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:
sgodinez
Date:
Mon Dec 30 19:00:56 2013 +0000
Revision:
97:5e65d8f334d5
Parent:
95:4fdf968b5b37
Child:
99:eba6b99bc80c
Merged. Fixed compile error.

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 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 95:4fdf968b5b37 230 if (!cmdOn) {
jengbrecht 95:4fdf968b5b37 231 if(!setCmdMode(true)) {
jengbrecht 95:4fdf968b5b37 232 printf("[ERROR] Failed to enter command mode\n\r");
jengbrecht 95:4fdf968b5b37 233 return false;
jengbrecht 95:4fdf968b5b37 234 }
jengbrecht 95:4fdf968b5b37 235 }
jengbrecht 95:4fdf968b5b37 236
jengbrecht 95:4fdf968b5b37 237 //Set Local Port
jengbrecht 95:4fdf968b5b37 238 if(local_port != 0) {
jengbrecht 95:4fdf968b5b37 239 //Attempt to set local port
jengbrecht 95:4fdf968b5b37 240 sprintf(buffer, "set ip localport %d", local_port);
jengbrecht 95:4fdf968b5b37 241 Code code = sendBasicCommand(buffer, 1000);
jengbrecht 95:4fdf968b5b37 242 if(code != SUCCESS) {
jengbrecht 95:4fdf968b5b37 243 printf("[WARNING] Unable to set local port (%d) [%d]. Continuing...\r\n", local_port, (int) code);
jengbrecht 95:4fdf968b5b37 244 }
jengbrecht 95:4fdf968b5b37 245 }
jengbrecht 95:4fdf968b5b37 246
jengbrecht 95:4fdf968b5b37 247 //Set TCP/UDP parameters
jengbrecht 95:4fdf968b5b37 248 sprintf(buffer, "set ip remote %d", port);
jengbrecht 95:4fdf968b5b37 249 if(sendBasicCommand(buffer, 1000) == SUCCESS) {
jengbrecht 95:4fdf968b5b37 250 host_port = port;
jengbrecht 95:4fdf968b5b37 251 } else {
jengbrecht 95:4fdf968b5b37 252 printf("[ERROR] Host port could not be set\r\n");
jengbrecht 95:4fdf968b5b37 253 }
jengbrecht 95:4fdf968b5b37 254
jengbrecht 95:4fdf968b5b37 255 if(sendBasicCommand("set ip host " + address, 1000) == SUCCESS) {
jengbrecht 95:4fdf968b5b37 256 host_address = address;
jengbrecht 95:4fdf968b5b37 257 } else {
jengbrecht 95:4fdf968b5b37 258 printf("[ERROR] Host address could not be set\r\n");
jengbrecht 95:4fdf968b5b37 259 }
jengbrecht 95:4fdf968b5b37 260
jengbrecht 95:4fdf968b5b37 261 if(sendBasicCommand("set ip host " + address, 1000) == SUCCESS) {
jengbrecht 95:4fdf968b5b37 262 host_address = address;
jengbrecht 95:4fdf968b5b37 263 } else {
jengbrecht 95:4fdf968b5b37 264 printf("[ERROR] Host address could not be set\r\n");
jengbrecht 95:4fdf968b5b37 265 }
jengbrecht 95:4fdf968b5b37 266
jengbrecht 95:4fdf968b5b37 267 // Try and Connect
jengbrecht 95:4fdf968b5b37 268 std::string sMode;
jengbrecht 95:4fdf968b5b37 269 std::string sOpenSocketCmd;
jengbrecht 95:4fdf968b5b37 270 if(mode == TCP) {
jengbrecht 95:4fdf968b5b37 271 sOpenSocketCmd = "open";
jengbrecht 95:4fdf968b5b37 272 sMode = "TCP";
jengbrecht 95:4fdf968b5b37 273 } else {
jengbrecht 95:4fdf968b5b37 274 sOpenSocketCmd = "AT#OUDP";
jengbrecht 95:4fdf968b5b37 275 sMode = "UDP";
jengbrecht 95:4fdf968b5b37 276 }
jengbrecht 95:4fdf968b5b37 277 string response = sendCommand(sOpenSocketCmd, 20000, "OPEN");
jengbrecht 95:4fdf968b5b37 278 printf("Open Response: %s\n\r", response.c_str());
jengbrecht 95:4fdf968b5b37 279 if (response.find("OPEN") != string::npos) {
jengbrecht 95:4fdf968b5b37 280 printf("[INFO] Opened %s Socket [%s:%d]\r\n", sMode.c_str(), address.c_str(), port);
jengbrecht 95:4fdf968b5b37 281 socketOpened = true;
jengbrecht 95:4fdf968b5b37 282 } else {
jengbrecht 95:4fdf968b5b37 283 printf("[WARNING] Unable to open %s Socket [%s:%d]\r\n", sMode.c_str(), address.c_str(), port);
jengbrecht 95:4fdf968b5b37 284 socketOpened = false;
jengbrecht 95:4fdf968b5b37 285 }
jengbrecht 95:4fdf968b5b37 286
jengbrecht 95:4fdf968b5b37 287 return socketOpened;
jengbrecht 69:f3e696bbb0d5 288 }
jengbrecht 69:f3e696bbb0d5 289
jengbrecht 69:f3e696bbb0d5 290 bool Wifi::isOpen()
jengbrecht 69:f3e696bbb0d5 291 {
jengbrecht 95:4fdf968b5b37 292 return socketOpened;
jengbrecht 69:f3e696bbb0d5 293 }
jengbrecht 69:f3e696bbb0d5 294
jengbrecht 69:f3e696bbb0d5 295 bool Wifi::close()
jengbrecht 69:f3e696bbb0d5 296 {
jengbrecht 95:4fdf968b5b37 297 if(io == NULL) {
jengbrecht 95:4fdf968b5b37 298 printf("[ERROR] MTSBufferedIO not set\r\n");
jengbrecht 95:4fdf968b5b37 299 return false;
jengbrecht 95:4fdf968b5b37 300 }
jengbrecht 95:4fdf968b5b37 301
jengbrecht 95:4fdf968b5b37 302 if(!socketOpened) {
jengbrecht 95:4fdf968b5b37 303 printf("[WARNING] Socket close() called, but socket was not open\r\n");
jengbrecht 95:4fdf968b5b37 304 return true;
jengbrecht 95:4fdf968b5b37 305 }
jengbrecht 95:4fdf968b5b37 306
jengbrecht 95:4fdf968b5b37 307 if (!cmdOn) {
jengbrecht 95:4fdf968b5b37 308 if(!setCmdMode(true)) {
jengbrecht 95:4fdf968b5b37 309 printf("[ERROR] Failed to enter command mode\n\r");
jengbrecht 95:4fdf968b5b37 310 }
jengbrecht 95:4fdf968b5b37 311 }
jengbrecht 95:4fdf968b5b37 312
jengbrecht 95:4fdf968b5b37 313 std::string response = sendCommand("close", 10000, "CLOS");
sgodinez 97:5e65d8f334d5 314 if(response.find("CLOS") == string::npos) {
jengbrecht 95:4fdf968b5b37 315 printf("[ERROR] Timed out attempting to close socket\r\n");
jengbrecht 95:4fdf968b5b37 316 return false;
jengbrecht 95:4fdf968b5b37 317 }
jengbrecht 95:4fdf968b5b37 318
jengbrecht 95:4fdf968b5b37 319 socketOpened = false;
jengbrecht 69:f3e696bbb0d5 320 return true;
jengbrecht 69:f3e696bbb0d5 321 }
jengbrecht 69:f3e696bbb0d5 322
jengbrecht 69:f3e696bbb0d5 323 int Wifi::read(char* data, int max, int timeout)
jengbrecht 69:f3e696bbb0d5 324 {
jengbrecht 69:f3e696bbb0d5 325 return 0;
jengbrecht 69:f3e696bbb0d5 326 }
jengbrecht 69:f3e696bbb0d5 327
jengbrecht 69:f3e696bbb0d5 328 int Wifi::write(const char* data, int length, int timeout)
jengbrecht 69:f3e696bbb0d5 329 {
jengbrecht 69:f3e696bbb0d5 330 return 0;
jengbrecht 69:f3e696bbb0d5 331 }
jengbrecht 69:f3e696bbb0d5 332
jengbrecht 69:f3e696bbb0d5 333 unsigned int Wifi::readable()
jengbrecht 69:f3e696bbb0d5 334 {
jengbrecht 69:f3e696bbb0d5 335 if(io == NULL) {
jengbrecht 69:f3e696bbb0d5 336 printf("[ERROR] MTSBufferedIO not set\r\n");
jengbrecht 69:f3e696bbb0d5 337 return 0;
jengbrecht 69:f3e696bbb0d5 338 }
jengbrecht 69:f3e696bbb0d5 339 if(!socketOpened) {
jengbrecht 69:f3e696bbb0d5 340 printf("[ERROR] Socket is not open\r\n");
jengbrecht 69:f3e696bbb0d5 341 return 0;
jengbrecht 69:f3e696bbb0d5 342 }
jengbrecht 69:f3e696bbb0d5 343 return io->readable();
jengbrecht 69:f3e696bbb0d5 344 }
jengbrecht 69:f3e696bbb0d5 345
jengbrecht 69:f3e696bbb0d5 346 unsigned int Wifi::writeable()
jengbrecht 69:f3e696bbb0d5 347 {
jengbrecht 69:f3e696bbb0d5 348 if(io == NULL) {
jengbrecht 69:f3e696bbb0d5 349 printf("[ERROR] MTSBufferedIO not set\r\n");
jengbrecht 69:f3e696bbb0d5 350 return 0;
jengbrecht 69:f3e696bbb0d5 351 }
jengbrecht 69:f3e696bbb0d5 352 if(!socketOpened) {
jengbrecht 69:f3e696bbb0d5 353 printf("[ERROR] Socket is not open\r\n");
jengbrecht 69:f3e696bbb0d5 354 return 0;
jengbrecht 69:f3e696bbb0d5 355 }
jengbrecht 69:f3e696bbb0d5 356
jengbrecht 69:f3e696bbb0d5 357 return io->writeable();
jengbrecht 69:f3e696bbb0d5 358 }
jengbrecht 69:f3e696bbb0d5 359
jengbrecht 69:f3e696bbb0d5 360 void Wifi::reset()
jengbrecht 69:f3e696bbb0d5 361 {
jengbrecht 69:f3e696bbb0d5 362 }
jengbrecht 69:f3e696bbb0d5 363
sgodinez 73:bb5bbca971ae 364 Code Wifi::setNetwork(const std::string& ssid, const std::string& key, SecurityType type)
jengbrecht 69:f3e696bbb0d5 365 {
sgodinez 73:bb5bbca971ae 366 Code code;
jengbrecht 69:f3e696bbb0d5 367
jengbrecht 69:f3e696bbb0d5 368 //Set the appropraite SSID
jengbrecht 69:f3e696bbb0d5 369 code = sendBasicCommand("set wlan ssid " + ssid, 1000);
sgodinez 73:bb5bbca971ae 370 if (code != SUCCESS) {
jengbrecht 69:f3e696bbb0d5 371 return code;
jengbrecht 69:f3e696bbb0d5 372 }
jengbrecht 69:f3e696bbb0d5 373
jengbrecht 69:f3e696bbb0d5 374 //Set the security key
jengbrecht 69:f3e696bbb0d5 375 if (type == WEP64 || type == WEP128) {
jengbrecht 69:f3e696bbb0d5 376 //Set the WEP key if using WEP encryption
jengbrecht 69:f3e696bbb0d5 377 code = sendBasicCommand("set wlan key " + key, 1000);
sgodinez 73:bb5bbca971ae 378 if (code != SUCCESS) {
jengbrecht 69:f3e696bbb0d5 379 return code;
jengbrecht 69:f3e696bbb0d5 380 }
jengbrecht 69:f3e696bbb0d5 381 } else if (type == WPA || type == WPA2) {
jengbrecht 69:f3e696bbb0d5 382 //Set the WPA key if using WPA encryption
jengbrecht 69:f3e696bbb0d5 383 code = sendBasicCommand("set wlan phrase " + key, 1000);
sgodinez 73:bb5bbca971ae 384 if (code != SUCCESS) {
jengbrecht 69:f3e696bbb0d5 385 return code;
jengbrecht 69:f3e696bbb0d5 386 }
jengbrecht 69:f3e696bbb0d5 387 }
jengbrecht 69:f3e696bbb0d5 388
jengbrecht 69:f3e696bbb0d5 389 _ssid = ssid;
sgodinez 73:bb5bbca971ae 390 return SUCCESS;
jengbrecht 69:f3e696bbb0d5 391 }
jengbrecht 69:f3e696bbb0d5 392
jengbrecht 94:1baa587e89ae 393 Code Wifi::setDNS(const std::string& dnsName)
jengbrecht 94:1baa587e89ae 394 {
jengbrecht 94:1baa587e89ae 395 return sendBasicCommand("set dns name " + dnsName, 1000);
jengbrecht 94:1baa587e89ae 396 }
jengbrecht 94:1baa587e89ae 397
jengbrecht 69:f3e696bbb0d5 398 int Wifi::getSignalStrength()
jengbrecht 69:f3e696bbb0d5 399 {
jengbrecht 93:aa7a48e65974 400 string response = sendCommand("show rssi", 2000, "dBm");
jengbrecht 74:9f87bd22c222 401 if (response.find("RSSI") == string::npos) {
jengbrecht 74:9f87bd22c222 402 return -1;
jengbrecht 74:9f87bd22c222 403 }
jengbrecht 74:9f87bd22c222 404 int start = response.find('(');
jengbrecht 74:9f87bd22c222 405 int stop = response.find(')', start);
jengbrecht 74:9f87bd22c222 406 string signal = response.substr(start + 1, stop - start - 1);
jengbrecht 74:9f87bd22c222 407 int value;
jengbrecht 74:9f87bd22c222 408 sscanf(signal.c_str(), "%d", &value);
jengbrecht 74:9f87bd22c222 409 return value;
jengbrecht 69:f3e696bbb0d5 410 }
jengbrecht 69:f3e696bbb0d5 411
jengbrecht 95:4fdf968b5b37 412 bool Wifi::ping(const std::string& address)
jengbrecht 95:4fdf968b5b37 413 {
jengbrecht 95:4fdf968b5b37 414 std::string response;
jengbrecht 95:4fdf968b5b37 415 for (int i = 0; i < PINGNUM; i++) {
jengbrecht 95:4fdf968b5b37 416 response = sendCommand("ping " + address, PINGDELAY * 1000, "reply");
jengbrecht 95:4fdf968b5b37 417 if (response.find("reply") != std::string::npos) {
jengbrecht 95:4fdf968b5b37 418 return true;
jengbrecht 95:4fdf968b5b37 419 }
jengbrecht 95:4fdf968b5b37 420 }
jengbrecht 95:4fdf968b5b37 421 return false;
jengbrecht 95:4fdf968b5b37 422 }
jengbrecht 95:4fdf968b5b37 423
jengbrecht 79:f356009dbc12 424 bool Wifi::setCmdMode(bool on)
jengbrecht 74:9f87bd22c222 425 {
jengbrecht 79:f356009dbc12 426 if (on) {
jengbrecht 79:f356009dbc12 427 if (cmdOn) {
jengbrecht 79:f356009dbc12 428 return true;
jengbrecht 79:f356009dbc12 429 }
jengbrecht 79:f356009dbc12 430 wait(.5);
jengbrecht 93:aa7a48e65974 431 std::string response = sendCommand("$$", 2000, "CMD", '$');
jengbrecht 79:f356009dbc12 432 if (response.find("CMD") != string::npos) {
jengbrecht 79:f356009dbc12 433 cmdOn = true;
jengbrecht 79:f356009dbc12 434 return true;
jengbrecht 79:f356009dbc12 435 }
jengbrecht 93:aa7a48e65974 436 printf("Failed Response: %s\n\r", response.c_str());
jengbrecht 79:f356009dbc12 437 return false;
jengbrecht 79:f356009dbc12 438 } else {
jengbrecht 79:f356009dbc12 439 if (!cmdOn) {
jengbrecht 79:f356009dbc12 440 return true;
jengbrecht 79:f356009dbc12 441 }
jengbrecht 93:aa7a48e65974 442 std::string response = sendCommand("exit", 2000, "EXIT");
jengbrecht 79:f356009dbc12 443 if (response.find("EXIT") != string::npos) {
jengbrecht 79:f356009dbc12 444 cmdOn = false;
jengbrecht 79:f356009dbc12 445 return true;
jengbrecht 79:f356009dbc12 446 }
jengbrecht 79:f356009dbc12 447 return false;
jengbrecht 74:9f87bd22c222 448 }
jengbrecht 74:9f87bd22c222 449 }
jengbrecht 69:f3e696bbb0d5 450
sgodinez 73:bb5bbca971ae 451 Code Wifi::sendBasicCommand(string command, int timeoutMillis, char esc)
jengbrecht 69:f3e696bbb0d5 452 {
jengbrecht 69:f3e696bbb0d5 453 if(socketOpened) {
jengbrecht 69:f3e696bbb0d5 454 printf("[ERROR] socket is open. Can not send AT commands\r\n");
sgodinez 73:bb5bbca971ae 455 return ERROR;
jengbrecht 69:f3e696bbb0d5 456 }
jengbrecht 69:f3e696bbb0d5 457
jengbrecht 93:aa7a48e65974 458 string response = sendCommand(command, timeoutMillis, "AOK", esc);
jengbrecht 69:f3e696bbb0d5 459 //printf("Response: %s\n\r", response.c_str());
jengbrecht 69:f3e696bbb0d5 460 if (response.size() == 0) {
sgodinez 73:bb5bbca971ae 461 return NO_RESPONSE;
jengbrecht 69:f3e696bbb0d5 462 } else if (response.find("AOK") != string::npos) {
sgodinez 73:bb5bbca971ae 463 return SUCCESS;
jengbrecht 69:f3e696bbb0d5 464 } else if (response.find("ERR") != string::npos) {
sgodinez 73:bb5bbca971ae 465 return ERROR;
jengbrecht 69:f3e696bbb0d5 466 } else {
sgodinez 73:bb5bbca971ae 467 return FAILURE;
jengbrecht 69:f3e696bbb0d5 468 }
jengbrecht 69:f3e696bbb0d5 469 }
jengbrecht 69:f3e696bbb0d5 470
jengbrecht 93:aa7a48e65974 471 string Wifi::sendCommand(string command, int timeoutMillis, std::string response, char esc)
jengbrecht 69:f3e696bbb0d5 472 {
jengbrecht 69:f3e696bbb0d5 473 if(io == NULL) {
jengbrecht 69:f3e696bbb0d5 474 printf("[ERROR] MTSBufferedIO not set\r\n");
jengbrecht 69:f3e696bbb0d5 475 return "";
jengbrecht 69:f3e696bbb0d5 476 }
jengbrecht 93:aa7a48e65974 477 if(socketOpened && command.compare("$$") != 0) {
jengbrecht 79:f356009dbc12 478 printf("[ERROR] socket is open. Can not send AT commands\r\n");
jengbrecht 69:f3e696bbb0d5 479 return "";
jengbrecht 69:f3e696bbb0d5 480 }
jengbrecht 69:f3e696bbb0d5 481
jengbrecht 69:f3e696bbb0d5 482 io->rxClear();
jengbrecht 69:f3e696bbb0d5 483 io->txClear();
jengbrecht 69:f3e696bbb0d5 484 std::string result;
jengbrecht 79:f356009dbc12 485
sgodinez 73:bb5bbca971ae 486 //Attempt to write command
sgodinez 73:bb5bbca971ae 487 if(io->write(command.data(), command.size(), timeoutMillis) != command.size()) {
sgodinez 73:bb5bbca971ae 488 //Failed to write command
sgodinez 73:bb5bbca971ae 489 printf("[ERROR] failed to send command to radio within %d milliseconds\r\n", timeoutMillis);
sgodinez 73:bb5bbca971ae 490 return "";
sgodinez 73:bb5bbca971ae 491 }
jengbrecht 79:f356009dbc12 492
sgodinez 73:bb5bbca971ae 493 //Send Escape Character
sgodinez 73:bb5bbca971ae 494 if (esc != 0x00) {
sgodinez 73:bb5bbca971ae 495 if(io->write(esc, timeoutMillis) != 1) {
sgodinez 73:bb5bbca971ae 496 printf("[ERROR] failed to send '%c' to radio within %d milliseconds\r\n", esc, timeoutMillis);
sgodinez 73:bb5bbca971ae 497 return "";
sgodinez 73:bb5bbca971ae 498 }
sgodinez 73:bb5bbca971ae 499 }
sgodinez 73:bb5bbca971ae 500
jengbrecht 69:f3e696bbb0d5 501 int timer = 0;
sgodinez 73:bb5bbca971ae 502 size_t previous = 0;
jengbrecht 69:f3e696bbb0d5 503 char tmp[256];
jengbrecht 69:f3e696bbb0d5 504 tmp[255] = 0;
jengbrecht 69:f3e696bbb0d5 505 bool done = false;
jengbrecht 69:f3e696bbb0d5 506 do {
jengbrecht 93:aa7a48e65974 507 wait(.2);
jengbrecht 93:aa7a48e65974 508 timer = timer + 200;
sgodinez 73:bb5bbca971ae 509 previous = result.size();
jengbrecht 93:aa7a48e65974 510 int size = io->read(tmp, 255, 0); //1 less than allocated
jengbrecht 69:f3e696bbb0d5 511 if(size > 0) {
jengbrecht 69:f3e696bbb0d5 512 result.append(tmp, size);
jengbrecht 93:aa7a48e65974 513 if (response.size() != 0) {
jengbrecht 93:aa7a48e65974 514 if (result.find(response) != string::npos) {
jengbrecht 93:aa7a48e65974 515 return result;
jengbrecht 93:aa7a48e65974 516 }
jengbrecht 93:aa7a48e65974 517 } else {
jengbrecht 93:aa7a48e65974 518 done = (result.size() == previous);
jengbrecht 69:f3e696bbb0d5 519 }
jengbrecht 69:f3e696bbb0d5 520 }
jengbrecht 69:f3e696bbb0d5 521 if(timer >= timeoutMillis) {
jengbrecht 93:aa7a48e65974 522 printf("[WARNING] sendCommand [%s] timed out after %d milliseconds\r\n", command.c_str(), timeoutMillis);
jengbrecht 69:f3e696bbb0d5 523 done = true;
jengbrecht 69:f3e696bbb0d5 524 }
jengbrecht 69:f3e696bbb0d5 525 } while (!done);
jengbrecht 79:f356009dbc12 526
jengbrecht 93:aa7a48e65974 527 //printf("Result: %s\n\r", result.c_str());
jengbrecht 69:f3e696bbb0d5 528 return result;
jengbrecht 69:f3e696bbb0d5 529 }