Important changes to repositories hosted on mbed.com
Mbed hosted mercurial repositories are deprecated and are due to be permanently deleted in July 2026.
To keep a copy of this software download the repository Zip archive or clone locally using Mercurial.
It is also possible to export all your personal repositories from the account settings page.
Fork of MTS-Cellular by
Diff: Cellular/EasyIP.cpp
- Revision:
- 33:3b6f3904dde0
- Parent:
- 32:7d5581159bed
- Child:
- 35:257eb41405e1
--- a/Cellular/EasyIP.cpp Tue Jul 15 20:37:08 2014 +0000 +++ b/Cellular/EasyIP.cpp Wed Jul 16 14:26:10 2014 +0000 @@ -6,121 +6,10 @@ using namespace mts; -bool EasyIP::sendEscapeCommand() -{ - //string Cellular::sendCommand(const std::string& command, unsigned int timeoutMillis, char esc) - if(io == NULL) { - logError("MTSBufferedIO not set"); - return false; - } - if(!socketOpened) { - logError("Socket is not open. Can not send AT escape sequence (+++)"); - return false; - } - - if(!socketCloseable) { - logError("Socket is not closeable"); - return false; - } - - io->rxClear(); - io->txClear(); - - std::string result; - unsigned int timeoutMillis = 2000; - const int size_cmd = 3; - //Attempt to write command - wait(1); //Format for +++ command is 1 second wait, send +++, then another second wait - //1s wait after command is implemented as a polling function for 2 seconds - //Option: Could change wait periods to be longer/shorter (0-255)*50ms - if(io->write("+++", size_cmd, timeoutMillis) != size_cmd) { - //Failed to write command - logError("failed to send command to radio within %d milliseconds", timeoutMillis); - return false; - } - - int timer = 0; - char tmp[256]; - tmp[255] = 0; - bool done = false; - io->read(tmp,255,0); - bool exitmode = false; - - do { - wait(0.1); - timer += 100; - //Make a non-blocking read call by passing timeout of zero - int size = io->read(tmp,255,0); //1 less than allocated (timeout is instant) - if(size > 0) { - result.append(tmp, size); - } - if(result.find("OK") != std::string::npos) { - exitmode = true; - done = true; - } else if(result.find("NO CARRIER") != std::string::npos) { - exitmode = true; - done = true; - } else if(result.find("ERROR") != std::string::npos) { - exitmode = false; - done = true; - } - if(timer >= timeoutMillis) { - logDebug("Escape sequence [+++] timed out after %d milliseconds", timeoutMillis); - exitmode = true; - done = true; - } - } while (!done); - - return exitmode; -} -bool EasyIP::socketCheck() { - bool status = false; - std::string socketInfo = "9"; //9 is unrecognized - std::vector<std::string> params; - - if(sendEscapeCommand()) { - socketOpened = false; - if(sendBasicCommand("AT", 1000) == MTS_SUCCESS) { - socketInfo = sendCommand("AT#SS=1", 2000); - if(socketInfo.find("OK") != std::string::npos) { - //Found valid response - params = Text::split(socketInfo, "\r\n"); - params = Text::split(params[1], ","); - socketInfo = params[1]; - //Check comparison of params[1] to response codes - } else { - logError("Could not determine socket status[%s]",socketInfo.c_str()); - socketInfo == "9"; //9 is unrecognized - } - } - } else { - status = false; //Return value of socketOpened when checking - } - //Check socket status query - if(socketInfo == "2" || socketInfo == "3" || socketInfo == "1" || socketInfo == "4") { - status = true; //2 and 3 are suspended connections - } else if(socketInfo == "0" || socketInfo == "5") { - status = false; //0 is closed socket, probably won't occur - } else { - logError("Could not determine socket status"); - status = false; //anything else is unknown status - } - - if(status) { - std::string reconnect = sendCommand("AT#SO=1", 2000); - if(reconnect.find("CONNECT") != std::string::npos || reconnect.find("OK") != std::string::npos) { - } else { - logError("Failed to resume socket connection"); - } - } - return status; -} EasyIP::EasyIP(Radio type) { - //Not sure how the construction process is done, - //but assuming it works for both EasyIP and UIP the same way. this->type = type; io = NULL; dcd = NULL; @@ -138,8 +27,6 @@ EasyIP::~EasyIP() { - //Same reasoning for the destructor as the constructor, - //assuming it works for UIP, it will work for EasyIP if (dtr != NULL) { dtr->write(1); } @@ -166,7 +53,7 @@ bool EasyIP::connect() { - //Check if APN is not set, if so, connect will not work. + //Check if APN is not set, if it is not, connect will not work. if (type == MTSMC_H5_IP || type == MTSMC_H5 || type == MTSMC_G3) { if(apn.size() == 0) { logDebug("APN is not set"); @@ -327,7 +214,7 @@ } } - //Check active mode (SGACT = 1,1) + //Check active context (SGACT = 1,1) reply = sendCommand("AT#SGACT?", 500); if(reply.empty() || (reply.find("ERROR") != std::string::npos)) { active = false; @@ -388,6 +275,18 @@ return pppConnected; } +//Resets the radio +void EasyIP::reset() +{ + disconnect(); + if(sendBasicCommand("AT#REBOOT", 10000) != MTS_SUCCESS) { + logError("Socket Modem did not accept RESET command\n\r"); + } else { + logWarning("Socket Modem is resetting, allow 30 seconds for it to come back\n\r"); + return; + } +} + //Binds the socket to a specific port if able bool EasyIP::bind(unsigned int port) { @@ -678,7 +577,7 @@ //Set IP,PPP,IPv6 Code code = sendBasicCommand("AT+CGDCONT=1,PPP," + apn, 1000); if (code != MTS_SUCCESS) { - return code; + return code; //This will return whatever is not MTS_SUCCESS } this->apn = apn; return code; //This will return MTS_SUCCESS @@ -688,17 +587,6 @@ } } -void EasyIP::reset() -{ - disconnect(); - if(sendBasicCommand("AT#REBOOT", 10000) != MTS_SUCCESS) { - logError("Socket Modem did not accept RESET command\n\r"); - } else { - logWarning("Socket Modem is resetting, allow 30 seconds for it to come back\n\r"); - return; - } -} - std::string EasyIP::getDeviceIP() { return local_address; @@ -776,3 +664,117 @@ return MTS_SUCCESS; } + +bool EasyIP::sendEscapeCommand() +{ + //string Cellular::sendCommand(const std::string& command, unsigned int timeoutMillis, char esc) + if(io == NULL) { + logError("MTSBufferedIO not set"); + return false; + } + if(!socketOpened) { + logError("Socket is not open. Can not send AT escape sequence (+++)"); + return false; + } + + if(!socketCloseable) { + logError("Socket is not closeable"); + return false; + } + + io->rxClear(); + io->txClear(); + + std::string result; + unsigned int timeoutMillis = 2000; + const int size_cmd = 3; + //Attempt to write command + wait(1); //Format for +++ command is 1 second wait, send +++, then another second wait + //1s wait after command is implemented as a polling function for 2 seconds + //Option: Could change wait periods to be longer/shorter (0-255)*50ms + if(io->write("+++", size_cmd, timeoutMillis) != size_cmd) { + //Failed to write command + logError("failed to send command to radio within %d milliseconds", timeoutMillis); + return false; + } + + int timer = 0; + char tmp[256]; + tmp[255] = 0; + bool done = false; + io->read(tmp,255,0); + bool exitmode = false; + + do { + wait(0.1); + timer += 100; + //Make a non-blocking read call by passing timeout of zero + int size = io->read(tmp,255,0); //1 less than allocated (timeout is instant) + if(size > 0) { + result.append(tmp, size); + } + if(result.find("OK") != std::string::npos) { + exitmode = true; + done = true; + } else if(result.find("NO CARRIER") != std::string::npos) { + exitmode = true; + done = true; + } else if(result.find("ERROR") != std::string::npos) { + exitmode = false; + done = true; + } + if(timer >= timeoutMillis) { + logDebug("Escape sequence [+++] timed out after %d milliseconds", timeoutMillis); + exitmode = true; + done = true; + } + } while (!done); + + return exitmode; +} + +bool EasyIP::socketCheck() { + bool status = false; + std::string socketInfo = "9"; //9 is unrecognized + std::vector<std::string> params; + + //Goes from data mode to command mode + if(sendEscapeCommand()) { + socketOpened = false; + if(sendBasicCommand("AT", 1000) == MTS_SUCCESS) { + socketInfo = sendCommand("AT#SS=1", 2000); + if(socketInfo.find("OK") != std::string::npos) { + //Found valid response + params = Text::split(socketInfo, "\r\n"); + params = Text::split(params[1], ","); + socketInfo = params[1]; + //Check comparison of params[1] to response codes + } else { + logError("Could not determine socket status[%s]",socketInfo.c_str()); + socketInfo == "9"; //9 is unrecognized + } + } + } else { + status = false; //Return value of socketOpened when checking + } + + //Check socket status query + if(socketInfo == "2" || socketInfo == "3" || socketInfo == "1" || socketInfo == "4") { + status = true; //2 and 3 are suspended connections + } else if(socketInfo == "0" || socketInfo == "5") { + status = false; //0 is closed socket, probably won't occur + } else { + logError("Could not determine socket status"); + status = false; //anything else is unknown status + } + + //Reconnects to active socket if able + if(status) { + std::string reconnect = sendCommand("AT#SO=1", 2000); + if(reconnect.find("CONNECT") != std::string::npos || reconnect.find("OK") != std::string::npos) { + } else { + logError("Failed to resume socket connection"); + } + } + return status; +}