Simple detection for LE910-NA1 modules

Fork of MTS-Cellular by MultiTech

Committer:
Vanger
Date:
Tue Aug 05 18:35:22 2014 +0000
Revision:
51:ffc556ba33f7
Parent:
49:1fc51c53cebf
Child:
52:2cb58398a4f9
Changed some comment lines in CellularFactory.cpp, EasyIP.cpp, UIP.cpp; Changed Cellular.cpp sendCommand() function to explicitly check for UIP responses, and removed 5ms wait between read cycles.

Who changed what in which revision?

UserRevisionLine numberNew contents of line
Vanger 26:2b769ed8de4f 1 #include "mbed.h"
Vanger 26:2b769ed8de4f 2 #include "EasyIP.h"
Vanger 26:2b769ed8de4f 3 #include "MTSText.h"
Vanger 26:2b769ed8de4f 4 #include "MTSLog.h"
Vanger 26:2b769ed8de4f 5 #include "CellUtils.h"
Vanger 26:2b769ed8de4f 6
Vanger 26:2b769ed8de4f 7 using namespace mts;
Vanger 26:2b769ed8de4f 8
Vanger 30:1326b623919a 9
Vanger 30:1326b623919a 10
Vanger 26:2b769ed8de4f 11 EasyIP::EasyIP(Radio type)
Vanger 26:2b769ed8de4f 12 {
Vanger 26:2b769ed8de4f 13 this->type = type;
Vanger 26:2b769ed8de4f 14 io = NULL;
Vanger 26:2b769ed8de4f 15 dcd = NULL;
Vanger 26:2b769ed8de4f 16 dtr = NULL;
Vanger 26:2b769ed8de4f 17 resetLine = NULL;
Vanger 26:2b769ed8de4f 18 echoMode = true;
Vanger 26:2b769ed8de4f 19 pppConnected = false;
Vanger 26:2b769ed8de4f 20 socketMode = TCP;
Vanger 26:2b769ed8de4f 21 socketOpened = false;
Vanger 26:2b769ed8de4f 22 socketCloseable = true;
Vanger 26:2b769ed8de4f 23 local_port = 0;
Vanger 26:2b769ed8de4f 24 local_address = "";
Vanger 26:2b769ed8de4f 25 host_port = 0;
Vanger 26:2b769ed8de4f 26 }
Vanger 26:2b769ed8de4f 27
Vanger 26:2b769ed8de4f 28 EasyIP::~EasyIP()
Vanger 26:2b769ed8de4f 29 {
Vanger 26:2b769ed8de4f 30 if (dtr != NULL) {
Vanger 26:2b769ed8de4f 31 dtr->write(1);
Vanger 26:2b769ed8de4f 32 }
Vanger 26:2b769ed8de4f 33
Vanger 26:2b769ed8de4f 34 delete dcd;
Vanger 26:2b769ed8de4f 35 delete dtr;
Vanger 26:2b769ed8de4f 36 delete resetLine;
Vanger 26:2b769ed8de4f 37 }
Vanger 26:2b769ed8de4f 38
Vanger 26:2b769ed8de4f 39 //Initializes the MTS IO Buffer
Vanger 26:2b769ed8de4f 40 bool EasyIP::init(MTSBufferedIO* io)
Vanger 26:2b769ed8de4f 41 {
Vanger 26:2b769ed8de4f 42 if (! Cellular::init(io)) {
Vanger 26:2b769ed8de4f 43 return false;
Vanger 26:2b769ed8de4f 44 }
Vanger 26:2b769ed8de4f 45
Vanger 26:2b769ed8de4f 46 logDebug("radio type: %s", Cellular::getRadioNames(type).c_str());
Vanger 49:1fc51c53cebf 47 //Turns on the HW flow control
Vanger 41:8b9b5098696f 48 if(sendBasicCommand("AT&K3", 2000) != MTS_SUCCESS) {
Vanger 35:257eb41405e1 49 logWarning("Failed to set flow control to radio");
Vanger 35:257eb41405e1 50 }
Vanger 26:2b769ed8de4f 51 return true;
Vanger 26:2b769ed8de4f 52 }
Vanger 26:2b769ed8de4f 53
Vanger 26:2b769ed8de4f 54 bool EasyIP::connect()
Vanger 26:2b769ed8de4f 55 {
Vanger 33:3b6f3904dde0 56 //Check if APN is not set, if it is not, connect will not work.
Vanger 29:edc613ed3f2e 57 if (type == MTSMC_H5_IP || type == MTSMC_H5 || type == MTSMC_G3) {
Vanger 29:edc613ed3f2e 58 if(apn.size() == 0) {
Vanger 29:edc613ed3f2e 59 logDebug("APN is not set");
Vanger 29:edc613ed3f2e 60 return false;
Vanger 29:edc613ed3f2e 61 }
Vanger 29:edc613ed3f2e 62 }
Vanger 29:edc613ed3f2e 63
Vanger 26:2b769ed8de4f 64 //Check if socket is open
Vanger 26:2b769ed8de4f 65 //flag stored in Cellular.h
Vanger 26:2b769ed8de4f 66 if(socketOpened) {
Vanger 26:2b769ed8de4f 67 return true;
Vanger 26:2b769ed8de4f 68 }
Vanger 26:2b769ed8de4f 69
Vanger 26:2b769ed8de4f 70 //Check if already connected
Vanger 26:2b769ed8de4f 71 //by calling the function isConnected() in EasyIP.cpp
Vanger 26:2b769ed8de4f 72 if(isConnected()) {
Vanger 26:2b769ed8de4f 73 return true;
Vanger 26:2b769ed8de4f 74 }
Vanger 51:ffc556ba33f7 75
Vanger 26:2b769ed8de4f 76 //Create an mbed timer object
Vanger 26:2b769ed8de4f 77 Timer tmr;
Vanger 26:2b769ed8de4f 78 //Check Registration: AT+CREG? == 0,1
Vanger 26:2b769ed8de4f 79 //(Does the AT command inside Cellular class)
Vanger 26:2b769ed8de4f 80 tmr.start();
Vanger 26:2b769ed8de4f 81 do {
Vanger 26:2b769ed8de4f 82 Registration registration = getRegistration();
Vanger 26:2b769ed8de4f 83 if(registration != REGISTERED) {
Vanger 26:2b769ed8de4f 84 logTrace("Not Registered [%d] ... waiting", (int)registration);
Vanger 26:2b769ed8de4f 85 wait(1);
Vanger 26:2b769ed8de4f 86 } else {
Vanger 26:2b769ed8de4f 87 break;
Vanger 26:2b769ed8de4f 88 }
Vanger 30:1326b623919a 89 } while(tmr.read() < 30);
Vanger 51:ffc556ba33f7 90
Vanger 26:2b769ed8de4f 91 //Check RSSI: AT+CSQ
Vanger 26:2b769ed8de4f 92 //Does the command inside Cellular
Vanger 26:2b769ed8de4f 93 tmr.reset();
Vanger 26:2b769ed8de4f 94 do {
Vanger 26:2b769ed8de4f 95 int rssi = getSignalStrength();
Vanger 26:2b769ed8de4f 96 logDebug("Signal strength: %d", rssi);
Vanger 51:ffc556ba33f7 97 if(rssi == 99 || rssi == -1) {
Vanger 26:2b769ed8de4f 98 logTrace("No Signal ... waiting");
Vanger 26:2b769ed8de4f 99 wait(1);
Vanger 26:2b769ed8de4f 100 } else {
Vanger 26:2b769ed8de4f 101 break;
Vanger 26:2b769ed8de4f 102 }
Vanger 26:2b769ed8de4f 103 } while(tmr.read() < 30);
Vanger 26:2b769ed8de4f 104
Vanger 27:ec44d5a9544f 105 //Similar to AT#CONNECTIONSTART: Make a PPP connection
Vanger 26:2b769ed8de4f 106 if (type == MTSMC_H5 || type == MTSMC_G3) {
Vanger 26:2b769ed8de4f 107 logDebug("Making PPP Connection Attempt. APN[%s]", apn.c_str());
Vanger 26:2b769ed8de4f 108 } else {
Vanger 26:2b769ed8de4f 109 logDebug("Making PPP Connection Attempt");
Vanger 26:2b769ed8de4f 110 }
Vanger 26:2b769ed8de4f 111 //The main thing going on; Sends the AT command to start a connection
Vanger 30:1326b623919a 112 //Assuming context is already stored in the modem
Vanger 35:257eb41405e1 113 std::string pppResult = sendCommand("AT#SGACT=1,1", 5000);
Vanger 30:1326b623919a 114 std::vector<std::string> parts;
Vanger 26:2b769ed8de4f 115 if(pppResult.find("OK") != std::string::npos) {
Vanger 30:1326b623919a 116 parts = Text::split(pppResult, "\r\n");
Vanger 26:2b769ed8de4f 117 if(parts.size() >= 2) {
Vanger 26:2b769ed8de4f 118 parts = Text::split(parts[1], " ");
Vanger 26:2b769ed8de4f 119 local_address = parts[1];
Vanger 26:2b769ed8de4f 120 }
Vanger 26:2b769ed8de4f 121 logInfo("PPP Connection Established: IP[%s]", local_address.c_str());
Vanger 26:2b769ed8de4f 122 pppConnected = true;
Vanger 26:2b769ed8de4f 123
Vanger 26:2b769ed8de4f 124 } else {
Vanger 30:1326b623919a 125 pppResult = sendCommand("AT#SGACT?", 2000);
Vanger 30:1326b623919a 126 if(pppResult.empty() || (pppResult.find("ERROR") != std::string::npos)) {
Vanger 30:1326b623919a 127 pppConnected = false;
Vanger 30:1326b623919a 128 } else {
Vanger 30:1326b623919a 129 if(pppResult.find("1,1") != std::string::npos) {
Vanger 35:257eb41405e1 130 logDebug("Radio is already connected");
Vanger 30:1326b623919a 131 pppConnected = true;
Vanger 30:1326b623919a 132 } else {
Vanger 30:1326b623919a 133 pppConnected = false;
Vanger 30:1326b623919a 134 }
Vanger 30:1326b623919a 135 }
Vanger 26:2b769ed8de4f 136 }
Vanger 26:2b769ed8de4f 137
Vanger 26:2b769ed8de4f 138 return pppConnected;
Vanger 26:2b769ed8de4f 139 }
Vanger 26:2b769ed8de4f 140
Vanger 26:2b769ed8de4f 141 void EasyIP::disconnect()
Vanger 26:2b769ed8de4f 142 {
Vanger 26:2b769ed8de4f 143 //AT#SGACT=1,0: Close a PPP connection
Vanger 28:f93d7b3f7c2e 144 logDebug("Closing PPP Connection");
Vanger 26:2b769ed8de4f 145 if(socketOpened) {
Vanger 30:1326b623919a 146 if(!close()) { //Calls another EasyIP function to close socket before disconnect
Vanger 30:1326b623919a 147 logDebug("Failed to close socket for disconnect");
Vanger 30:1326b623919a 148 return; //Can't close connection without AT commands
Vanger 30:1326b623919a 149 //(and thus need socket closed)
Vanger 30:1326b623919a 150 }
Vanger 26:2b769ed8de4f 151 }
Vanger 35:257eb41405e1 152 std::string result;
Vanger 35:257eb41405e1 153 Timer tmr;
Vanger 26:2b769ed8de4f 154 //Sends AT#SGACT=1,0 command
Vanger 35:257eb41405e1 155 if (sendBasicCommand("AT#SGACT=1,0", 1000) == MTS_SUCCESS) {
Vanger 30:1326b623919a 156 pppConnected = false;
Vanger 30:1326b623919a 157 logDebug("Successfully closed PPP Connection");
Vanger 30:1326b623919a 158 }
Vanger 35:257eb41405e1 159
Vanger 51:ffc556ba33f7 160 /* Radio was entering unknown state if ping command was sent after calling
Vanger 51:ffc556ba33f7 161 * disconnect, due to context being closed between radio sending ping and
Vanger 51:ffc556ba33f7 162 * waiting for ping response (which will never occur with connection closed)
Vanger 51:ffc556ba33f7 163 */
Vanger 35:257eb41405e1 164 tmr.start();
Vanger 35:257eb41405e1 165 while(tmr.read() < 30) {
Vanger 35:257eb41405e1 166 result = sendCommand("AT#SGACT?", 1000);
Vanger 35:257eb41405e1 167 if(result.find("1,0") != std::string::npos) {
Vanger 35:257eb41405e1 168 pppConnected = false;
Vanger 35:257eb41405e1 169 break;
Vanger 35:257eb41405e1 170 } else if(result.find("ERROR") != std::string::npos) {
Vanger 35:257eb41405e1 171 break;
Vanger 35:257eb41405e1 172 } else {
Vanger 35:257eb41405e1 173 wait(1);
Vanger 35:257eb41405e1 174 }
Vanger 35:257eb41405e1 175 }
Vanger 35:257eb41405e1 176
Vanger 51:ffc556ba33f7 177 //If still unable to close PPP connection, wait for 30 seconds to drop connection
Vanger 35:257eb41405e1 178 if(pppConnected) {
Vanger 35:257eb41405e1 179 wait(30);
Vanger 35:257eb41405e1 180 pppConnected = false;
Vanger 35:257eb41405e1 181 }
Vanger 35:257eb41405e1 182
Vanger 30:1326b623919a 183 return;
Vanger 26:2b769ed8de4f 184 }
Vanger 27:ec44d5a9544f 185
Vanger 26:2b769ed8de4f 186 bool EasyIP::isConnected()
Vanger 26:2b769ed8de4f 187 {
Vanger 29:edc613ed3f2e 188 std::string stateString;
Vanger 29:edc613ed3f2e 189 std::vector<std::string> pieces;
Vanger 51:ffc556ba33f7 190 //state flags for various connection components
Vanger 30:1326b623919a 191 bool signal = false, regist = false, active = false;
Vanger 26:2b769ed8de4f 192
Vanger 29:edc613ed3f2e 193 //1) Check if APN was set if we're on an HSPA radio
Vanger 29:edc613ed3f2e 194 if (type == MTSMC_H5_IP || type == MTSMC_H5 || type == MTSMC_G3) {
Vanger 29:edc613ed3f2e 195 if(apn.size() == 0) {
Vanger 29:edc613ed3f2e 196 logDebug("APN is not set");
Vanger 29:edc613ed3f2e 197 return false;
Vanger 29:edc613ed3f2e 198 }
Vanger 29:edc613ed3f2e 199 }
Vanger 29:edc613ed3f2e 200
Vanger 29:edc613ed3f2e 201 //2) Check that we do not have a live connection up
Vanger 29:edc613ed3f2e 202 if(socketOpened) {
Vanger 29:edc613ed3f2e 203 logDebug("Socket is opened");
Vanger 29:edc613ed3f2e 204 return true;
Vanger 29:edc613ed3f2e 205 }
Vanger 29:edc613ed3f2e 206
Vanger 30:1326b623919a 207
Vanger 29:edc613ed3f2e 208 //3) Query the radio
Vanger 51:ffc556ba33f7 209 //3.a) Check antenna signal
Vanger 30:1326b623919a 210 std::string reply = sendCommand("AT+CSQ", 500);
Vanger 29:edc613ed3f2e 211 if(reply.empty() || (reply.find("ERROR") != std::string::npos)) {
Vanger 29:edc613ed3f2e 212 signal = false;
Vanger 29:edc613ed3f2e 213 } else {
Vanger 29:edc613ed3f2e 214 pieces = Text::split(reply, "\r\n");
Vanger 29:edc613ed3f2e 215 if(pieces.size() >= 2) {
Vanger 29:edc613ed3f2e 216 pieces = Text::split(pieces[1], " ");
Vanger 29:edc613ed3f2e 217 if(pieces.size() >= 2) {
Vanger 29:edc613ed3f2e 218 if((pieces[1].find("0,0") != std::string::npos) || (pieces[1].find("99,99") != std::string::npos)) {
Vanger 29:edc613ed3f2e 219 signal = false;
Vanger 29:edc613ed3f2e 220 } else {
Vanger 29:edc613ed3f2e 221 signal = true;
Vanger 29:edc613ed3f2e 222 }
Vanger 29:edc613ed3f2e 223 }
Vanger 29:edc613ed3f2e 224 }
Vanger 29:edc613ed3f2e 225 }
Vanger 27:ec44d5a9544f 226
Vanger 51:ffc556ba33f7 227 //3.b) Check cell tower registration
Vanger 30:1326b623919a 228 reply = sendCommand("AT+CREG?", 500);
Vanger 29:edc613ed3f2e 229 if(reply.empty() || (reply.find("ERROR") != std::string::npos)) {
Vanger 29:edc613ed3f2e 230 regist = false;
Vanger 29:edc613ed3f2e 231 } else {
Vanger 29:edc613ed3f2e 232 pieces = Text::split(reply, "\r\n");
Vanger 29:edc613ed3f2e 233 if(pieces.size() >= 2) {
Vanger 29:edc613ed3f2e 234 pieces = Text::split(pieces[1], " ");
Vanger 29:edc613ed3f2e 235 if(pieces.size() >= 2) {
Vanger 29:edc613ed3f2e 236 if((pieces[1].find("0,1") != std::string::npos) || (pieces[1].find("0,5") != std::string::npos)) {
Vanger 29:edc613ed3f2e 237 regist = true; //1 for connected, 5 for roaming connected
Vanger 29:edc613ed3f2e 238 } else {
Vanger 29:edc613ed3f2e 239 regist = false; //Cell tower not registered
Vanger 29:edc613ed3f2e 240 }
Vanger 29:edc613ed3f2e 241 }
Vanger 29:edc613ed3f2e 242 }
Vanger 29:edc613ed3f2e 243 }
Vanger 27:ec44d5a9544f 244
Vanger 51:ffc556ba33f7 245 //3.c) Check active context (SGACT = 1,1)
Vanger 30:1326b623919a 246 reply = sendCommand("AT#SGACT?", 500);
Vanger 29:edc613ed3f2e 247 if(reply.empty() || (reply.find("ERROR") != std::string::npos)) {
Vanger 29:edc613ed3f2e 248 active = false;
Vanger 29:edc613ed3f2e 249 } else {
Vanger 29:edc613ed3f2e 250 pieces = Text::split(reply, "\r\n");
Vanger 29:edc613ed3f2e 251 if(pieces.size() >= 2) {
Vanger 29:edc613ed3f2e 252 pieces = Text::split(pieces[1], " ");
Vanger 29:edc613ed3f2e 253 if(pieces.size() >= 2) {
Vanger 29:edc613ed3f2e 254 if(pieces[1].find("1,1") != std::string::npos) {
Vanger 29:edc613ed3f2e 255 active = true; //1 for an active connection mode
Vanger 29:edc613ed3f2e 256 } else {
Vanger 29:edc613ed3f2e 257 active = false; //0, or unknown value, is an inactive connection mode
Vanger 29:edc613ed3f2e 258 }
Vanger 29:edc613ed3f2e 259 }
Vanger 29:edc613ed3f2e 260 }
Vanger 29:edc613ed3f2e 261 }
Vanger 30:1326b623919a 262 //4) Determine radio state
Vanger 30:1326b623919a 263 if(regist && signal) {
Vanger 29:edc613ed3f2e 264 if(pppConnected) {
Vanger 30:1326b623919a 265 if(active) {
Vanger 30:1326b623919a 266 if(ping()) {
Vanger 30:1326b623919a 267 stateString = "CONNECTED";
Vanger 30:1326b623919a 268 pppConnected = true;
Vanger 29:edc613ed3f2e 269 } else {
Vanger 30:1326b623919a 270 stateString = "AUTHENTICATING";
Vanger 30:1326b623919a 271 pppConnected = true;
Vanger 30:1326b623919a 272 return false; //Return false instead of changing pppConnected due to the fact
Vanger 30:1326b623919a 273 //that it is connected to ppp, it just can't ping successfully
Vanger 29:edc613ed3f2e 274 }
Vanger 30:1326b623919a 275 } else {
Vanger 30:1326b623919a 276 stateString = "DISCONNECTING";
Vanger 30:1326b623919a 277 pppConnected = false;
Vanger 30:1326b623919a 278 }
Vanger 30:1326b623919a 279 } else {
Vanger 30:1326b623919a 280 if(active) {
Vanger 30:1326b623919a 281 if(ping()) {
Vanger 30:1326b623919a 282 pppConnected = true;
Vanger 30:1326b623919a 283 stateString = "CONNECTED";
Vanger 30:1326b623919a 284 } else {
Vanger 30:1326b623919a 285 stateString = "CONNECTING";
Vanger 30:1326b623919a 286 }
Vanger 30:1326b623919a 287 } else {
Vanger 30:1326b623919a 288 stateString = "IDLE";
Vanger 30:1326b623919a 289 }
Vanger 29:edc613ed3f2e 290 }
Vanger 30:1326b623919a 291 } else if(regist != signal) {
Vanger 30:1326b623919a 292 stateString = "CHECKING";
Vanger 35:257eb41405e1 293 return false;
Vanger 30:1326b623919a 294 } else if(!regist && !signal) {
Vanger 30:1326b623919a 295 stateString = "DISCONNECTED";
Vanger 30:1326b623919a 296 pppConnected = false;
Vanger 30:1326b623919a 297 }
Vanger 35:257eb41405e1 298
Vanger 35:257eb41405e1 299 std::string pppStatus = pppConnected ? "CONNECTED" : "DISCONNECTED";
Vanger 35:257eb41405e1 300 if(stateString != pppStatus) {
Vanger 35:257eb41405e1 301 logDebug("Internal PPP state[%s], radio state[%s])",pppStatus.c_str() ,stateString.c_str());
Vanger 29:edc613ed3f2e 302 }
Vanger 26:2b769ed8de4f 303 return pppConnected;
Vanger 26:2b769ed8de4f 304 }
Vanger 30:1326b623919a 305
Vanger 33:3b6f3904dde0 306 //Resets the radio
Vanger 33:3b6f3904dde0 307 void EasyIP::reset()
Vanger 33:3b6f3904dde0 308 {
Vanger 33:3b6f3904dde0 309 disconnect();
Vanger 33:3b6f3904dde0 310 if(sendBasicCommand("AT#REBOOT", 10000) != MTS_SUCCESS) {
Vanger 33:3b6f3904dde0 311 logError("Socket Modem did not accept RESET command\n\r");
Vanger 33:3b6f3904dde0 312 } else {
Vanger 33:3b6f3904dde0 313 logWarning("Socket Modem is resetting, allow 30 seconds for it to come back\n\r");
Vanger 33:3b6f3904dde0 314 return;
Vanger 33:3b6f3904dde0 315 }
Vanger 33:3b6f3904dde0 316 }
Vanger 33:3b6f3904dde0 317
Vanger 26:2b769ed8de4f 318 //Binds the socket to a specific port if able
Vanger 26:2b769ed8de4f 319 bool EasyIP::bind(unsigned int port)
Vanger 26:2b769ed8de4f 320 {
Vanger 30:1326b623919a 321 if(socketOpened) {
Vanger 30:1326b623919a 322 logError("socket is open. Can not set local port");
Vanger 30:1326b623919a 323 return false;
Vanger 30:1326b623919a 324 }
Vanger 30:1326b623919a 325 if(port > 65535) {
Vanger 30:1326b623919a 326 logError("port out of range (0-65535)");
Vanger 30:1326b623919a 327 return false;
Vanger 30:1326b623919a 328 }
Vanger 30:1326b623919a 329 local_port = port;
Vanger 26:2b769ed8de4f 330 return true;
Vanger 26:2b769ed8de4f 331 }
Vanger 27:ec44d5a9544f 332
Vanger 26:2b769ed8de4f 333 bool EasyIP::open(const std::string& address, unsigned int port, Mode mode)
Vanger 26:2b769ed8de4f 334 {
Vanger 30:1326b623919a 335 char sOpenSocketCmd[256] = {0}; //String for AT command
Vanger 30:1326b623919a 336 std::string sMode = "";
Vanger 31:529db15abda7 337 int typeSocket = 0;
Vanger 31:529db15abda7 338 int closeType = 0;
Vanger 30:1326b623919a 339
Vanger 30:1326b623919a 340 //1) Check that we do not have a live connection up
Vanger 30:1326b623919a 341 if(socketOpened) {
Vanger 30:1326b623919a 342 //Check that the address, port, and mode match
Vanger 30:1326b623919a 343 if(host_address != address || host_port != port || socketMode != mode) {
Vanger 30:1326b623919a 344 if(socketMode == TCP) {
Vanger 30:1326b623919a 345 logError("TCP socket already opened [%s:%d]", host_address.c_str(), host_port);
Vanger 30:1326b623919a 346 } else {
Vanger 30:1326b623919a 347 logError("UDP socket already opened [%s:%d]", host_address.c_str(), host_port);
Vanger 30:1326b623919a 348 }
Vanger 30:1326b623919a 349 return false;
Vanger 30:1326b623919a 350 }
Vanger 30:1326b623919a 351
Vanger 30:1326b623919a 352 logDebug("Socket already opened");
Vanger 30:1326b623919a 353 return true;
Vanger 30:1326b623919a 354 }
Vanger 30:1326b623919a 355
Vanger 30:1326b623919a 356 //2) Check Parameters
Vanger 30:1326b623919a 357 if(port > 65535) {
Vanger 30:1326b623919a 358 logError("port out of range (0-65535)");
Vanger 30:1326b623919a 359 return false;
Vanger 30:1326b623919a 360 }
Vanger 41:8b9b5098696f 361
Vanger 41:8b9b5098696f 362 if(type == MTSMC_EV3) {
Vanger 41:8b9b5098696f 363 if(!local_port) {
Vanger 41:8b9b5098696f 364 logDebug("Local port set to 1, port 0 not supported for MTSMC_EV3");
Vanger 41:8b9b5098696f 365 local_port = 1;
Vanger 41:8b9b5098696f 366 }
Vanger 41:8b9b5098696f 367 }
Vanger 30:1326b623919a 368
Vanger 30:1326b623919a 369 //3) Check PPP connection
Vanger 30:1326b623919a 370 if(!isConnected()) {
Vanger 30:1326b623919a 371 logError("PPP not established. Attempting to connect");
Vanger 30:1326b623919a 372 if(!connect()) {
Vanger 30:1326b623919a 373 logError("PPP connection failed");
Vanger 30:1326b623919a 374 return false;
Vanger 30:1326b623919a 375 } else {
Vanger 30:1326b623919a 376 logDebug("PPP connection established");
Vanger 30:1326b623919a 377 }
Vanger 30:1326b623919a 378 }
Vanger 30:1326b623919a 379
Vanger 30:1326b623919a 380 //4) Set escape sequence to not be transmitted
Vanger 30:1326b623919a 381 if(sendBasicCommand("AT#SKIPESC=1", 2000) != MTS_SUCCESS) {
Vanger 30:1326b623919a 382 logWarning("Failed to disable escape sequence transmission on data mode suspension");
Vanger 30:1326b623919a 383 }
Vanger 30:1326b623919a 384
Vanger 30:1326b623919a 385 if(mode == TCP) {
Vanger 30:1326b623919a 386 typeSocket = 0;
Vanger 30:1326b623919a 387 sMode = "TCP";
Vanger 30:1326b623919a 388 } else {
Vanger 30:1326b623919a 389 typeSocket = 1;
Vanger 30:1326b623919a 390 sMode = "UDP";
Vanger 30:1326b623919a 391 }
Vanger 31:529db15abda7 392
Vanger 31:529db15abda7 393 if(socketCloseable) {
Vanger 31:529db15abda7 394 closeType = 0;
Vanger 31:529db15abda7 395 } else {
Vanger 31:529db15abda7 396 closeType = 255;
Vanger 31:529db15abda7 397 }
Vanger 31:529db15abda7 398 //5) Open Socket
Vanger 31:529db15abda7 399 sprintf(sOpenSocketCmd, "AT#SD=1,%d,%d,%s,%d,%d,0", typeSocket, port, address.c_str(),closeType , local_port);
Vanger 38:b2088faa8bfd 400 std::string response = sendCommand(sOpenSocketCmd, 60000);
Vanger 30:1326b623919a 401
Vanger 30:1326b623919a 402 if(response.find("CONNECT") != std::string::npos) {
Vanger 30:1326b623919a 403 host_address = address;
Vanger 30:1326b623919a 404 host_port = port;
Vanger 30:1326b623919a 405
Vanger 30:1326b623919a 406 logInfo("Opened %s Socket [%s:%d]", sMode.c_str(), address.c_str(), port);
Vanger 30:1326b623919a 407 socketOpened = true;
Vanger 30:1326b623919a 408 socketMode = mode;
Vanger 30:1326b623919a 409 } else {
Vanger 30:1326b623919a 410 logWarning("Unable to open %s Socket [%s:%d]", sMode.c_str(), address.c_str(), port);
Vanger 30:1326b623919a 411 socketOpened = false;
Vanger 30:1326b623919a 412 }
Vanger 30:1326b623919a 413
Vanger 26:2b769ed8de4f 414 return socketOpened;
Vanger 26:2b769ed8de4f 415 }
Vanger 27:ec44d5a9544f 416
Vanger 26:2b769ed8de4f 417 bool EasyIP::isOpen()
Vanger 26:2b769ed8de4f 418 {
Vanger 30:1326b623919a 419 if(io->readable()) {
Vanger 30:1326b623919a 420 logDebug("Assuming open, data available to read.\n\r");
Vanger 30:1326b623919a 421 return true;
Vanger 30:1326b623919a 422 }
Vanger 26:2b769ed8de4f 423 return socketOpened;
Vanger 26:2b769ed8de4f 424 }
Vanger 27:ec44d5a9544f 425
Vanger 26:2b769ed8de4f 426 bool EasyIP::close()
Vanger 26:2b769ed8de4f 427 {
Vanger 26:2b769ed8de4f 428
Vanger 30:1326b623919a 429 if(io == NULL) {
Vanger 30:1326b623919a 430 logError("MTSBufferedIO not set");
Vanger 30:1326b623919a 431 return false;
Vanger 30:1326b623919a 432 }
Vanger 30:1326b623919a 433
Vanger 30:1326b623919a 434 if(!socketOpened) {
Vanger 30:1326b623919a 435 logWarning("Socket close() called, but socket was not open");
Vanger 30:1326b623919a 436 return true;
Vanger 30:1326b623919a 437 }
Vanger 30:1326b623919a 438
Vanger 30:1326b623919a 439 if(!socketCloseable) {
Vanger 30:1326b623919a 440 logError("Socket is not closeable");
Vanger 30:1326b623919a 441 return false;
Vanger 30:1326b623919a 442 }
Vanger 30:1326b623919a 443
Vanger 30:1326b623919a 444 if(!sendEscapeCommand()) {
Vanger 30:1326b623919a 445 logError("Failed to exit online mode");
Vanger 30:1326b623919a 446 return false;
Vanger 30:1326b623919a 447 } else {
Vanger 30:1326b623919a 448 socketOpened = false;
Vanger 30:1326b623919a 449 }
Vanger 30:1326b623919a 450
Vanger 30:1326b623919a 451 if(sendBasicCommand("AT#SH=1", 2000) != MTS_SUCCESS) {
Vanger 30:1326b623919a 452 logDebug("Failed to close socket connection");
Vanger 30:1326b623919a 453 }
Vanger 30:1326b623919a 454
Vanger 30:1326b623919a 455 Timer tmr;
Vanger 30:1326b623919a 456 int counter = 0;
Vanger 30:1326b623919a 457 char tmp[256];
Vanger 30:1326b623919a 458 tmr.start();
Vanger 30:1326b623919a 459 do {
Vanger 30:1326b623919a 460 if(socketOpened == false) {
Vanger 30:1326b623919a 461 break;
Vanger 30:1326b623919a 462 }
Vanger 30:1326b623919a 463 read(tmp, 256, 1000);
Vanger 30:1326b623919a 464 } while(counter++ < 10);
Vanger 30:1326b623919a 465
Vanger 30:1326b623919a 466 io->rxClear();
Vanger 30:1326b623919a 467 io->txClear();
Vanger 30:1326b623919a 468
Vanger 30:1326b623919a 469 return !socketOpened;
Vanger 26:2b769ed8de4f 470 }
Vanger 26:2b769ed8de4f 471
Vanger 26:2b769ed8de4f 472 int EasyIP::read(char* data, int max, int timeout)
Vanger 26:2b769ed8de4f 473 {
Vanger 30:1326b623919a 474 if(io == NULL) {
Vanger 30:1326b623919a 475 logError("MTSBufferedIO not set");
Vanger 30:1326b623919a 476 return -1;
Vanger 30:1326b623919a 477 }
Vanger 30:1326b623919a 478
Vanger 30:1326b623919a 479 //Check that nothing is in the rx buffer
Vanger 30:1326b623919a 480 if(!socketOpened && !io->readable()) {
Vanger 30:1326b623919a 481 logError("Socket is not open");
Vanger 30:1326b623919a 482 return -1;
Vanger 30:1326b623919a 483 }
Vanger 30:1326b623919a 484
Vanger 30:1326b623919a 485 int bytesRead = 0;
Vanger 30:1326b623919a 486
Vanger 30:1326b623919a 487
Vanger 30:1326b623919a 488 if(timeout >= 0) {
Vanger 30:1326b623919a 489 bytesRead = io->read(data, max, static_cast<unsigned int>(timeout));
Vanger 30:1326b623919a 490 } else {
Vanger 30:1326b623919a 491 bytesRead = io->read(data, max);
Vanger 30:1326b623919a 492 }
Vanger 35:257eb41405e1 493
Vanger 35:257eb41405e1 494 //Scan for socket closed message
Vanger 31:529db15abda7 495 if(bytesRead > 0 && socketCloseable) {
Vanger 35:257eb41405e1 496 for(int i = 0; i < bytesRead; i++) {
Vanger 31:529db15abda7 497 if(data[i] == 'N') {
Vanger 31:529db15abda7 498 if(strstr(&data[i], "NO CARRIER")) {
Vanger 31:529db15abda7 499 logTrace("Found socket closed message. Checking validity");
Vanger 31:529db15abda7 500 //Close socket and Cut Off End of Message
Vanger 31:529db15abda7 501 socketOpened = socketCheck(); //Verifies legitimacy of socket disconnect
Vanger 31:529db15abda7 502 if(socketOpened) {
Vanger 31:529db15abda7 503 logDebug("Socket still open");
Vanger 31:529db15abda7 504 continue;
Vanger 31:529db15abda7 505 } else {
Vanger 31:529db15abda7 506 logDebug("Socket closed");
Vanger 31:529db15abda7 507 data[i] = '\0';
Vanger 31:529db15abda7 508 bytesRead = i;
Vanger 31:529db15abda7 509 break;
Vanger 31:529db15abda7 510 }
Vanger 30:1326b623919a 511 }
Vanger 30:1326b623919a 512 }
Vanger 30:1326b623919a 513 }
Vanger 30:1326b623919a 514 }
Vanger 30:1326b623919a 515 return bytesRead;
Vanger 26:2b769ed8de4f 516 }
Vanger 26:2b769ed8de4f 517
Vanger 26:2b769ed8de4f 518 int EasyIP::write(const char* data, int length, int timeout)
Vanger 26:2b769ed8de4f 519 {
Vanger 30:1326b623919a 520 if(io == NULL) {
Vanger 30:1326b623919a 521 logError("MTSBufferedIO not set");
Vanger 30:1326b623919a 522 return -1;
Vanger 30:1326b623919a 523 }
Vanger 30:1326b623919a 524
Vanger 30:1326b623919a 525 if(!socketOpened) {
Vanger 30:1326b623919a 526 logError("Socket is not open");
Vanger 30:1326b623919a 527 return -1;
Vanger 30:1326b623919a 528 }
Vanger 30:1326b623919a 529
Vanger 30:1326b623919a 530 int bytesWritten = 0;
Vanger 31:529db15abda7 531 int size = length;
Vanger 31:529db15abda7 532 int failedWrites = 0;
Vanger 30:1326b623919a 533 if(timeout >= 0) {
Vanger 30:1326b623919a 534 Timer tmr;
Vanger 30:1326b623919a 535 tmr.start();
Vanger 30:1326b623919a 536 do {
Vanger 30:1326b623919a 537 int available = io->writeable();
Vanger 30:1326b623919a 538 if (available > 0) {
Vanger 31:529db15abda7 539 size = MIN(available, length - bytesWritten);
Vanger 31:529db15abda7 540 bytesWritten += io->write(&data[bytesWritten], size);
Vanger 30:1326b623919a 541 } else {
Vanger 30:1326b623919a 542 wait(0.05);
Vanger 30:1326b623919a 543 }
Vanger 30:1326b623919a 544 } while (tmr.read_ms() <= timeout && bytesWritten < length);
Vanger 30:1326b623919a 545 } else {
Vanger 31:529db15abda7 546 //If timeout is -1:
Vanger 31:529db15abda7 547 do {
Vanger 31:529db15abda7 548 int available = io->writeable();
Vanger 31:529db15abda7 549 if(available > 0) {
Vanger 31:529db15abda7 550 size = MIN(available, length - bytesWritten);
Vanger 31:529db15abda7 551 int currentWritten = io->write(&data[bytesWritten], size);
Vanger 31:529db15abda7 552 bytesWritten += currentWritten;
Vanger 31:529db15abda7 553 if(!currentWritten) {
Vanger 31:529db15abda7 554 failedWrites++;
Vanger 31:529db15abda7 555 }
Vanger 31:529db15abda7 556 if(failedWrites > 10) {
Vanger 31:529db15abda7 557 logError("Couldn't write any characters");
Vanger 31:529db15abda7 558 return bytesWritten;
Vanger 31:529db15abda7 559 }
Vanger 31:529db15abda7 560 } else {
Vanger 31:529db15abda7 561 wait(0.05);
Vanger 30:1326b623919a 562 }
Vanger 31:529db15abda7 563 } while (bytesWritten < length);
Vanger 30:1326b623919a 564 }
Vanger 30:1326b623919a 565 return bytesWritten;
Vanger 26:2b769ed8de4f 566 }
Vanger 26:2b769ed8de4f 567
Vanger 26:2b769ed8de4f 568 unsigned int EasyIP::readable()
Vanger 26:2b769ed8de4f 569 {
Vanger 30:1326b623919a 570 if(io == NULL) {
Vanger 30:1326b623919a 571 logWarning("MTSBufferedIO not set");
Vanger 30:1326b623919a 572 return 0;
Vanger 30:1326b623919a 573 }
Vanger 30:1326b623919a 574 if(!socketOpened && !io->readable()) {
Vanger 30:1326b623919a 575 logWarning("Socket is not open");
Vanger 30:1326b623919a 576 return 0;
Vanger 30:1326b623919a 577 }
Vanger 26:2b769ed8de4f 578 return io->readable();
Vanger 26:2b769ed8de4f 579 }
Vanger 26:2b769ed8de4f 580
Vanger 26:2b769ed8de4f 581 unsigned int EasyIP::writeable()
Vanger 26:2b769ed8de4f 582 {
Vanger 30:1326b623919a 583 if(io == NULL) {
Vanger 30:1326b623919a 584 logWarning("MTSBufferedIO not set");
Vanger 30:1326b623919a 585 return 0;
Vanger 30:1326b623919a 586 }
Vanger 30:1326b623919a 587 if(!socketOpened) {
Vanger 30:1326b623919a 588 logWarning("Socket is not open");
Vanger 30:1326b623919a 589 return 0;
Vanger 30:1326b623919a 590 }
Vanger 26:2b769ed8de4f 591
Vanger 26:2b769ed8de4f 592 return io->writeable();
Vanger 26:2b769ed8de4f 593 }
Vanger 26:2b769ed8de4f 594
Vanger 26:2b769ed8de4f 595 bool EasyIP::setDeviceIP(std::string address)
Vanger 26:2b769ed8de4f 596 {
Vanger 26:2b769ed8de4f 597 if (address.compare("DHCP") == 0) {
Vanger 26:2b769ed8de4f 598 return true;
Vanger 26:2b769ed8de4f 599 } else {
Vanger 26:2b769ed8de4f 600 logWarning("Radio does not support static IPs, using DHCP.\n\r");
Vanger 26:2b769ed8de4f 601 return false;
Vanger 26:2b769ed8de4f 602 }
Vanger 26:2b769ed8de4f 603 }
Vanger 26:2b769ed8de4f 604
Vanger 26:2b769ed8de4f 605 Code EasyIP::setApn(const std::string& apn)
Vanger 26:2b769ed8de4f 606 {
Vanger 26:2b769ed8de4f 607 if (type == MTSMC_H5 || type == MTSMC_G3) {
Vanger 26:2b769ed8de4f 608 //Set IP,PPP,IPv6
Vanger 26:2b769ed8de4f 609 Code code = sendBasicCommand("AT+CGDCONT=1,PPP," + apn, 1000);
Vanger 26:2b769ed8de4f 610 if (code != MTS_SUCCESS) {
Vanger 33:3b6f3904dde0 611 return code; //This will return whatever is not MTS_SUCCESS
Vanger 26:2b769ed8de4f 612 }
Vanger 26:2b769ed8de4f 613 this->apn = apn;
Vanger 26:2b769ed8de4f 614 return code; //This will return MTS_SUCCESS
Vanger 26:2b769ed8de4f 615 } else {
Vanger 26:2b769ed8de4f 616 logInfo("CDMA radios don't need an APN");
Vanger 26:2b769ed8de4f 617 return MTS_SUCCESS;
Vanger 26:2b769ed8de4f 618 }
Vanger 26:2b769ed8de4f 619 }
Vanger 27:ec44d5a9544f 620
Vanger 26:2b769ed8de4f 621 std::string EasyIP::getDeviceIP()
Vanger 26:2b769ed8de4f 622 {
Vanger 26:2b769ed8de4f 623 return local_address;
Vanger 26:2b769ed8de4f 624 }
Vanger 26:2b769ed8de4f 625
Vanger 32:7d5581159bed 626 //Turns off echo when it receives a true, turns on when it receives false
Vanger 26:2b769ed8de4f 627 Code EasyIP::echo(bool state)
Vanger 26:2b769ed8de4f 628 {
Vanger 27:ec44d5a9544f 629 Code code;
Vanger 27:ec44d5a9544f 630 if (state) {
Vanger 27:ec44d5a9544f 631 code = sendBasicCommand("ATE0", 1000);
Vanger 27:ec44d5a9544f 632 echoMode = (code == MTS_SUCCESS) ? false : echoMode;
Vanger 27:ec44d5a9544f 633 } else {
Vanger 27:ec44d5a9544f 634 code = sendBasicCommand("ATE1", 1000);
Vanger 27:ec44d5a9544f 635 echoMode = (code == MTS_SUCCESS) ? true : echoMode;
Vanger 27:ec44d5a9544f 636 }
Vanger 27:ec44d5a9544f 637 return code;
Vanger 26:2b769ed8de4f 638 }
Vanger 26:2b769ed8de4f 639
Vanger 26:2b769ed8de4f 640 bool EasyIP::ping(const std::string& address)
Vanger 26:2b769ed8de4f 641 {
Vanger 26:2b769ed8de4f 642 char buffer[256] = {0};
Vanger 27:ec44d5a9544f 643 std::vector<std::string> parts;
Vanger 27:ec44d5a9544f 644 int pingsRec=0;
Vanger 27:ec44d5a9544f 645 int TTL=0;
Vanger 27:ec44d5a9544f 646 int Timeout=0;
Vanger 27:ec44d5a9544f 647
Vanger 27:ec44d5a9544f 648 //Format parameters for sending to radio
Vanger 30:1326b623919a 649 sprintf(buffer, "AT#PING=%s,1,32,%d", address.c_str(), (PINGDELAY*10));
Vanger 26:2b769ed8de4f 650
Vanger 27:ec44d5a9544f 651 for(int pngs=0; pngs<PINGNUM; pngs++) {
Vanger 35:257eb41405e1 652 std::string response = sendCommand(buffer, (PINGDELAY*2000)); //Send 1 ping
Vanger 35:257eb41405e1 653 wait(0.5); //Radio seems to get stuck if no wait is incurred between issuing ping commands
Vanger 35:257eb41405e1 654 //leads to unknown registration state eventually :(
Vanger 28:f93d7b3f7c2e 655 if(response.empty()) {
Vanger 28:f93d7b3f7c2e 656 continue; //Skip current loop if send command fails
Vanger 28:f93d7b3f7c2e 657 }
Vanger 28:f93d7b3f7c2e 658 if(response.find("ERROR") != std::string::npos) {
Vanger 28:f93d7b3f7c2e 659 continue; //Skip current loop if send command fails
Vanger 28:f93d7b3f7c2e 660 }
Vanger 27:ec44d5a9544f 661 parts = Text::split(response, "\r\n");
Vanger 28:f93d7b3f7c2e 662 if(parts.size() < 2) {
Vanger 28:f93d7b3f7c2e 663 continue;
Vanger 28:f93d7b3f7c2e 664 }
Vanger 27:ec44d5a9544f 665 parts = Text::split(parts[1], ",");
Vanger 28:f93d7b3f7c2e 666 if(parts.size() < 4) {
Vanger 28:f93d7b3f7c2e 667 continue;
Vanger 28:f93d7b3f7c2e 668 }
Vanger 27:ec44d5a9544f 669 //Parse TTL and Timeout values
Vanger 27:ec44d5a9544f 670 Timeout = std::atoi(parts[2].c_str());
Vanger 27:ec44d5a9544f 671 TTL = std::atoi(parts[3].c_str());
Vanger 27:ec44d5a9544f 672
Vanger 27:ec44d5a9544f 673 if((Timeout < 600) && (TTL < 255)) {
Vanger 27:ec44d5a9544f 674 pingsRec++;
Vanger 27:ec44d5a9544f 675 }
Vanger 27:ec44d5a9544f 676 } //Success if less than 50% packet loss
Vanger 27:ec44d5a9544f 677 if( ((pingsRec/PINGNUM)>= 0.5) ) {
Vanger 27:ec44d5a9544f 678 return true;
Vanger 27:ec44d5a9544f 679 }
Vanger 26:2b769ed8de4f 680 return false;
Vanger 26:2b769ed8de4f 681 }
Vanger 26:2b769ed8de4f 682
Vanger 27:ec44d5a9544f 683 //Pass 1 to enable socket closeable
Vanger 27:ec44d5a9544f 684 //Pass 0 to disable socket closeable
Vanger 26:2b769ed8de4f 685 Code EasyIP::setSocketCloseable(bool enabled)
Vanger 26:2b769ed8de4f 686 {
Vanger 31:529db15abda7 687 if(socketCloseable == enabled) {
Vanger 31:529db15abda7 688 return MTS_SUCCESS;
Vanger 31:529db15abda7 689 }
Vanger 31:529db15abda7 690
Vanger 31:529db15abda7 691 if(socketOpened) {
Vanger 31:529db15abda7 692 logError("socket is already opened. Can not set closeable");
Vanger 31:529db15abda7 693 return MTS_ERROR;
Vanger 31:529db15abda7 694 }
Vanger 31:529db15abda7 695
Vanger 31:529db15abda7 696 socketCloseable = enabled;
Vanger 31:529db15abda7 697
Vanger 26:2b769ed8de4f 698 return MTS_SUCCESS;
Vanger 26:2b769ed8de4f 699 }
Vanger 33:3b6f3904dde0 700
Vanger 33:3b6f3904dde0 701 bool EasyIP::sendEscapeCommand()
Vanger 33:3b6f3904dde0 702 {
Vanger 33:3b6f3904dde0 703 //string Cellular::sendCommand(const std::string& command, unsigned int timeoutMillis, char esc)
Vanger 33:3b6f3904dde0 704 if(io == NULL) {
Vanger 33:3b6f3904dde0 705 logError("MTSBufferedIO not set");
Vanger 33:3b6f3904dde0 706 return false;
Vanger 33:3b6f3904dde0 707 }
Vanger 33:3b6f3904dde0 708 if(!socketOpened) {
Vanger 35:257eb41405e1 709 logError("Socket is not open. +++ Escape sequence should fail");
Vanger 33:3b6f3904dde0 710 }
Vanger 33:3b6f3904dde0 711
Vanger 33:3b6f3904dde0 712 if(!socketCloseable) {
Vanger 33:3b6f3904dde0 713 logError("Socket is not closeable");
Vanger 33:3b6f3904dde0 714 return false;
Vanger 33:3b6f3904dde0 715 }
Vanger 33:3b6f3904dde0 716
Vanger 33:3b6f3904dde0 717 io->rxClear();
Vanger 33:3b6f3904dde0 718 io->txClear();
Vanger 33:3b6f3904dde0 719
Vanger 33:3b6f3904dde0 720 std::string result;
Vanger 41:8b9b5098696f 721 unsigned int timeoutMillis = 10000; //time in ms
Vanger 33:3b6f3904dde0 722 //Attempt to write command
Vanger 35:257eb41405e1 723 wait(1.2); //Format for +++ command is 1 second wait, send +++, then another second wait
Vanger 33:3b6f3904dde0 724 //1s wait after command is implemented as a polling function for 2 seconds
Vanger 33:3b6f3904dde0 725 //Option: Could change wait periods to be longer/shorter (0-255)*50ms
Vanger 49:1fc51c53cebf 726 if(io->write("+++", 3, timeoutMillis) != 3) {
Vanger 33:3b6f3904dde0 727 //Failed to write command
Vanger 33:3b6f3904dde0 728 logError("failed to send command to radio within %d milliseconds", timeoutMillis);
Vanger 33:3b6f3904dde0 729 return false;
Vanger 33:3b6f3904dde0 730 }
Vanger 33:3b6f3904dde0 731
Vanger 33:3b6f3904dde0 732 int timer = 0;
Vanger 33:3b6f3904dde0 733 char tmp[256];
Vanger 33:3b6f3904dde0 734 tmp[255] = 0;
Vanger 33:3b6f3904dde0 735 bool done = false;
Vanger 33:3b6f3904dde0 736 io->read(tmp,255,0);
Vanger 33:3b6f3904dde0 737 bool exitmode = false;
Vanger 33:3b6f3904dde0 738
Vanger 33:3b6f3904dde0 739 do {
Vanger 33:3b6f3904dde0 740 wait(0.1);
Vanger 33:3b6f3904dde0 741 timer += 100;
Vanger 33:3b6f3904dde0 742 //Make a non-blocking read call by passing timeout of zero
Vanger 33:3b6f3904dde0 743 int size = io->read(tmp,255,0); //1 less than allocated (timeout is instant)
Vanger 33:3b6f3904dde0 744 if(size > 0) {
Vanger 33:3b6f3904dde0 745 result.append(tmp, size);
Vanger 33:3b6f3904dde0 746 }
Vanger 33:3b6f3904dde0 747 if(result.find("OK") != std::string::npos) {
Vanger 33:3b6f3904dde0 748 exitmode = true;
Vanger 33:3b6f3904dde0 749 done = true;
Vanger 33:3b6f3904dde0 750 } else if(result.find("NO CARRIER") != std::string::npos) {
Vanger 33:3b6f3904dde0 751 exitmode = true;
Vanger 33:3b6f3904dde0 752 done = true;
Vanger 33:3b6f3904dde0 753 } else if(result.find("ERROR") != std::string::npos) {
Vanger 33:3b6f3904dde0 754 exitmode = false;
Vanger 33:3b6f3904dde0 755 done = true;
Vanger 33:3b6f3904dde0 756 }
Vanger 33:3b6f3904dde0 757 if(timer >= timeoutMillis) {
Vanger 33:3b6f3904dde0 758 logDebug("Escape sequence [+++] timed out after %d milliseconds", timeoutMillis);
Vanger 33:3b6f3904dde0 759 exitmode = true;
Vanger 33:3b6f3904dde0 760 done = true;
Vanger 33:3b6f3904dde0 761 }
Vanger 33:3b6f3904dde0 762 } while (!done);
Vanger 33:3b6f3904dde0 763
Vanger 33:3b6f3904dde0 764 return exitmode;
Vanger 33:3b6f3904dde0 765 }
Vanger 33:3b6f3904dde0 766
Vanger 33:3b6f3904dde0 767 bool EasyIP::socketCheck() {
Vanger 33:3b6f3904dde0 768 bool status = false;
Vanger 33:3b6f3904dde0 769 std::string socketInfo = "9"; //9 is unrecognized
Vanger 33:3b6f3904dde0 770 std::vector<std::string> params;
Vanger 33:3b6f3904dde0 771
Vanger 33:3b6f3904dde0 772 //Goes from data mode to command mode
Vanger 33:3b6f3904dde0 773 if(sendEscapeCommand()) {
Vanger 33:3b6f3904dde0 774 socketOpened = false;
Vanger 33:3b6f3904dde0 775 if(sendBasicCommand("AT", 1000) == MTS_SUCCESS) {
Vanger 33:3b6f3904dde0 776 socketInfo = sendCommand("AT#SS=1", 2000);
Vanger 33:3b6f3904dde0 777 if(socketInfo.find("OK") != std::string::npos) {
Vanger 33:3b6f3904dde0 778 //Found valid response
Vanger 33:3b6f3904dde0 779 params = Text::split(socketInfo, "\r\n");
Vanger 33:3b6f3904dde0 780 params = Text::split(params[1], ",");
Vanger 33:3b6f3904dde0 781 socketInfo = params[1];
Vanger 33:3b6f3904dde0 782 //Check comparison of params[1] to response codes
Vanger 33:3b6f3904dde0 783 } else {
Vanger 33:3b6f3904dde0 784 logError("Could not determine socket status[%s]",socketInfo.c_str());
Vanger 33:3b6f3904dde0 785 socketInfo == "9"; //9 is unrecognized
Vanger 33:3b6f3904dde0 786 }
Vanger 33:3b6f3904dde0 787 }
Vanger 33:3b6f3904dde0 788 } else {
Vanger 33:3b6f3904dde0 789 status = false; //Return value of socketOpened when checking
Vanger 33:3b6f3904dde0 790 }
Vanger 33:3b6f3904dde0 791
Vanger 33:3b6f3904dde0 792 //Check socket status query
Vanger 33:3b6f3904dde0 793 if(socketInfo == "2" || socketInfo == "3" || socketInfo == "1" || socketInfo == "4") {
Vanger 33:3b6f3904dde0 794 status = true; //2 and 3 are suspended connections
Vanger 33:3b6f3904dde0 795 } else if(socketInfo == "0" || socketInfo == "5") {
Vanger 33:3b6f3904dde0 796 status = false; //0 is closed socket, probably won't occur
Vanger 33:3b6f3904dde0 797 } else {
Vanger 33:3b6f3904dde0 798 logError("Could not determine socket status");
Vanger 33:3b6f3904dde0 799 status = false; //anything else is unknown status
Vanger 33:3b6f3904dde0 800 }
Vanger 33:3b6f3904dde0 801
Vanger 33:3b6f3904dde0 802 //Reconnects to active socket if able
Vanger 33:3b6f3904dde0 803 if(status) {
Vanger 33:3b6f3904dde0 804 std::string reconnect = sendCommand("AT#SO=1", 2000);
Vanger 33:3b6f3904dde0 805 if(reconnect.find("CONNECT") != std::string::npos || reconnect.find("OK") != std::string::npos) {
Vanger 33:3b6f3904dde0 806 } else {
Vanger 33:3b6f3904dde0 807 logError("Failed to resume socket connection");
Vanger 33:3b6f3904dde0 808 }
Vanger 33:3b6f3904dde0 809 }
Vanger 33:3b6f3904dde0 810 return status;
Vanger 33:3b6f3904dde0 811 }