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 17:46:11 2013 +0000
Revision:
95:4fdf968b5b37
Parent:
94:1baa587e89ae
Child:
97:5e65d8f334d5
Child:
98:dbeac735109d
Added more functionality to Wifi like ping, open, close, although open and are still not working right....

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");
jengbrecht 95:4fdf968b5b37 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 }