AT command firmware for MultiTech Dot devices.

Fork of mDot_AT_firmware by MultiTech

Embed: (wiki syntax)

« Back to documentation index

Show/hide line numbers CmdNetworkSessionKey.cpp Source File

CmdNetworkSessionKey.cpp

00001 #include "CmdNetworkSessionKey.h"
00002 
00003 CmdNetworkSessionKey::CmdNetworkSessionKey() :
00004 #if MTS_CMD_TERM_VERBOSE
00005     Command("Network Session Key", "AT+NSK", "Network session encryption key (16 bytes)", "(hex:16) or (1-8),(hex:16)")
00006 #else
00007     Command("AT+NSK")
00008 #endif
00009 {
00010     _queryable = true;
00011 }
00012 
00013 uint32_t CmdNetworkSessionKey::action(const std::vector<std::string>& args)
00014 {
00015     if (args.size() == 1)
00016     {
00017         CommandTerminal::Serial()->writef("%s\r\n", mts::Text::bin2hexString(CommandTerminal::Dot()->getNetworkSessionKey(), ".").c_str());
00018     }
00019     else if (args.size() == 2 || args.size() == 3)
00020     {
00021         int index = 0;
00022         int arg_index = 1;
00023         if (args.size() == 3) {
00024             arg_index = 2;
00025             sscanf(args[1].c_str(), "%d", &index);
00026         }
00027 
00028         if (args.size() == 3 && args[2] == "?") {
00029             uint8_t nsk[16];
00030             CommandTerminal::Dot()->getMulticastNetworkSessionKey(index-1, nsk);
00031             CommandTerminal::Serial()->writef("%s\r\n", mts::Text::bin2hexString(nsk, 16, ".").c_str());
00032         } else {
00033             std::vector<uint8_t> NewKey;
00034 
00035             // Read in the key components...
00036             readByteArray(args[arg_index], NewKey, KEY_LENGTH);
00037 
00038             if (arg_index == 2 && CommandTerminal::Dot()->setMulticastNetworkSessionKey(index-1, &NewKey[0]) == mDot::MDOT_OK) {
00039 #if MTS_CMD_TERM_VERBOSE
00040                 CommandTerminal::Serial()->writef("Set Multicast Network Session Key %d: ", index);
00041                 CommandTerminal::Serial()->writef("%s\r\n", mts::Text::bin2hexString(NewKey, ".").c_str());
00042 #endif
00043             } else if (CommandTerminal::Dot()->setNetworkSessionKey(NewKey) == mDot::MDOT_OK) {
00044 #if MTS_CMD_TERM_VERBOSE
00045                 CommandTerminal::Serial()->writef("Set Network Session Key: ");
00046                 CommandTerminal::Serial()->writef("%s\r\n", mts::Text::bin2hexString(NewKey, ".").c_str());
00047 #endif
00048             } else {
00049                 return 1;
00050             }
00051         }
00052     }
00053 
00054     return 0;
00055 }
00056 
00057 bool CmdNetworkSessionKey::verify(const std::vector<std::string>& args)
00058 {
00059     if (args.size() == 1)
00060         return true;
00061 
00062     if (args.size() == 2) {
00063         if (!isHexString(args[1], 16)) {
00064 #if MTS_CMD_TERM_VERBOSE
00065             CommandTerminal::setErrorMessage("Invalid key, expects (hex:16)");
00066 #endif
00067             return false;
00068         }
00069 
00070         return true;
00071     }
00072 
00073     if (args.size() == 3) {
00074         int index = 0;
00075         sscanf(args[1].c_str(), "%d", &index);
00076 
00077         if (args[1].size() == 1 && (index < 1 || index > 8)) {
00078 #if MTS_CMD_TERM_VERBOSE
00079             CommandTerminal::setErrorMessage("Invalid index, expects 1-8");
00080 #endif
00081             return false;
00082         } else if (args[2] != "?" && !isHexString(args[2], 16)) {
00083 #if MTS_CMD_TERM_VERBOSE
00084             CommandTerminal::setErrorMessage("Invalid key, expects (hex:16)");
00085 #endif
00086             return false;
00087         }
00088 
00089         return true;
00090     }
00091 
00092 #if MTS_CMD_TERM_VERBOSE
00093     CommandTerminal::setErrorMessage("Invalid arguments");
00094 #endif
00095     return false;
00096 }