Library to use a wifly module: RN 131 C/G

Dependents:   RN-XV_simple_server

Committer:
samux
Date:
Tue Sep 06 16:44:24 2011 +0000
Revision:
10:d3e3e925f62f
Parent:
9:984c1436dd42
Child:
11:6eb90004d92a

        

Who changed what in which revision?

UserRevisionLine numberNew contents of line
samux 0:2f38aaabc810 1 #include "mbed.h"
samux 0:2f38aaabc810 2 #include "Wifly.h"
samux 0:2f38aaabc810 3 #include <string>
samux 0:2f38aaabc810 4
samux 0:2f38aaabc810 5
samux 0:2f38aaabc810 6
samux 0:2f38aaabc810 7
samux 0:2f38aaabc810 8
samux 0:2f38aaabc810 9
samux 10:d3e3e925f62f 10 Wifly::Wifly( PinName tx, PinName rx, PinName _reset, char * ssid, char * phrase,
samux 10:d3e3e925f62f 11 bool wpa, char * ip, char * netmask, bool dhcp, int baudrate):
samux 10:d3e3e925f62f 12 wifi(tx, rx), reset_pin(_reset) {
samux 0:2f38aaabc810 13 wifi.baud(baudrate);
samux 0:2f38aaabc810 14 reset_pin = 1;
samux 5:9890eb81f730 15 wifi.format(8, Serial::None, 1);
samux 0:2f38aaabc810 16 this->wpa = wpa;
samux 0:2f38aaabc810 17 this->phrase = phrase;
samux 0:2f38aaabc810 18 this->ssid = ssid;
samux 0:2f38aaabc810 19 this->ip = ip;
samux 0:2f38aaabc810 20 this->netmask = netmask;
samux 0:2f38aaabc810 21 this->dhcp = dhcp;
samux 0:2f38aaabc810 22 adhoc = false;
samux 10:d3e3e925f62f 23 length = 0;
samux 10:d3e3e925f62f 24 new_msg = false;
samux 0:2f38aaabc810 25 }
samux 0:2f38aaabc810 26
samux 0:2f38aaabc810 27
samux 0:2f38aaabc810 28
samux 0:2f38aaabc810 29
samux 0:2f38aaabc810 30
samux 10:d3e3e925f62f 31 Wifly::Wifly( PinName tx, PinName rx, PinName _reset, char * ssid, char * ip, char * netmask, int channel,
samux 10:d3e3e925f62f 32 int baudrate):
samux 10:d3e3e925f62f 33 wifi(tx, rx), reset_pin(_reset) {
samux 0:2f38aaabc810 34 wifi.baud(baudrate);
samux 0:2f38aaabc810 35 reset_pin = 1;
samux 5:9890eb81f730 36 wifi.format(8, Serial::None, 1);
samux 0:2f38aaabc810 37 adhoc = true;
samux 0:2f38aaabc810 38 this->ssid = ssid;
samux 0:2f38aaabc810 39 this->ip = ip;
samux 0:2f38aaabc810 40 this->netmask = netmask;
samux 0:2f38aaabc810 41 this->channel = channel;
samux 10:d3e3e925f62f 42 length = 0;
samux 10:d3e3e925f62f 43 new_msg = false;
samux 10:d3e3e925f62f 44 }
samux 10:d3e3e925f62f 45
samux 10:d3e3e925f62f 46
samux 10:d3e3e925f62f 47 void Wifly::handler_rx(void) {
samux 10:d3e3e925f62f 48 char read = wifi.getc();
samux 10:d3e3e925f62f 49 if (read != '\r' && read != '\n') {
samux 10:d3e3e925f62f 50 tmp_buf_rx[length] = read;
samux 10:d3e3e925f62f 51 length++;
samux 10:d3e3e925f62f 52 new_msg = false;
samux 10:d3e3e925f62f 53 }
samux 10:d3e3e925f62f 54 if (read == 0xff || read == '\n') {
samux 10:d3e3e925f62f 55 new_msg = true;
samux 10:d3e3e925f62f 56 tmp_buf_rx[length] = 0;
samux 10:d3e3e925f62f 57 memcpy(buf_rx, tmp_buf_rx, length);
samux 10:d3e3e925f62f 58 length = 0;
samux 10:d3e3e925f62f 59 }
samux 10:d3e3e925f62f 60 }
samux 10:d3e3e925f62f 61
samux 10:d3e3e925f62f 62 void Wifly::attach_rx(bool null) {
samux 10:d3e3e925f62f 63 if (!null)
samux 10:d3e3e925f62f 64 wifi.attach(NULL);
samux 10:d3e3e925f62f 65 else
samux 10:d3e3e925f62f 66 wifi.attach(this, &Wifly::handler_rx);
samux 0:2f38aaabc810 67 }
samux 0:2f38aaabc810 68
samux 0:2f38aaabc810 69
samux 0:2f38aaabc810 70
samux 10:d3e3e925f62f 71 bool Wifly::Send(char * str, char * ACK, char * res) {
samux 0:2f38aaabc810 72
samux 10:d3e3e925f62f 73 char read;
samux 0:2f38aaabc810 74
samux 10:d3e3e925f62f 75 attach_rx(false);
samux 10:d3e3e925f62f 76
samux 0:2f38aaabc810 77 size_t found = string::npos;
samux 10:d3e3e925f62f 78
samux 0:2f38aaabc810 79 if (!strcmp(ACK, "NO"))
samux 0:2f38aaabc810 80 wifi.printf("%s", str);
samux 10:d3e3e925f62f 81 else {
samux 10:d3e3e925f62f 82
samux 10:d3e3e925f62f 83 //We flush the buffer
samux 10:d3e3e925f62f 84 while (wifi.readable())
samux 10:d3e3e925f62f 85 wifi.getc();
samux 10:d3e3e925f62f 86
samux 0:2f38aaabc810 87 Timer tmr;
samux 0:2f38aaabc810 88 tmr.start();
samux 0:2f38aaabc810 89 wifi.printf("%s", str);
samux 0:2f38aaabc810 90 string checking;
samux 10:d3e3e925f62f 91
samux 10:d3e3e925f62f 92 while (1) {
samux 10:d3e3e925f62f 93 if (tmr.read() > 3) {
samux 10:d3e3e925f62f 94 //We flush the buffer
samux 10:d3e3e925f62f 95 while (wifi.readable())
samux 10:d3e3e925f62f 96 wifi.getc();
samux 10:d3e3e925f62f 97
samux 0:2f38aaabc810 98 //printf("checking: %s\r\n", checking);
samux 10:d3e3e925f62f 99 attach_rx(true);
samux 0:2f38aaabc810 100 return false;
samux 10:d3e3e925f62f 101 } else if (wifi.readable()) {
samux 0:2f38aaabc810 102 read = wifi.getc();
samux 10:d3e3e925f62f 103 if ( read != '\r' && read != '\n') {
samux 0:2f38aaabc810 104 checking += read;
samux 0:2f38aaabc810 105 found = checking.find(ACK);
samux 10:d3e3e925f62f 106 if (found != string::npos) {
samux 10:d3e3e925f62f 107
samux 10:d3e3e925f62f 108 //We flush the buffer
samux 10:d3e3e925f62f 109 while (wifi.readable())
samux 10:d3e3e925f62f 110 wifi.getc();
samux 10:d3e3e925f62f 111
samux 0:2f38aaabc810 112 //printf("checking: %s\r\n", checking);
samux 0:2f38aaabc810 113 break;
samux 0:2f38aaabc810 114 }
samux 0:2f38aaabc810 115 }
samux 0:2f38aaabc810 116 }
samux 0:2f38aaabc810 117 }
samux 10:d3e3e925f62f 118 attach_rx(true);
samux 0:2f38aaabc810 119 return (found != string::npos);
samux 0:2f38aaabc810 120 }
samux 10:d3e3e925f62f 121 if ( res != NULL) {
samux 10:d3e3e925f62f 122 int i = 0;
samux 10:d3e3e925f62f 123 while (!wifi.readable());
samux 10:d3e3e925f62f 124 wait(0.1);
samux 10:d3e3e925f62f 125 while (wifi.readable()) {
samux 10:d3e3e925f62f 126 read = wifi.getc();
samux 10:d3e3e925f62f 127 if ( read != '\r' && read != '\n') {
samux 10:d3e3e925f62f 128 res[i++] = read;
samux 10:d3e3e925f62f 129 }
samux 10:d3e3e925f62f 130 }
samux 10:d3e3e925f62f 131 }
samux 10:d3e3e925f62f 132 attach_rx(true);
samux 0:2f38aaabc810 133 return true;
samux 0:2f38aaabc810 134 }
samux 0:2f38aaabc810 135
samux 10:d3e3e925f62f 136 bool Wifly::Join() {
samux 0:2f38aaabc810 137 char cmd[30];
samux 10:d3e3e925f62f 138
samux 0:2f38aaabc810 139 exit();
samux 10:d3e3e925f62f 140
samux 10:d3e3e925f62f 141 if (!CmdMode()) {
samux 0:2f38aaabc810 142 printf("join: cannot enter in cmd mode\r\n");
samux 0:2f38aaabc810 143 exit();
samux 10:d3e3e925f62f 144 return false;
samux 0:2f38aaabc810 145 }
samux 10:d3e3e925f62f 146
samux 0:2f38aaabc810 147 //auth
samux 10:d3e3e925f62f 148 if (!Send("set wlan auth 3\r\n", "AOK")) {
samux 0:2f38aaabc810 149 printf("join: cannot set auth\r\n");
samux 0:2f38aaabc810 150 exit();
samux 0:2f38aaabc810 151 return false;
samux 0:2f38aaabc810 152 }
samux 10:d3e3e925f62f 153
samux 0:2f38aaabc810 154 //dhcp
samux 0:2f38aaabc810 155 sprintf(cmd, "set ip dhcp %d\r\n", (dhcp) ? 1 : 0);
samux 10:d3e3e925f62f 156 if (!Send(cmd, "AOK")) {
samux 0:2f38aaabc810 157 printf("join: cannot set dhcp\r\n");
samux 0:2f38aaabc810 158 exit();
samux 0:2f38aaabc810 159 return false;
samux 0:2f38aaabc810 160 }
samux 10:d3e3e925f62f 161
samux 7:c6cf9ae117b1 162 //no echo
samux 10:d3e3e925f62f 163 if (!Send("set uart mode 1\r\n", "AOK")) {
samux 7:c6cf9ae117b1 164 printf("join: cannot set no echo\r\n");
samux 7:c6cf9ae117b1 165 exit();
samux 7:c6cf9ae117b1 166 return false;
samux 7:c6cf9ae117b1 167 }
samux 10:d3e3e925f62f 168
samux 10:d3e3e925f62f 169 if (!dhcp) {
samux 0:2f38aaabc810 170 printf("not dhcp\r\n");
samux 0:2f38aaabc810 171 sprintf(cmd, "set ip address %s\r\n", ip);
samux 10:d3e3e925f62f 172 if (!Send(cmd, "AOK")) {
samux 0:2f38aaabc810 173 printf("Wifly::Join: cannot set ip address\r\n");
samux 0:2f38aaabc810 174 exit();
samux 0:2f38aaabc810 175 return false;
samux 0:2f38aaabc810 176 }
samux 10:d3e3e925f62f 177
samux 0:2f38aaabc810 178 sprintf(cmd, "set ip netmask %s\r\n", netmask);
samux 10:d3e3e925f62f 179 if (!Send(cmd, "AOK")) {
samux 0:2f38aaabc810 180 printf("Wifly::join: cannot set netmask\r\n");
samux 0:2f38aaabc810 181 exit();
samux 0:2f38aaabc810 182 return false;
samux 0:2f38aaabc810 183 }
samux 10:d3e3e925f62f 184
samux 0:2f38aaabc810 185 }
samux 10:d3e3e925f62f 186
samux 0:2f38aaabc810 187 //key step
samux 10:d3e3e925f62f 188 if (wpa)
samux 0:2f38aaabc810 189 sprintf(cmd, "set wlan phrase %s\r\n", phrase);
samux 0:2f38aaabc810 190 else
samux 0:2f38aaabc810 191 sprintf(cmd, "set wlan key %s\r\n", phrase);
samux 10:d3e3e925f62f 192
samux 10:d3e3e925f62f 193 if (!Send(cmd, "AOK")) {
samux 0:2f38aaabc810 194 printf("join: cannot set phrase\r\n");
samux 0:2f38aaabc810 195 exit();
samux 0:2f38aaabc810 196 return false;
samux 0:2f38aaabc810 197 }
samux 10:d3e3e925f62f 198
samux 10:d3e3e925f62f 199
samux 10:d3e3e925f62f 200
samux 0:2f38aaabc810 201 //join the network
samux 0:2f38aaabc810 202 sprintf(cmd, "join %s\r\n", ssid);
samux 10:d3e3e925f62f 203
samux 10:d3e3e925f62f 204 if (!Send(cmd, "IP=")) {
samux 0:2f38aaabc810 205 printf("join: cannot join %s\r\n", ssid);
samux 0:2f38aaabc810 206 exit();
samux 0:2f38aaabc810 207 return false;
samux 0:2f38aaabc810 208 }
samux 0:2f38aaabc810 209 exit();
samux 0:2f38aaabc810 210 printf("\r\nssid: %s\r\nphrase: %s\r\nsecurity: %s\r\n\r\n", this->ssid, this->phrase, (wpa) ? "WPA" : "WEP");
samux 0:2f38aaabc810 211 return true;
samux 10:d3e3e925f62f 212
samux 0:2f38aaabc810 213 }
samux 0:2f38aaabc810 214
samux 0:2f38aaabc810 215
samux 10:d3e3e925f62f 216
samux 10:d3e3e925f62f 217 bool Wifly::CreateAdhocNetwork() {
samux 10:d3e3e925f62f 218 if (adhoc) {
samux 0:2f38aaabc810 219 char cmd[50];
samux 10:d3e3e925f62f 220
samux 0:2f38aaabc810 221 exit();
samux 10:d3e3e925f62f 222
samux 10:d3e3e925f62f 223 if (!CmdMode()) {
samux 0:2f38aaabc810 224 printf("Wifly::CreateAdhocNetwork: cannot enter in cmd mode\r\n");
samux 0:2f38aaabc810 225 exit();
samux 10:d3e3e925f62f 226 return false;
samux 0:2f38aaabc810 227 }
samux 10:d3e3e925f62f 228
samux 10:d3e3e925f62f 229 if (!Send("set wlan join 4\r\n", "AOK")) {
samux 0:2f38aaabc810 230 printf("Wifly::CreateAdhocNetwork: cannot set join 4\r\n");
samux 0:2f38aaabc810 231 exit();
samux 0:2f38aaabc810 232 return false;
samux 0:2f38aaabc810 233 }
samux 10:d3e3e925f62f 234
samux 7:c6cf9ae117b1 235 //no echo
samux 10:d3e3e925f62f 236 if (!Send("set uart mode 1\r\n", "AOK")) {
samux 7:c6cf9ae117b1 237 printf("join: cannot set no echo\r\n");
samux 7:c6cf9ae117b1 238 exit();
samux 7:c6cf9ae117b1 239 return false;
samux 7:c6cf9ae117b1 240 }
samux 10:d3e3e925f62f 241
samux 0:2f38aaabc810 242 //ssid
samux 0:2f38aaabc810 243 sprintf(cmd, "set wlan ssid %s\r\n", ssid);
samux 10:d3e3e925f62f 244 if (!Send(cmd, "AOK")) {
samux 0:2f38aaabc810 245 printf("Wifly::CreateAdhocNetwork: cannot set ssid\r\n");
samux 0:2f38aaabc810 246 exit();
samux 0:2f38aaabc810 247 return false;
samux 0:2f38aaabc810 248 }
samux 10:d3e3e925f62f 249
samux 0:2f38aaabc810 250 sprintf(cmd, "set wlan channel %d\r\n", channel);
samux 10:d3e3e925f62f 251 if (!Send(cmd, "AOK")) {
samux 0:2f38aaabc810 252 printf("Wifly::CreateAdhocNetwork: cannot set channel\r\n");
samux 0:2f38aaabc810 253 exit();
samux 0:2f38aaabc810 254 return false;
samux 0:2f38aaabc810 255 }
samux 10:d3e3e925f62f 256
samux 0:2f38aaabc810 257 sprintf(cmd, "set ip address %s\r\n", ip);
samux 10:d3e3e925f62f 258 if (!Send(cmd, "AOK")) {
samux 0:2f38aaabc810 259 printf("Wifly::CreateAdhocNetwork: cannot set ip address\r\n");
samux 0:2f38aaabc810 260 exit();
samux 0:2f38aaabc810 261 return false;
samux 0:2f38aaabc810 262 }
samux 10:d3e3e925f62f 263
samux 0:2f38aaabc810 264 sprintf(cmd, "set ip netmask %s\r\n", netmask);
samux 10:d3e3e925f62f 265 if (!Send(cmd, "AOK")) {
samux 0:2f38aaabc810 266 printf("Wifly::CreateAdhocNetwork: cannot set netmask\r\n");
samux 0:2f38aaabc810 267 exit();
samux 0:2f38aaabc810 268 return false;
samux 0:2f38aaabc810 269 }
samux 10:d3e3e925f62f 270
samux 10:d3e3e925f62f 271 if (!Send("set ip dhcp 0\r\n", "AOK")) {
samux 0:2f38aaabc810 272 printf("Wifly::CreateAdhocNetwork: cannot set dhcp off\r\n");
samux 0:2f38aaabc810 273 exit();
samux 0:2f38aaabc810 274 return false;
samux 0:2f38aaabc810 275 }
samux 10:d3e3e925f62f 276
samux 10:d3e3e925f62f 277 if (!Send("save\r\n", "Stor")) {
samux 0:2f38aaabc810 278 printf("Wifly::CreateAdhocNetwork: cannot save\r\n");
samux 0:2f38aaabc810 279 exit();
samux 0:2f38aaabc810 280 return false;
samux 0:2f38aaabc810 281 }
samux 10:d3e3e925f62f 282
samux 0:2f38aaabc810 283 Send("reboot\r\n", "NO");
samux 0:2f38aaabc810 284 printf("\r\ncreating an adhoc\r\nnetwork: %s\r\nip: %s\r\nnetmask: %s\r\nchannel: %d\r\n\r\n", ssid, ip, netmask, channel);
samux 0:2f38aaabc810 285 return true;
samux 10:d3e3e925f62f 286 } else {
samux 0:2f38aaabc810 287 printf("Wifly::join: You don't chose the right constructor for creating an adhoc mode!\r\n");
samux 0:2f38aaabc810 288 return false;
samux 0:2f38aaabc810 289 }
samux 0:2f38aaabc810 290 }
samux 0:2f38aaabc810 291
samux 10:d3e3e925f62f 292 bool Wifly::CmdMode() {
samux 10:d3e3e925f62f 293 if (!Send("$$$", "CMD")) {
samux 0:2f38aaabc810 294 printf("Wifly::CmdMode: cannot enter in cmd mode\r\n");
samux 9:984c1436dd42 295 return false;
samux 0:2f38aaabc810 296 }
samux 0:2f38aaabc810 297 return true;
samux 0:2f38aaabc810 298 }
samux 0:2f38aaabc810 299
samux 0:2f38aaabc810 300
samux 0:2f38aaabc810 301
samux 0:2f38aaabc810 302
samux 10:d3e3e925f62f 303 void Wifly::reset() {
samux 0:2f38aaabc810 304 reset_pin = 0;
samux 10:d3e3e925f62f 305 memset(buf_rx, 0, 100);
samux 0:2f38aaabc810 306 wait(0.2);
samux 0:2f38aaabc810 307 reset_pin = 1;
samux 10:d3e3e925f62f 308 memset(tmp_buf_rx, 0, 100);
samux 0:2f38aaabc810 309 wait(0.2);
samux 0:2f38aaabc810 310 }
samux 0:2f38aaabc810 311
samux 0:2f38aaabc810 312
samux 0:2f38aaabc810 313
samux 0:2f38aaabc810 314
samux 0:2f38aaabc810 315
samux 0:2f38aaabc810 316
samux 10:d3e3e925f62f 317 void Wifly::putc(char c) {
samux 0:2f38aaabc810 318 wifi.putc(c);
samux 0:2f38aaabc810 319 }
samux 0:2f38aaabc810 320
samux 0:2f38aaabc810 321
samux 0:2f38aaabc810 322
samux 0:2f38aaabc810 323
samux 10:d3e3e925f62f 324 void Wifly::read(char * str) {
samux 10:d3e3e925f62f 325 if (new_msg) {
samux 10:d3e3e925f62f 326 memcpy(str, buf_rx, strlen(buf_rx + 1) + 1);
samux 10:d3e3e925f62f 327 new_msg = false;
samux 10:d3e3e925f62f 328 } else
samux 10:d3e3e925f62f 329 str = NULL;
samux 0:2f38aaabc810 330 }
samux 0:2f38aaabc810 331
samux 0:2f38aaabc810 332
samux 0:2f38aaabc810 333
samux 0:2f38aaabc810 334
samux 10:d3e3e925f62f 335 bool Wifly::exit() {
samux 0:2f38aaabc810 336 return Send("exit\r", "EXIT");
samux 0:2f38aaabc810 337 }
samux 0:2f38aaabc810 338
samux 0:2f38aaabc810 339
samux 0:2f38aaabc810 340
samux 10:d3e3e925f62f 341 bool Wifly::readable() {
samux 0:2f38aaabc810 342 return(wifi.readable());
samux 0:2f38aaabc810 343 }
samux 0:2f38aaabc810 344
samux 10:d3e3e925f62f 345 bool Wifly::changeBaudrate(int baudrate) {
samux 4:06ca04e2e279 346 char cmd[20];
samux 4:06ca04e2e279 347 exit();
samux 10:d3e3e925f62f 348 if (!CmdMode()) {
samux 4:06ca04e2e279 349 printf("Wifly::changeBaudrate: cannot enter in cmd mode\r\n");
samux 4:06ca04e2e279 350 return false;
samux 4:06ca04e2e279 351 }
samux 10:d3e3e925f62f 352
samux 4:06ca04e2e279 353 sprintf(cmd, "set u b %d\r\n", baudrate);
samux 10:d3e3e925f62f 354 if (!Send(cmd, "AOK")) {
samux 4:06ca04e2e279 355 printf("Wifly::changeBaudrate: cannot set new baudrate\r\n");
samux 4:06ca04e2e279 356 exit();
samux 4:06ca04e2e279 357 return false;
samux 4:06ca04e2e279 358 }
samux 10:d3e3e925f62f 359
samux 10:d3e3e925f62f 360 if (!Send("save\r\n", "Stor")) {
samux 4:06ca04e2e279 361 printf("Wifly::changeBaudrate: cannot save\r\n");
samux 4:06ca04e2e279 362 exit();
samux 4:06ca04e2e279 363 return false;
samux 4:06ca04e2e279 364 }
samux 10:d3e3e925f62f 365
samux 4:06ca04e2e279 366 return true;
samux 4:06ca04e2e279 367 }
samux 0:2f38aaabc810 368
samux 0:2f38aaabc810 369
samux 10:d3e3e925f62f 370 char Wifly::getc() {
samux 0:2f38aaabc810 371 return(wifi.getc());
samux 0:2f38aaabc810 372 }