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 CmdNetworkId.cpp Source File

CmdNetworkId.cpp

00001 #include "CmdNetworkId.h"
00002 
00003 CmdNetworkId::CmdNetworkId() :
00004 #if MTS_CMD_TERM_VERBOSE
00005     Command("Network ID", "AT+NI", "Configured Network Name/EUI (MSB, App EUI in LoRaWAN) AT+NI=0/2,hex AT+NI=1,network_name  (Net ID = crc64(network_name)) (8 bytes)", "(0/2,(hex:8)),(1,(string:128))")
00006 #else
00007     Command("AT+NI")
00008 #endif
00009 {
00010     _queryable = true;
00011 }
00012 
00013 uint32_t CmdNetworkId::action(const std::vector<std::string>& args)
00014 {
00015     char arg1 = '\0';
00016     if ((args.size() >= 2) && (args[1].size() == 1)) {
00017         arg1 = args[1][0];
00018     }
00019 
00020     if ((args.size() == 1) || ((args.size() == 3) && (args[2].size() == 1) && (args[2][0] == '?'))) {
00021 #if defined(TARGET_MTS_MDOT_F411RE) || defined(TARGET_XDOT_L151CC) || defined(TARGET_XDOT_MAX32670)
00022         if (arg1 == '2') {
00023             CommandTerminal::Serial()->writef("%s\r\n", mts::Text::bin2hexString(CommandTerminal::Dot()->getProtectedAppEUI(), "-").c_str());
00024         } else
00025 #endif
00026         {
00027             CommandTerminal::Serial()->writef("%s\r\n", mts::Text::bin2hexString(CommandTerminal::Dot()->getNetworkId(), "-").c_str());
00028 
00029             if (!CommandTerminal::Dot()->getNetworkName().empty())
00030                 CommandTerminal::Serial()->writef("Passphrase: '%s'\r\n", CommandTerminal::Dot()->getNetworkName().c_str());
00031         }
00032     } else if (args.size() >= 3) {
00033         if (arg1 == '1')
00034         {
00035             std::string text = args[2];
00036 
00037             // passphrase was split on commas
00038             for (size_t i = 3; i < args.size(); i++)
00039             {
00040                 text.append(",");
00041                 text.append(args[i]);
00042             }
00043 
00044             if (CommandTerminal::Dot()->setNetworkName(text) == mDot::MDOT_OK)
00045             {
00046 #if MTS_CMD_TERM_VERBOSE
00047                 CommandTerminal::Serial()->writef("Set Network Name: ");
00048                 CommandTerminal::Serial()->writef("%s\r\n", text.c_str());
00049 #endif
00050             }
00051             else
00052             {
00053                 return 1;
00054             }
00055         }
00056         else
00057         {
00058             std::vector<uint8_t> NewEUI;
00059             readByteArray(args[2], NewEUI, EUI_LENGTH);
00060             if (arg1 != '2') {
00061                 if (CommandTerminal::Dot()->setNetworkId(NewEUI) == mDot::MDOT_OK)
00062                 {
00063 #if MTS_CMD_TERM_VERBOSE
00064                     CommandTerminal::Serial()->writef("Set Network ID: ");
00065                     CommandTerminal::Serial()->writef("%s\r\n", mts::Text::bin2hexString(NewEUI, "-").c_str());
00066 #endif
00067                 }
00068                 else
00069                 {
00070                     return 1;
00071                 }
00072             } else {
00073 #if defined(TARGET_MTS_MDOT_F411RE) || defined(TARGET_XDOT_L151CC) || defined(TARGET_XDOT_MAX32670)
00074 
00075                 if (CommandTerminal::Dot()->setProtectedAppEUI(NewEUI) == mDot::MDOT_OK)
00076                 {
00077 #if MTS_CMD_TERM_VERBOSE
00078                     CommandTerminal::Serial()->writef("Set Protected AppEUI: ");
00079                     CommandTerminal::Serial()->writef("%s\r\n", mts::Text::bin2hexString(NewEUI, "-").c_str());
00080 #endif
00081                 }
00082                 else
00083                 {
00084                     return 1;
00085                 }
00086 #endif
00087             }
00088         }
00089     }
00090 
00091     return 0;
00092 }
00093 
00094 bool CmdNetworkId::verify(const std::vector<std::string>& args)
00095 {
00096     if (args.size() == 1)
00097         return true;
00098 
00099     if (args.size() > 1 && args[1].size() == 1) {
00100 
00101         char arg1 = args[1][0];
00102 
00103         if (args.size() == 2 && arg1 == '2')
00104             return true;
00105 
00106         if (args.size() >= 3) {
00107             if (arg1 != '0' && arg1 != '1' && arg1 != '2') {
00108     #if MTS_CMD_TERM_VERBOSE
00109                 CommandTerminal::setErrorMessage("Invalid type, expects (0,1,2)");
00110     #endif
00111                 return false;
00112             }
00113 
00114             if ((arg1 == '0' || arg1 == '2') && args[2] != "?" && !isHexString(args[2], 8)) {
00115     #if MTS_CMD_TERM_VERBOSE
00116                 CommandTerminal::setErrorMessage("Invalid ID, expects (hex:8)");
00117     #endif
00118                 return false;
00119             } else {
00120                 if (args[2].size() < 8) {
00121                     if (!((args[2].size() == 1) && (args[2][0] == '?'))) {
00122     #if MTS_CMD_TERM_VERBOSE
00123                         CommandTerminal::setErrorMessage("Invalid name, expects minimum 8 characters");
00124     #endif
00125                         return false;
00126                     }
00127                 } else if (args[2].size() > 128) {
00128     #if MTS_CMD_TERM_VERBOSE
00129                     CommandTerminal::setErrorMessage("Invalid name, expects (string:128)");
00130     #endif
00131                     return false;
00132                 }
00133             }
00134 
00135             return true;
00136         }
00137     }
00138 
00139 #if MTS_CMD_TERM_VERBOSE
00140     CommandTerminal::setErrorMessage("Invalid arguments");
00141 #endif
00142     return false;
00143 }