MicroLabo / Mbed OS mbed-Dot-AT-Firmware

Dependencies:   MTS-Serial libmDot-mbed5

Fork of Dot-AT-Firmware by MultiTech

Embed: (wiki syntax)

« Back to documentation index

Show/hide line numbers CmdNetworkKey.cpp Source File

CmdNetworkKey.cpp

00001 #include "CmdNetworkKey.h"
00002 
00003 CmdNetworkKey::CmdNetworkKey() :
00004     Command("Network Key", "AT+NK", "Configured network key/passphrase (App Key in LoRaWAN) ##  AT+NK=0,hex  AT+NK=1,passphrase (Net key = cmac(passphrase)) (16 bytes)", "(0,(hex:16)),(1,(string:128))")
00005 {
00006     _queryable = true;
00007 }
00008 
00009 uint32_t CmdNetworkKey::action(std::vector<std::string> args)
00010 {
00011     if (args.size() == 1)
00012     {
00013         CommandTerminal::Serial()->writef("%s\r\n", mts::Text::bin2hexString(CommandTerminal::Dot()->getNetworkKey(), ".").c_str());
00014         if (!CommandTerminal::Dot()->getNetworkPassphrase().empty())
00015             CommandTerminal::Serial()->writef("Passphrase: '%s'\r\n", CommandTerminal::Dot()->getNetworkPassphrase().c_str());
00016     }
00017     else if (args.size() == 3)
00018     {
00019         if (args[1].find("1") == 0 && args[1].size() == 1)
00020         {
00021             std::string text;
00022             if (args.size() > 3)
00023             {
00024                 // passphrase was split on commas
00025                 for (size_t i = 2; i < args.size(); i++)
00026                 {
00027                     text.append(args[i]);
00028                     if (i < args.size() - 1)
00029                         text.append(",");
00030                 }
00031             }
00032             else
00033             {
00034                 text = args[2];
00035             }
00036 
00037             if (CommandTerminal::Dot()->setNetworkPassphrase(text) == mDot::MDOT_OK)
00038             {
00039                 CommandTerminal::Serial()->writef("Set Network Passphrase: ");
00040                 CommandTerminal::Serial()->writef("%s\r\n", text.c_str());
00041             }
00042             else
00043             {
00044                 CommandTerminal::setErrorMessage(CommandTerminal::Dot()->getLastError());;
00045                 return 1;
00046             }
00047         }
00048         else
00049         {
00050             std::vector<uint8_t> NewKey;
00051             readByteArray(args[2], NewKey, KEY_LENGTH);
00052             if (CommandTerminal::Dot()->setNetworkKey(NewKey) == mDot::MDOT_OK)
00053             {
00054                 CommandTerminal::Serial()->writef("Set Network Key: ");
00055                 CommandTerminal::Serial()->writef("%s\r\n", mts::Text::bin2hexString(NewKey, ".").c_str());
00056             }
00057             else
00058             {
00059                 CommandTerminal::setErrorMessage(CommandTerminal::Dot()->getLastError());;
00060                 return 1;
00061             }
00062         }
00063     }
00064 
00065     return 0;
00066 }
00067 
00068 bool CmdNetworkKey::verify(std::vector<std::string> args)
00069 {
00070     if (args.size() == 1)
00071         return true;
00072 
00073     if (args.size() == 3) {
00074         if (args[1] != "0" && args[1] != "1") {
00075             CommandTerminal::setErrorMessage("Invalid type, expects (0,1)");
00076             return false;
00077         }
00078         if (args[1] == "0" && !isHexString(args[2], 16)) {
00079             CommandTerminal::setErrorMessage("Invalid key, expects (hex:16)");
00080             return false;
00081         }
00082 
00083         if (args[1] == "1" && args[2].size() < 8) {
00084             CommandTerminal::setErrorMessage("Invalid name, expects minimum 8 characters");
00085             return false;
00086         }
00087 
00088         if (args[1] == "1" && (args[2].size() > 128 || args[2].size() < 8)) {
00089             CommandTerminal::setErrorMessage("Invalid passphrase, expects (string:8-128)");
00090             return false;
00091         }
00092 
00093         return true;
00094     }
00095 
00096     CommandTerminal::setErrorMessage("Invalid arguments");
00097     return false;
00098 }
00099