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:
- 29:edc613ed3f2e
- Parent:
- 28:f93d7b3f7c2e
- Child:
- 30:1326b623919a
--- a/Cellular/EasyIP.cpp Tue Jul 01 19:50:39 2014 +0000 +++ b/Cellular/EasyIP.cpp Wed Jul 02 15:06:03 2014 +0000 @@ -57,6 +57,14 @@ bool EasyIP::connect() { + //Check if APN is not set, if so, connect will not work. + if (type == MTSMC_H5_IP || type == MTSMC_H5 || type == MTSMC_G3) { + if(apn.size() == 0) { + logDebug("APN is not set"); + return false; + } + } + //Check if socket is open //flag stored in Cellular.h if(socketOpened) { @@ -149,9 +157,106 @@ bool EasyIP::isConnected() { + std::string stateString; + std::vector<std::string> pieces; + bool signal = false, regist = false, active = false, ping = false; + //1) Check if APN was set if we're on an HSPA radio + if (type == MTSMC_H5_IP || type == MTSMC_H5 || type == MTSMC_G3) { + if(apn.size() == 0) { + logDebug("APN is not set"); + return false; + } + } + + //2) Check that we do not have a live connection up + if(socketOpened) { + logDebug("Socket is opened"); + return true; + } + + //3) Query the radio + //Check antenna signal + std::string reply = sendCommand("AT+CSQ", 1000); + if(reply.empty() || (reply.find("ERROR") != std::string::npos)) { + signal = false; + } else { + pieces = Text::split(reply, "\r\n"); + if(pieces.size() >= 2) { + pieces = Text::split(pieces[1], " "); + if(pieces.size() >= 2) { + if((pieces[1].find("0,0") != std::string::npos) || (pieces[1].find("99,99") != std::string::npos)) { + signal = false; + } else { + signal = true; + } + } + } + } + //Check cell tower registration + reply = sendCommand("AT+CREG?", 1000); + if(reply.empty() || (reply.find("ERROR") != std::string::npos)) { + regist = false; + } else { + pieces = Text::split(reply, "\r\n"); + if(pieces.size() >= 2) { + pieces = Text::split(pieces[1], " "); + if(pieces.size() >= 2) { + if((pieces[1].find("0,1") != std::string::npos) || (pieces[1].find("0,5") != std::string::npos)) { + regist = true; //1 for connected, 5 for roaming connected + } else { + regist = false; //Cell tower not registered + } + } + } + } + //Check internet connection through ping, admittedly uses data over cell network + ping = EasyIP::ping("www.google.com"); + + //Check active mode (SGACT = 1,1) + reply = sendCommand("AT#SGACT?", 1000); + if(reply.empty() || (reply.find("ERROR") != std::string::npos)) { + active = false; + } else { + pieces = Text::split(reply, "\r\n"); + if(pieces.size() >= 2) { + pieces = Text::split(pieces[1], " "); + if(pieces.size() >= 2) { + if(pieces[1].find("1,1") != std::string::npos) { + active = true; //1 for an active connection mode + } else { + active = false; //0, or unknown value, is an inactive connection mode + } + } + } + } + + if(ping) { + if(!pppConnected) { + logWarning("Internal PPP state tracking differs from radio (DISCONNECTED:CONNECTED)"); + } + pppConnected = true; + } else { + std::string stateStr; + if(pppConnected) { + //New code for state from boolean values + if(regist && signal) { + if(active) { + stateString = "AUTHENTICATING"; + } else { + stateString = "IDLE"; + } + } else if(regist != signal) { + stateString = "CHECKING"; + } else { + stateString = "DISCONNECTED"; + } + logWarning("Internal PPP state tracking differs from radio (CONNECTED:%s)", stateString.c_str()); + } + pppConnected = false; + } return pppConnected; } //Binds the socket to a specific port if able