Library to use a wifly module: RN 131 C/G
Dependents: RN-XV_simple_server
Diff: Wifly.cpp
- Revision:
- 0:2f38aaabc810
- Child:
- 4:06ca04e2e279
diff -r 000000000000 -r 2f38aaabc810 Wifly.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/Wifly.cpp Fri Aug 12 11:20:42 2011 +0000 @@ -0,0 +1,318 @@ +#include "mbed.h" +#include "Wifly.h" +#include <string> + + + + + + +Wifly::Wifly( PinName tx, PinName rx, PinName _reset, char * ssid, char * phrase, + bool wpa, char * ip, char * netmask, bool dhcp, int baudrate, int bits,Serial::Parity parity, + int stop_bits): wifi(tx, rx), reset_pin(_reset) +{ + wifi.baud(baudrate); + reset_pin = 1; + wifi.format(bits, parity, stop_bits); + this->wpa = wpa; + this->phrase = phrase; + this->ssid = ssid; + this->ip = ip; + this->netmask = netmask; + this->dhcp = dhcp; + adhoc = false; +} + + + + + +Wifly::Wifly( PinName tx, PinName rx, PinName _reset, char * ssid, char * ip, char * netmask, int channel, + int baudrate, int bits,Serial::Parity parity,int stop_bits): wifi(tx, rx), reset_pin(_reset) +{ + wifi.baud(baudrate); + reset_pin = 1; + wifi.format(bits, parity, stop_bits); + adhoc = true; + this->ssid = ssid; + this->ip = ip; + this->netmask = netmask; + this->channel = channel; +} + + + + + + +bool Wifly::Send(char * str, char * ACK) { + + //We flush the buffer + while(wifi.readable()) + //printf("%c",wifi.getc()); + wifi.getc(); + + char read; + + size_t found = string::npos; + + if (!strcmp(ACK, "NO")) + wifi.printf("%s", str); + else + { + Timer tmr; + tmr.start(); + wifi.printf("%s", str); + string checking; + while (1) + { + if(tmr.read() > 3) + { + //printf("checking: %s\r\n", checking); + return false; + } + else if(wifi.readable()) + { + read = wifi.getc(); + if ( read != '\r' && read != '\n') + { + checking += read; + found = checking.find(ACK); + if(found != string::npos) + { + //printf("checking: %s\r\n", checking); + break; + } + } + } + } + return (found != string::npos); + } + return true; +} + +bool Wifly::Join() +{ + char cmd[30]; + + exit(); + + if(!CmdMode()) + { + printf("join: cannot enter in cmd mode\r\n"); + exit(); + return false; + } + + //auth + if(!Send("set wlan auth 3\r\n", "AOK")) + { + printf("join: cannot set auth\r\n"); + exit(); + return false; + } + + //dhcp + sprintf(cmd, "set ip dhcp %d\r\n", (dhcp) ? 1 : 0); + if(!Send(cmd, "AOK")) + { + printf("join: cannot set dhcp\r\n"); + exit(); + return false; + } + + if(!dhcp) + { + printf("not dhcp\r\n"); + sprintf(cmd, "set ip address %s\r\n", ip); + if(!Send(cmd, "AOK")) + { + printf("Wifly::Join: cannot set ip address\r\n"); + exit(); + return false; + } + + sprintf(cmd, "set ip netmask %s\r\n", netmask); + if(!Send(cmd, "AOK")) + { + printf("Wifly::join: cannot set netmask\r\n"); + exit(); + return false; + } + + } + + //key step + if(wpa) + sprintf(cmd, "set wlan phrase %s\r\n", phrase); + else + sprintf(cmd, "set wlan key %s\r\n", phrase); + + if(!Send(cmd, "AOK")) + { + printf("join: cannot set phrase\r\n"); + exit(); + return false; + } + + + + //join the network + sprintf(cmd, "join %s\r\n", ssid); + + if(!Send(cmd, "IP=")) + { + printf("join: cannot join %s\r\n", ssid); + exit(); + return false; + } + exit(); + printf("\r\nssid: %s\r\nphrase: %s\r\nsecurity: %s\r\n\r\n", this->ssid, this->phrase, (wpa) ? "WPA" : "WEP"); + return true; + +} + + +bool Wifly::CreateAdhocNetwork() +{ + if(adhoc) + { + char cmd[50]; + + exit(); + + if(!CmdMode()) + { + printf("Wifly::CreateAdhocNetwork: cannot enter in cmd mode\r\n"); + exit(); + return false; + } + + if(!Send("set wlan join 4\r\n", "AOK")) + { + printf("Wifly::CreateAdhocNetwork: cannot set join 4\r\n"); + exit(); + return false; + } + + //ssid + sprintf(cmd, "set wlan ssid %s\r\n", ssid); + if(!Send(cmd, "AOK")) + { + printf("Wifly::CreateAdhocNetwork: cannot set ssid\r\n"); + exit(); + return false; + } + + sprintf(cmd, "set wlan channel %d\r\n", channel); + if(!Send(cmd, "AOK")) + { + printf("Wifly::CreateAdhocNetwork: cannot set channel\r\n"); + exit(); + return false; + } + + sprintf(cmd, "set ip address %s\r\n", ip); + if(!Send(cmd, "AOK")) + { + printf("Wifly::CreateAdhocNetwork: cannot set ip address\r\n"); + exit(); + return false; + } + + sprintf(cmd, "set ip netmask %s\r\n", netmask); + if(!Send(cmd, "AOK")) + { + printf("Wifly::CreateAdhocNetwork: cannot set netmask\r\n"); + exit(); + return false; + } + + if(!Send("set ip dhcp 0\r\n", "AOK")) + { + printf("Wifly::CreateAdhocNetwork: cannot set dhcp off\r\n"); + exit(); + return false; + } + + if(!Send("save\r\n", "Stor")) + { + printf("Wifly::CreateAdhocNetwork: cannot save\r\n"); + exit(); + return false; + } + + Send("reboot\r\n", "NO"); + 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); + return true; + } + else + { + printf("Wifly::join: You don't chose the right constructor for creating an adhoc mode!\r\n"); + return false; + } +} + +bool Wifly::CmdMode() +{ + int i = 0; + while(!Send("$$$", "CMD")) + { + printf("Wifly::CmdMode: cannot enter in cmd mode\r\n"); + i++; + if ( i == 4 ) return false; + } + return true; +} + + + + +void Wifly::reset() +{ + reset_pin = 0; + wait(0.2); + reset_pin = 1; + wait(0.2); +} + + + + + + +void Wifly::putc(char c) +{ + wifi.putc(c); +} + + + + +void Wifly::read(char * str) +{ + wifi.scanf("%s", str); +} + + + + +bool Wifly::exit() +{ + return Send("exit\r", "EXIT"); +} + + + +bool Wifly::readable() +{ + return(wifi.readable()); +} + + + + +char Wifly::getc() +{ + return(wifi.getc()); +} \ No newline at end of file