This program opens a socket and wait connection through Wi-Fi. When the socket is connected, print out received characters to LCD.
Diff: WifiTerminalMode.h
- Revision:
- 2:f5754fb90f07
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/WifiTerminalMode.h Wed Oct 24 10:16:52 2012 +0000 @@ -0,0 +1,260 @@ +#include "private.h" +#include <string.h> + +/* + * common constants + */ +#define BAUD_RATE 115200 +//#define BAUD_RATE 9600 +#define CR 13 +#define LF 10 +#define READ_BUFF_LEN 4096 +#define IPADDRESS_LENGTH 16 +#define PORT_NUM "1080" + +/* + * mbed pin settings + */ +Serial wifi(p13, p14); +DigitalOut PRST(p15); + +class WifiTerminalMode { +private: + unsigned char buff[READ_BUFF_LEN]; + unsigned char myIPAddress[IPADDRESS_LENGTH]; + +private: + void putc(int c) + { + while (!wifi.writeable()) + ; // empty loop body + wifi.putc(c); + } + + int getc() + { + return wifi.getc(); + } + + void delayedPutc(unsigned char c) + { + wait(0.00032); + putc(c); + } + + void write(const unsigned char *data) + { + const unsigned char *p; + for ( p = data; *p != '\0'; p++ ) { + delayedPutc(*p); + } + } + + int readToPrompt() + { + int len; + unsigned char *p = buff; + for ( len = 0; len < READ_BUFF_LEN - 1; len++, p++ ) { + *p = getc(); + if ( *p == '#' ) { + break; + } + } + *p = '\0'; + + return len; + } + + void waitPrompt() + { + while (getc() != '#') + ; // empty loop body + } + +public: + unsigned char *readBlock() + { + int len; + unsigned char *p = buff; + for ( len = 0; len < READ_BUFF_LEN - 1; len++ ) { + *p++ = getc(); + if ( !wifi.readable() ) { + break; + } + } + *p = '\0'; + + return buff; + } + + unsigned char *readLine() + { + int len; + unsigned char *p = buff; + + for ( len = 0; len < READ_BUFF_LEN - 1; len++, p++ ) { + *p = getc(); + if ( *p == CR || *p == LF ) { + p++; + break; + } + } + *p = '\0'; + + return buff; + } +private: + int command(const unsigned char *data) + { + int len = 0; + unsigned char *p2 = buff; + const unsigned char *p; + + for ( p = data; *p != '\0'; p++ ) { + while (wifi.readable()) { + *p2++ = getc(); + len++; + } + delayedPutc(*p); + } + for (; len < READ_BUFF_LEN - 1; len++, p2++ ) { + *p2 = getc(); + if ( *p2 == '#') { + break; + } + } + *p2 = '\0'; + + return len; + } + +public: + void reset() + { + wifi.baud(BAUD_RATE); + wifi.format(8, Serial::None, 1); + + PRST = 0; // activate reset line + wait(1.0); // perhaps needs 1 sec + PRST = 1; // deactivate reset line + } + + void serialInit() + { + int i; + int c = 0; + + while (true) { + if (wifi.writeable()) + putc('A'); + if (wifi.readable()) { + if ( c == '*' ) { + c = getc(); + if ( c == CR ) { + break; + } + } else { + c = getc(); + } + } + wait(0.00032); // this wait is important + } + // flush buffer + while (wifi.readable()) + getc(); + // change to config mode + for ( i = 0; i < 8; i++ ) { + delayedPutc(' '); + } + c = 0; + while (true) { + if (wifi.readable()) { + if ( c == '*' ) { + c = getc(); + if ( c == CR ) { + break; + } + } else { + c = getc(); + } + } + } + } + + void portSetup() + { + command("wlan_type set infra\r"); + command("wlan_ssid set " SSID "\r"); + command("wlan_wps set stop\r"); + command("wlan_crdl set off\r"); +#ifdef WEP40_KEY + command("wlan_sec set wep40\r"); + command("wlan_wep set " WEP40_KEY "\r"); +#endif +#ifdef WEP104_KEY + command("wlan_sec set wep104\r"); + command("wlan_wep set " WEP104_KEY "\r"); +#endif +#ifdef TKIP_KEY + command("wlan_sec set wpa-tkip\r"); + command("wlan_psk set " TKIP_KEY "\r"); +#endif +#ifdef AES_KEY + command("wlan_sec set wpa2-aes\r"); + command("wlan_psk set " AES_KEY "\r"); +#endif +#ifdef MIX_KEY + command("wlan_sec set wpa-mix\r"); + command("wlan_psk set " MIX_KEY "\r"); +#endif + command("ip_dhcp set on\r"); + command("ip_term_prot set tcps\r"); + command("ip_term_hp set " PORT_NUM "\r"); + command("save permit\r"); + } + + unsigned char *getAddr() + { + int len; + int i = 0; + const char *p; + + waitPrompt(); + while (true) { + len = command("wlan_con get\r"); + if (len > 0 && strstr((const char *)buff, (const char *)"= Connect") != 0 ) { + break; + } + setLeds(4 | i); + i ^= 1; + wait(1.0); + } + do { + setLeds(6 | i); + i ^= 1; + wait(1.0); + len = command("ip_current get\r"); + if ( len <= 0 ) { + p = (const char *)buff; + buff[0] = '\0'; + continue; + } + p = strstr((const char *)buff, (const char *)"IP"); + if ( p == NULL ) + continue; + p = strstr(p, (const char *)" = "); + if ( p == NULL ) + continue; + } while ( strncmp(p, " = 0.0.0.0", 10) == 0 ); + p += 3; + for ( i = 0; i < IPADDRESS_LENGTH - 1; i++, p++ ) { + if ( *p == '\r' ) + break; + myIPAddress[i] = *p; + } + myIPAddress[i] = '\0'; + command("run permit\r"); + + return myIPAddress; + } +}; \ No newline at end of file