This program opens a socket and wait connection through Wi-Fi. When the socket is connected, print out received characters to LCD.
WifiTerminalMode.h@2:f5754fb90f07, 2012-10-24 (annotated)
- Committer:
- nakata
- Date:
- Wed Oct 24 10:16:52 2012 +0000
- Revision:
- 2:f5754fb90f07
Interface public version
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
nakata | 2:f5754fb90f07 | 1 | #include "private.h" |
nakata | 2:f5754fb90f07 | 2 | #include <string.h> |
nakata | 2:f5754fb90f07 | 3 | |
nakata | 2:f5754fb90f07 | 4 | /* |
nakata | 2:f5754fb90f07 | 5 | * common constants |
nakata | 2:f5754fb90f07 | 6 | */ |
nakata | 2:f5754fb90f07 | 7 | #define BAUD_RATE 115200 |
nakata | 2:f5754fb90f07 | 8 | //#define BAUD_RATE 9600 |
nakata | 2:f5754fb90f07 | 9 | #define CR 13 |
nakata | 2:f5754fb90f07 | 10 | #define LF 10 |
nakata | 2:f5754fb90f07 | 11 | #define READ_BUFF_LEN 4096 |
nakata | 2:f5754fb90f07 | 12 | #define IPADDRESS_LENGTH 16 |
nakata | 2:f5754fb90f07 | 13 | #define PORT_NUM "1080" |
nakata | 2:f5754fb90f07 | 14 | |
nakata | 2:f5754fb90f07 | 15 | /* |
nakata | 2:f5754fb90f07 | 16 | * mbed pin settings |
nakata | 2:f5754fb90f07 | 17 | */ |
nakata | 2:f5754fb90f07 | 18 | Serial wifi(p13, p14); |
nakata | 2:f5754fb90f07 | 19 | DigitalOut PRST(p15); |
nakata | 2:f5754fb90f07 | 20 | |
nakata | 2:f5754fb90f07 | 21 | class WifiTerminalMode { |
nakata | 2:f5754fb90f07 | 22 | private: |
nakata | 2:f5754fb90f07 | 23 | unsigned char buff[READ_BUFF_LEN]; |
nakata | 2:f5754fb90f07 | 24 | unsigned char myIPAddress[IPADDRESS_LENGTH]; |
nakata | 2:f5754fb90f07 | 25 | |
nakata | 2:f5754fb90f07 | 26 | private: |
nakata | 2:f5754fb90f07 | 27 | void putc(int c) |
nakata | 2:f5754fb90f07 | 28 | { |
nakata | 2:f5754fb90f07 | 29 | while (!wifi.writeable()) |
nakata | 2:f5754fb90f07 | 30 | ; // empty loop body |
nakata | 2:f5754fb90f07 | 31 | wifi.putc(c); |
nakata | 2:f5754fb90f07 | 32 | } |
nakata | 2:f5754fb90f07 | 33 | |
nakata | 2:f5754fb90f07 | 34 | int getc() |
nakata | 2:f5754fb90f07 | 35 | { |
nakata | 2:f5754fb90f07 | 36 | return wifi.getc(); |
nakata | 2:f5754fb90f07 | 37 | } |
nakata | 2:f5754fb90f07 | 38 | |
nakata | 2:f5754fb90f07 | 39 | void delayedPutc(unsigned char c) |
nakata | 2:f5754fb90f07 | 40 | { |
nakata | 2:f5754fb90f07 | 41 | wait(0.00032); |
nakata | 2:f5754fb90f07 | 42 | putc(c); |
nakata | 2:f5754fb90f07 | 43 | } |
nakata | 2:f5754fb90f07 | 44 | |
nakata | 2:f5754fb90f07 | 45 | void write(const unsigned char *data) |
nakata | 2:f5754fb90f07 | 46 | { |
nakata | 2:f5754fb90f07 | 47 | const unsigned char *p; |
nakata | 2:f5754fb90f07 | 48 | for ( p = data; *p != '\0'; p++ ) { |
nakata | 2:f5754fb90f07 | 49 | delayedPutc(*p); |
nakata | 2:f5754fb90f07 | 50 | } |
nakata | 2:f5754fb90f07 | 51 | } |
nakata | 2:f5754fb90f07 | 52 | |
nakata | 2:f5754fb90f07 | 53 | int readToPrompt() |
nakata | 2:f5754fb90f07 | 54 | { |
nakata | 2:f5754fb90f07 | 55 | int len; |
nakata | 2:f5754fb90f07 | 56 | unsigned char *p = buff; |
nakata | 2:f5754fb90f07 | 57 | for ( len = 0; len < READ_BUFF_LEN - 1; len++, p++ ) { |
nakata | 2:f5754fb90f07 | 58 | *p = getc(); |
nakata | 2:f5754fb90f07 | 59 | if ( *p == '#' ) { |
nakata | 2:f5754fb90f07 | 60 | break; |
nakata | 2:f5754fb90f07 | 61 | } |
nakata | 2:f5754fb90f07 | 62 | } |
nakata | 2:f5754fb90f07 | 63 | *p = '\0'; |
nakata | 2:f5754fb90f07 | 64 | |
nakata | 2:f5754fb90f07 | 65 | return len; |
nakata | 2:f5754fb90f07 | 66 | } |
nakata | 2:f5754fb90f07 | 67 | |
nakata | 2:f5754fb90f07 | 68 | void waitPrompt() |
nakata | 2:f5754fb90f07 | 69 | { |
nakata | 2:f5754fb90f07 | 70 | while (getc() != '#') |
nakata | 2:f5754fb90f07 | 71 | ; // empty loop body |
nakata | 2:f5754fb90f07 | 72 | } |
nakata | 2:f5754fb90f07 | 73 | |
nakata | 2:f5754fb90f07 | 74 | public: |
nakata | 2:f5754fb90f07 | 75 | unsigned char *readBlock() |
nakata | 2:f5754fb90f07 | 76 | { |
nakata | 2:f5754fb90f07 | 77 | int len; |
nakata | 2:f5754fb90f07 | 78 | unsigned char *p = buff; |
nakata | 2:f5754fb90f07 | 79 | for ( len = 0; len < READ_BUFF_LEN - 1; len++ ) { |
nakata | 2:f5754fb90f07 | 80 | *p++ = getc(); |
nakata | 2:f5754fb90f07 | 81 | if ( !wifi.readable() ) { |
nakata | 2:f5754fb90f07 | 82 | break; |
nakata | 2:f5754fb90f07 | 83 | } |
nakata | 2:f5754fb90f07 | 84 | } |
nakata | 2:f5754fb90f07 | 85 | *p = '\0'; |
nakata | 2:f5754fb90f07 | 86 | |
nakata | 2:f5754fb90f07 | 87 | return buff; |
nakata | 2:f5754fb90f07 | 88 | } |
nakata | 2:f5754fb90f07 | 89 | |
nakata | 2:f5754fb90f07 | 90 | unsigned char *readLine() |
nakata | 2:f5754fb90f07 | 91 | { |
nakata | 2:f5754fb90f07 | 92 | int len; |
nakata | 2:f5754fb90f07 | 93 | unsigned char *p = buff; |
nakata | 2:f5754fb90f07 | 94 | |
nakata | 2:f5754fb90f07 | 95 | for ( len = 0; len < READ_BUFF_LEN - 1; len++, p++ ) { |
nakata | 2:f5754fb90f07 | 96 | *p = getc(); |
nakata | 2:f5754fb90f07 | 97 | if ( *p == CR || *p == LF ) { |
nakata | 2:f5754fb90f07 | 98 | p++; |
nakata | 2:f5754fb90f07 | 99 | break; |
nakata | 2:f5754fb90f07 | 100 | } |
nakata | 2:f5754fb90f07 | 101 | } |
nakata | 2:f5754fb90f07 | 102 | *p = '\0'; |
nakata | 2:f5754fb90f07 | 103 | |
nakata | 2:f5754fb90f07 | 104 | return buff; |
nakata | 2:f5754fb90f07 | 105 | } |
nakata | 2:f5754fb90f07 | 106 | private: |
nakata | 2:f5754fb90f07 | 107 | int command(const unsigned char *data) |
nakata | 2:f5754fb90f07 | 108 | { |
nakata | 2:f5754fb90f07 | 109 | int len = 0; |
nakata | 2:f5754fb90f07 | 110 | unsigned char *p2 = buff; |
nakata | 2:f5754fb90f07 | 111 | const unsigned char *p; |
nakata | 2:f5754fb90f07 | 112 | |
nakata | 2:f5754fb90f07 | 113 | for ( p = data; *p != '\0'; p++ ) { |
nakata | 2:f5754fb90f07 | 114 | while (wifi.readable()) { |
nakata | 2:f5754fb90f07 | 115 | *p2++ = getc(); |
nakata | 2:f5754fb90f07 | 116 | len++; |
nakata | 2:f5754fb90f07 | 117 | } |
nakata | 2:f5754fb90f07 | 118 | delayedPutc(*p); |
nakata | 2:f5754fb90f07 | 119 | } |
nakata | 2:f5754fb90f07 | 120 | for (; len < READ_BUFF_LEN - 1; len++, p2++ ) { |
nakata | 2:f5754fb90f07 | 121 | *p2 = getc(); |
nakata | 2:f5754fb90f07 | 122 | if ( *p2 == '#') { |
nakata | 2:f5754fb90f07 | 123 | break; |
nakata | 2:f5754fb90f07 | 124 | } |
nakata | 2:f5754fb90f07 | 125 | } |
nakata | 2:f5754fb90f07 | 126 | *p2 = '\0'; |
nakata | 2:f5754fb90f07 | 127 | |
nakata | 2:f5754fb90f07 | 128 | return len; |
nakata | 2:f5754fb90f07 | 129 | } |
nakata | 2:f5754fb90f07 | 130 | |
nakata | 2:f5754fb90f07 | 131 | public: |
nakata | 2:f5754fb90f07 | 132 | void reset() |
nakata | 2:f5754fb90f07 | 133 | { |
nakata | 2:f5754fb90f07 | 134 | wifi.baud(BAUD_RATE); |
nakata | 2:f5754fb90f07 | 135 | wifi.format(8, Serial::None, 1); |
nakata | 2:f5754fb90f07 | 136 | |
nakata | 2:f5754fb90f07 | 137 | PRST = 0; // activate reset line |
nakata | 2:f5754fb90f07 | 138 | wait(1.0); // perhaps needs 1 sec |
nakata | 2:f5754fb90f07 | 139 | PRST = 1; // deactivate reset line |
nakata | 2:f5754fb90f07 | 140 | } |
nakata | 2:f5754fb90f07 | 141 | |
nakata | 2:f5754fb90f07 | 142 | void serialInit() |
nakata | 2:f5754fb90f07 | 143 | { |
nakata | 2:f5754fb90f07 | 144 | int i; |
nakata | 2:f5754fb90f07 | 145 | int c = 0; |
nakata | 2:f5754fb90f07 | 146 | |
nakata | 2:f5754fb90f07 | 147 | while (true) { |
nakata | 2:f5754fb90f07 | 148 | if (wifi.writeable()) |
nakata | 2:f5754fb90f07 | 149 | putc('A'); |
nakata | 2:f5754fb90f07 | 150 | if (wifi.readable()) { |
nakata | 2:f5754fb90f07 | 151 | if ( c == '*' ) { |
nakata | 2:f5754fb90f07 | 152 | c = getc(); |
nakata | 2:f5754fb90f07 | 153 | if ( c == CR ) { |
nakata | 2:f5754fb90f07 | 154 | break; |
nakata | 2:f5754fb90f07 | 155 | } |
nakata | 2:f5754fb90f07 | 156 | } else { |
nakata | 2:f5754fb90f07 | 157 | c = getc(); |
nakata | 2:f5754fb90f07 | 158 | } |
nakata | 2:f5754fb90f07 | 159 | } |
nakata | 2:f5754fb90f07 | 160 | wait(0.00032); // this wait is important |
nakata | 2:f5754fb90f07 | 161 | } |
nakata | 2:f5754fb90f07 | 162 | // flush buffer |
nakata | 2:f5754fb90f07 | 163 | while (wifi.readable()) |
nakata | 2:f5754fb90f07 | 164 | getc(); |
nakata | 2:f5754fb90f07 | 165 | // change to config mode |
nakata | 2:f5754fb90f07 | 166 | for ( i = 0; i < 8; i++ ) { |
nakata | 2:f5754fb90f07 | 167 | delayedPutc(' '); |
nakata | 2:f5754fb90f07 | 168 | } |
nakata | 2:f5754fb90f07 | 169 | c = 0; |
nakata | 2:f5754fb90f07 | 170 | while (true) { |
nakata | 2:f5754fb90f07 | 171 | if (wifi.readable()) { |
nakata | 2:f5754fb90f07 | 172 | if ( c == '*' ) { |
nakata | 2:f5754fb90f07 | 173 | c = getc(); |
nakata | 2:f5754fb90f07 | 174 | if ( c == CR ) { |
nakata | 2:f5754fb90f07 | 175 | break; |
nakata | 2:f5754fb90f07 | 176 | } |
nakata | 2:f5754fb90f07 | 177 | } else { |
nakata | 2:f5754fb90f07 | 178 | c = getc(); |
nakata | 2:f5754fb90f07 | 179 | } |
nakata | 2:f5754fb90f07 | 180 | } |
nakata | 2:f5754fb90f07 | 181 | } |
nakata | 2:f5754fb90f07 | 182 | } |
nakata | 2:f5754fb90f07 | 183 | |
nakata | 2:f5754fb90f07 | 184 | void portSetup() |
nakata | 2:f5754fb90f07 | 185 | { |
nakata | 2:f5754fb90f07 | 186 | command("wlan_type set infra\r"); |
nakata | 2:f5754fb90f07 | 187 | command("wlan_ssid set " SSID "\r"); |
nakata | 2:f5754fb90f07 | 188 | command("wlan_wps set stop\r"); |
nakata | 2:f5754fb90f07 | 189 | command("wlan_crdl set off\r"); |
nakata | 2:f5754fb90f07 | 190 | #ifdef WEP40_KEY |
nakata | 2:f5754fb90f07 | 191 | command("wlan_sec set wep40\r"); |
nakata | 2:f5754fb90f07 | 192 | command("wlan_wep set " WEP40_KEY "\r"); |
nakata | 2:f5754fb90f07 | 193 | #endif |
nakata | 2:f5754fb90f07 | 194 | #ifdef WEP104_KEY |
nakata | 2:f5754fb90f07 | 195 | command("wlan_sec set wep104\r"); |
nakata | 2:f5754fb90f07 | 196 | command("wlan_wep set " WEP104_KEY "\r"); |
nakata | 2:f5754fb90f07 | 197 | #endif |
nakata | 2:f5754fb90f07 | 198 | #ifdef TKIP_KEY |
nakata | 2:f5754fb90f07 | 199 | command("wlan_sec set wpa-tkip\r"); |
nakata | 2:f5754fb90f07 | 200 | command("wlan_psk set " TKIP_KEY "\r"); |
nakata | 2:f5754fb90f07 | 201 | #endif |
nakata | 2:f5754fb90f07 | 202 | #ifdef AES_KEY |
nakata | 2:f5754fb90f07 | 203 | command("wlan_sec set wpa2-aes\r"); |
nakata | 2:f5754fb90f07 | 204 | command("wlan_psk set " AES_KEY "\r"); |
nakata | 2:f5754fb90f07 | 205 | #endif |
nakata | 2:f5754fb90f07 | 206 | #ifdef MIX_KEY |
nakata | 2:f5754fb90f07 | 207 | command("wlan_sec set wpa-mix\r"); |
nakata | 2:f5754fb90f07 | 208 | command("wlan_psk set " MIX_KEY "\r"); |
nakata | 2:f5754fb90f07 | 209 | #endif |
nakata | 2:f5754fb90f07 | 210 | command("ip_dhcp set on\r"); |
nakata | 2:f5754fb90f07 | 211 | command("ip_term_prot set tcps\r"); |
nakata | 2:f5754fb90f07 | 212 | command("ip_term_hp set " PORT_NUM "\r"); |
nakata | 2:f5754fb90f07 | 213 | command("save permit\r"); |
nakata | 2:f5754fb90f07 | 214 | } |
nakata | 2:f5754fb90f07 | 215 | |
nakata | 2:f5754fb90f07 | 216 | unsigned char *getAddr() |
nakata | 2:f5754fb90f07 | 217 | { |
nakata | 2:f5754fb90f07 | 218 | int len; |
nakata | 2:f5754fb90f07 | 219 | int i = 0; |
nakata | 2:f5754fb90f07 | 220 | const char *p; |
nakata | 2:f5754fb90f07 | 221 | |
nakata | 2:f5754fb90f07 | 222 | waitPrompt(); |
nakata | 2:f5754fb90f07 | 223 | while (true) { |
nakata | 2:f5754fb90f07 | 224 | len = command("wlan_con get\r"); |
nakata | 2:f5754fb90f07 | 225 | if (len > 0 && strstr((const char *)buff, (const char *)"= Connect") != 0 ) { |
nakata | 2:f5754fb90f07 | 226 | break; |
nakata | 2:f5754fb90f07 | 227 | } |
nakata | 2:f5754fb90f07 | 228 | setLeds(4 | i); |
nakata | 2:f5754fb90f07 | 229 | i ^= 1; |
nakata | 2:f5754fb90f07 | 230 | wait(1.0); |
nakata | 2:f5754fb90f07 | 231 | } |
nakata | 2:f5754fb90f07 | 232 | do { |
nakata | 2:f5754fb90f07 | 233 | setLeds(6 | i); |
nakata | 2:f5754fb90f07 | 234 | i ^= 1; |
nakata | 2:f5754fb90f07 | 235 | wait(1.0); |
nakata | 2:f5754fb90f07 | 236 | len = command("ip_current get\r"); |
nakata | 2:f5754fb90f07 | 237 | if ( len <= 0 ) { |
nakata | 2:f5754fb90f07 | 238 | p = (const char *)buff; |
nakata | 2:f5754fb90f07 | 239 | buff[0] = '\0'; |
nakata | 2:f5754fb90f07 | 240 | continue; |
nakata | 2:f5754fb90f07 | 241 | } |
nakata | 2:f5754fb90f07 | 242 | p = strstr((const char *)buff, (const char *)"IP"); |
nakata | 2:f5754fb90f07 | 243 | if ( p == NULL ) |
nakata | 2:f5754fb90f07 | 244 | continue; |
nakata | 2:f5754fb90f07 | 245 | p = strstr(p, (const char *)" = "); |
nakata | 2:f5754fb90f07 | 246 | if ( p == NULL ) |
nakata | 2:f5754fb90f07 | 247 | continue; |
nakata | 2:f5754fb90f07 | 248 | } while ( strncmp(p, " = 0.0.0.0", 10) == 0 ); |
nakata | 2:f5754fb90f07 | 249 | p += 3; |
nakata | 2:f5754fb90f07 | 250 | for ( i = 0; i < IPADDRESS_LENGTH - 1; i++, p++ ) { |
nakata | 2:f5754fb90f07 | 251 | if ( *p == '\r' ) |
nakata | 2:f5754fb90f07 | 252 | break; |
nakata | 2:f5754fb90f07 | 253 | myIPAddress[i] = *p; |
nakata | 2:f5754fb90f07 | 254 | } |
nakata | 2:f5754fb90f07 | 255 | myIPAddress[i] = '\0'; |
nakata | 2:f5754fb90f07 | 256 | command("run permit\r"); |
nakata | 2:f5754fb90f07 | 257 | |
nakata | 2:f5754fb90f07 | 258 | return myIPAddress; |
nakata | 2:f5754fb90f07 | 259 | } |
nakata | 2:f5754fb90f07 | 260 | }; |