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 22:54:55 2013 +0000
Revision:
100:9d96b4391151
Parent:
99:eba6b99bc80c
Child:
103:da58d27c15d7
Got all Wifi commands working in a stable way, except reset.  Was able to perform a successful loopback test.

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 return false;
jengbrecht 94:1baa587e89ae 23 }
jengbrecht 94:1baa587e89ae 24
jengbrecht 94:1baa587e89ae 25 //Set device to non-echo mode
jengbrecht 94:1baa587e89ae 26 if (sendBasicCommand("set uart mode 1", 1000) != SUCCESS) {
jengbrecht 94:1baa587e89ae 27 printf("[ERROR] Failed to set to non-echo mode\n\r");
jengbrecht 94:1baa587e89ae 28 return false;
jengbrecht 74:9f87bd22c222 29 }
jengbrecht 94:1baa587e89ae 30
jengbrecht 94:1baa587e89ae 31 //Set device to manual infrastructure mode
jengbrecht 94:1baa587e89ae 32 if (sendBasicCommand("set wlan join 0", 1000) != SUCCESS) {
jengbrecht 94:1baa587e89ae 33 printf("[ERROR] Failed to set join mode\n\r");
jengbrecht 94:1baa587e89ae 34 return false;
jengbrecht 94:1baa587e89ae 35 }
jengbrecht 94:1baa587e89ae 36
jengbrecht 94:1baa587e89ae 37 //Set device to channel auto-scanning mode
jengbrecht 94:1baa587e89ae 38 if (sendBasicCommand("set wlan channel 0", 1000) != SUCCESS) {
jengbrecht 94:1baa587e89ae 39 printf("[ERROR] Failed to set auto-scanning mode\n\r");
jengbrecht 94:1baa587e89ae 40 return false;
jengbrecht 94:1baa587e89ae 41 }
jengbrecht 94:1baa587e89ae 42
jengbrecht 94:1baa587e89ae 43 //Set device so no data is transmitted immediately following a socket connection
jengbrecht 94:1baa587e89ae 44 if (sendBasicCommand("set comm remote 0", 1000) != SUCCESS) {
jengbrecht 94:1baa587e89ae 45 printf("[ERROR] Failed to set remote transmit mode\n\r");
jengbrecht 94:1baa587e89ae 46 return false;
jengbrecht 94:1baa587e89ae 47 }
jengbrecht 94:1baa587e89ae 48 return true;
jengbrecht 69:f3e696bbb0d5 49 }
jengbrecht 69:f3e696bbb0d5 50
jengbrecht 69:f3e696bbb0d5 51 Wifi::Wifi(MTSBufferedIO* io)
jengbrecht 69:f3e696bbb0d5 52 : io(io)
jengbrecht 69:f3e696bbb0d5 53 , wifiConnected(false)
jengbrecht 79:f356009dbc12 54 , _ssid("")
jengbrecht 69:f3e696bbb0d5 55 , mode(TCP)
jengbrecht 69:f3e696bbb0d5 56 , socketOpened(false)
jengbrecht 69:f3e696bbb0d5 57 , socketCloseable(true)
jengbrecht 69:f3e696bbb0d5 58 , local_port(0)
jengbrecht 69:f3e696bbb0d5 59 , host_port(0)
jengbrecht 79:f356009dbc12 60 , cmdOn(false)
jengbrecht 69:f3e696bbb0d5 61 {
jengbrecht 69:f3e696bbb0d5 62
jengbrecht 69:f3e696bbb0d5 63 }
jengbrecht 69:f3e696bbb0d5 64
jengbrecht 69:f3e696bbb0d5 65 Wifi::~Wifi()
jengbrecht 69:f3e696bbb0d5 66 {
jengbrecht 69:f3e696bbb0d5 67 }
jengbrecht 69:f3e696bbb0d5 68
jengbrecht 69:f3e696bbb0d5 69 bool Wifi::connect()
jengbrecht 69:f3e696bbb0d5 70 {
jengbrecht 69:f3e696bbb0d5 71 //Check if socket is open
jengbrecht 69:f3e696bbb0d5 72 if(socketOpened) {
jengbrecht 69:f3e696bbb0d5 73 return true;
jengbrecht 69:f3e696bbb0d5 74 }
jengbrecht 69:f3e696bbb0d5 75
jengbrecht 69:f3e696bbb0d5 76 //Run Test first to validate a good state
jengbrecht 69:f3e696bbb0d5 77 if(isConnected()) {
jengbrecht 69:f3e696bbb0d5 78 return true;
jengbrecht 69:f3e696bbb0d5 79 }
jengbrecht 69:f3e696bbb0d5 80
jengbrecht 93:aa7a48e65974 81 if (_ssid.size() == 0) {
jengbrecht 93:aa7a48e65974 82 printf("[ERROR] No SSID has been set\n\r");
jengbrecht 93:aa7a48e65974 83 return false;
jengbrecht 93:aa7a48e65974 84 }
jengbrecht 93:aa7a48e65974 85
jengbrecht 98:dbeac735109d 86 if(!setCmdMode(true)) {
jengbrecht 98:dbeac735109d 87 return false;
jengbrecht 93:aa7a48e65974 88 }
jengbrecht 93:aa7a48e65974 89
jengbrecht 69:f3e696bbb0d5 90 //Check RSSI: AT+CSQ
jengbrecht 93:aa7a48e65974 91 int rssi = getSignalStrength();
jengbrecht 94:1baa587e89ae 92 printf("[DEBUG] Signal strength (dBm): %d\r\n", rssi);
jengbrecht 69:f3e696bbb0d5 93
jengbrecht 69:f3e696bbb0d5 94 //Possibly add a scan command here and look for the network....
jengbrecht 69:f3e696bbb0d5 95
jengbrecht 69:f3e696bbb0d5 96 //Set device into DHCP mode
sgodinez 73:bb5bbca971ae 97 if (sendBasicCommand("set ip dhcp 1", 1000) != SUCCESS) {
jengbrecht 69:f3e696bbb0d5 98 return false;
jengbrecht 69:f3e696bbb0d5 99 }
jengbrecht 69:f3e696bbb0d5 100
jengbrecht 69:f3e696bbb0d5 101 //join my_network
jengbrecht 69:f3e696bbb0d5 102 printf("[DEBUG] Making SSID Connection Attempt. SSID[%s]\r\n", _ssid.c_str());
jengbrecht 93:aa7a48e65974 103 std::string result = sendCommand("join " + _ssid, 15000, "Listen");
jengbrecht 93:aa7a48e65974 104 //printf("Connect Status: %s\n\r", result.c_str());
jengbrecht 69:f3e696bbb0d5 105
jengbrecht 93:aa7a48e65974 106 //Check whether connection was successful
jengbrecht 93:aa7a48e65974 107 if(result.find("Associated!") != string::npos) {
jengbrecht 93:aa7a48e65974 108 int start = result.find("IP=");
jengbrecht 93:aa7a48e65974 109 int stop = result.find(":", start);
jengbrecht 93:aa7a48e65974 110 local_address = result.substr(start + 3, stop - start - 3);
jengbrecht 93:aa7a48e65974 111 printf("[INFO] WiFi Connection Established: IP[%s]\r\n", local_address.c_str());
jengbrecht 93:aa7a48e65974 112 wifiConnected = true;
jengbrecht 93:aa7a48e65974 113 } else {
jengbrecht 93:aa7a48e65974 114 wifiConnected = false;
jengbrecht 93:aa7a48e65974 115 }
jengbrecht 69:f3e696bbb0d5 116
jengbrecht 69:f3e696bbb0d5 117 return wifiConnected;
jengbrecht 69:f3e696bbb0d5 118 }
jengbrecht 69:f3e696bbb0d5 119
jengbrecht 69:f3e696bbb0d5 120 void Wifi::disconnect()
jengbrecht 69:f3e696bbb0d5 121 {
jengbrecht 79:f356009dbc12 122 printf("[DEBUG] Disconnecting from network\r\n");
jengbrecht 79:f356009dbc12 123
jengbrecht 79:f356009dbc12 124 if(socketOpened) {
jengbrecht 79:f356009dbc12 125 close();
jengbrecht 79:f356009dbc12 126 }
jengbrecht 79:f356009dbc12 127
jengbrecht 98:dbeac735109d 128 if(!setCmdMode(true)) {
jengbrecht 98:dbeac735109d 129 printf("[ERROR] Failed in disconnecting from network. Continuing ...\r\n");
jengbrecht 79:f356009dbc12 130 }
jengbrecht 79:f356009dbc12 131
jengbrecht 100:9d96b4391151 132 std::string response = sendCommand("leave", 10000, "<4.00>");
jengbrecht 100:9d96b4391151 133 response = sendCommand("show net", 5000, "Links");
jengbrecht 100:9d96b4391151 134 //printf("Response: %s\n\r", response.c_str());
jengbrecht 100:9d96b4391151 135 if (response.find("Assoc=FAIL") != string::npos) {
jengbrecht 79:f356009dbc12 136 printf("[DEBUG] Successfully disconnected from network\r\n");
jengbrecht 79:f356009dbc12 137 } else {
jengbrecht 79:f356009dbc12 138 printf("[ERROR] Failed in disconnecting from network. Continuing ...\r\n");
jengbrecht 79:f356009dbc12 139 }
jengbrecht 79:f356009dbc12 140
jengbrecht 79:f356009dbc12 141 wifiConnected = false;
jengbrecht 69:f3e696bbb0d5 142 }
jengbrecht 69:f3e696bbb0d5 143
jengbrecht 69:f3e696bbb0d5 144 bool Wifi::isConnected()
jengbrecht 69:f3e696bbb0d5 145 {
jengbrecht 79:f356009dbc12 146 //1) Check if SSID was set
jengbrecht 79:f356009dbc12 147 if(_ssid.size() == 0) {
jengbrecht 79:f356009dbc12 148 printf("[DEBUG] SSID is not set\r\n");
jengbrecht 79:f356009dbc12 149 return false;
jengbrecht 79:f356009dbc12 150 }
jengbrecht 79:f356009dbc12 151
jengbrecht 79:f356009dbc12 152 //1) Check that we do not have a live connection up
jengbrecht 79:f356009dbc12 153 if(socketOpened) {
jengbrecht 79:f356009dbc12 154 printf("[DEBUG] Socket is opened\r\n");
jengbrecht 79:f356009dbc12 155 return true;
jengbrecht 79:f356009dbc12 156 }
jengbrecht 79:f356009dbc12 157
jengbrecht 98:dbeac735109d 158 //Check command mode.
jengbrecht 98:dbeac735109d 159 if(!setCmdMode(true)) {
jengbrecht 98:dbeac735109d 160 return false;
jengbrecht 98:dbeac735109d 161 }
jengbrecht 98:dbeac735109d 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 95:4fdf968b5b37 192 char buffer[256] = {0};
jengbrecht 95:4fdf968b5b37 193 printf("[DEBUG] Attempting to Open Socket\r\n");
jengbrecht 95:4fdf968b5b37 194
jengbrecht 95:4fdf968b5b37 195 //1) Check that we do not have a live connection up
jengbrecht 95:4fdf968b5b37 196 if(socketOpened) {
jengbrecht 95:4fdf968b5b37 197 //Check that the address, port, and mode match
jengbrecht 95:4fdf968b5b37 198 if(host_address != address || host_port != port || this->mode != mode) {
jengbrecht 95:4fdf968b5b37 199 if(this->mode == TCP) {
jengbrecht 95:4fdf968b5b37 200 printf("[ERROR] TCP socket already opened (%s:%d)\r\n", host_address.c_str(), host_port);
jengbrecht 95:4fdf968b5b37 201 } else {
jengbrecht 95:4fdf968b5b37 202 printf("[ERROR] UDP socket already opened (%s:%d)\r\n", host_address.c_str(), host_port);
jengbrecht 95:4fdf968b5b37 203 }
jengbrecht 95:4fdf968b5b37 204 return false;
jengbrecht 95:4fdf968b5b37 205 }
jengbrecht 95:4fdf968b5b37 206
jengbrecht 95:4fdf968b5b37 207 printf("[DEBUG] Socket already opened\r\n");
jengbrecht 95:4fdf968b5b37 208 return true;
jengbrecht 95:4fdf968b5b37 209 }
jengbrecht 95:4fdf968b5b37 210
jengbrecht 95:4fdf968b5b37 211 //2) Check Parameters
jengbrecht 95:4fdf968b5b37 212 if(port > 65535) {
jengbrecht 95:4fdf968b5b37 213 printf("[ERROR] port out of range (0-65535)\r\n");
jengbrecht 95:4fdf968b5b37 214 return false;
jengbrecht 95:4fdf968b5b37 215 }
jengbrecht 95:4fdf968b5b37 216
jengbrecht 95:4fdf968b5b37 217
jengbrecht 95:4fdf968b5b37 218 //3) Check Wifi network connection
jengbrecht 95:4fdf968b5b37 219 if(!isConnected()) {
jengbrecht 95:4fdf968b5b37 220 printf("[ERROR] Wifi network not connected. Attempting to connect\r\n");
jengbrecht 95:4fdf968b5b37 221 if(!connect()) {
jengbrecht 95:4fdf968b5b37 222 printf("[ERROR] Wifi network connection failed\r\n");
jengbrecht 95:4fdf968b5b37 223 return false;
jengbrecht 95:4fdf968b5b37 224 } else {
jengbrecht 95:4fdf968b5b37 225 printf("[DEBUG] Wifi connection established\r\n");
jengbrecht 95:4fdf968b5b37 226 }
jengbrecht 95:4fdf968b5b37 227 }
jengbrecht 95:4fdf968b5b37 228
jengbrecht 95:4fdf968b5b37 229 //Check command mode
jengbrecht 98:dbeac735109d 230 if(!setCmdMode(true)) {
jengbrecht 98:dbeac735109d 231 return false;
jengbrecht 95:4fdf968b5b37 232 }
jengbrecht 95:4fdf968b5b37 233
jengbrecht 95:4fdf968b5b37 234 //Set Local Port
jengbrecht 95:4fdf968b5b37 235 if(local_port != 0) {
jengbrecht 95:4fdf968b5b37 236 //Attempt to set local port
jengbrecht 95:4fdf968b5b37 237 sprintf(buffer, "set ip localport %d", local_port);
jengbrecht 95:4fdf968b5b37 238 Code code = sendBasicCommand(buffer, 1000);
jengbrecht 95:4fdf968b5b37 239 if(code != SUCCESS) {
jengbrecht 95:4fdf968b5b37 240 printf("[WARNING] Unable to set local port (%d) [%d]. Continuing...\r\n", local_port, (int) code);
jengbrecht 95:4fdf968b5b37 241 }
jengbrecht 95:4fdf968b5b37 242 }
jengbrecht 95:4fdf968b5b37 243
jengbrecht 95:4fdf968b5b37 244 //Set TCP/UDP parameters
jengbrecht 95:4fdf968b5b37 245 sprintf(buffer, "set ip remote %d", port);
jengbrecht 95:4fdf968b5b37 246 if(sendBasicCommand(buffer, 1000) == SUCCESS) {
jengbrecht 95:4fdf968b5b37 247 host_port = port;
jengbrecht 95:4fdf968b5b37 248 } else {
jengbrecht 95:4fdf968b5b37 249 printf("[ERROR] Host port could not be set\r\n");
jengbrecht 95:4fdf968b5b37 250 }
jengbrecht 95:4fdf968b5b37 251
jengbrecht 95:4fdf968b5b37 252 if(sendBasicCommand("set ip host " + address, 1000) == SUCCESS) {
jengbrecht 95:4fdf968b5b37 253 host_address = address;
jengbrecht 95:4fdf968b5b37 254 } else {
jengbrecht 95:4fdf968b5b37 255 printf("[ERROR] Host address could not be set\r\n");
jengbrecht 95:4fdf968b5b37 256 }
jengbrecht 95:4fdf968b5b37 257
jengbrecht 100:9d96b4391151 258 if(sendBasicCommand("set ip protocol 8", 1000) != SUCCESS) {
jengbrecht 100:9d96b4391151 259 printf("[ERROR] Failed to set TCP mode\r\n");
jengbrecht 95:4fdf968b5b37 260 }
jengbrecht 95:4fdf968b5b37 261
jengbrecht 95:4fdf968b5b37 262 // Try and Connect
jengbrecht 95:4fdf968b5b37 263 std::string sMode;
jengbrecht 95:4fdf968b5b37 264 std::string sOpenSocketCmd;
jengbrecht 95:4fdf968b5b37 265 if(mode == TCP) {
jengbrecht 95:4fdf968b5b37 266 sOpenSocketCmd = "open";
jengbrecht 95:4fdf968b5b37 267 sMode = "TCP";
jengbrecht 95:4fdf968b5b37 268 } else {
jengbrecht 100:9d96b4391151 269 //TODO
jengbrecht 100:9d96b4391151 270 //sOpenSocketCmd = "AT#OUDP";
jengbrecht 100:9d96b4391151 271 //sMode = "UDP";
jengbrecht 95:4fdf968b5b37 272 }
jengbrecht 100:9d96b4391151 273 string response = sendCommand(sOpenSocketCmd, 10000, "OPEN");
jengbrecht 95:4fdf968b5b37 274 if (response.find("OPEN") != string::npos) {
jengbrecht 95:4fdf968b5b37 275 printf("[INFO] Opened %s Socket [%s:%d]\r\n", sMode.c_str(), address.c_str(), port);
jengbrecht 95:4fdf968b5b37 276 socketOpened = true;
jengbrecht 100:9d96b4391151 277 cmdOn = false;
jengbrecht 95:4fdf968b5b37 278 } else {
jengbrecht 95:4fdf968b5b37 279 printf("[WARNING] Unable to open %s Socket [%s:%d]\r\n", sMode.c_str(), address.c_str(), port);
jengbrecht 95:4fdf968b5b37 280 socketOpened = false;
jengbrecht 95:4fdf968b5b37 281 }
jengbrecht 95:4fdf968b5b37 282
jengbrecht 95:4fdf968b5b37 283 return socketOpened;
jengbrecht 69:f3e696bbb0d5 284 }
jengbrecht 69:f3e696bbb0d5 285
jengbrecht 69:f3e696bbb0d5 286 bool Wifi::isOpen()
jengbrecht 69:f3e696bbb0d5 287 {
jengbrecht 95:4fdf968b5b37 288 return socketOpened;
jengbrecht 69:f3e696bbb0d5 289 }
jengbrecht 69:f3e696bbb0d5 290
jengbrecht 69:f3e696bbb0d5 291 bool Wifi::close()
jengbrecht 69:f3e696bbb0d5 292 {
jengbrecht 95:4fdf968b5b37 293 if(io == NULL) {
jengbrecht 95:4fdf968b5b37 294 printf("[ERROR] MTSBufferedIO not set\r\n");
jengbrecht 95:4fdf968b5b37 295 return false;
jengbrecht 95:4fdf968b5b37 296 }
jengbrecht 95:4fdf968b5b37 297
jengbrecht 95:4fdf968b5b37 298 if(!socketOpened) {
jengbrecht 95:4fdf968b5b37 299 printf("[WARNING] Socket close() called, but socket was not open\r\n");
jengbrecht 95:4fdf968b5b37 300 return true;
jengbrecht 95:4fdf968b5b37 301 }
jengbrecht 95:4fdf968b5b37 302
jengbrecht 98:dbeac735109d 303 if(!setCmdMode(true)) {
jengbrecht 98:dbeac735109d 304 printf("[ERROR] Failed to close socket\r\n");
jengbrecht 98:dbeac735109d 305 return false;
jengbrecht 95:4fdf968b5b37 306 }
jengbrecht 95:4fdf968b5b37 307
jengbrecht 95:4fdf968b5b37 308 std::string response = sendCommand("close", 10000, "CLOS");
sgodinez 97:5e65d8f334d5 309 if(response.find("CLOS") == string::npos) {
jengbrecht 98:dbeac735109d 310 printf("[ERROR] Failed to successfully close socket\r\n");
jengbrecht 95:4fdf968b5b37 311 return false;
jengbrecht 95:4fdf968b5b37 312 }
jengbrecht 95:4fdf968b5b37 313
jengbrecht 95:4fdf968b5b37 314 socketOpened = false;
jengbrecht 69:f3e696bbb0d5 315 return true;
jengbrecht 69:f3e696bbb0d5 316 }
jengbrecht 69:f3e696bbb0d5 317
jengbrecht 69:f3e696bbb0d5 318 int Wifi::read(char* data, int max, int timeout)
jengbrecht 69:f3e696bbb0d5 319 {
jengbrecht 98:dbeac735109d 320 if(io == NULL) {
jengbrecht 98:dbeac735109d 321 printf("[ERROR] MTSBufferedIO not set\r\n");
jengbrecht 98:dbeac735109d 322 return -1;
jengbrecht 98:dbeac735109d 323 }
jengbrecht 98:dbeac735109d 324
jengbrecht 98:dbeac735109d 325 //Check that nothing is in the rx buffer
jengbrecht 98:dbeac735109d 326 if(!socketOpened && !io->readable()) {
jengbrecht 98:dbeac735109d 327 printf("[ERROR] Socket is not open\r\n");
jengbrecht 98:dbeac735109d 328 return -1;
jengbrecht 98:dbeac735109d 329 }
jengbrecht 98:dbeac735109d 330
jengbrecht 98:dbeac735109d 331 //Check for data mode
jengbrecht 98:dbeac735109d 332 if(!setCmdMode(false)) {
jengbrecht 98:dbeac735109d 333 printf("[ERROR] Failed to read data due to mode\r\n");
jengbrecht 98:dbeac735109d 334 return -1;
jengbrecht 98:dbeac735109d 335 }
jengbrecht 98:dbeac735109d 336
jengbrecht 98:dbeac735109d 337 int bytesRead = 0;
jengbrecht 98:dbeac735109d 338
jengbrecht 98:dbeac735109d 339 if(timeout >= 0) {
jengbrecht 98:dbeac735109d 340 bytesRead = io->read(data, max, static_cast<unsigned int>(timeout));
jengbrecht 98:dbeac735109d 341 } else {
jengbrecht 98:dbeac735109d 342 bytesRead = io->read(data, max);
jengbrecht 98:dbeac735109d 343 }
jengbrecht 98:dbeac735109d 344
jengbrecht 98:dbeac735109d 345 return bytesRead;
jengbrecht 69:f3e696bbb0d5 346 }
jengbrecht 69:f3e696bbb0d5 347
jengbrecht 69:f3e696bbb0d5 348 int Wifi::write(const char* data, int length, int timeout)
jengbrecht 69:f3e696bbb0d5 349 {
jengbrecht 98:dbeac735109d 350 if(io == NULL) {
jengbrecht 98:dbeac735109d 351 printf("[ERROR] MTSBufferedIO not set\r\n");
jengbrecht 98:dbeac735109d 352 return -1;
jengbrecht 98:dbeac735109d 353 }
jengbrecht 98:dbeac735109d 354
jengbrecht 98:dbeac735109d 355 if(!socketOpened) {
jengbrecht 98:dbeac735109d 356 printf("[ERROR] Socket is not open\r\n");
jengbrecht 98:dbeac735109d 357 return -1;
jengbrecht 98:dbeac735109d 358 }
jengbrecht 98:dbeac735109d 359
jengbrecht 98:dbeac735109d 360 //Check for data mode
jengbrecht 98:dbeac735109d 361 if(!setCmdMode(false)) {
jengbrecht 98:dbeac735109d 362 printf("[ERROR] Failed to write data due to mode\r\n");
jengbrecht 98:dbeac735109d 363 return -1;
jengbrecht 98:dbeac735109d 364 }
jengbrecht 98:dbeac735109d 365
jengbrecht 98:dbeac735109d 366 int bytesWritten = 0;
jengbrecht 100:9d96b4391151 367
jengbrecht 98:dbeac735109d 368 if(timeout >= 0) {
jengbrecht 100:9d96b4391151 369 bytesWritten = io->write(data, length, static_cast<unsigned int>(timeout));
jengbrecht 98:dbeac735109d 370 } else {
jengbrecht 100:9d96b4391151 371 bytesWritten = io->write(data, length);
jengbrecht 98:dbeac735109d 372 }
jengbrecht 100:9d96b4391151 373
jengbrecht 98:dbeac735109d 374 return bytesWritten;
jengbrecht 69:f3e696bbb0d5 375 }
jengbrecht 69:f3e696bbb0d5 376
jengbrecht 69:f3e696bbb0d5 377 unsigned int Wifi::readable()
jengbrecht 69:f3e696bbb0d5 378 {
jengbrecht 69:f3e696bbb0d5 379 if(io == NULL) {
jengbrecht 69:f3e696bbb0d5 380 printf("[ERROR] MTSBufferedIO not set\r\n");
jengbrecht 69:f3e696bbb0d5 381 return 0;
jengbrecht 69:f3e696bbb0d5 382 }
jengbrecht 69:f3e696bbb0d5 383 if(!socketOpened) {
jengbrecht 69:f3e696bbb0d5 384 printf("[ERROR] Socket is not open\r\n");
jengbrecht 69:f3e696bbb0d5 385 return 0;
jengbrecht 69:f3e696bbb0d5 386 }
jengbrecht 69:f3e696bbb0d5 387 return io->readable();
jengbrecht 69:f3e696bbb0d5 388 }
jengbrecht 69:f3e696bbb0d5 389
jengbrecht 69:f3e696bbb0d5 390 unsigned int Wifi::writeable()
jengbrecht 69:f3e696bbb0d5 391 {
jengbrecht 69:f3e696bbb0d5 392 if(io == NULL) {
jengbrecht 69:f3e696bbb0d5 393 printf("[ERROR] MTSBufferedIO not set\r\n");
jengbrecht 69:f3e696bbb0d5 394 return 0;
jengbrecht 69:f3e696bbb0d5 395 }
jengbrecht 69:f3e696bbb0d5 396 if(!socketOpened) {
jengbrecht 69:f3e696bbb0d5 397 printf("[ERROR] Socket is not open\r\n");
jengbrecht 69:f3e696bbb0d5 398 return 0;
jengbrecht 69:f3e696bbb0d5 399 }
jengbrecht 69:f3e696bbb0d5 400
jengbrecht 69:f3e696bbb0d5 401 return io->writeable();
jengbrecht 69:f3e696bbb0d5 402 }
jengbrecht 69:f3e696bbb0d5 403
jengbrecht 69:f3e696bbb0d5 404 void Wifi::reset()
jengbrecht 69:f3e696bbb0d5 405 {
jengbrecht 69:f3e696bbb0d5 406 }
jengbrecht 69:f3e696bbb0d5 407
sgodinez 73:bb5bbca971ae 408 Code Wifi::setNetwork(const std::string& ssid, const std::string& key, SecurityType type)
jengbrecht 69:f3e696bbb0d5 409 {
jengbrecht 98:dbeac735109d 410 //Check the command mode
jengbrecht 98:dbeac735109d 411 if(!setCmdMode(true)) {
jengbrecht 98:dbeac735109d 412 return FAILURE;
jengbrecht 98:dbeac735109d 413 }
jengbrecht 98:dbeac735109d 414
sgodinez 73:bb5bbca971ae 415 Code code;
jengbrecht 69:f3e696bbb0d5 416
jengbrecht 69:f3e696bbb0d5 417 //Set the appropraite SSID
jengbrecht 69:f3e696bbb0d5 418 code = sendBasicCommand("set wlan ssid " + ssid, 1000);
sgodinez 73:bb5bbca971ae 419 if (code != SUCCESS) {
jengbrecht 69:f3e696bbb0d5 420 return code;
jengbrecht 69:f3e696bbb0d5 421 }
jengbrecht 69:f3e696bbb0d5 422
jengbrecht 69:f3e696bbb0d5 423 //Set the security key
jengbrecht 69:f3e696bbb0d5 424 if (type == WEP64 || type == WEP128) {
jengbrecht 69:f3e696bbb0d5 425 //Set the WEP key if using WEP encryption
jengbrecht 69:f3e696bbb0d5 426 code = sendBasicCommand("set wlan key " + key, 1000);
sgodinez 73:bb5bbca971ae 427 if (code != SUCCESS) {
jengbrecht 69:f3e696bbb0d5 428 return code;
jengbrecht 69:f3e696bbb0d5 429 }
jengbrecht 69:f3e696bbb0d5 430 } else if (type == WPA || type == WPA2) {
jengbrecht 69:f3e696bbb0d5 431 //Set the WPA key if using WPA encryption
jengbrecht 69:f3e696bbb0d5 432 code = sendBasicCommand("set wlan phrase " + key, 1000);
sgodinez 73:bb5bbca971ae 433 if (code != SUCCESS) {
jengbrecht 69:f3e696bbb0d5 434 return code;
jengbrecht 69:f3e696bbb0d5 435 }
jengbrecht 69:f3e696bbb0d5 436 }
jengbrecht 69:f3e696bbb0d5 437
jengbrecht 69:f3e696bbb0d5 438 _ssid = ssid;
sgodinez 73:bb5bbca971ae 439 return SUCCESS;
jengbrecht 69:f3e696bbb0d5 440 }
jengbrecht 69:f3e696bbb0d5 441
jengbrecht 94:1baa587e89ae 442 Code Wifi::setDNS(const std::string& dnsName)
jengbrecht 94:1baa587e89ae 443 {
jengbrecht 98:dbeac735109d 444 //Check the command mode
jengbrecht 98:dbeac735109d 445 if(!setCmdMode(true)) {
jengbrecht 98:dbeac735109d 446 return FAILURE;
jengbrecht 98:dbeac735109d 447 }
jengbrecht 98:dbeac735109d 448
jengbrecht 94:1baa587e89ae 449 return sendBasicCommand("set dns name " + dnsName, 1000);
jengbrecht 94:1baa587e89ae 450 }
jengbrecht 94:1baa587e89ae 451
jengbrecht 69:f3e696bbb0d5 452 int Wifi::getSignalStrength()
jengbrecht 69:f3e696bbb0d5 453 {
jengbrecht 98:dbeac735109d 454 //Check the command mode
jengbrecht 98:dbeac735109d 455 if(!setCmdMode(true)) {
jengbrecht 98:dbeac735109d 456 printf("[ERROR] Could not get RSSI\n\r");
jengbrecht 98:dbeac735109d 457 return -1;
jengbrecht 98:dbeac735109d 458 }
jengbrecht 98:dbeac735109d 459
jengbrecht 93:aa7a48e65974 460 string response = sendCommand("show rssi", 2000, "dBm");
jengbrecht 74:9f87bd22c222 461 if (response.find("RSSI") == string::npos) {
jengbrecht 98:dbeac735109d 462 printf("[ERROR] Could not get RSSI\n\r");
jengbrecht 74:9f87bd22c222 463 return -1;
jengbrecht 74:9f87bd22c222 464 }
jengbrecht 74:9f87bd22c222 465 int start = response.find('(');
jengbrecht 74:9f87bd22c222 466 int stop = response.find(')', start);
jengbrecht 74:9f87bd22c222 467 string signal = response.substr(start + 1, stop - start - 1);
jengbrecht 74:9f87bd22c222 468 int value;
jengbrecht 74:9f87bd22c222 469 sscanf(signal.c_str(), "%d", &value);
jengbrecht 74:9f87bd22c222 470 return value;
jengbrecht 69:f3e696bbb0d5 471 }
jengbrecht 69:f3e696bbb0d5 472
jengbrecht 95:4fdf968b5b37 473 bool Wifi::ping(const std::string& address)
jengbrecht 95:4fdf968b5b37 474 {
jengbrecht 98:dbeac735109d 475 //Check the command mode
jengbrecht 98:dbeac735109d 476 if(!setCmdMode(true)) {
jengbrecht 98:dbeac735109d 477 printf("[ERROR] Could not send ping command\n\r");
jengbrecht 98:dbeac735109d 478 return false;
jengbrecht 98:dbeac735109d 479 }
jengbrecht 98:dbeac735109d 480
jengbrecht 95:4fdf968b5b37 481 std::string response;
jengbrecht 95:4fdf968b5b37 482 for (int i = 0; i < PINGNUM; i++) {
jengbrecht 95:4fdf968b5b37 483 response = sendCommand("ping " + address, PINGDELAY * 1000, "reply");
jengbrecht 95:4fdf968b5b37 484 if (response.find("reply") != std::string::npos) {
jengbrecht 95:4fdf968b5b37 485 return true;
jengbrecht 95:4fdf968b5b37 486 }
jengbrecht 95:4fdf968b5b37 487 }
jengbrecht 95:4fdf968b5b37 488 return false;
jengbrecht 95:4fdf968b5b37 489 }
jengbrecht 95:4fdf968b5b37 490
jengbrecht 79:f356009dbc12 491 bool Wifi::setCmdMode(bool on)
jengbrecht 74:9f87bd22c222 492 {
jengbrecht 79:f356009dbc12 493 if (on) {
jengbrecht 79:f356009dbc12 494 if (cmdOn) {
jengbrecht 79:f356009dbc12 495 return true;
jengbrecht 79:f356009dbc12 496 }
jengbrecht 79:f356009dbc12 497 wait(.5);
jengbrecht 93:aa7a48e65974 498 std::string response = sendCommand("$$", 2000, "CMD", '$');
jengbrecht 79:f356009dbc12 499 if (response.find("CMD") != string::npos) {
jengbrecht 79:f356009dbc12 500 cmdOn = true;
jengbrecht 79:f356009dbc12 501 return true;
jengbrecht 79:f356009dbc12 502 }
jengbrecht 98:dbeac735109d 503 printf("[ERROR] Failed to enter command mode\n\r");
jengbrecht 79:f356009dbc12 504 return false;
jengbrecht 79:f356009dbc12 505 } else {
jengbrecht 79:f356009dbc12 506 if (!cmdOn) {
jengbrecht 79:f356009dbc12 507 return true;
jengbrecht 79:f356009dbc12 508 }
jengbrecht 93:aa7a48e65974 509 std::string response = sendCommand("exit", 2000, "EXIT");
jengbrecht 79:f356009dbc12 510 if (response.find("EXIT") != string::npos) {
jengbrecht 79:f356009dbc12 511 cmdOn = false;
jengbrecht 79:f356009dbc12 512 return true;
jengbrecht 79:f356009dbc12 513 }
jengbrecht 98:dbeac735109d 514 printf("[ERROR] Failed to exit command mode\n\r");
jengbrecht 79:f356009dbc12 515 return false;
jengbrecht 74:9f87bd22c222 516 }
jengbrecht 74:9f87bd22c222 517 }
jengbrecht 69:f3e696bbb0d5 518
sgodinez 73:bb5bbca971ae 519 Code Wifi::sendBasicCommand(string command, int timeoutMillis, char esc)
jengbrecht 69:f3e696bbb0d5 520 {
jengbrecht 69:f3e696bbb0d5 521 if(socketOpened) {
jengbrecht 69:f3e696bbb0d5 522 printf("[ERROR] socket is open. Can not send AT commands\r\n");
sgodinez 73:bb5bbca971ae 523 return ERROR;
jengbrecht 69:f3e696bbb0d5 524 }
jengbrecht 69:f3e696bbb0d5 525
jengbrecht 93:aa7a48e65974 526 string response = sendCommand(command, timeoutMillis, "AOK", esc);
jengbrecht 69:f3e696bbb0d5 527 //printf("Response: %s\n\r", response.c_str());
jengbrecht 69:f3e696bbb0d5 528 if (response.size() == 0) {
sgodinez 73:bb5bbca971ae 529 return NO_RESPONSE;
jengbrecht 69:f3e696bbb0d5 530 } else if (response.find("AOK") != string::npos) {
sgodinez 73:bb5bbca971ae 531 return SUCCESS;
jengbrecht 69:f3e696bbb0d5 532 } else if (response.find("ERR") != string::npos) {
sgodinez 73:bb5bbca971ae 533 return ERROR;
jengbrecht 69:f3e696bbb0d5 534 } else {
sgodinez 73:bb5bbca971ae 535 return FAILURE;
jengbrecht 69:f3e696bbb0d5 536 }
jengbrecht 69:f3e696bbb0d5 537 }
jengbrecht 69:f3e696bbb0d5 538
jengbrecht 93:aa7a48e65974 539 string Wifi::sendCommand(string command, int timeoutMillis, std::string response, char esc)
jengbrecht 69:f3e696bbb0d5 540 {
jengbrecht 69:f3e696bbb0d5 541 if(io == NULL) {
jengbrecht 69:f3e696bbb0d5 542 printf("[ERROR] MTSBufferedIO not set\r\n");
jengbrecht 69:f3e696bbb0d5 543 return "";
jengbrecht 69:f3e696bbb0d5 544 }
jengbrecht 100:9d96b4391151 545 if(socketOpened && command.compare("$$") != 0 && command.compare("exit") != 0 && command.compare("close") != 0) {
jengbrecht 79:f356009dbc12 546 printf("[ERROR] socket is open. Can not send AT commands\r\n");
jengbrecht 69:f3e696bbb0d5 547 return "";
jengbrecht 69:f3e696bbb0d5 548 }
jengbrecht 69:f3e696bbb0d5 549
jengbrecht 69:f3e696bbb0d5 550 io->rxClear();
jengbrecht 69:f3e696bbb0d5 551 io->txClear();
jengbrecht 69:f3e696bbb0d5 552 std::string result;
jengbrecht 79:f356009dbc12 553
sgodinez 73:bb5bbca971ae 554 //Attempt to write command
sgodinez 73:bb5bbca971ae 555 if(io->write(command.data(), command.size(), timeoutMillis) != command.size()) {
sgodinez 73:bb5bbca971ae 556 //Failed to write command
sgodinez 73:bb5bbca971ae 557 printf("[ERROR] failed to send command to radio within %d milliseconds\r\n", timeoutMillis);
sgodinez 73:bb5bbca971ae 558 return "";
sgodinez 73:bb5bbca971ae 559 }
jengbrecht 79:f356009dbc12 560
sgodinez 73:bb5bbca971ae 561 //Send Escape Character
sgodinez 73:bb5bbca971ae 562 if (esc != 0x00) {
sgodinez 73:bb5bbca971ae 563 if(io->write(esc, timeoutMillis) != 1) {
sgodinez 73:bb5bbca971ae 564 printf("[ERROR] failed to send '%c' to radio within %d milliseconds\r\n", esc, timeoutMillis);
sgodinez 73:bb5bbca971ae 565 return "";
sgodinez 73:bb5bbca971ae 566 }
sgodinez 73:bb5bbca971ae 567 }
sgodinez 73:bb5bbca971ae 568
jengbrecht 69:f3e696bbb0d5 569 int timer = 0;
sgodinez 73:bb5bbca971ae 570 size_t previous = 0;
jengbrecht 69:f3e696bbb0d5 571 char tmp[256];
jengbrecht 69:f3e696bbb0d5 572 tmp[255] = 0;
jengbrecht 69:f3e696bbb0d5 573 bool done = false;
jengbrecht 69:f3e696bbb0d5 574 do {
jengbrecht 93:aa7a48e65974 575 wait(.2);
jengbrecht 93:aa7a48e65974 576 timer = timer + 200;
sgodinez 73:bb5bbca971ae 577 previous = result.size();
jengbrecht 93:aa7a48e65974 578 int size = io->read(tmp, 255, 0); //1 less than allocated
jengbrecht 69:f3e696bbb0d5 579 if(size > 0) {
jengbrecht 69:f3e696bbb0d5 580 result.append(tmp, size);
jengbrecht 93:aa7a48e65974 581 if (response.size() != 0) {
jengbrecht 93:aa7a48e65974 582 if (result.find(response) != string::npos) {
jengbrecht 93:aa7a48e65974 583 return result;
jengbrecht 93:aa7a48e65974 584 }
jengbrecht 93:aa7a48e65974 585 } else {
jengbrecht 93:aa7a48e65974 586 done = (result.size() == previous);
jengbrecht 69:f3e696bbb0d5 587 }
jengbrecht 69:f3e696bbb0d5 588 }
jengbrecht 69:f3e696bbb0d5 589 if(timer >= timeoutMillis) {
jengbrecht 93:aa7a48e65974 590 printf("[WARNING] sendCommand [%s] timed out after %d milliseconds\r\n", command.c_str(), timeoutMillis);
jengbrecht 69:f3e696bbb0d5 591 done = true;
jengbrecht 69:f3e696bbb0d5 592 }
jengbrecht 69:f3e696bbb0d5 593 } while (!done);
jengbrecht 79:f356009dbc12 594
jengbrecht 93:aa7a48e65974 595 //printf("Result: %s\n\r", result.c_str());
jengbrecht 69:f3e696bbb0d5 596 return result;
jengbrecht 69:f3e696bbb0d5 597 }