A library for talking to Multi-Tech's Cellular SocketModem Devices.

Dependents:   M2X_dev axeda_wrapper_dev MTS_M2x_Example1 MTS_Cellular_Connect_Example ... more

Committer:
jengbrecht
Date:
Mon Dec 30 16:18:49 2013 +0000
Revision:
94:1baa587e89ae
Parent:
93:aa7a48e65974
Child:
95:4fdf968b5b37
Added several improvements and robustness stuff to the Wifi class, starting to be pretty stable, still issue with Disconnect....

Who changed what in which revision?

UserRevisionLine numberNew contents of line
jengbrecht 69:f3e696bbb0d5 1 #include "Wifi.h"
jengbrecht 93:aa7a48e65974 2 #include <string>
jengbrecht 69:f3e696bbb0d5 3
jengbrecht 69:f3e696bbb0d5 4 Wifi* Wifi::instance = NULL;
jengbrecht 69:f3e696bbb0d5 5
jengbrecht 69:f3e696bbb0d5 6 Wifi* Wifi::getInstance()
jengbrecht 69:f3e696bbb0d5 7 {
jengbrecht 69:f3e696bbb0d5 8 if(instance == NULL) {
jengbrecht 69:f3e696bbb0d5 9 instance = new Wifi(NULL);
jengbrecht 69:f3e696bbb0d5 10 }
jengbrecht 69:f3e696bbb0d5 11 return instance;
jengbrecht 69:f3e696bbb0d5 12 }
jengbrecht 69:f3e696bbb0d5 13
jengbrecht 69:f3e696bbb0d5 14 bool Wifi::init(MTSBufferedIO* io)
jengbrecht 69:f3e696bbb0d5 15 {
jengbrecht 69:f3e696bbb0d5 16 if (io == NULL) {
jengbrecht 69:f3e696bbb0d5 17 return false;
jengbrecht 69:f3e696bbb0d5 18 }
jengbrecht 69:f3e696bbb0d5 19 instance->io = io;
jengbrecht 94:1baa587e89ae 20 //Set device into command mode
jengbrecht 94:1baa587e89ae 21 if (!setCmdMode(true)) {
jengbrecht 94:1baa587e89ae 22 printf("[ERROR] Failed to set command mode\n\r");
jengbrecht 94:1baa587e89ae 23 return false;
jengbrecht 94:1baa587e89ae 24 }
jengbrecht 94:1baa587e89ae 25
jengbrecht 94:1baa587e89ae 26 //Set device to non-echo mode
jengbrecht 94:1baa587e89ae 27 if (sendBasicCommand("set uart mode 1", 1000) != SUCCESS) {
jengbrecht 94:1baa587e89ae 28 printf("[ERROR] Failed to set to non-echo mode\n\r");
jengbrecht 94:1baa587e89ae 29 return false;
jengbrecht 74:9f87bd22c222 30 }
jengbrecht 94:1baa587e89ae 31
jengbrecht 94:1baa587e89ae 32 //Set device to manual infrastructure mode
jengbrecht 94:1baa587e89ae 33 if (sendBasicCommand("set wlan join 0", 1000) != SUCCESS) {
jengbrecht 94:1baa587e89ae 34 printf("[ERROR] Failed to set join mode\n\r");
jengbrecht 94:1baa587e89ae 35 return false;
jengbrecht 94:1baa587e89ae 36 }
jengbrecht 94:1baa587e89ae 37
jengbrecht 94:1baa587e89ae 38 //Set device to channel auto-scanning mode
jengbrecht 94:1baa587e89ae 39 if (sendBasicCommand("set wlan channel 0", 1000) != SUCCESS) {
jengbrecht 94:1baa587e89ae 40 printf("[ERROR] Failed to set auto-scanning mode\n\r");
jengbrecht 94:1baa587e89ae 41 return false;
jengbrecht 94:1baa587e89ae 42 }
jengbrecht 94:1baa587e89ae 43
jengbrecht 94:1baa587e89ae 44 //Set device so no data is transmitted immediately following a socket connection
jengbrecht 94:1baa587e89ae 45 if (sendBasicCommand("set comm remote 0", 1000) != SUCCESS) {
jengbrecht 94:1baa587e89ae 46 printf("[ERROR] Failed to set remote transmit mode\n\r");
jengbrecht 94:1baa587e89ae 47 return false;
jengbrecht 94:1baa587e89ae 48 }
jengbrecht 94:1baa587e89ae 49 return true;
jengbrecht 69:f3e696bbb0d5 50 }
jengbrecht 69:f3e696bbb0d5 51
jengbrecht 69:f3e696bbb0d5 52 Wifi::Wifi(MTSBufferedIO* io)
jengbrecht 69:f3e696bbb0d5 53 : io(io)
jengbrecht 69:f3e696bbb0d5 54 , wifiConnected(false)
jengbrecht 79:f356009dbc12 55 , _ssid("")
jengbrecht 69:f3e696bbb0d5 56 , mode(TCP)
jengbrecht 69:f3e696bbb0d5 57 , socketOpened(false)
jengbrecht 69:f3e696bbb0d5 58 , socketCloseable(true)
jengbrecht 69:f3e696bbb0d5 59 , local_port(0)
jengbrecht 69:f3e696bbb0d5 60 , host_port(0)
jengbrecht 79:f356009dbc12 61 , cmdOn(false)
jengbrecht 69:f3e696bbb0d5 62 {
jengbrecht 69:f3e696bbb0d5 63
jengbrecht 69:f3e696bbb0d5 64 }
jengbrecht 69:f3e696bbb0d5 65
jengbrecht 69:f3e696bbb0d5 66 Wifi::~Wifi()
jengbrecht 69:f3e696bbb0d5 67 {
jengbrecht 69:f3e696bbb0d5 68 }
jengbrecht 69:f3e696bbb0d5 69
jengbrecht 69:f3e696bbb0d5 70 bool Wifi::connect()
jengbrecht 69:f3e696bbb0d5 71 {
jengbrecht 69:f3e696bbb0d5 72 //Check if socket is open
jengbrecht 69:f3e696bbb0d5 73 if(socketOpened) {
jengbrecht 69:f3e696bbb0d5 74 return true;
jengbrecht 69:f3e696bbb0d5 75 }
jengbrecht 69:f3e696bbb0d5 76
jengbrecht 69:f3e696bbb0d5 77 //Run Test first to validate a good state
jengbrecht 69:f3e696bbb0d5 78 if(isConnected()) {
jengbrecht 69:f3e696bbb0d5 79 return true;
jengbrecht 69:f3e696bbb0d5 80 }
jengbrecht 69:f3e696bbb0d5 81
jengbrecht 93:aa7a48e65974 82 if (_ssid.size() == 0) {
jengbrecht 93:aa7a48e65974 83 printf("[ERROR] No SSID has been set\n\r");
jengbrecht 93:aa7a48e65974 84 return false;
jengbrecht 93:aa7a48e65974 85 }
jengbrecht 93:aa7a48e65974 86
jengbrecht 93:aa7a48e65974 87 if (!cmdOn) {
jengbrecht 93:aa7a48e65974 88 if(!setCmdMode(true)) {
jengbrecht 93:aa7a48e65974 89 printf("[ERROR] Failed to enter command mode\n\r");
jengbrecht 93:aa7a48e65974 90 return false;
jengbrecht 93:aa7a48e65974 91 }
jengbrecht 93:aa7a48e65974 92 }
jengbrecht 93:aa7a48e65974 93
jengbrecht 69:f3e696bbb0d5 94 //Check RSSI: AT+CSQ
jengbrecht 93:aa7a48e65974 95 int rssi = getSignalStrength();
jengbrecht 94:1baa587e89ae 96 printf("[DEBUG] Signal strength (dBm): %d\r\n", rssi);
jengbrecht 69:f3e696bbb0d5 97
jengbrecht 69:f3e696bbb0d5 98 //Possibly add a scan command here and look for the network....
jengbrecht 69:f3e696bbb0d5 99
jengbrecht 69:f3e696bbb0d5 100 //Set device into DHCP mode
sgodinez 73:bb5bbca971ae 101 if (sendBasicCommand("set ip dhcp 1", 1000) != SUCCESS) {
jengbrecht 69:f3e696bbb0d5 102 return false;
jengbrecht 69:f3e696bbb0d5 103 }
jengbrecht 69:f3e696bbb0d5 104
jengbrecht 69:f3e696bbb0d5 105 //join my_network
jengbrecht 69:f3e696bbb0d5 106 printf("[DEBUG] Making SSID Connection Attempt. SSID[%s]\r\n", _ssid.c_str());
jengbrecht 93:aa7a48e65974 107 std::string result = sendCommand("join " + _ssid, 15000, "Listen");
jengbrecht 93:aa7a48e65974 108 //printf("Connect Status: %s\n\r", result.c_str());
jengbrecht 69:f3e696bbb0d5 109
jengbrecht 93:aa7a48e65974 110 //Check whether connection was successful
jengbrecht 93:aa7a48e65974 111 if(result.find("Associated!") != string::npos) {
jengbrecht 93:aa7a48e65974 112 int start = result.find("IP=");
jengbrecht 93:aa7a48e65974 113 int stop = result.find(":", start);
jengbrecht 93:aa7a48e65974 114 local_address = result.substr(start + 3, stop - start - 3);
jengbrecht 93:aa7a48e65974 115 printf("[INFO] WiFi Connection Established: IP[%s]\r\n", local_address.c_str());
jengbrecht 93:aa7a48e65974 116 wifiConnected = true;
jengbrecht 93:aa7a48e65974 117 } else {
jengbrecht 93:aa7a48e65974 118 wifiConnected = false;
jengbrecht 93:aa7a48e65974 119 }
jengbrecht 69:f3e696bbb0d5 120
jengbrecht 69:f3e696bbb0d5 121 return wifiConnected;
jengbrecht 69:f3e696bbb0d5 122 }
jengbrecht 69:f3e696bbb0d5 123
jengbrecht 69:f3e696bbb0d5 124 void Wifi::disconnect()
jengbrecht 69:f3e696bbb0d5 125 {
jengbrecht 79:f356009dbc12 126 printf("[DEBUG] Disconnecting from network\r\n");
jengbrecht 79:f356009dbc12 127
jengbrecht 79:f356009dbc12 128 if(socketOpened) {
jengbrecht 79:f356009dbc12 129 close();
jengbrecht 79:f356009dbc12 130 }
jengbrecht 79:f356009dbc12 131
jengbrecht 94:1baa587e89ae 132 if (!cmdOn) {
jengbrecht 94:1baa587e89ae 133 if(!setCmdMode(true)) {
jengbrecht 94:1baa587e89ae 134 printf("[ERROR] Failed to enter command mode\n\r");
jengbrecht 79:f356009dbc12 135 }
jengbrecht 79:f356009dbc12 136 }
jengbrecht 79:f356009dbc12 137
jengbrecht 94:1baa587e89ae 138 std::string response = sendCommand("leave", 20000);
jengbrecht 94:1baa587e89ae 139 printf("Response: %s\n\r", response.c_str());
jengbrecht 94:1baa587e89ae 140 if (response.find("DeAuth") != string::npos) {
jengbrecht 79:f356009dbc12 141 printf("[DEBUG] Successfully disconnected from network\r\n");
jengbrecht 79:f356009dbc12 142 } else {
jengbrecht 79:f356009dbc12 143 printf("[ERROR] Failed in disconnecting from network. Continuing ...\r\n");
jengbrecht 79:f356009dbc12 144 }
jengbrecht 79:f356009dbc12 145
jengbrecht 79:f356009dbc12 146 wifiConnected = false;
jengbrecht 69:f3e696bbb0d5 147 }
jengbrecht 69:f3e696bbb0d5 148
jengbrecht 69:f3e696bbb0d5 149 bool Wifi::isConnected()
jengbrecht 69:f3e696bbb0d5 150 {
jengbrecht 79:f356009dbc12 151 //1) Check if SSID was set
jengbrecht 79:f356009dbc12 152 if(_ssid.size() == 0) {
jengbrecht 79:f356009dbc12 153 printf("[DEBUG] SSID is not set\r\n");
jengbrecht 79:f356009dbc12 154 return false;
jengbrecht 79:f356009dbc12 155 }
jengbrecht 79:f356009dbc12 156
jengbrecht 79:f356009dbc12 157 //1) Check that we do not have a live connection up
jengbrecht 79:f356009dbc12 158 if(socketOpened) {
jengbrecht 79:f356009dbc12 159 printf("[DEBUG] Socket is opened\r\n");
jengbrecht 79:f356009dbc12 160 return true;
jengbrecht 79:f356009dbc12 161 }
jengbrecht 79:f356009dbc12 162
jengbrecht 79:f356009dbc12 163 //2) Query the wifi module
jengbrecht 79:f356009dbc12 164 wifiConnected = false;
jengbrecht 93:aa7a48e65974 165 std::string result = sendCommand("show net", 5000, "Links");
jengbrecht 93:aa7a48e65974 166 //printf("netResult: %s\n\r", result);
jengbrecht 93:aa7a48e65974 167 if(result.find("Assoc=OK") != std::string::npos) {
jengbrecht 79:f356009dbc12 168 wifiConnected = true;
jengbrecht 79:f356009dbc12 169 }
jengbrecht 79:f356009dbc12 170
jengbrecht 79:f356009dbc12 171 return wifiConnected;
jengbrecht 69:f3e696bbb0d5 172 }
jengbrecht 69:f3e696bbb0d5 173
jengbrecht 69:f3e696bbb0d5 174 bool Wifi::bind(unsigned int port)
jengbrecht 69:f3e696bbb0d5 175 {
jengbrecht 94:1baa587e89ae 176 if(socketOpened) {
jengbrecht 94:1baa587e89ae 177 printf("[ERROR] socket is open. Can not set local port\r\n");
jengbrecht 94:1baa587e89ae 178 return false;
jengbrecht 94:1baa587e89ae 179 }
jengbrecht 94:1baa587e89ae 180 if(port > 65535) {
jengbrecht 94:1baa587e89ae 181 printf("[ERROR] port out of range (0-65535)\r\n");
jengbrecht 94:1baa587e89ae 182 return false;
jengbrecht 94:1baa587e89ae 183 }
jengbrecht 94:1baa587e89ae 184 local_port = port;
jengbrecht 69:f3e696bbb0d5 185 return true;
jengbrecht 69:f3e696bbb0d5 186 }
jengbrecht 69:f3e696bbb0d5 187
jengbrecht 69:f3e696bbb0d5 188 bool Wifi::open(const std::string& address, unsigned int port, Mode mode)
jengbrecht 69:f3e696bbb0d5 189 {
jengbrecht 69:f3e696bbb0d5 190 //set comm size??? are advanced Socket settings
jengbrecht 69:f3e696bbb0d5 191 //set comm time??? are advanced Socket settings
jengbrecht 69:f3e696bbb0d5 192 return true;
jengbrecht 69:f3e696bbb0d5 193 }
jengbrecht 69:f3e696bbb0d5 194
jengbrecht 69:f3e696bbb0d5 195 bool Wifi::isOpen()
jengbrecht 69:f3e696bbb0d5 196 {
jengbrecht 69:f3e696bbb0d5 197 return true;
jengbrecht 69:f3e696bbb0d5 198 }
jengbrecht 69:f3e696bbb0d5 199
jengbrecht 69:f3e696bbb0d5 200 bool Wifi::close()
jengbrecht 69:f3e696bbb0d5 201 {
jengbrecht 69:f3e696bbb0d5 202 return true;
jengbrecht 69:f3e696bbb0d5 203 }
jengbrecht 69:f3e696bbb0d5 204
jengbrecht 69:f3e696bbb0d5 205 int Wifi::read(char* data, int max, int timeout)
jengbrecht 69:f3e696bbb0d5 206 {
jengbrecht 69:f3e696bbb0d5 207 return 0;
jengbrecht 69:f3e696bbb0d5 208 }
jengbrecht 69:f3e696bbb0d5 209
jengbrecht 69:f3e696bbb0d5 210 int Wifi::write(const char* data, int length, int timeout)
jengbrecht 69:f3e696bbb0d5 211 {
jengbrecht 69:f3e696bbb0d5 212 return 0;
jengbrecht 69:f3e696bbb0d5 213 }
jengbrecht 69:f3e696bbb0d5 214
jengbrecht 69:f3e696bbb0d5 215 unsigned int Wifi::readable()
jengbrecht 69:f3e696bbb0d5 216 {
jengbrecht 69:f3e696bbb0d5 217 if(io == NULL) {
jengbrecht 69:f3e696bbb0d5 218 printf("[ERROR] MTSBufferedIO not set\r\n");
jengbrecht 69:f3e696bbb0d5 219 return 0;
jengbrecht 69:f3e696bbb0d5 220 }
jengbrecht 69:f3e696bbb0d5 221 if(!socketOpened) {
jengbrecht 69:f3e696bbb0d5 222 printf("[ERROR] Socket is not open\r\n");
jengbrecht 69:f3e696bbb0d5 223 return 0;
jengbrecht 69:f3e696bbb0d5 224 }
jengbrecht 69:f3e696bbb0d5 225 return io->readable();
jengbrecht 69:f3e696bbb0d5 226 }
jengbrecht 69:f3e696bbb0d5 227
jengbrecht 69:f3e696bbb0d5 228 unsigned int Wifi::writeable()
jengbrecht 69:f3e696bbb0d5 229 {
jengbrecht 69:f3e696bbb0d5 230 if(io == NULL) {
jengbrecht 69:f3e696bbb0d5 231 printf("[ERROR] MTSBufferedIO not set\r\n");
jengbrecht 69:f3e696bbb0d5 232 return 0;
jengbrecht 69:f3e696bbb0d5 233 }
jengbrecht 69:f3e696bbb0d5 234 if(!socketOpened) {
jengbrecht 69:f3e696bbb0d5 235 printf("[ERROR] Socket is not open\r\n");
jengbrecht 69:f3e696bbb0d5 236 return 0;
jengbrecht 69:f3e696bbb0d5 237 }
jengbrecht 69:f3e696bbb0d5 238
jengbrecht 69:f3e696bbb0d5 239 return io->writeable();
jengbrecht 69:f3e696bbb0d5 240 }
jengbrecht 69:f3e696bbb0d5 241
jengbrecht 69:f3e696bbb0d5 242 void Wifi::reset()
jengbrecht 69:f3e696bbb0d5 243 {
jengbrecht 69:f3e696bbb0d5 244 }
jengbrecht 69:f3e696bbb0d5 245
sgodinez 73:bb5bbca971ae 246 Code Wifi::setNetwork(const std::string& ssid, const std::string& key, SecurityType type)
jengbrecht 69:f3e696bbb0d5 247 {
sgodinez 73:bb5bbca971ae 248 Code code;
jengbrecht 69:f3e696bbb0d5 249
jengbrecht 69:f3e696bbb0d5 250 //Set the appropraite SSID
jengbrecht 69:f3e696bbb0d5 251 code = sendBasicCommand("set wlan ssid " + ssid, 1000);
sgodinez 73:bb5bbca971ae 252 if (code != SUCCESS) {
jengbrecht 69:f3e696bbb0d5 253 return code;
jengbrecht 69:f3e696bbb0d5 254 }
jengbrecht 69:f3e696bbb0d5 255
jengbrecht 69:f3e696bbb0d5 256 //Set the security key
jengbrecht 69:f3e696bbb0d5 257 if (type == WEP64 || type == WEP128) {
jengbrecht 69:f3e696bbb0d5 258 //Set the WEP key if using WEP encryption
jengbrecht 69:f3e696bbb0d5 259 code = sendBasicCommand("set wlan key " + key, 1000);
sgodinez 73:bb5bbca971ae 260 if (code != SUCCESS) {
jengbrecht 69:f3e696bbb0d5 261 return code;
jengbrecht 69:f3e696bbb0d5 262 }
jengbrecht 69:f3e696bbb0d5 263 } else if (type == WPA || type == WPA2) {
jengbrecht 69:f3e696bbb0d5 264 //Set the WPA key if using WPA encryption
jengbrecht 69:f3e696bbb0d5 265 code = sendBasicCommand("set wlan phrase " + key, 1000);
sgodinez 73:bb5bbca971ae 266 if (code != SUCCESS) {
jengbrecht 69:f3e696bbb0d5 267 return code;
jengbrecht 69:f3e696bbb0d5 268 }
jengbrecht 69:f3e696bbb0d5 269 }
jengbrecht 69:f3e696bbb0d5 270
jengbrecht 69:f3e696bbb0d5 271 _ssid = ssid;
sgodinez 73:bb5bbca971ae 272 return SUCCESS;
jengbrecht 69:f3e696bbb0d5 273 }
jengbrecht 69:f3e696bbb0d5 274
jengbrecht 94:1baa587e89ae 275 Code Wifi::setDNS(const std::string& dnsName)
jengbrecht 94:1baa587e89ae 276 {
jengbrecht 94:1baa587e89ae 277 return sendBasicCommand("set dns name " + dnsName, 1000);
jengbrecht 94:1baa587e89ae 278 }
jengbrecht 94:1baa587e89ae 279
jengbrecht 69:f3e696bbb0d5 280 int Wifi::getSignalStrength()
jengbrecht 69:f3e696bbb0d5 281 {
jengbrecht 93:aa7a48e65974 282 string response = sendCommand("show rssi", 2000, "dBm");
jengbrecht 74:9f87bd22c222 283 if (response.find("RSSI") == string::npos) {
jengbrecht 74:9f87bd22c222 284 return -1;
jengbrecht 74:9f87bd22c222 285 }
jengbrecht 74:9f87bd22c222 286 int start = response.find('(');
jengbrecht 74:9f87bd22c222 287 int stop = response.find(')', start);
jengbrecht 74:9f87bd22c222 288 string signal = response.substr(start + 1, stop - start - 1);
jengbrecht 74:9f87bd22c222 289 int value;
jengbrecht 74:9f87bd22c222 290 sscanf(signal.c_str(), "%d", &value);
jengbrecht 74:9f87bd22c222 291 return value;
jengbrecht 69:f3e696bbb0d5 292 }
jengbrecht 69:f3e696bbb0d5 293
jengbrecht 79:f356009dbc12 294 bool Wifi::setCmdMode(bool on)
jengbrecht 74:9f87bd22c222 295 {
jengbrecht 79:f356009dbc12 296 if (on) {
jengbrecht 79:f356009dbc12 297 if (cmdOn) {
jengbrecht 79:f356009dbc12 298 return true;
jengbrecht 79:f356009dbc12 299 }
jengbrecht 79:f356009dbc12 300 wait(.5);
jengbrecht 93:aa7a48e65974 301 std::string response = sendCommand("$$", 2000, "CMD", '$');
jengbrecht 79:f356009dbc12 302 if (response.find("CMD") != string::npos) {
jengbrecht 79:f356009dbc12 303 cmdOn = true;
jengbrecht 79:f356009dbc12 304 return true;
jengbrecht 79:f356009dbc12 305 }
jengbrecht 93:aa7a48e65974 306 printf("Failed Response: %s\n\r", response.c_str());
jengbrecht 79:f356009dbc12 307 return false;
jengbrecht 79:f356009dbc12 308 } else {
jengbrecht 79:f356009dbc12 309 if (!cmdOn) {
jengbrecht 79:f356009dbc12 310 return true;
jengbrecht 79:f356009dbc12 311 }
jengbrecht 93:aa7a48e65974 312 std::string response = sendCommand("exit", 2000, "EXIT");
jengbrecht 79:f356009dbc12 313 if (response.find("EXIT") != string::npos) {
jengbrecht 79:f356009dbc12 314 cmdOn = false;
jengbrecht 79:f356009dbc12 315 return true;
jengbrecht 79:f356009dbc12 316 }
jengbrecht 79:f356009dbc12 317 return false;
jengbrecht 74:9f87bd22c222 318 }
jengbrecht 74:9f87bd22c222 319 }
jengbrecht 69:f3e696bbb0d5 320
sgodinez 73:bb5bbca971ae 321 Code Wifi::sendBasicCommand(string command, int timeoutMillis, char esc)
jengbrecht 69:f3e696bbb0d5 322 {
jengbrecht 69:f3e696bbb0d5 323 if(socketOpened) {
jengbrecht 69:f3e696bbb0d5 324 printf("[ERROR] socket is open. Can not send AT commands\r\n");
sgodinez 73:bb5bbca971ae 325 return ERROR;
jengbrecht 69:f3e696bbb0d5 326 }
jengbrecht 69:f3e696bbb0d5 327
jengbrecht 93:aa7a48e65974 328 string response = sendCommand(command, timeoutMillis, "AOK", esc);
jengbrecht 69:f3e696bbb0d5 329 //printf("Response: %s\n\r", response.c_str());
jengbrecht 69:f3e696bbb0d5 330 if (response.size() == 0) {
sgodinez 73:bb5bbca971ae 331 return NO_RESPONSE;
jengbrecht 69:f3e696bbb0d5 332 } else if (response.find("AOK") != string::npos) {
sgodinez 73:bb5bbca971ae 333 return SUCCESS;
jengbrecht 69:f3e696bbb0d5 334 } else if (response.find("ERR") != string::npos) {
sgodinez 73:bb5bbca971ae 335 return ERROR;
jengbrecht 69:f3e696bbb0d5 336 } else {
sgodinez 73:bb5bbca971ae 337 return FAILURE;
jengbrecht 69:f3e696bbb0d5 338 }
jengbrecht 69:f3e696bbb0d5 339 }
jengbrecht 69:f3e696bbb0d5 340
jengbrecht 93:aa7a48e65974 341 string Wifi::sendCommand(string command, int timeoutMillis, std::string response, char esc)
jengbrecht 69:f3e696bbb0d5 342 {
jengbrecht 69:f3e696bbb0d5 343 if(io == NULL) {
jengbrecht 69:f3e696bbb0d5 344 printf("[ERROR] MTSBufferedIO not set\r\n");
jengbrecht 69:f3e696bbb0d5 345 return "";
jengbrecht 69:f3e696bbb0d5 346 }
jengbrecht 93:aa7a48e65974 347 if(socketOpened && command.compare("$$") != 0) {
jengbrecht 79:f356009dbc12 348 printf("[ERROR] socket is open. Can not send AT commands\r\n");
jengbrecht 69:f3e696bbb0d5 349 return "";
jengbrecht 69:f3e696bbb0d5 350 }
jengbrecht 69:f3e696bbb0d5 351
jengbrecht 69:f3e696bbb0d5 352 io->rxClear();
jengbrecht 69:f3e696bbb0d5 353 io->txClear();
jengbrecht 69:f3e696bbb0d5 354 std::string result;
jengbrecht 79:f356009dbc12 355
sgodinez 73:bb5bbca971ae 356 //Attempt to write command
sgodinez 73:bb5bbca971ae 357 if(io->write(command.data(), command.size(), timeoutMillis) != command.size()) {
sgodinez 73:bb5bbca971ae 358 //Failed to write command
sgodinez 73:bb5bbca971ae 359 printf("[ERROR] failed to send command to radio within %d milliseconds\r\n", timeoutMillis);
sgodinez 73:bb5bbca971ae 360 return "";
sgodinez 73:bb5bbca971ae 361 }
jengbrecht 79:f356009dbc12 362
sgodinez 73:bb5bbca971ae 363 //Send Escape Character
sgodinez 73:bb5bbca971ae 364 if (esc != 0x00) {
sgodinez 73:bb5bbca971ae 365 if(io->write(esc, timeoutMillis) != 1) {
sgodinez 73:bb5bbca971ae 366 printf("[ERROR] failed to send '%c' to radio within %d milliseconds\r\n", esc, timeoutMillis);
sgodinez 73:bb5bbca971ae 367 return "";
sgodinez 73:bb5bbca971ae 368 }
sgodinez 73:bb5bbca971ae 369 }
sgodinez 73:bb5bbca971ae 370
jengbrecht 69:f3e696bbb0d5 371 int timer = 0;
sgodinez 73:bb5bbca971ae 372 size_t previous = 0;
jengbrecht 69:f3e696bbb0d5 373 char tmp[256];
jengbrecht 69:f3e696bbb0d5 374 tmp[255] = 0;
jengbrecht 69:f3e696bbb0d5 375 bool done = false;
jengbrecht 69:f3e696bbb0d5 376 do {
jengbrecht 93:aa7a48e65974 377 wait(.2);
jengbrecht 93:aa7a48e65974 378 timer = timer + 200;
sgodinez 73:bb5bbca971ae 379 previous = result.size();
jengbrecht 93:aa7a48e65974 380 int size = io->read(tmp, 255, 0); //1 less than allocated
jengbrecht 69:f3e696bbb0d5 381 if(size > 0) {
jengbrecht 69:f3e696bbb0d5 382 result.append(tmp, size);
jengbrecht 93:aa7a48e65974 383 if (response.size() != 0) {
jengbrecht 93:aa7a48e65974 384 if (result.find(response) != string::npos) {
jengbrecht 93:aa7a48e65974 385 return result;
jengbrecht 93:aa7a48e65974 386 }
jengbrecht 93:aa7a48e65974 387 } else {
jengbrecht 93:aa7a48e65974 388 done = (result.size() == previous);
jengbrecht 69:f3e696bbb0d5 389 }
jengbrecht 69:f3e696bbb0d5 390 }
jengbrecht 69:f3e696bbb0d5 391 if(timer >= timeoutMillis) {
jengbrecht 93:aa7a48e65974 392 printf("[WARNING] sendCommand [%s] timed out after %d milliseconds\r\n", command.c_str(), timeoutMillis);
jengbrecht 69:f3e696bbb0d5 393 done = true;
jengbrecht 69:f3e696bbb0d5 394 }
jengbrecht 69:f3e696bbb0d5 395 } while (!done);
jengbrecht 79:f356009dbc12 396
jengbrecht 93:aa7a48e65974 397 //printf("Result: %s\n\r", result.c_str());
jengbrecht 69:f3e696bbb0d5 398 return result;
jengbrecht 69:f3e696bbb0d5 399 }