Library to use a wifly module: RN 131 C/G
Dependents: RN-XV_simple_server
Wifly.cpp@0:2f38aaabc810, 2011-08-12 (annotated)
- Committer:
- samux
- Date:
- Fri Aug 12 11:20:42 2011 +0000
- Revision:
- 0:2f38aaabc810
- Child:
- 4:06ca04e2e279
Who changed what in which revision?
User | Revision | Line number | New 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 | 0:2f38aaabc810 | 10 | Wifly::Wifly( PinName tx, PinName rx, PinName _reset, char * ssid, char * phrase, |
samux | 0:2f38aaabc810 | 11 | bool wpa, char * ip, char * netmask, bool dhcp, int baudrate, int bits,Serial::Parity parity, |
samux | 0:2f38aaabc810 | 12 | int stop_bits): wifi(tx, rx), reset_pin(_reset) |
samux | 0:2f38aaabc810 | 13 | { |
samux | 0:2f38aaabc810 | 14 | wifi.baud(baudrate); |
samux | 0:2f38aaabc810 | 15 | reset_pin = 1; |
samux | 0:2f38aaabc810 | 16 | wifi.format(bits, parity, stop_bits); |
samux | 0:2f38aaabc810 | 17 | this->wpa = wpa; |
samux | 0:2f38aaabc810 | 18 | this->phrase = phrase; |
samux | 0:2f38aaabc810 | 19 | this->ssid = ssid; |
samux | 0:2f38aaabc810 | 20 | this->ip = ip; |
samux | 0:2f38aaabc810 | 21 | this->netmask = netmask; |
samux | 0:2f38aaabc810 | 22 | this->dhcp = dhcp; |
samux | 0:2f38aaabc810 | 23 | adhoc = false; |
samux | 0:2f38aaabc810 | 24 | } |
samux | 0:2f38aaabc810 | 25 | |
samux | 0:2f38aaabc810 | 26 | |
samux | 0:2f38aaabc810 | 27 | |
samux | 0:2f38aaabc810 | 28 | |
samux | 0:2f38aaabc810 | 29 | |
samux | 0:2f38aaabc810 | 30 | Wifly::Wifly( PinName tx, PinName rx, PinName _reset, char * ssid, char * ip, char * netmask, int channel, |
samux | 0:2f38aaabc810 | 31 | int baudrate, int bits,Serial::Parity parity,int stop_bits): wifi(tx, rx), reset_pin(_reset) |
samux | 0:2f38aaabc810 | 32 | { |
samux | 0:2f38aaabc810 | 33 | wifi.baud(baudrate); |
samux | 0:2f38aaabc810 | 34 | reset_pin = 1; |
samux | 0:2f38aaabc810 | 35 | wifi.format(bits, parity, stop_bits); |
samux | 0:2f38aaabc810 | 36 | adhoc = true; |
samux | 0:2f38aaabc810 | 37 | this->ssid = ssid; |
samux | 0:2f38aaabc810 | 38 | this->ip = ip; |
samux | 0:2f38aaabc810 | 39 | this->netmask = netmask; |
samux | 0:2f38aaabc810 | 40 | this->channel = channel; |
samux | 0:2f38aaabc810 | 41 | } |
samux | 0:2f38aaabc810 | 42 | |
samux | 0:2f38aaabc810 | 43 | |
samux | 0:2f38aaabc810 | 44 | |
samux | 0:2f38aaabc810 | 45 | |
samux | 0:2f38aaabc810 | 46 | |
samux | 0:2f38aaabc810 | 47 | |
samux | 0:2f38aaabc810 | 48 | bool Wifly::Send(char * str, char * ACK) { |
samux | 0:2f38aaabc810 | 49 | |
samux | 0:2f38aaabc810 | 50 | //We flush the buffer |
samux | 0:2f38aaabc810 | 51 | while(wifi.readable()) |
samux | 0:2f38aaabc810 | 52 | //printf("%c",wifi.getc()); |
samux | 0:2f38aaabc810 | 53 | wifi.getc(); |
samux | 0:2f38aaabc810 | 54 | |
samux | 0:2f38aaabc810 | 55 | char read; |
samux | 0:2f38aaabc810 | 56 | |
samux | 0:2f38aaabc810 | 57 | size_t found = string::npos; |
samux | 0:2f38aaabc810 | 58 | |
samux | 0:2f38aaabc810 | 59 | if (!strcmp(ACK, "NO")) |
samux | 0:2f38aaabc810 | 60 | wifi.printf("%s", str); |
samux | 0:2f38aaabc810 | 61 | else |
samux | 0:2f38aaabc810 | 62 | { |
samux | 0:2f38aaabc810 | 63 | Timer tmr; |
samux | 0:2f38aaabc810 | 64 | tmr.start(); |
samux | 0:2f38aaabc810 | 65 | wifi.printf("%s", str); |
samux | 0:2f38aaabc810 | 66 | string checking; |
samux | 0:2f38aaabc810 | 67 | while (1) |
samux | 0:2f38aaabc810 | 68 | { |
samux | 0:2f38aaabc810 | 69 | if(tmr.read() > 3) |
samux | 0:2f38aaabc810 | 70 | { |
samux | 0:2f38aaabc810 | 71 | //printf("checking: %s\r\n", checking); |
samux | 0:2f38aaabc810 | 72 | return false; |
samux | 0:2f38aaabc810 | 73 | } |
samux | 0:2f38aaabc810 | 74 | else if(wifi.readable()) |
samux | 0:2f38aaabc810 | 75 | { |
samux | 0:2f38aaabc810 | 76 | read = wifi.getc(); |
samux | 0:2f38aaabc810 | 77 | if ( read != '\r' && read != '\n') |
samux | 0:2f38aaabc810 | 78 | { |
samux | 0:2f38aaabc810 | 79 | checking += read; |
samux | 0:2f38aaabc810 | 80 | found = checking.find(ACK); |
samux | 0:2f38aaabc810 | 81 | if(found != string::npos) |
samux | 0:2f38aaabc810 | 82 | { |
samux | 0:2f38aaabc810 | 83 | //printf("checking: %s\r\n", checking); |
samux | 0:2f38aaabc810 | 84 | break; |
samux | 0:2f38aaabc810 | 85 | } |
samux | 0:2f38aaabc810 | 86 | } |
samux | 0:2f38aaabc810 | 87 | } |
samux | 0:2f38aaabc810 | 88 | } |
samux | 0:2f38aaabc810 | 89 | return (found != string::npos); |
samux | 0:2f38aaabc810 | 90 | } |
samux | 0:2f38aaabc810 | 91 | return true; |
samux | 0:2f38aaabc810 | 92 | } |
samux | 0:2f38aaabc810 | 93 | |
samux | 0:2f38aaabc810 | 94 | bool Wifly::Join() |
samux | 0:2f38aaabc810 | 95 | { |
samux | 0:2f38aaabc810 | 96 | char cmd[30]; |
samux | 0:2f38aaabc810 | 97 | |
samux | 0:2f38aaabc810 | 98 | exit(); |
samux | 0:2f38aaabc810 | 99 | |
samux | 0:2f38aaabc810 | 100 | if(!CmdMode()) |
samux | 0:2f38aaabc810 | 101 | { |
samux | 0:2f38aaabc810 | 102 | printf("join: cannot enter in cmd mode\r\n"); |
samux | 0:2f38aaabc810 | 103 | exit(); |
samux | 0:2f38aaabc810 | 104 | return false; |
samux | 0:2f38aaabc810 | 105 | } |
samux | 0:2f38aaabc810 | 106 | |
samux | 0:2f38aaabc810 | 107 | //auth |
samux | 0:2f38aaabc810 | 108 | if(!Send("set wlan auth 3\r\n", "AOK")) |
samux | 0:2f38aaabc810 | 109 | { |
samux | 0:2f38aaabc810 | 110 | printf("join: cannot set auth\r\n"); |
samux | 0:2f38aaabc810 | 111 | exit(); |
samux | 0:2f38aaabc810 | 112 | return false; |
samux | 0:2f38aaabc810 | 113 | } |
samux | 0:2f38aaabc810 | 114 | |
samux | 0:2f38aaabc810 | 115 | //dhcp |
samux | 0:2f38aaabc810 | 116 | sprintf(cmd, "set ip dhcp %d\r\n", (dhcp) ? 1 : 0); |
samux | 0:2f38aaabc810 | 117 | if(!Send(cmd, "AOK")) |
samux | 0:2f38aaabc810 | 118 | { |
samux | 0:2f38aaabc810 | 119 | printf("join: cannot set dhcp\r\n"); |
samux | 0:2f38aaabc810 | 120 | exit(); |
samux | 0:2f38aaabc810 | 121 | return false; |
samux | 0:2f38aaabc810 | 122 | } |
samux | 0:2f38aaabc810 | 123 | |
samux | 0:2f38aaabc810 | 124 | if(!dhcp) |
samux | 0:2f38aaabc810 | 125 | { |
samux | 0:2f38aaabc810 | 126 | printf("not dhcp\r\n"); |
samux | 0:2f38aaabc810 | 127 | sprintf(cmd, "set ip address %s\r\n", ip); |
samux | 0:2f38aaabc810 | 128 | if(!Send(cmd, "AOK")) |
samux | 0:2f38aaabc810 | 129 | { |
samux | 0:2f38aaabc810 | 130 | printf("Wifly::Join: cannot set ip address\r\n"); |
samux | 0:2f38aaabc810 | 131 | exit(); |
samux | 0:2f38aaabc810 | 132 | return false; |
samux | 0:2f38aaabc810 | 133 | } |
samux | 0:2f38aaabc810 | 134 | |
samux | 0:2f38aaabc810 | 135 | sprintf(cmd, "set ip netmask %s\r\n", netmask); |
samux | 0:2f38aaabc810 | 136 | if(!Send(cmd, "AOK")) |
samux | 0:2f38aaabc810 | 137 | { |
samux | 0:2f38aaabc810 | 138 | printf("Wifly::join: cannot set netmask\r\n"); |
samux | 0:2f38aaabc810 | 139 | exit(); |
samux | 0:2f38aaabc810 | 140 | return false; |
samux | 0:2f38aaabc810 | 141 | } |
samux | 0:2f38aaabc810 | 142 | |
samux | 0:2f38aaabc810 | 143 | } |
samux | 0:2f38aaabc810 | 144 | |
samux | 0:2f38aaabc810 | 145 | //key step |
samux | 0:2f38aaabc810 | 146 | if(wpa) |
samux | 0:2f38aaabc810 | 147 | sprintf(cmd, "set wlan phrase %s\r\n", phrase); |
samux | 0:2f38aaabc810 | 148 | else |
samux | 0:2f38aaabc810 | 149 | sprintf(cmd, "set wlan key %s\r\n", phrase); |
samux | 0:2f38aaabc810 | 150 | |
samux | 0:2f38aaabc810 | 151 | if(!Send(cmd, "AOK")) |
samux | 0:2f38aaabc810 | 152 | { |
samux | 0:2f38aaabc810 | 153 | printf("join: cannot set phrase\r\n"); |
samux | 0:2f38aaabc810 | 154 | exit(); |
samux | 0:2f38aaabc810 | 155 | return false; |
samux | 0:2f38aaabc810 | 156 | } |
samux | 0:2f38aaabc810 | 157 | |
samux | 0:2f38aaabc810 | 158 | |
samux | 0:2f38aaabc810 | 159 | |
samux | 0:2f38aaabc810 | 160 | //join the network |
samux | 0:2f38aaabc810 | 161 | sprintf(cmd, "join %s\r\n", ssid); |
samux | 0:2f38aaabc810 | 162 | |
samux | 0:2f38aaabc810 | 163 | if(!Send(cmd, "IP=")) |
samux | 0:2f38aaabc810 | 164 | { |
samux | 0:2f38aaabc810 | 165 | printf("join: cannot join %s\r\n", ssid); |
samux | 0:2f38aaabc810 | 166 | exit(); |
samux | 0:2f38aaabc810 | 167 | return false; |
samux | 0:2f38aaabc810 | 168 | } |
samux | 0:2f38aaabc810 | 169 | exit(); |
samux | 0:2f38aaabc810 | 170 | printf("\r\nssid: %s\r\nphrase: %s\r\nsecurity: %s\r\n\r\n", this->ssid, this->phrase, (wpa) ? "WPA" : "WEP"); |
samux | 0:2f38aaabc810 | 171 | return true; |
samux | 0:2f38aaabc810 | 172 | |
samux | 0:2f38aaabc810 | 173 | } |
samux | 0:2f38aaabc810 | 174 | |
samux | 0:2f38aaabc810 | 175 | |
samux | 0:2f38aaabc810 | 176 | bool Wifly::CreateAdhocNetwork() |
samux | 0:2f38aaabc810 | 177 | { |
samux | 0:2f38aaabc810 | 178 | if(adhoc) |
samux | 0:2f38aaabc810 | 179 | { |
samux | 0:2f38aaabc810 | 180 | char cmd[50]; |
samux | 0:2f38aaabc810 | 181 | |
samux | 0:2f38aaabc810 | 182 | exit(); |
samux | 0:2f38aaabc810 | 183 | |
samux | 0:2f38aaabc810 | 184 | if(!CmdMode()) |
samux | 0:2f38aaabc810 | 185 | { |
samux | 0:2f38aaabc810 | 186 | printf("Wifly::CreateAdhocNetwork: cannot enter in cmd mode\r\n"); |
samux | 0:2f38aaabc810 | 187 | exit(); |
samux | 0:2f38aaabc810 | 188 | return false; |
samux | 0:2f38aaabc810 | 189 | } |
samux | 0:2f38aaabc810 | 190 | |
samux | 0:2f38aaabc810 | 191 | if(!Send("set wlan join 4\r\n", "AOK")) |
samux | 0:2f38aaabc810 | 192 | { |
samux | 0:2f38aaabc810 | 193 | printf("Wifly::CreateAdhocNetwork: cannot set join 4\r\n"); |
samux | 0:2f38aaabc810 | 194 | exit(); |
samux | 0:2f38aaabc810 | 195 | return false; |
samux | 0:2f38aaabc810 | 196 | } |
samux | 0:2f38aaabc810 | 197 | |
samux | 0:2f38aaabc810 | 198 | //ssid |
samux | 0:2f38aaabc810 | 199 | sprintf(cmd, "set wlan ssid %s\r\n", ssid); |
samux | 0:2f38aaabc810 | 200 | if(!Send(cmd, "AOK")) |
samux | 0:2f38aaabc810 | 201 | { |
samux | 0:2f38aaabc810 | 202 | printf("Wifly::CreateAdhocNetwork: cannot set ssid\r\n"); |
samux | 0:2f38aaabc810 | 203 | exit(); |
samux | 0:2f38aaabc810 | 204 | return false; |
samux | 0:2f38aaabc810 | 205 | } |
samux | 0:2f38aaabc810 | 206 | |
samux | 0:2f38aaabc810 | 207 | sprintf(cmd, "set wlan channel %d\r\n", channel); |
samux | 0:2f38aaabc810 | 208 | if(!Send(cmd, "AOK")) |
samux | 0:2f38aaabc810 | 209 | { |
samux | 0:2f38aaabc810 | 210 | printf("Wifly::CreateAdhocNetwork: cannot set channel\r\n"); |
samux | 0:2f38aaabc810 | 211 | exit(); |
samux | 0:2f38aaabc810 | 212 | return false; |
samux | 0:2f38aaabc810 | 213 | } |
samux | 0:2f38aaabc810 | 214 | |
samux | 0:2f38aaabc810 | 215 | sprintf(cmd, "set ip address %s\r\n", ip); |
samux | 0:2f38aaabc810 | 216 | if(!Send(cmd, "AOK")) |
samux | 0:2f38aaabc810 | 217 | { |
samux | 0:2f38aaabc810 | 218 | printf("Wifly::CreateAdhocNetwork: cannot set ip address\r\n"); |
samux | 0:2f38aaabc810 | 219 | exit(); |
samux | 0:2f38aaabc810 | 220 | return false; |
samux | 0:2f38aaabc810 | 221 | } |
samux | 0:2f38aaabc810 | 222 | |
samux | 0:2f38aaabc810 | 223 | sprintf(cmd, "set ip netmask %s\r\n", netmask); |
samux | 0:2f38aaabc810 | 224 | if(!Send(cmd, "AOK")) |
samux | 0:2f38aaabc810 | 225 | { |
samux | 0:2f38aaabc810 | 226 | printf("Wifly::CreateAdhocNetwork: cannot set netmask\r\n"); |
samux | 0:2f38aaabc810 | 227 | exit(); |
samux | 0:2f38aaabc810 | 228 | return false; |
samux | 0:2f38aaabc810 | 229 | } |
samux | 0:2f38aaabc810 | 230 | |
samux | 0:2f38aaabc810 | 231 | if(!Send("set ip dhcp 0\r\n", "AOK")) |
samux | 0:2f38aaabc810 | 232 | { |
samux | 0:2f38aaabc810 | 233 | printf("Wifly::CreateAdhocNetwork: cannot set dhcp off\r\n"); |
samux | 0:2f38aaabc810 | 234 | exit(); |
samux | 0:2f38aaabc810 | 235 | return false; |
samux | 0:2f38aaabc810 | 236 | } |
samux | 0:2f38aaabc810 | 237 | |
samux | 0:2f38aaabc810 | 238 | if(!Send("save\r\n", "Stor")) |
samux | 0:2f38aaabc810 | 239 | { |
samux | 0:2f38aaabc810 | 240 | printf("Wifly::CreateAdhocNetwork: cannot save\r\n"); |
samux | 0:2f38aaabc810 | 241 | exit(); |
samux | 0:2f38aaabc810 | 242 | return false; |
samux | 0:2f38aaabc810 | 243 | } |
samux | 0:2f38aaabc810 | 244 | |
samux | 0:2f38aaabc810 | 245 | Send("reboot\r\n", "NO"); |
samux | 0:2f38aaabc810 | 246 | 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 | 247 | return true; |
samux | 0:2f38aaabc810 | 248 | } |
samux | 0:2f38aaabc810 | 249 | else |
samux | 0:2f38aaabc810 | 250 | { |
samux | 0:2f38aaabc810 | 251 | printf("Wifly::join: You don't chose the right constructor for creating an adhoc mode!\r\n"); |
samux | 0:2f38aaabc810 | 252 | return false; |
samux | 0:2f38aaabc810 | 253 | } |
samux | 0:2f38aaabc810 | 254 | } |
samux | 0:2f38aaabc810 | 255 | |
samux | 0:2f38aaabc810 | 256 | bool Wifly::CmdMode() |
samux | 0:2f38aaabc810 | 257 | { |
samux | 0:2f38aaabc810 | 258 | int i = 0; |
samux | 0:2f38aaabc810 | 259 | while(!Send("$$$", "CMD")) |
samux | 0:2f38aaabc810 | 260 | { |
samux | 0:2f38aaabc810 | 261 | printf("Wifly::CmdMode: cannot enter in cmd mode\r\n"); |
samux | 0:2f38aaabc810 | 262 | i++; |
samux | 0:2f38aaabc810 | 263 | if ( i == 4 ) return false; |
samux | 0:2f38aaabc810 | 264 | } |
samux | 0:2f38aaabc810 | 265 | return true; |
samux | 0:2f38aaabc810 | 266 | } |
samux | 0:2f38aaabc810 | 267 | |
samux | 0:2f38aaabc810 | 268 | |
samux | 0:2f38aaabc810 | 269 | |
samux | 0:2f38aaabc810 | 270 | |
samux | 0:2f38aaabc810 | 271 | void Wifly::reset() |
samux | 0:2f38aaabc810 | 272 | { |
samux | 0:2f38aaabc810 | 273 | reset_pin = 0; |
samux | 0:2f38aaabc810 | 274 | wait(0.2); |
samux | 0:2f38aaabc810 | 275 | reset_pin = 1; |
samux | 0:2f38aaabc810 | 276 | wait(0.2); |
samux | 0:2f38aaabc810 | 277 | } |
samux | 0:2f38aaabc810 | 278 | |
samux | 0:2f38aaabc810 | 279 | |
samux | 0:2f38aaabc810 | 280 | |
samux | 0:2f38aaabc810 | 281 | |
samux | 0:2f38aaabc810 | 282 | |
samux | 0:2f38aaabc810 | 283 | |
samux | 0:2f38aaabc810 | 284 | void Wifly::putc(char c) |
samux | 0:2f38aaabc810 | 285 | { |
samux | 0:2f38aaabc810 | 286 | wifi.putc(c); |
samux | 0:2f38aaabc810 | 287 | } |
samux | 0:2f38aaabc810 | 288 | |
samux | 0:2f38aaabc810 | 289 | |
samux | 0:2f38aaabc810 | 290 | |
samux | 0:2f38aaabc810 | 291 | |
samux | 0:2f38aaabc810 | 292 | void Wifly::read(char * str) |
samux | 0:2f38aaabc810 | 293 | { |
samux | 0:2f38aaabc810 | 294 | wifi.scanf("%s", str); |
samux | 0:2f38aaabc810 | 295 | } |
samux | 0:2f38aaabc810 | 296 | |
samux | 0:2f38aaabc810 | 297 | |
samux | 0:2f38aaabc810 | 298 | |
samux | 0:2f38aaabc810 | 299 | |
samux | 0:2f38aaabc810 | 300 | bool Wifly::exit() |
samux | 0:2f38aaabc810 | 301 | { |
samux | 0:2f38aaabc810 | 302 | return Send("exit\r", "EXIT"); |
samux | 0:2f38aaabc810 | 303 | } |
samux | 0:2f38aaabc810 | 304 | |
samux | 0:2f38aaabc810 | 305 | |
samux | 0:2f38aaabc810 | 306 | |
samux | 0:2f38aaabc810 | 307 | bool Wifly::readable() |
samux | 0:2f38aaabc810 | 308 | { |
samux | 0:2f38aaabc810 | 309 | return(wifi.readable()); |
samux | 0:2f38aaabc810 | 310 | } |
samux | 0:2f38aaabc810 | 311 | |
samux | 0:2f38aaabc810 | 312 | |
samux | 0:2f38aaabc810 | 313 | |
samux | 0:2f38aaabc810 | 314 | |
samux | 0:2f38aaabc810 | 315 | char Wifly::getc() |
samux | 0:2f38aaabc810 | 316 | { |
samux | 0:2f38aaabc810 | 317 | return(wifi.getc()); |
samux | 0:2f38aaabc810 | 318 | } |