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:
Thu Dec 26 16:21:11 2013 +0000
Revision:
73:bb5bbca971ae
Parent:
69:f3e696bbb0d5
Child:
76:371aab9902a4
Updated Wifi for merge.

Who changed what in which revision?

UserRevisionLine numberNew contents of line
jengbrecht 69:f3e696bbb0d5 1 #include "Wifi.h"
jengbrecht 69:f3e696bbb0d5 2
jengbrecht 69:f3e696bbb0d5 3 Wifi* Wifi::instance = NULL;
jengbrecht 69:f3e696bbb0d5 4
jengbrecht 69:f3e696bbb0d5 5 Wifi* Wifi::getInstance()
jengbrecht 69:f3e696bbb0d5 6 {
jengbrecht 69:f3e696bbb0d5 7 if(instance == NULL) {
jengbrecht 69:f3e696bbb0d5 8 instance = new Wifi(NULL);
jengbrecht 69:f3e696bbb0d5 9 }
jengbrecht 69:f3e696bbb0d5 10 return instance;
jengbrecht 69:f3e696bbb0d5 11 }
jengbrecht 69:f3e696bbb0d5 12
jengbrecht 69:f3e696bbb0d5 13 bool Wifi::init(MTSBufferedIO* io)
jengbrecht 69:f3e696bbb0d5 14 {
jengbrecht 69:f3e696bbb0d5 15 if (io == NULL) {
jengbrecht 69:f3e696bbb0d5 16 return false;
jengbrecht 69:f3e696bbb0d5 17 }
jengbrecht 69:f3e696bbb0d5 18 instance->io = io;
jengbrecht 69:f3e696bbb0d5 19 //sendCommand("$$$", 1000, Cellular::NONE);
jengbrecht 69:f3e696bbb0d5 20 return true;
jengbrecht 69:f3e696bbb0d5 21 }
jengbrecht 69:f3e696bbb0d5 22
jengbrecht 69:f3e696bbb0d5 23 Wifi::Wifi(MTSBufferedIO* io)
jengbrecht 69:f3e696bbb0d5 24 : io(io)
jengbrecht 69:f3e696bbb0d5 25 , echoMode(true)
jengbrecht 69:f3e696bbb0d5 26 , wifiConnected(false)
jengbrecht 69:f3e696bbb0d5 27 , mode(TCP)
jengbrecht 69:f3e696bbb0d5 28 , socketOpened(false)
jengbrecht 69:f3e696bbb0d5 29 , socketCloseable(true)
jengbrecht 69:f3e696bbb0d5 30 , local_port(0)
jengbrecht 69:f3e696bbb0d5 31 , host_port(0)
jengbrecht 69:f3e696bbb0d5 32 , _ssid("")
jengbrecht 69:f3e696bbb0d5 33 {
jengbrecht 69:f3e696bbb0d5 34
jengbrecht 69:f3e696bbb0d5 35 }
jengbrecht 69:f3e696bbb0d5 36
jengbrecht 69:f3e696bbb0d5 37 Wifi::~Wifi()
jengbrecht 69:f3e696bbb0d5 38 {
jengbrecht 69:f3e696bbb0d5 39 }
jengbrecht 69:f3e696bbb0d5 40
jengbrecht 69:f3e696bbb0d5 41 bool Wifi::connect()
jengbrecht 69:f3e696bbb0d5 42 {
jengbrecht 69:f3e696bbb0d5 43 //Check if socket is open
jengbrecht 69:f3e696bbb0d5 44 if(socketOpened) {
jengbrecht 69:f3e696bbb0d5 45 return true;
jengbrecht 69:f3e696bbb0d5 46 }
jengbrecht 69:f3e696bbb0d5 47
jengbrecht 69:f3e696bbb0d5 48 //Run Test first to validate a good state
jengbrecht 69:f3e696bbb0d5 49 if(isConnected()) {
jengbrecht 69:f3e696bbb0d5 50 return true;
jengbrecht 69:f3e696bbb0d5 51 }
jengbrecht 69:f3e696bbb0d5 52
jengbrecht 69:f3e696bbb0d5 53 //Check RSSI: AT+CSQ
jengbrecht 69:f3e696bbb0d5 54 //int rssi = getSignalStrength();
jengbrecht 69:f3e696bbb0d5 55 //printf("[DEBUG] Signal strength: %d\r\n", rssi);
jengbrecht 69:f3e696bbb0d5 56
jengbrecht 69:f3e696bbb0d5 57 //Possibly add a scan command here and look for the network....
jengbrecht 69:f3e696bbb0d5 58
jengbrecht 69:f3e696bbb0d5 59 printf("Starting Setup\n\r");
jengbrecht 69:f3e696bbb0d5 60 //Set device to manual infrastructure mode
sgodinez 73:bb5bbca971ae 61 if (sendBasicCommand("set wlan join 0", 1000) != SUCCESS) {
jengbrecht 69:f3e696bbb0d5 62 return false;
jengbrecht 69:f3e696bbb0d5 63 }
jengbrecht 69:f3e696bbb0d5 64
jengbrecht 69:f3e696bbb0d5 65 printf("Set Manual Mode\n\r");
jengbrecht 69:f3e696bbb0d5 66 //Set device to channel auto-scanning mode
sgodinez 73:bb5bbca971ae 67 if (sendBasicCommand("set wlan channel 0", 1000) != SUCCESS) {
jengbrecht 69:f3e696bbb0d5 68 return false;
jengbrecht 69:f3e696bbb0d5 69 }
jengbrecht 69:f3e696bbb0d5 70
jengbrecht 69:f3e696bbb0d5 71 //Set device so no data is transmitted immediately following a socket connection
sgodinez 73:bb5bbca971ae 72 if (sendBasicCommand("set comm remote 0", 1000) != SUCCESS) {
jengbrecht 69:f3e696bbb0d5 73 return false;
jengbrecht 69:f3e696bbb0d5 74 }
jengbrecht 69:f3e696bbb0d5 75
jengbrecht 69:f3e696bbb0d5 76 //Set device into DHCP mode
sgodinez 73:bb5bbca971ae 77 if (sendBasicCommand("set ip dhcp 1", 1000) != SUCCESS) {
jengbrecht 69:f3e696bbb0d5 78 return false;
jengbrecht 69:f3e696bbb0d5 79 }
jengbrecht 69:f3e696bbb0d5 80
jengbrecht 69:f3e696bbb0d5 81 //join my_network
jengbrecht 69:f3e696bbb0d5 82
jengbrecht 69:f3e696bbb0d5 83 //AT#CONNECTIONSTART: Make a PPP connection
jengbrecht 69:f3e696bbb0d5 84 printf("[DEBUG] Making SSID Connection Attempt. SSID[%s]\r\n", _ssid.c_str());
jengbrecht 69:f3e696bbb0d5 85 std::string result = sendCommand("join " + _ssid, 10000);
jengbrecht 69:f3e696bbb0d5 86 printf("Connect Status: %s\n\r", result.c_str());
jengbrecht 69:f3e696bbb0d5 87 //std::string pppResult = sendCommand("AT#CONNECTIONSTART", 120000);
jengbrecht 69:f3e696bbb0d5 88 // std::vector<std::string> parts = Text::split(pppResult, "\r\n");
jengbrecht 69:f3e696bbb0d5 89
jengbrecht 69:f3e696bbb0d5 90 /*
jengbrecht 69:f3e696bbb0d5 91 if(pppResult.find("Ok_Info_GprsActivation") != std::string::npos) {
jengbrecht 69:f3e696bbb0d5 92 if(parts.size() >= 2) {
jengbrecht 69:f3e696bbb0d5 93 local_address = parts[1];
jengbrecht 69:f3e696bbb0d5 94 }
jengbrecht 69:f3e696bbb0d5 95 printf("[INFO] PPP Connection Established: IP[%s]\r\n", local_address.c_str());
jengbrecht 69:f3e696bbb0d5 96 pppConnected = true;
jengbrecht 69:f3e696bbb0d5 97
jengbrecht 69:f3e696bbb0d5 98 } else {
jengbrecht 69:f3e696bbb0d5 99 pppConnected = false;
jengbrecht 69:f3e696bbb0d5 100 }
jengbrecht 69:f3e696bbb0d5 101 */
jengbrecht 69:f3e696bbb0d5 102
jengbrecht 69:f3e696bbb0d5 103 wifiConnected = true;
jengbrecht 69:f3e696bbb0d5 104 return wifiConnected;
jengbrecht 69:f3e696bbb0d5 105 }
jengbrecht 69:f3e696bbb0d5 106
jengbrecht 69:f3e696bbb0d5 107 void Wifi::disconnect()
jengbrecht 69:f3e696bbb0d5 108 {
jengbrecht 69:f3e696bbb0d5 109 }
jengbrecht 69:f3e696bbb0d5 110
jengbrecht 69:f3e696bbb0d5 111 bool Wifi::isConnected()
jengbrecht 69:f3e696bbb0d5 112 {
jengbrecht 69:f3e696bbb0d5 113 return false;
jengbrecht 69:f3e696bbb0d5 114 }
jengbrecht 69:f3e696bbb0d5 115
jengbrecht 69:f3e696bbb0d5 116 bool Wifi::bind(unsigned int port)
jengbrecht 69:f3e696bbb0d5 117 {
jengbrecht 69:f3e696bbb0d5 118 return true;
jengbrecht 69:f3e696bbb0d5 119 }
jengbrecht 69:f3e696bbb0d5 120
jengbrecht 69:f3e696bbb0d5 121 bool Wifi::open(const std::string& address, unsigned int port, Mode mode)
jengbrecht 69:f3e696bbb0d5 122 {
jengbrecht 69:f3e696bbb0d5 123 //set comm size??? are advanced Socket settings
jengbrecht 69:f3e696bbb0d5 124 //set comm time??? are advanced Socket settings
jengbrecht 69:f3e696bbb0d5 125 return true;
jengbrecht 69:f3e696bbb0d5 126 }
jengbrecht 69:f3e696bbb0d5 127
jengbrecht 69:f3e696bbb0d5 128 bool Wifi::isOpen()
jengbrecht 69:f3e696bbb0d5 129 {
jengbrecht 69:f3e696bbb0d5 130 return true;
jengbrecht 69:f3e696bbb0d5 131 }
jengbrecht 69:f3e696bbb0d5 132
jengbrecht 69:f3e696bbb0d5 133 bool Wifi::close()
jengbrecht 69:f3e696bbb0d5 134 {
jengbrecht 69:f3e696bbb0d5 135 return true;
jengbrecht 69:f3e696bbb0d5 136 }
jengbrecht 69:f3e696bbb0d5 137
jengbrecht 69:f3e696bbb0d5 138 int Wifi::read(char* data, int max, int timeout)
jengbrecht 69:f3e696bbb0d5 139 {
jengbrecht 69:f3e696bbb0d5 140 return 0;
jengbrecht 69:f3e696bbb0d5 141 }
jengbrecht 69:f3e696bbb0d5 142
jengbrecht 69:f3e696bbb0d5 143 int Wifi::write(const char* data, int length, int timeout)
jengbrecht 69:f3e696bbb0d5 144 {
jengbrecht 69:f3e696bbb0d5 145 return 0;
jengbrecht 69:f3e696bbb0d5 146 }
jengbrecht 69:f3e696bbb0d5 147
jengbrecht 69:f3e696bbb0d5 148 unsigned int Wifi::readable()
jengbrecht 69:f3e696bbb0d5 149 {
jengbrecht 69:f3e696bbb0d5 150 if(io == NULL) {
jengbrecht 69:f3e696bbb0d5 151 printf("[ERROR] MTSBufferedIO not set\r\n");
jengbrecht 69:f3e696bbb0d5 152 return 0;
jengbrecht 69:f3e696bbb0d5 153 }
jengbrecht 69:f3e696bbb0d5 154 if(!socketOpened) {
jengbrecht 69:f3e696bbb0d5 155 printf("[ERROR] Socket is not open\r\n");
jengbrecht 69:f3e696bbb0d5 156 return 0;
jengbrecht 69:f3e696bbb0d5 157 }
jengbrecht 69:f3e696bbb0d5 158 return io->readable();
jengbrecht 69:f3e696bbb0d5 159 }
jengbrecht 69:f3e696bbb0d5 160
jengbrecht 69:f3e696bbb0d5 161 unsigned int Wifi::writeable()
jengbrecht 69:f3e696bbb0d5 162 {
jengbrecht 69:f3e696bbb0d5 163 if(io == NULL) {
jengbrecht 69:f3e696bbb0d5 164 printf("[ERROR] MTSBufferedIO not set\r\n");
jengbrecht 69:f3e696bbb0d5 165 return 0;
jengbrecht 69:f3e696bbb0d5 166 }
jengbrecht 69:f3e696bbb0d5 167 if(!socketOpened) {
jengbrecht 69:f3e696bbb0d5 168 printf("[ERROR] Socket is not open\r\n");
jengbrecht 69:f3e696bbb0d5 169 return 0;
jengbrecht 69:f3e696bbb0d5 170 }
jengbrecht 69:f3e696bbb0d5 171
jengbrecht 69:f3e696bbb0d5 172 return io->writeable();
jengbrecht 69:f3e696bbb0d5 173 }
jengbrecht 69:f3e696bbb0d5 174
jengbrecht 69:f3e696bbb0d5 175 void Wifi::reset()
jengbrecht 69:f3e696bbb0d5 176 {
jengbrecht 69:f3e696bbb0d5 177 }
jengbrecht 69:f3e696bbb0d5 178
sgodinez 73:bb5bbca971ae 179 Code Wifi::echo(bool state)
jengbrecht 69:f3e696bbb0d5 180 {
jengbrecht 69:f3e696bbb0d5 181 //Code code;
jengbrecht 69:f3e696bbb0d5 182 if (state) {
jengbrecht 69:f3e696bbb0d5 183 //code = sendBasicCommand("ATE0", 1000);
jengbrecht 69:f3e696bbb0d5 184 //set uart mode 1 - Disabled
jengbrecht 69:f3e696bbb0d5 185 //echoMode = (code == CELL_OK) ? false : echoMode;
jengbrecht 69:f3e696bbb0d5 186 } else {
jengbrecht 69:f3e696bbb0d5 187 //code = sendBasicCommand("ATE1", 1000);
jengbrecht 69:f3e696bbb0d5 188 //set uart mode 0 - Enabled
jengbrecht 69:f3e696bbb0d5 189 //echoMode = (code == CELL_OK) ? true : echoMode;
jengbrecht 69:f3e696bbb0d5 190 }
sgodinez 73:bb5bbca971ae 191 return SUCCESS;
jengbrecht 69:f3e696bbb0d5 192 }
jengbrecht 69:f3e696bbb0d5 193
sgodinez 73:bb5bbca971ae 194 Code Wifi::setNetwork(const std::string& ssid, const std::string& key, SecurityType type)
jengbrecht 69:f3e696bbb0d5 195 {
sgodinez 73:bb5bbca971ae 196 Code code;
jengbrecht 69:f3e696bbb0d5 197
jengbrecht 69:f3e696bbb0d5 198 //Set the appropraite SSID
jengbrecht 69:f3e696bbb0d5 199 code = sendBasicCommand("set wlan ssid " + ssid, 1000);
sgodinez 73:bb5bbca971ae 200 if (code != SUCCESS) {
jengbrecht 69:f3e696bbb0d5 201 return code;
jengbrecht 69:f3e696bbb0d5 202 }
jengbrecht 69:f3e696bbb0d5 203
jengbrecht 69:f3e696bbb0d5 204 //Set the security key
jengbrecht 69:f3e696bbb0d5 205 if (type == WEP64 || type == WEP128) {
jengbrecht 69:f3e696bbb0d5 206 //Set the WEP key if using WEP encryption
jengbrecht 69:f3e696bbb0d5 207 code = sendBasicCommand("set wlan key " + key, 1000);
sgodinez 73:bb5bbca971ae 208 if (code != SUCCESS) {
jengbrecht 69:f3e696bbb0d5 209 return code;
jengbrecht 69:f3e696bbb0d5 210 }
jengbrecht 69:f3e696bbb0d5 211 } else if (type == WPA || type == WPA2) {
jengbrecht 69:f3e696bbb0d5 212 //Set the WPA key if using WPA encryption
jengbrecht 69:f3e696bbb0d5 213 code = sendBasicCommand("set wlan phrase " + key, 1000);
sgodinez 73:bb5bbca971ae 214 if (code != SUCCESS) {
jengbrecht 69:f3e696bbb0d5 215 return code;
jengbrecht 69:f3e696bbb0d5 216 }
jengbrecht 69:f3e696bbb0d5 217 }
jengbrecht 69:f3e696bbb0d5 218
jengbrecht 69:f3e696bbb0d5 219 _ssid = ssid;
sgodinez 73:bb5bbca971ae 220 return SUCCESS;
jengbrecht 69:f3e696bbb0d5 221 }
jengbrecht 69:f3e696bbb0d5 222
jengbrecht 69:f3e696bbb0d5 223 int Wifi::getSignalStrength()
jengbrecht 69:f3e696bbb0d5 224 {
jengbrecht 69:f3e696bbb0d5 225 //show rssi
jengbrecht 69:f3e696bbb0d5 226 return 0;
jengbrecht 69:f3e696bbb0d5 227 }
jengbrecht 69:f3e696bbb0d5 228
jengbrecht 69:f3e696bbb0d5 229
jengbrecht 69:f3e696bbb0d5 230
sgodinez 73:bb5bbca971ae 231 Code Wifi::sendBasicCommand(string command, int timeoutMillis, char esc)
jengbrecht 69:f3e696bbb0d5 232 {
jengbrecht 69:f3e696bbb0d5 233 if(socketOpened) {
jengbrecht 69:f3e696bbb0d5 234 printf("[ERROR] socket is open. Can not send AT commands\r\n");
sgodinez 73:bb5bbca971ae 235 return ERROR;
jengbrecht 69:f3e696bbb0d5 236 }
jengbrecht 69:f3e696bbb0d5 237
jengbrecht 69:f3e696bbb0d5 238 string response = sendCommand(command, timeoutMillis, esc);
jengbrecht 69:f3e696bbb0d5 239 //printf("Response: %s\n\r", response.c_str());
jengbrecht 69:f3e696bbb0d5 240 if (response.size() == 0) {
sgodinez 73:bb5bbca971ae 241 return NO_RESPONSE;
jengbrecht 69:f3e696bbb0d5 242 } else if (response.find("AOK") != string::npos) {
sgodinez 73:bb5bbca971ae 243 return SUCCESS;
jengbrecht 69:f3e696bbb0d5 244 } else if (response.find("ERR") != string::npos) {
sgodinez 73:bb5bbca971ae 245 return ERROR;
jengbrecht 69:f3e696bbb0d5 246 } else {
sgodinez 73:bb5bbca971ae 247 return FAILURE;
jengbrecht 69:f3e696bbb0d5 248 }
jengbrecht 69:f3e696bbb0d5 249 }
jengbrecht 69:f3e696bbb0d5 250
sgodinez 73:bb5bbca971ae 251 string Wifi::sendCommand(string command, int timeoutMillis, char esc)
jengbrecht 69:f3e696bbb0d5 252 {
jengbrecht 69:f3e696bbb0d5 253 if(io == NULL) {
jengbrecht 69:f3e696bbb0d5 254 printf("[ERROR] MTSBufferedIO not set\r\n");
jengbrecht 69:f3e696bbb0d5 255 return "";
jengbrecht 69:f3e696bbb0d5 256 }
jengbrecht 69:f3e696bbb0d5 257 if(socketOpened) {
sgodinez 73:bb5bbca971ae 258 printf("[ERROR] socket is open. Can not send AT commands\r\n");
jengbrecht 69:f3e696bbb0d5 259 return "";
jengbrecht 69:f3e696bbb0d5 260 }
jengbrecht 69:f3e696bbb0d5 261
jengbrecht 69:f3e696bbb0d5 262 io->rxClear();
jengbrecht 69:f3e696bbb0d5 263 io->txClear();
jengbrecht 69:f3e696bbb0d5 264 std::string result;
sgodinez 73:bb5bbca971ae 265
sgodinez 73:bb5bbca971ae 266 //Attempt to write command
sgodinez 73:bb5bbca971ae 267 if(io->write(command.data(), command.size(), timeoutMillis) != command.size()) {
sgodinez 73:bb5bbca971ae 268 //Failed to write command
sgodinez 73:bb5bbca971ae 269 printf("[ERROR] failed to send command to radio within %d milliseconds\r\n", timeoutMillis);
sgodinez 73:bb5bbca971ae 270 return "";
sgodinez 73:bb5bbca971ae 271 }
sgodinez 73:bb5bbca971ae 272
sgodinez 73:bb5bbca971ae 273 //Send Escape Character
sgodinez 73:bb5bbca971ae 274 if (esc != 0x00) {
sgodinez 73:bb5bbca971ae 275 if(io->write(esc, timeoutMillis) != 1) {
sgodinez 73:bb5bbca971ae 276 printf("[ERROR] failed to send '%c' to radio within %d milliseconds\r\n", esc, timeoutMillis);
sgodinez 73:bb5bbca971ae 277 return "";
sgodinez 73:bb5bbca971ae 278 }
sgodinez 73:bb5bbca971ae 279 }
sgodinez 73:bb5bbca971ae 280
jengbrecht 69:f3e696bbb0d5 281 int timer = 0;
sgodinez 73:bb5bbca971ae 282 size_t previous = 0;
jengbrecht 69:f3e696bbb0d5 283 char tmp[256];
jengbrecht 69:f3e696bbb0d5 284 tmp[255] = 0;
jengbrecht 69:f3e696bbb0d5 285 bool started = !echoMode;
jengbrecht 69:f3e696bbb0d5 286 bool done = false;
jengbrecht 69:f3e696bbb0d5 287 do {
jengbrecht 69:f3e696bbb0d5 288 wait(.1);
jengbrecht 69:f3e696bbb0d5 289 timer = timer + 100;
sgodinez 73:bb5bbca971ae 290 previous = result.size();
jengbrecht 69:f3e696bbb0d5 291 int size = io->read(tmp,255); //1 less than allocated
jengbrecht 69:f3e696bbb0d5 292 if(size > 0) {
jengbrecht 69:f3e696bbb0d5 293 result.append(tmp, size);
jengbrecht 69:f3e696bbb0d5 294 }
sgodinez 73:bb5bbca971ae 295
jengbrecht 69:f3e696bbb0d5 296 if(!started) {
jengbrecht 69:f3e696bbb0d5 297 //In Echo Mode (Command will have echo'd + 2 characters for \r\n)
jengbrecht 69:f3e696bbb0d5 298 if(result.size() > command.size() + 2) {
jengbrecht 69:f3e696bbb0d5 299 started = true;
jengbrecht 69:f3e696bbb0d5 300 }
jengbrecht 69:f3e696bbb0d5 301 } else {
sgodinez 73:bb5bbca971ae 302 done = (result.size() == previous);
jengbrecht 69:f3e696bbb0d5 303 }
jengbrecht 69:f3e696bbb0d5 304 if(timer >= timeoutMillis) {
jengbrecht 69:f3e696bbb0d5 305 printf("[WARNING] sendCommand timed out after %d milliseconds\r\n", timeoutMillis);
jengbrecht 69:f3e696bbb0d5 306 done = true;
jengbrecht 69:f3e696bbb0d5 307 }
jengbrecht 69:f3e696bbb0d5 308 } while (!done);
sgodinez 73:bb5bbca971ae 309
jengbrecht 69:f3e696bbb0d5 310 return result;
jengbrecht 69:f3e696bbb0d5 311 }