Simple detection for LE910-NA1 modules
Fork of MTS-Cellular by
Cellular/EasyIP.cpp@29:edc613ed3f2e, 2014-07-02 (annotated)
- Committer:
- Vanger
- Date:
- Wed Jul 02 15:06:03 2014 +0000
- Revision:
- 29:edc613ed3f2e
- Parent:
- 28:f93d7b3f7c2e
- Child:
- 30:1326b623919a
Added APN check for connect() under EasyIP.; Implemented isConnected() under EasyIP. ; Note for isConnected(): some states from UIP will never be reached in the EasyIP version, and main method of checking connection is a ping to google.com
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
Vanger | 26:2b769ed8de4f | 1 | // This is a template from UIP.cpp for now, will modify code and implement it as I go |
Vanger | 26:2b769ed8de4f | 2 | |
Vanger | 26:2b769ed8de4f | 3 | |
Vanger | 26:2b769ed8de4f | 4 | |
Vanger | 26:2b769ed8de4f | 5 | #include "mbed.h" |
Vanger | 26:2b769ed8de4f | 6 | #include "EasyIP.h" |
Vanger | 26:2b769ed8de4f | 7 | #include "MTSText.h" |
Vanger | 26:2b769ed8de4f | 8 | #include "MTSLog.h" |
Vanger | 26:2b769ed8de4f | 9 | #include "CellUtils.h" |
Vanger | 26:2b769ed8de4f | 10 | |
Vanger | 26:2b769ed8de4f | 11 | |
Vanger | 26:2b769ed8de4f | 12 | |
Vanger | 26:2b769ed8de4f | 13 | using namespace mts; |
Vanger | 26:2b769ed8de4f | 14 | |
Vanger | 26:2b769ed8de4f | 15 | EasyIP::EasyIP(Radio type) |
Vanger | 26:2b769ed8de4f | 16 | { |
Vanger | 26:2b769ed8de4f | 17 | //Not sure how the construction process is done, |
Vanger | 26:2b769ed8de4f | 18 | //but assuming it works for both EasyIP and UIP the same way. |
Vanger | 26:2b769ed8de4f | 19 | this->type = type; |
Vanger | 26:2b769ed8de4f | 20 | io = NULL; |
Vanger | 26:2b769ed8de4f | 21 | dcd = NULL; |
Vanger | 26:2b769ed8de4f | 22 | dtr = NULL; |
Vanger | 26:2b769ed8de4f | 23 | resetLine = NULL; |
Vanger | 26:2b769ed8de4f | 24 | echoMode = true; |
Vanger | 26:2b769ed8de4f | 25 | pppConnected = false; |
Vanger | 26:2b769ed8de4f | 26 | socketMode = TCP; |
Vanger | 26:2b769ed8de4f | 27 | socketOpened = false; |
Vanger | 26:2b769ed8de4f | 28 | socketCloseable = true; |
Vanger | 26:2b769ed8de4f | 29 | local_port = 0; |
Vanger | 26:2b769ed8de4f | 30 | local_address = ""; |
Vanger | 26:2b769ed8de4f | 31 | host_port = 0; |
Vanger | 26:2b769ed8de4f | 32 | } |
Vanger | 26:2b769ed8de4f | 33 | |
Vanger | 26:2b769ed8de4f | 34 | EasyIP::~EasyIP() |
Vanger | 26:2b769ed8de4f | 35 | { |
Vanger | 26:2b769ed8de4f | 36 | //Same reasoning for the destructor as the constructor, |
Vanger | 26:2b769ed8de4f | 37 | //assuming it works for UIP, it will work for EasyIP |
Vanger | 26:2b769ed8de4f | 38 | if (dtr != NULL) { |
Vanger | 26:2b769ed8de4f | 39 | dtr->write(1); |
Vanger | 26:2b769ed8de4f | 40 | } |
Vanger | 26:2b769ed8de4f | 41 | |
Vanger | 26:2b769ed8de4f | 42 | delete dcd; |
Vanger | 26:2b769ed8de4f | 43 | delete dtr; |
Vanger | 26:2b769ed8de4f | 44 | delete resetLine; |
Vanger | 26:2b769ed8de4f | 45 | } |
Vanger | 26:2b769ed8de4f | 46 | |
Vanger | 26:2b769ed8de4f | 47 | //Initializes the MTS IO Buffer |
Vanger | 26:2b769ed8de4f | 48 | bool EasyIP::init(MTSBufferedIO* io) |
Vanger | 26:2b769ed8de4f | 49 | { |
Vanger | 26:2b769ed8de4f | 50 | if (! Cellular::init(io)) { |
Vanger | 26:2b769ed8de4f | 51 | return false; |
Vanger | 26:2b769ed8de4f | 52 | } |
Vanger | 26:2b769ed8de4f | 53 | |
Vanger | 26:2b769ed8de4f | 54 | logDebug("radio type: %s", Cellular::getRadioNames(type).c_str()); |
Vanger | 26:2b769ed8de4f | 55 | return true; |
Vanger | 26:2b769ed8de4f | 56 | } |
Vanger | 26:2b769ed8de4f | 57 | |
Vanger | 26:2b769ed8de4f | 58 | bool EasyIP::connect() |
Vanger | 26:2b769ed8de4f | 59 | { |
Vanger | 29:edc613ed3f2e | 60 | //Check if APN is not set, if so, connect will not work. |
Vanger | 29:edc613ed3f2e | 61 | if (type == MTSMC_H5_IP || type == MTSMC_H5 || type == MTSMC_G3) { |
Vanger | 29:edc613ed3f2e | 62 | if(apn.size() == 0) { |
Vanger | 29:edc613ed3f2e | 63 | logDebug("APN is not set"); |
Vanger | 29:edc613ed3f2e | 64 | return false; |
Vanger | 29:edc613ed3f2e | 65 | } |
Vanger | 29:edc613ed3f2e | 66 | } |
Vanger | 29:edc613ed3f2e | 67 | |
Vanger | 26:2b769ed8de4f | 68 | //Check if socket is open |
Vanger | 26:2b769ed8de4f | 69 | //flag stored in Cellular.h |
Vanger | 26:2b769ed8de4f | 70 | if(socketOpened) { |
Vanger | 26:2b769ed8de4f | 71 | return true; |
Vanger | 26:2b769ed8de4f | 72 | } |
Vanger | 26:2b769ed8de4f | 73 | |
Vanger | 26:2b769ed8de4f | 74 | //Check if already connected |
Vanger | 26:2b769ed8de4f | 75 | //by calling the function isConnected() in EasyIP.cpp |
Vanger | 26:2b769ed8de4f | 76 | if(isConnected()) { |
Vanger | 26:2b769ed8de4f | 77 | return true; |
Vanger | 26:2b769ed8de4f | 78 | } |
Vanger | 26:2b769ed8de4f | 79 | //Create an mbed timer object |
Vanger | 26:2b769ed8de4f | 80 | Timer tmr; |
Vanger | 26:2b769ed8de4f | 81 | |
Vanger | 26:2b769ed8de4f | 82 | //Check Registration: AT+CREG? == 0,1 |
Vanger | 26:2b769ed8de4f | 83 | //(Does the AT command inside Cellular class) |
Vanger | 26:2b769ed8de4f | 84 | tmr.start(); |
Vanger | 26:2b769ed8de4f | 85 | do { |
Vanger | 26:2b769ed8de4f | 86 | Registration registration = getRegistration(); |
Vanger | 26:2b769ed8de4f | 87 | if(registration != REGISTERED) { |
Vanger | 26:2b769ed8de4f | 88 | logTrace("Not Registered [%d] ... waiting", (int)registration); |
Vanger | 26:2b769ed8de4f | 89 | wait(1); |
Vanger | 26:2b769ed8de4f | 90 | } else { |
Vanger | 26:2b769ed8de4f | 91 | break; |
Vanger | 26:2b769ed8de4f | 92 | } |
Vanger | 26:2b769ed8de4f | 93 | } while(tmr.read() < 30); |
Vanger | 26:2b769ed8de4f | 94 | |
Vanger | 26:2b769ed8de4f | 95 | //Check RSSI: AT+CSQ |
Vanger | 26:2b769ed8de4f | 96 | //Does the command inside Cellular |
Vanger | 26:2b769ed8de4f | 97 | tmr.reset(); |
Vanger | 26:2b769ed8de4f | 98 | do { |
Vanger | 26:2b769ed8de4f | 99 | int rssi = getSignalStrength(); |
Vanger | 26:2b769ed8de4f | 100 | logDebug("Signal strength: %d", rssi); |
Vanger | 26:2b769ed8de4f | 101 | if(rssi == 99) { |
Vanger | 26:2b769ed8de4f | 102 | logTrace("No Signal ... waiting"); |
Vanger | 26:2b769ed8de4f | 103 | wait(1); |
Vanger | 26:2b769ed8de4f | 104 | } else { |
Vanger | 26:2b769ed8de4f | 105 | break; |
Vanger | 26:2b769ed8de4f | 106 | } |
Vanger | 26:2b769ed8de4f | 107 | } while(tmr.read() < 30); |
Vanger | 26:2b769ed8de4f | 108 | |
Vanger | 27:ec44d5a9544f | 109 | //Similar to AT#CONNECTIONSTART: Make a PPP connection |
Vanger | 26:2b769ed8de4f | 110 | if (type == MTSMC_H5 || type == MTSMC_G3) { |
Vanger | 26:2b769ed8de4f | 111 | logDebug("Making PPP Connection Attempt. APN[%s]", apn.c_str()); |
Vanger | 26:2b769ed8de4f | 112 | } else { |
Vanger | 26:2b769ed8de4f | 113 | logDebug("Making PPP Connection Attempt"); |
Vanger | 26:2b769ed8de4f | 114 | } |
Vanger | 26:2b769ed8de4f | 115 | //The main thing going on; Sends the AT command to start a connection |
Vanger | 26:2b769ed8de4f | 116 | //Assuming context is already stored in the modem...If not, will need to set context from classes/data |
Vanger | 26:2b769ed8de4f | 117 | std::string pppResult = sendCommand("AT#SGACT=1,1", 120000); |
Vanger | 26:2b769ed8de4f | 118 | |
Vanger | 26:2b769ed8de4f | 119 | if(pppResult.find("OK") != std::string::npos) { |
Vanger | 26:2b769ed8de4f | 120 | std::vector<std::string> parts = Text::split(pppResult, "\r\n"); |
Vanger | 26:2b769ed8de4f | 121 | if(parts.size() >= 2) { |
Vanger | 26:2b769ed8de4f | 122 | parts = Text::split(parts[1], " "); |
Vanger | 26:2b769ed8de4f | 123 | local_address = parts[1]; |
Vanger | 26:2b769ed8de4f | 124 | } |
Vanger | 26:2b769ed8de4f | 125 | logInfo("PPP Connection Established: IP[%s]", local_address.c_str()); |
Vanger | 26:2b769ed8de4f | 126 | pppConnected = true; |
Vanger | 26:2b769ed8de4f | 127 | |
Vanger | 26:2b769ed8de4f | 128 | } else { |
Vanger | 26:2b769ed8de4f | 129 | pppConnected = false; |
Vanger | 26:2b769ed8de4f | 130 | } |
Vanger | 26:2b769ed8de4f | 131 | |
Vanger | 26:2b769ed8de4f | 132 | return pppConnected; |
Vanger | 26:2b769ed8de4f | 133 | } |
Vanger | 26:2b769ed8de4f | 134 | |
Vanger | 26:2b769ed8de4f | 135 | void EasyIP::disconnect() |
Vanger | 26:2b769ed8de4f | 136 | { |
Vanger | 28:f93d7b3f7c2e | 137 | bool complete = false; |
Vanger | 28:f93d7b3f7c2e | 138 | Timer dctmr; |
Vanger | 26:2b769ed8de4f | 139 | //AT#SGACT=1,0: Close a PPP connection |
Vanger | 28:f93d7b3f7c2e | 140 | logDebug("Closing PPP Connection"); |
Vanger | 26:2b769ed8de4f | 141 | if(socketOpened) { |
Vanger | 26:2b769ed8de4f | 142 | close(); //Calls another EasyIP |
Vanger | 26:2b769ed8de4f | 143 | //function to close socket before disconnect |
Vanger | 26:2b769ed8de4f | 144 | } |
Vanger | 26:2b769ed8de4f | 145 | //Sends AT#SGACT=1,0 command |
Vanger | 28:f93d7b3f7c2e | 146 | dctmr.start(); |
Vanger | 28:f93d7b3f7c2e | 147 | do { |
Vanger | 28:f93d7b3f7c2e | 148 | if(sendBasicCommand("AT#SGACT=1,0", 10000) == MTS_SUCCESS) { |
Vanger | 28:f93d7b3f7c2e | 149 | complete = true; |
Vanger | 28:f93d7b3f7c2e | 150 | } else { |
Vanger | 28:f93d7b3f7c2e | 151 | wait(0.050); |
Vanger | 28:f93d7b3f7c2e | 152 | } |
Vanger | 28:f93d7b3f7c2e | 153 | } while((!complete) && (dctmr.read() < 5)); |
Vanger | 28:f93d7b3f7c2e | 154 | logDebug("Successfully closed PPP Connection"); |
Vanger | 28:f93d7b3f7c2e | 155 | pppConnected = false; //Cell will drop connection if we go silent |
Vanger | 26:2b769ed8de4f | 156 | } |
Vanger | 27:ec44d5a9544f | 157 | |
Vanger | 26:2b769ed8de4f | 158 | bool EasyIP::isConnected() |
Vanger | 26:2b769ed8de4f | 159 | { |
Vanger | 29:edc613ed3f2e | 160 | std::string stateString; |
Vanger | 29:edc613ed3f2e | 161 | std::vector<std::string> pieces; |
Vanger | 29:edc613ed3f2e | 162 | bool signal = false, regist = false, active = false, ping = false; |
Vanger | 26:2b769ed8de4f | 163 | |
Vanger | 29:edc613ed3f2e | 164 | //1) Check if APN was set if we're on an HSPA radio |
Vanger | 29:edc613ed3f2e | 165 | if (type == MTSMC_H5_IP || type == MTSMC_H5 || type == MTSMC_G3) { |
Vanger | 29:edc613ed3f2e | 166 | if(apn.size() == 0) { |
Vanger | 29:edc613ed3f2e | 167 | logDebug("APN is not set"); |
Vanger | 29:edc613ed3f2e | 168 | return false; |
Vanger | 29:edc613ed3f2e | 169 | } |
Vanger | 29:edc613ed3f2e | 170 | } |
Vanger | 29:edc613ed3f2e | 171 | |
Vanger | 29:edc613ed3f2e | 172 | //2) Check that we do not have a live connection up |
Vanger | 29:edc613ed3f2e | 173 | if(socketOpened) { |
Vanger | 29:edc613ed3f2e | 174 | logDebug("Socket is opened"); |
Vanger | 29:edc613ed3f2e | 175 | return true; |
Vanger | 29:edc613ed3f2e | 176 | } |
Vanger | 29:edc613ed3f2e | 177 | |
Vanger | 29:edc613ed3f2e | 178 | //3) Query the radio |
Vanger | 29:edc613ed3f2e | 179 | //Check antenna signal |
Vanger | 29:edc613ed3f2e | 180 | std::string reply = sendCommand("AT+CSQ", 1000); |
Vanger | 29:edc613ed3f2e | 181 | if(reply.empty() || (reply.find("ERROR") != std::string::npos)) { |
Vanger | 29:edc613ed3f2e | 182 | signal = false; |
Vanger | 29:edc613ed3f2e | 183 | } else { |
Vanger | 29:edc613ed3f2e | 184 | pieces = Text::split(reply, "\r\n"); |
Vanger | 29:edc613ed3f2e | 185 | if(pieces.size() >= 2) { |
Vanger | 29:edc613ed3f2e | 186 | pieces = Text::split(pieces[1], " "); |
Vanger | 29:edc613ed3f2e | 187 | if(pieces.size() >= 2) { |
Vanger | 29:edc613ed3f2e | 188 | if((pieces[1].find("0,0") != std::string::npos) || (pieces[1].find("99,99") != std::string::npos)) { |
Vanger | 29:edc613ed3f2e | 189 | signal = false; |
Vanger | 29:edc613ed3f2e | 190 | } else { |
Vanger | 29:edc613ed3f2e | 191 | signal = true; |
Vanger | 29:edc613ed3f2e | 192 | } |
Vanger | 29:edc613ed3f2e | 193 | } |
Vanger | 29:edc613ed3f2e | 194 | } |
Vanger | 29:edc613ed3f2e | 195 | } |
Vanger | 27:ec44d5a9544f | 196 | |
Vanger | 29:edc613ed3f2e | 197 | //Check cell tower registration |
Vanger | 29:edc613ed3f2e | 198 | reply = sendCommand("AT+CREG?", 1000); |
Vanger | 29:edc613ed3f2e | 199 | if(reply.empty() || (reply.find("ERROR") != std::string::npos)) { |
Vanger | 29:edc613ed3f2e | 200 | regist = false; |
Vanger | 29:edc613ed3f2e | 201 | } else { |
Vanger | 29:edc613ed3f2e | 202 | pieces = Text::split(reply, "\r\n"); |
Vanger | 29:edc613ed3f2e | 203 | if(pieces.size() >= 2) { |
Vanger | 29:edc613ed3f2e | 204 | pieces = Text::split(pieces[1], " "); |
Vanger | 29:edc613ed3f2e | 205 | if(pieces.size() >= 2) { |
Vanger | 29:edc613ed3f2e | 206 | if((pieces[1].find("0,1") != std::string::npos) || (pieces[1].find("0,5") != std::string::npos)) { |
Vanger | 29:edc613ed3f2e | 207 | regist = true; //1 for connected, 5 for roaming connected |
Vanger | 29:edc613ed3f2e | 208 | } else { |
Vanger | 29:edc613ed3f2e | 209 | regist = false; //Cell tower not registered |
Vanger | 29:edc613ed3f2e | 210 | } |
Vanger | 29:edc613ed3f2e | 211 | } |
Vanger | 29:edc613ed3f2e | 212 | } |
Vanger | 29:edc613ed3f2e | 213 | } |
Vanger | 27:ec44d5a9544f | 214 | |
Vanger | 29:edc613ed3f2e | 215 | //Check internet connection through ping, admittedly uses data over cell network |
Vanger | 29:edc613ed3f2e | 216 | ping = EasyIP::ping("www.google.com"); |
Vanger | 29:edc613ed3f2e | 217 | |
Vanger | 29:edc613ed3f2e | 218 | //Check active mode (SGACT = 1,1) |
Vanger | 29:edc613ed3f2e | 219 | reply = sendCommand("AT#SGACT?", 1000); |
Vanger | 29:edc613ed3f2e | 220 | if(reply.empty() || (reply.find("ERROR") != std::string::npos)) { |
Vanger | 29:edc613ed3f2e | 221 | active = false; |
Vanger | 29:edc613ed3f2e | 222 | } else { |
Vanger | 29:edc613ed3f2e | 223 | pieces = Text::split(reply, "\r\n"); |
Vanger | 29:edc613ed3f2e | 224 | if(pieces.size() >= 2) { |
Vanger | 29:edc613ed3f2e | 225 | pieces = Text::split(pieces[1], " "); |
Vanger | 29:edc613ed3f2e | 226 | if(pieces.size() >= 2) { |
Vanger | 29:edc613ed3f2e | 227 | if(pieces[1].find("1,1") != std::string::npos) { |
Vanger | 29:edc613ed3f2e | 228 | active = true; //1 for an active connection mode |
Vanger | 29:edc613ed3f2e | 229 | } else { |
Vanger | 29:edc613ed3f2e | 230 | active = false; //0, or unknown value, is an inactive connection mode |
Vanger | 29:edc613ed3f2e | 231 | } |
Vanger | 29:edc613ed3f2e | 232 | } |
Vanger | 29:edc613ed3f2e | 233 | } |
Vanger | 29:edc613ed3f2e | 234 | } |
Vanger | 29:edc613ed3f2e | 235 | |
Vanger | 29:edc613ed3f2e | 236 | if(ping) { |
Vanger | 29:edc613ed3f2e | 237 | if(!pppConnected) { |
Vanger | 29:edc613ed3f2e | 238 | logWarning("Internal PPP state tracking differs from radio (DISCONNECTED:CONNECTED)"); |
Vanger | 29:edc613ed3f2e | 239 | } |
Vanger | 29:edc613ed3f2e | 240 | pppConnected = true; |
Vanger | 29:edc613ed3f2e | 241 | } else { |
Vanger | 29:edc613ed3f2e | 242 | std::string stateStr; |
Vanger | 29:edc613ed3f2e | 243 | if(pppConnected) { |
Vanger | 29:edc613ed3f2e | 244 | //New code for state from boolean values |
Vanger | 29:edc613ed3f2e | 245 | if(regist && signal) { |
Vanger | 29:edc613ed3f2e | 246 | if(active) { |
Vanger | 29:edc613ed3f2e | 247 | stateString = "AUTHENTICATING"; |
Vanger | 29:edc613ed3f2e | 248 | } else { |
Vanger | 29:edc613ed3f2e | 249 | stateString = "IDLE"; |
Vanger | 29:edc613ed3f2e | 250 | } |
Vanger | 29:edc613ed3f2e | 251 | } else if(regist != signal) { |
Vanger | 29:edc613ed3f2e | 252 | stateString = "CHECKING"; |
Vanger | 29:edc613ed3f2e | 253 | } else { |
Vanger | 29:edc613ed3f2e | 254 | stateString = "DISCONNECTED"; |
Vanger | 29:edc613ed3f2e | 255 | } |
Vanger | 29:edc613ed3f2e | 256 | logWarning("Internal PPP state tracking differs from radio (CONNECTED:%s)", stateString.c_str()); |
Vanger | 29:edc613ed3f2e | 257 | } |
Vanger | 29:edc613ed3f2e | 258 | pppConnected = false; |
Vanger | 29:edc613ed3f2e | 259 | } |
Vanger | 26:2b769ed8de4f | 260 | return pppConnected; |
Vanger | 26:2b769ed8de4f | 261 | } |
Vanger | 26:2b769ed8de4f | 262 | //Binds the socket to a specific port if able |
Vanger | 26:2b769ed8de4f | 263 | bool EasyIP::bind(unsigned int port) |
Vanger | 26:2b769ed8de4f | 264 | { |
Vanger | 26:2b769ed8de4f | 265 | |
Vanger | 26:2b769ed8de4f | 266 | |
Vanger | 26:2b769ed8de4f | 267 | return true; |
Vanger | 26:2b769ed8de4f | 268 | } |
Vanger | 27:ec44d5a9544f | 269 | |
Vanger | 26:2b769ed8de4f | 270 | bool EasyIP::open(const std::string& address, unsigned int port, Mode mode) |
Vanger | 26:2b769ed8de4f | 271 | { |
Vanger | 26:2b769ed8de4f | 272 | |
Vanger | 26:2b769ed8de4f | 273 | return socketOpened; |
Vanger | 26:2b769ed8de4f | 274 | } |
Vanger | 27:ec44d5a9544f | 275 | |
Vanger | 26:2b769ed8de4f | 276 | bool EasyIP::isOpen() |
Vanger | 26:2b769ed8de4f | 277 | { |
Vanger | 26:2b769ed8de4f | 278 | |
Vanger | 26:2b769ed8de4f | 279 | return socketOpened; |
Vanger | 26:2b769ed8de4f | 280 | } |
Vanger | 27:ec44d5a9544f | 281 | |
Vanger | 26:2b769ed8de4f | 282 | bool EasyIP::close() |
Vanger | 26:2b769ed8de4f | 283 | { |
Vanger | 26:2b769ed8de4f | 284 | |
Vanger | 26:2b769ed8de4f | 285 | return true; |
Vanger | 26:2b769ed8de4f | 286 | } |
Vanger | 26:2b769ed8de4f | 287 | |
Vanger | 26:2b769ed8de4f | 288 | int EasyIP::read(char* data, int max, int timeout) |
Vanger | 26:2b769ed8de4f | 289 | { |
Vanger | 26:2b769ed8de4f | 290 | |
Vanger | 26:2b769ed8de4f | 291 | return 1; |
Vanger | 26:2b769ed8de4f | 292 | } |
Vanger | 26:2b769ed8de4f | 293 | |
Vanger | 26:2b769ed8de4f | 294 | int EasyIP::write(const char* data, int length, int timeout) |
Vanger | 26:2b769ed8de4f | 295 | { |
Vanger | 26:2b769ed8de4f | 296 | |
Vanger | 26:2b769ed8de4f | 297 | return 1; |
Vanger | 26:2b769ed8de4f | 298 | } |
Vanger | 26:2b769ed8de4f | 299 | |
Vanger | 26:2b769ed8de4f | 300 | unsigned int EasyIP::readable() |
Vanger | 26:2b769ed8de4f | 301 | { |
Vanger | 26:2b769ed8de4f | 302 | |
Vanger | 26:2b769ed8de4f | 303 | return io->readable(); |
Vanger | 26:2b769ed8de4f | 304 | } |
Vanger | 26:2b769ed8de4f | 305 | |
Vanger | 26:2b769ed8de4f | 306 | unsigned int EasyIP::writeable() |
Vanger | 26:2b769ed8de4f | 307 | { |
Vanger | 26:2b769ed8de4f | 308 | |
Vanger | 26:2b769ed8de4f | 309 | |
Vanger | 26:2b769ed8de4f | 310 | return io->writeable(); |
Vanger | 26:2b769ed8de4f | 311 | } |
Vanger | 26:2b769ed8de4f | 312 | |
Vanger | 26:2b769ed8de4f | 313 | bool EasyIP::setDeviceIP(std::string address) |
Vanger | 26:2b769ed8de4f | 314 | { |
Vanger | 26:2b769ed8de4f | 315 | if (address.compare("DHCP") == 0) { |
Vanger | 26:2b769ed8de4f | 316 | return true; |
Vanger | 26:2b769ed8de4f | 317 | } else { |
Vanger | 26:2b769ed8de4f | 318 | logWarning("Radio does not support static IPs, using DHCP.\n\r"); |
Vanger | 26:2b769ed8de4f | 319 | return false; |
Vanger | 26:2b769ed8de4f | 320 | } |
Vanger | 26:2b769ed8de4f | 321 | } |
Vanger | 26:2b769ed8de4f | 322 | |
Vanger | 26:2b769ed8de4f | 323 | Code EasyIP::setApn(const std::string& apn) |
Vanger | 26:2b769ed8de4f | 324 | { |
Vanger | 26:2b769ed8de4f | 325 | if (type == MTSMC_H5 || type == MTSMC_G3) { |
Vanger | 26:2b769ed8de4f | 326 | //Set IP,PPP,IPv6 |
Vanger | 26:2b769ed8de4f | 327 | Code code = sendBasicCommand("AT+CGDCONT=1,PPP," + apn, 1000); |
Vanger | 26:2b769ed8de4f | 328 | if (code != MTS_SUCCESS) { |
Vanger | 26:2b769ed8de4f | 329 | return code; |
Vanger | 26:2b769ed8de4f | 330 | } |
Vanger | 26:2b769ed8de4f | 331 | this->apn = apn; |
Vanger | 26:2b769ed8de4f | 332 | return code; //This will return MTS_SUCCESS |
Vanger | 26:2b769ed8de4f | 333 | } else { |
Vanger | 26:2b769ed8de4f | 334 | logInfo("CDMA radios don't need an APN"); |
Vanger | 26:2b769ed8de4f | 335 | return MTS_SUCCESS; |
Vanger | 26:2b769ed8de4f | 336 | } |
Vanger | 26:2b769ed8de4f | 337 | } |
Vanger | 27:ec44d5a9544f | 338 | |
Vanger | 26:2b769ed8de4f | 339 | void EasyIP::reset() |
Vanger | 26:2b769ed8de4f | 340 | { |
Vanger | 26:2b769ed8de4f | 341 | } |
Vanger | 26:2b769ed8de4f | 342 | |
Vanger | 26:2b769ed8de4f | 343 | std::string EasyIP::getDeviceIP() |
Vanger | 26:2b769ed8de4f | 344 | { |
Vanger | 26:2b769ed8de4f | 345 | return local_address; |
Vanger | 26:2b769ed8de4f | 346 | } |
Vanger | 26:2b769ed8de4f | 347 | |
Vanger | 26:2b769ed8de4f | 348 | //Turns off echo when it receives a 1, turns on when it receives anything else |
Vanger | 26:2b769ed8de4f | 349 | Code EasyIP::echo(bool state) |
Vanger | 26:2b769ed8de4f | 350 | { |
Vanger | 27:ec44d5a9544f | 351 | Code code; |
Vanger | 27:ec44d5a9544f | 352 | if (state) { |
Vanger | 27:ec44d5a9544f | 353 | code = sendBasicCommand("ATE0", 1000); |
Vanger | 27:ec44d5a9544f | 354 | echoMode = (code == MTS_SUCCESS) ? false : echoMode; |
Vanger | 27:ec44d5a9544f | 355 | } else { |
Vanger | 27:ec44d5a9544f | 356 | code = sendBasicCommand("ATE1", 1000); |
Vanger | 27:ec44d5a9544f | 357 | echoMode = (code == MTS_SUCCESS) ? true : echoMode; |
Vanger | 27:ec44d5a9544f | 358 | } |
Vanger | 27:ec44d5a9544f | 359 | return code; |
Vanger | 26:2b769ed8de4f | 360 | } |
Vanger | 26:2b769ed8de4f | 361 | |
Vanger | 26:2b769ed8de4f | 362 | bool EasyIP::ping(const std::string& address) |
Vanger | 26:2b769ed8de4f | 363 | { |
Vanger | 26:2b769ed8de4f | 364 | char buffer[256] = {0}; |
Vanger | 27:ec44d5a9544f | 365 | std::vector<std::string> parts; |
Vanger | 27:ec44d5a9544f | 366 | int pingsRec=0; |
Vanger | 27:ec44d5a9544f | 367 | int TTL=0; |
Vanger | 27:ec44d5a9544f | 368 | int Timeout=0; |
Vanger | 27:ec44d5a9544f | 369 | |
Vanger | 27:ec44d5a9544f | 370 | //Format parameters for sending to radio |
Vanger | 28:f93d7b3f7c2e | 371 | sprintf(buffer, "AT#PING=%s,1,32,%d", address.c_str(), (5*PINGDELAY)); |
Vanger | 26:2b769ed8de4f | 372 | |
Vanger | 27:ec44d5a9544f | 373 | for(int pngs=0; pngs<PINGNUM; pngs++) { |
Vanger | 28:f93d7b3f7c2e | 374 | std::string response = sendCommand(buffer, (PINGDELAY*1000)); //Send 1 ping |
Vanger | 28:f93d7b3f7c2e | 375 | //printf("Response [%s]\n", response.c_str()); //remove |
Vanger | 28:f93d7b3f7c2e | 376 | if(response.empty()) { |
Vanger | 28:f93d7b3f7c2e | 377 | //printf("Response empty!\n"); //remove |
Vanger | 28:f93d7b3f7c2e | 378 | continue; //Skip current loop if send command fails |
Vanger | 28:f93d7b3f7c2e | 379 | } |
Vanger | 28:f93d7b3f7c2e | 380 | if(response.find("ERROR") != std::string::npos) { |
Vanger | 28:f93d7b3f7c2e | 381 | //printf("ERROR found\n"); //remove |
Vanger | 28:f93d7b3f7c2e | 382 | continue; //Skip current loop if send command fails |
Vanger | 28:f93d7b3f7c2e | 383 | } |
Vanger | 27:ec44d5a9544f | 384 | parts = Text::split(response, "\r\n"); |
Vanger | 28:f93d7b3f7c2e | 385 | if(parts.size() < 2) { |
Vanger | 28:f93d7b3f7c2e | 386 | //printf("Response newline-split size %d\n", parts.size()); //remove |
Vanger | 28:f93d7b3f7c2e | 387 | continue; |
Vanger | 28:f93d7b3f7c2e | 388 | } |
Vanger | 27:ec44d5a9544f | 389 | parts = Text::split(parts[1], ","); |
Vanger | 28:f93d7b3f7c2e | 390 | if(parts.size() < 4) { |
Vanger | 28:f93d7b3f7c2e | 391 | //printf("Response comma-split size %d\n", parts.size()); //remove |
Vanger | 28:f93d7b3f7c2e | 392 | continue; |
Vanger | 28:f93d7b3f7c2e | 393 | } |
Vanger | 27:ec44d5a9544f | 394 | //Parse TTL and Timeout values |
Vanger | 27:ec44d5a9544f | 395 | Timeout = std::atoi(parts[2].c_str()); |
Vanger | 27:ec44d5a9544f | 396 | TTL = std::atoi(parts[3].c_str()); |
Vanger | 27:ec44d5a9544f | 397 | |
Vanger | 27:ec44d5a9544f | 398 | if((Timeout < 600) && (TTL < 255)) { |
Vanger | 27:ec44d5a9544f | 399 | pingsRec++; |
Vanger | 27:ec44d5a9544f | 400 | } |
Vanger | 27:ec44d5a9544f | 401 | } //Success if less than 50% packet loss |
Vanger | 27:ec44d5a9544f | 402 | if( ((pingsRec/PINGNUM)>= 0.5) ) { |
Vanger | 27:ec44d5a9544f | 403 | return true; |
Vanger | 27:ec44d5a9544f | 404 | } |
Vanger | 26:2b769ed8de4f | 405 | return false; |
Vanger | 26:2b769ed8de4f | 406 | } |
Vanger | 26:2b769ed8de4f | 407 | |
Vanger | 27:ec44d5a9544f | 408 | //Pass 1 to enable socket closeable |
Vanger | 27:ec44d5a9544f | 409 | //Pass 0 to disable socket closeable |
Vanger | 26:2b769ed8de4f | 410 | Code EasyIP::setSocketCloseable(bool enabled) |
Vanger | 26:2b769ed8de4f | 411 | { |
Vanger | 27:ec44d5a9544f | 412 | |
Vanger | 26:2b769ed8de4f | 413 | return MTS_SUCCESS; |
Vanger | 26:2b769ed8de4f | 414 | } |