This program calculate location of Wi-Fi receiver, by using AP beacon. Please check the Japanese magazine "Interface 2012/12".
WiFiScanner.h@0:4eaf38ccb19c, 2012-08-24 (annotated)
- Committer:
- nakata
- Date:
- Fri Aug 24 03:21:43 2012 +0000
- Revision:
- 0:4eaf38ccb19c
- Child:
- 1:2f2f793fcf4f
CQ test version
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
nakata | 0:4eaf38ccb19c | 1 | #include <string.h> |
nakata | 0:4eaf38ccb19c | 2 | |
nakata | 0:4eaf38ccb19c | 3 | #define BAUD_RATE 115200 |
nakata | 0:4eaf38ccb19c | 4 | |
nakata | 0:4eaf38ccb19c | 5 | #define MULTI_CHANNEL |
nakata | 0:4eaf38ccb19c | 6 | #ifdef MULTI_CHANNEL |
nakata | 0:4eaf38ccb19c | 7 | #define TOTAL_CHANNELS 13 |
nakata | 0:4eaf38ccb19c | 8 | #else |
nakata | 0:4eaf38ccb19c | 9 | #define TOTAL_CHANNELS 1 |
nakata | 0:4eaf38ccb19c | 10 | #endif |
nakata | 0:4eaf38ccb19c | 11 | #define MAX_AP_COUNT (10 * TOTAL_CHANNELS) |
nakata | 0:4eaf38ccb19c | 12 | //#define PASSIVE_SCAN // uncommnet here when you need passive scan |
nakata | 0:4eaf38ccb19c | 13 | |
nakata | 0:4eaf38ccb19c | 14 | #define CR '\r' |
nakata | 0:4eaf38ccb19c | 15 | #define SHORT_WAIT 0.00032 |
nakata | 0:4eaf38ccb19c | 16 | #define BUFF_LEN 4096 |
nakata | 0:4eaf38ccb19c | 17 | #define ESSID_LEN 33 |
nakata | 0:4eaf38ccb19c | 18 | #define MACADDR_LEN 6 |
nakata | 0:4eaf38ccb19c | 19 | |
nakata | 0:4eaf38ccb19c | 20 | struct apinfo { |
nakata | 0:4eaf38ccb19c | 21 | unsigned char essid[ESSID_LEN]; |
nakata | 0:4eaf38ccb19c | 22 | unsigned char bssid[MACADDR_LEN]; |
nakata | 0:4eaf38ccb19c | 23 | int power; |
nakata | 0:4eaf38ccb19c | 24 | }; |
nakata | 0:4eaf38ccb19c | 25 | |
nakata | 0:4eaf38ccb19c | 26 | struct apinfo apinfos[MAX_AP_COUNT]; |
nakata | 0:4eaf38ccb19c | 27 | int apinfo_count; |
nakata | 0:4eaf38ccb19c | 28 | |
nakata | 0:4eaf38ccb19c | 29 | Serial wifi(p13, p14); |
nakata | 0:4eaf38ccb19c | 30 | |
nakata | 0:4eaf38ccb19c | 31 | DigitalOut PRST(p15); |
nakata | 0:4eaf38ccb19c | 32 | DigitalOut UART_CTS(p16); |
nakata | 0:4eaf38ccb19c | 33 | DigitalIn UART_RTS(p17); |
nakata | 0:4eaf38ccb19c | 34 | |
nakata | 0:4eaf38ccb19c | 35 | class WiFiScanner { |
nakata | 0:4eaf38ccb19c | 36 | private: |
nakata | 0:4eaf38ccb19c | 37 | int sequence; |
nakata | 0:4eaf38ccb19c | 38 | unsigned char buff[BUFF_LEN]; |
nakata | 0:4eaf38ccb19c | 39 | |
nakata | 0:4eaf38ccb19c | 40 | void wifiReadWait() |
nakata | 0:4eaf38ccb19c | 41 | { |
nakata | 0:4eaf38ccb19c | 42 | UART_CTS = 0; |
nakata | 0:4eaf38ccb19c | 43 | } |
nakata | 0:4eaf38ccb19c | 44 | |
nakata | 0:4eaf38ccb19c | 45 | void wifiReadEnd() |
nakata | 0:4eaf38ccb19c | 46 | { |
nakata | 0:4eaf38ccb19c | 47 | UART_CTS = 1; |
nakata | 0:4eaf38ccb19c | 48 | } |
nakata | 0:4eaf38ccb19c | 49 | |
nakata | 0:4eaf38ccb19c | 50 | void wifiPutc(int c) |
nakata | 0:4eaf38ccb19c | 51 | { |
nakata | 0:4eaf38ccb19c | 52 | while (!wifi.writeable()) |
nakata | 0:4eaf38ccb19c | 53 | ; // empty loop body |
nakata | 0:4eaf38ccb19c | 54 | wifi.putc(c); |
nakata | 0:4eaf38ccb19c | 55 | } |
nakata | 0:4eaf38ccb19c | 56 | |
nakata | 0:4eaf38ccb19c | 57 | int wifiGetc() |
nakata | 0:4eaf38ccb19c | 58 | { |
nakata | 0:4eaf38ccb19c | 59 | while (!wifi.readable()) |
nakata | 0:4eaf38ccb19c | 60 | ; // empty loop body |
nakata | 0:4eaf38ccb19c | 61 | return wifi.getc(); |
nakata | 0:4eaf38ccb19c | 62 | } |
nakata | 0:4eaf38ccb19c | 63 | |
nakata | 0:4eaf38ccb19c | 64 | int num2hex(int i) |
nakata | 0:4eaf38ccb19c | 65 | { |
nakata | 0:4eaf38ccb19c | 66 | static const char hexadecimal[] = "0123456789ABCDEF"; |
nakata | 0:4eaf38ccb19c | 67 | |
nakata | 0:4eaf38ccb19c | 68 | if ( i < 0 || i > 15 ) |
nakata | 0:4eaf38ccb19c | 69 | return '0'; |
nakata | 0:4eaf38ccb19c | 70 | |
nakata | 0:4eaf38ccb19c | 71 | return ((int)hexadecimal[i]); |
nakata | 0:4eaf38ccb19c | 72 | } |
nakata | 0:4eaf38ccb19c | 73 | |
nakata | 0:4eaf38ccb19c | 74 | int hex2num(int i) |
nakata | 0:4eaf38ccb19c | 75 | { |
nakata | 0:4eaf38ccb19c | 76 | switch (i) { |
nakata | 0:4eaf38ccb19c | 77 | case '0': |
nakata | 0:4eaf38ccb19c | 78 | case '1': |
nakata | 0:4eaf38ccb19c | 79 | case '2': |
nakata | 0:4eaf38ccb19c | 80 | case '3': |
nakata | 0:4eaf38ccb19c | 81 | case '4': |
nakata | 0:4eaf38ccb19c | 82 | case '5': |
nakata | 0:4eaf38ccb19c | 83 | case '6': |
nakata | 0:4eaf38ccb19c | 84 | case '7': |
nakata | 0:4eaf38ccb19c | 85 | case '8': |
nakata | 0:4eaf38ccb19c | 86 | case '9': |
nakata | 0:4eaf38ccb19c | 87 | return (i - '0'); |
nakata | 0:4eaf38ccb19c | 88 | case 'A': |
nakata | 0:4eaf38ccb19c | 89 | case 'B': |
nakata | 0:4eaf38ccb19c | 90 | case 'C': |
nakata | 0:4eaf38ccb19c | 91 | case 'D': |
nakata | 0:4eaf38ccb19c | 92 | case 'E': |
nakata | 0:4eaf38ccb19c | 93 | case 'F': |
nakata | 0:4eaf38ccb19c | 94 | return ( i - 'A' + 10); |
nakata | 0:4eaf38ccb19c | 95 | case 'a': |
nakata | 0:4eaf38ccb19c | 96 | case 'b': |
nakata | 0:4eaf38ccb19c | 97 | case 'c': |
nakata | 0:4eaf38ccb19c | 98 | case 'd': |
nakata | 0:4eaf38ccb19c | 99 | case 'e': |
nakata | 0:4eaf38ccb19c | 100 | case 'f': |
nakata | 0:4eaf38ccb19c | 101 | return ( i - 'a' + 10); |
nakata | 0:4eaf38ccb19c | 102 | } |
nakata | 0:4eaf38ccb19c | 103 | return (-1); |
nakata | 0:4eaf38ccb19c | 104 | } |
nakata | 0:4eaf38ccb19c | 105 | |
nakata | 0:4eaf38ccb19c | 106 | void delayedPutc(unsigned char c) |
nakata | 0:4eaf38ccb19c | 107 | { |
nakata | 0:4eaf38ccb19c | 108 | wifiPutc(c); |
nakata | 0:4eaf38ccb19c | 109 | wait(SHORT_WAIT); |
nakata | 0:4eaf38ccb19c | 110 | } |
nakata | 0:4eaf38ccb19c | 111 | |
nakata | 0:4eaf38ccb19c | 112 | |
nakata | 0:4eaf38ccb19c | 113 | void wifiWrite(unsigned char *data) |
nakata | 0:4eaf38ccb19c | 114 | { |
nakata | 0:4eaf38ccb19c | 115 | int i; |
nakata | 0:4eaf38ccb19c | 116 | int len = ((int)data[3]) * 256 + data[2]; |
nakata | 0:4eaf38ccb19c | 117 | |
nakata | 0:4eaf38ccb19c | 118 | delayedPutc('*'); |
nakata | 0:4eaf38ccb19c | 119 | delayedPutc(num2hex((len >> 4) & 0xf)); |
nakata | 0:4eaf38ccb19c | 120 | delayedPutc(num2hex(len & 0xf)); |
nakata | 0:4eaf38ccb19c | 121 | delayedPutc('4'); |
nakata | 0:4eaf38ccb19c | 122 | delayedPutc(num2hex((len >> 8) & 0xf)); |
nakata | 0:4eaf38ccb19c | 123 | for ( i = 0; i < len; i++ ) { |
nakata | 0:4eaf38ccb19c | 124 | if ( i == 1 ) { |
nakata | 0:4eaf38ccb19c | 125 | delayedPutc(num2hex((sequence >> 4) & 0x0f)); |
nakata | 0:4eaf38ccb19c | 126 | delayedPutc(num2hex(sequence & 0x0f)); |
nakata | 0:4eaf38ccb19c | 127 | } else { |
nakata | 0:4eaf38ccb19c | 128 | delayedPutc(num2hex((data[i] >> 4) & 0x0f)); |
nakata | 0:4eaf38ccb19c | 129 | delayedPutc(num2hex(data[i] & 0x0f)); |
nakata | 0:4eaf38ccb19c | 130 | } |
nakata | 0:4eaf38ccb19c | 131 | } |
nakata | 0:4eaf38ccb19c | 132 | delayedPutc(CR); |
nakata | 0:4eaf38ccb19c | 133 | sequence++; |
nakata | 0:4eaf38ccb19c | 134 | } |
nakata | 0:4eaf38ccb19c | 135 | |
nakata | 0:4eaf38ccb19c | 136 | int wifiRead() |
nakata | 0:4eaf38ccb19c | 137 | { |
nakata | 0:4eaf38ccb19c | 138 | int len = 0; |
nakata | 0:4eaf38ccb19c | 139 | int index = 0; |
nakata | 0:4eaf38ccb19c | 140 | int c; |
nakata | 0:4eaf38ccb19c | 141 | |
nakata | 0:4eaf38ccb19c | 142 | wifiReadWait(); |
nakata | 0:4eaf38ccb19c | 143 | while (true) { |
nakata | 0:4eaf38ccb19c | 144 | c = wifiGetc(); |
nakata | 0:4eaf38ccb19c | 145 | if ( c == CR ) { |
nakata | 0:4eaf38ccb19c | 146 | if ( (index - 5) >= len * 2 ) { |
nakata | 0:4eaf38ccb19c | 147 | break; |
nakata | 0:4eaf38ccb19c | 148 | } |
nakata | 0:4eaf38ccb19c | 149 | |
nakata | 0:4eaf38ccb19c | 150 | len = 0; |
nakata | 0:4eaf38ccb19c | 151 | index = 0; |
nakata | 0:4eaf38ccb19c | 152 | continue; |
nakata | 0:4eaf38ccb19c | 153 | } |
nakata | 0:4eaf38ccb19c | 154 | if ( index == 0 ) { |
nakata | 0:4eaf38ccb19c | 155 | if ( c == '*' ) { |
nakata | 0:4eaf38ccb19c | 156 | index++; |
nakata | 0:4eaf38ccb19c | 157 | } else { |
nakata | 0:4eaf38ccb19c | 158 | while (wifiGetc() != CR) |
nakata | 0:4eaf38ccb19c | 159 | ; //empty loop body |
nakata | 0:4eaf38ccb19c | 160 | } |
nakata | 0:4eaf38ccb19c | 161 | continue; |
nakata | 0:4eaf38ccb19c | 162 | } |
nakata | 0:4eaf38ccb19c | 163 | |
nakata | 0:4eaf38ccb19c | 164 | c = hex2num(c); |
nakata | 0:4eaf38ccb19c | 165 | if ( c < 0 ) { |
nakata | 0:4eaf38ccb19c | 166 | while (wifiGetc() != CR) |
nakata | 0:4eaf38ccb19c | 167 | ; // empty loop body |
nakata | 0:4eaf38ccb19c | 168 | len = 0; |
nakata | 0:4eaf38ccb19c | 169 | index = 0; |
nakata | 0:4eaf38ccb19c | 170 | continue; |
nakata | 0:4eaf38ccb19c | 171 | } |
nakata | 0:4eaf38ccb19c | 172 | if ( index == 1 ) { |
nakata | 0:4eaf38ccb19c | 173 | len = c << 4; |
nakata | 0:4eaf38ccb19c | 174 | } else if ( index == 2 ) { |
nakata | 0:4eaf38ccb19c | 175 | len |= c; |
nakata | 0:4eaf38ccb19c | 176 | } else if ( index == 3 ) { |
nakata | 0:4eaf38ccb19c | 177 | if ( c != 3 ) { |
nakata | 0:4eaf38ccb19c | 178 | wifiReadEnd(); |
nakata | 0:4eaf38ccb19c | 179 | return -3; |
nakata | 0:4eaf38ccb19c | 180 | } |
nakata | 0:4eaf38ccb19c | 181 | } else if ( index == 4 ) { |
nakata | 0:4eaf38ccb19c | 182 | len |= c << 8; |
nakata | 0:4eaf38ccb19c | 183 | } else if ( index & 1 ) { |
nakata | 0:4eaf38ccb19c | 184 | buff[(index - 5)/2] = c << 4; |
nakata | 0:4eaf38ccb19c | 185 | } else { |
nakata | 0:4eaf38ccb19c | 186 | buff[(index - 5)/2] |= c; |
nakata | 0:4eaf38ccb19c | 187 | } |
nakata | 0:4eaf38ccb19c | 188 | index++; |
nakata | 0:4eaf38ccb19c | 189 | } |
nakata | 0:4eaf38ccb19c | 190 | wifiReadEnd(); |
nakata | 0:4eaf38ccb19c | 191 | return len; |
nakata | 0:4eaf38ccb19c | 192 | } |
nakata | 0:4eaf38ccb19c | 193 | |
nakata | 0:4eaf38ccb19c | 194 | public: |
nakata | 0:4eaf38ccb19c | 195 | WiFiScanner() |
nakata | 0:4eaf38ccb19c | 196 | { |
nakata | 0:4eaf38ccb19c | 197 | sequence = 0; |
nakata | 0:4eaf38ccb19c | 198 | } |
nakata | 0:4eaf38ccb19c | 199 | |
nakata | 0:4eaf38ccb19c | 200 | void reset() |
nakata | 0:4eaf38ccb19c | 201 | { |
nakata | 0:4eaf38ccb19c | 202 | wifi.baud(BAUD_RATE); |
nakata | 0:4eaf38ccb19c | 203 | wifi.format(8, Serial::None, 1); |
nakata | 0:4eaf38ccb19c | 204 | |
nakata | 0:4eaf38ccb19c | 205 | sequence = 0; |
nakata | 0:4eaf38ccb19c | 206 | PRST = 0; // reset BP3591 |
nakata | 0:4eaf38ccb19c | 207 | wait(1.0); // perhaps needs 1 sec |
nakata | 0:4eaf38ccb19c | 208 | PRST = 1; |
nakata | 0:4eaf38ccb19c | 209 | UART_CTS = 1; |
nakata | 0:4eaf38ccb19c | 210 | } |
nakata | 0:4eaf38ccb19c | 211 | |
nakata | 0:4eaf38ccb19c | 212 | void serialInit() |
nakata | 0:4eaf38ccb19c | 213 | { |
nakata | 0:4eaf38ccb19c | 214 | int i; |
nakata | 0:4eaf38ccb19c | 215 | int c = 0; |
nakata | 0:4eaf38ccb19c | 216 | |
nakata | 0:4eaf38ccb19c | 217 | wifiReadWait(); |
nakata | 0:4eaf38ccb19c | 218 | while (true) { |
nakata | 0:4eaf38ccb19c | 219 | if (wifi.writeable()) |
nakata | 0:4eaf38ccb19c | 220 | wifiPutc('A'); |
nakata | 0:4eaf38ccb19c | 221 | if (wifi.readable()) { |
nakata | 0:4eaf38ccb19c | 222 | if ( c == '*' ) { |
nakata | 0:4eaf38ccb19c | 223 | c = wifiGetc(); |
nakata | 0:4eaf38ccb19c | 224 | if ( c == CR ) { |
nakata | 0:4eaf38ccb19c | 225 | break; |
nakata | 0:4eaf38ccb19c | 226 | } |
nakata | 0:4eaf38ccb19c | 227 | } else { |
nakata | 0:4eaf38ccb19c | 228 | c = wifiGetc(); |
nakata | 0:4eaf38ccb19c | 229 | } |
nakata | 0:4eaf38ccb19c | 230 | } |
nakata | 0:4eaf38ccb19c | 231 | wait(SHORT_WAIT); // this wait is important |
nakata | 0:4eaf38ccb19c | 232 | } |
nakata | 0:4eaf38ccb19c | 233 | |
nakata | 0:4eaf38ccb19c | 234 | while (wifi.readable()) |
nakata | 0:4eaf38ccb19c | 235 | wifiGetc(); |
nakata | 0:4eaf38ccb19c | 236 | for ( i = 0; i < 8; i++ ) { |
nakata | 0:4eaf38ccb19c | 237 | delayedPutc(0xf1); |
nakata | 0:4eaf38ccb19c | 238 | } |
nakata | 0:4eaf38ccb19c | 239 | c = 0; |
nakata | 0:4eaf38ccb19c | 240 | while (true) { |
nakata | 0:4eaf38ccb19c | 241 | if (wifi.readable()) { |
nakata | 0:4eaf38ccb19c | 242 | if ( c == '*' ) { |
nakata | 0:4eaf38ccb19c | 243 | c = wifiGetc(); |
nakata | 0:4eaf38ccb19c | 244 | if ( c == CR ) { |
nakata | 0:4eaf38ccb19c | 245 | break; |
nakata | 0:4eaf38ccb19c | 246 | } |
nakata | 0:4eaf38ccb19c | 247 | } else { |
nakata | 0:4eaf38ccb19c | 248 | c = wifiGetc(); |
nakata | 0:4eaf38ccb19c | 249 | } |
nakata | 0:4eaf38ccb19c | 250 | } |
nakata | 0:4eaf38ccb19c | 251 | } |
nakata | 0:4eaf38ccb19c | 252 | wifiReadEnd(); |
nakata | 0:4eaf38ccb19c | 253 | } |
nakata | 0:4eaf38ccb19c | 254 | |
nakata | 0:4eaf38ccb19c | 255 | void waitStartup() |
nakata | 0:4eaf38ccb19c | 256 | { |
nakata | 0:4eaf38ccb19c | 257 | int i; |
nakata | 0:4eaf38ccb19c | 258 | int len = 0; |
nakata | 0:4eaf38ccb19c | 259 | bool loopFlag = true; |
nakata | 0:4eaf38ccb19c | 260 | for (i = 0; loopFlag || len <= 0 || wifi.readable(); i++) { |
nakata | 0:4eaf38ccb19c | 261 | len = wifiRead(); |
nakata | 0:4eaf38ccb19c | 262 | if ( len == 8 && buff[5] == 0x00 && buff[4] == 0x3d) { |
nakata | 0:4eaf38ccb19c | 263 | loopFlag = false; |
nakata | 0:4eaf38ccb19c | 264 | } |
nakata | 0:4eaf38ccb19c | 265 | lcd.putc('+'); |
nakata | 0:4eaf38ccb19c | 266 | } |
nakata | 0:4eaf38ccb19c | 267 | } |
nakata | 0:4eaf38ccb19c | 268 | |
nakata | 0:4eaf38ccb19c | 269 | void scanMode() |
nakata | 0:4eaf38ccb19c | 270 | { |
nakata | 0:4eaf38ccb19c | 271 | // WID_SSID |
nakata | 0:4eaf38ccb19c | 272 | unsigned char cmd0[] = { 0x57, 0x00, 0x08, 0x00, 0x00, 0x30, 0x01, 0x00 }; |
nakata | 0:4eaf38ccb19c | 273 | wifiWrite(cmd0); |
nakata | 0:4eaf38ccb19c | 274 | while ( wifiRead() <= 0 || (buff[5] != 0x00 || buff[4] != 0x05 || buff[7] != 1)) |
nakata | 0:4eaf38ccb19c | 275 | wait(SHORT_WAIT); |
nakata | 0:4eaf38ccb19c | 276 | |
nakata | 0:4eaf38ccb19c | 277 | // WID_BSS_TYPE |
nakata | 0:4eaf38ccb19c | 278 | unsigned char cmd1[] = { 0x57, 0x00, 0x08, 0x00, 0x00, 0x00, 0x01, 0x00 }; |
nakata | 0:4eaf38ccb19c | 279 | wifiWrite(cmd1); |
nakata | 0:4eaf38ccb19c | 280 | while ( wifiRead() <= 0 || (buff[5] != 0x00 || buff[4] != 0x05 || buff[7] != 1)) |
nakata | 0:4eaf38ccb19c | 281 | wait(SHORT_WAIT); |
nakata | 0:4eaf38ccb19c | 282 | |
nakata | 0:4eaf38ccb19c | 283 | // WID_BCAST_SSID |
nakata | 0:4eaf38ccb19c | 284 | unsigned char cmd2[] = { 0x57, 0x00, 0x08, 0x00, 0x15, 0x00, 0x01, 0x01 }; |
nakata | 0:4eaf38ccb19c | 285 | wifiWrite(cmd2); |
nakata | 0:4eaf38ccb19c | 286 | while ( wifiRead() <= 0 || (buff[5] != 0x00 || buff[4] != 0x05 || buff[7] != 1)) |
nakata | 0:4eaf38ccb19c | 287 | wait(SHORT_WAIT); |
nakata | 0:4eaf38ccb19c | 288 | |
nakata | 0:4eaf38ccb19c | 289 | // WID_SCAN_TYPE |
nakata | 0:4eaf38ccb19c | 290 | #ifdef PASSIVE_SCAN |
nakata | 0:4eaf38ccb19c | 291 | unsigned char cmd3[] = { 0x57, 0x00, 0x08, 0x00, 0x07, 0x00, 0x01, 0x00 }; |
nakata | 0:4eaf38ccb19c | 292 | #else |
nakata | 0:4eaf38ccb19c | 293 | unsigned char cmd3[] = { 0x57, 0x00, 0x08, 0x00, 0x07, 0x00, 0x01, 0x01 }; |
nakata | 0:4eaf38ccb19c | 294 | #endif |
nakata | 0:4eaf38ccb19c | 295 | wifiWrite(cmd3); |
nakata | 0:4eaf38ccb19c | 296 | while ( wifiRead() <= 0 || (buff[5] != 0x00 || buff[4] != 0x05 || buff[7] != 1)) |
nakata | 0:4eaf38ccb19c | 297 | wait(SHORT_WAIT); |
nakata | 0:4eaf38ccb19c | 298 | |
nakata | 0:4eaf38ccb19c | 299 | // WID_ENABLE_CHANNEL |
nakata | 0:4eaf38ccb19c | 300 | unsigned char cmd4[] = { 0x57, 0x02, 0x0b, 0x00, 0x24, 0x20, 0x04, 0xff, 0x1f, 0x00, 0x00 }; |
nakata | 0:4eaf38ccb19c | 301 | wifiWrite(cmd4); |
nakata | 0:4eaf38ccb19c | 302 | while ( wifiRead() <= 0 || (buff[5] != 0x00 || buff[4] != 0x05 || buff[7] != 1)) |
nakata | 0:4eaf38ccb19c | 303 | wait(SHORT_WAIT); |
nakata | 0:4eaf38ccb19c | 304 | |
nakata | 0:4eaf38ccb19c | 305 | // WID_SITE_SURVEY |
nakata | 0:4eaf38ccb19c | 306 | #ifdef MULTI_CHANNEL |
nakata | 0:4eaf38ccb19c | 307 | unsigned char cmd5[] = { 0x57, 0x01, 0x08, 0x00, 0x0e, 0x00, 0x01, 0x11 }; |
nakata | 0:4eaf38ccb19c | 308 | #else |
nakata | 0:4eaf38ccb19c | 309 | unsigned char cmd5[] = { 0x57, 0x01, 0x08, 0x00, 0x0e, 0x00, 0x01, 0x01 }; |
nakata | 0:4eaf38ccb19c | 310 | #endif |
nakata | 0:4eaf38ccb19c | 311 | wifiWrite(cmd5); |
nakata | 0:4eaf38ccb19c | 312 | while ( wifiRead() <= 0 || (buff[5] != 0x00 || buff[4] != 0x05 || buff[7] != 1)) |
nakata | 0:4eaf38ccb19c | 313 | wait(SHORT_WAIT); |
nakata | 0:4eaf38ccb19c | 314 | |
nakata | 0:4eaf38ccb19c | 315 | // WID_SCAN_FILTER |
nakata | 0:4eaf38ccb19c | 316 | #ifdef MULTI_CHANNEL |
nakata | 0:4eaf38ccb19c | 317 | unsigned char cmd6[] = { 0x57, 0x02, 0x08, 0x00, 0x36, 0x00, 0x01, 0x00 }; |
nakata | 0:4eaf38ccb19c | 318 | #else |
nakata | 0:4eaf38ccb19c | 319 | unsigned char cmd6[] = { 0x57, 0x02, 0x08, 0x00, 0x36, 0x00, 0x01, 0x00 }; |
nakata | 0:4eaf38ccb19c | 320 | #endif |
nakata | 0:4eaf38ccb19c | 321 | wifiWrite(cmd6); |
nakata | 0:4eaf38ccb19c | 322 | while ( wifiRead() <= 0 || (buff[5] != 0x00 || buff[4] != 0x05 || buff[7] != 1)) |
nakata | 0:4eaf38ccb19c | 323 | wait(SHORT_WAIT); |
nakata | 0:4eaf38ccb19c | 324 | |
nakata | 0:4eaf38ccb19c | 325 | #ifdef PASSIVE_SCAN |
nakata | 0:4eaf38ccb19c | 326 | // WID_SITE_SURVEY_SCAN_TIME |
nakata | 0:4eaf38ccb19c | 327 | unsigned char cmd7[] = { 0x57, 0x00, 0x09, 0x00, 0x0e, 0x10, 0x02, 0x00, 0x02 }; |
nakata | 0:4eaf38ccb19c | 328 | wifiWrite(cmd7); |
nakata | 0:4eaf38ccb19c | 329 | while ( wifiRead() <= 0 || (buff[5] != 0x00 || buff[4] != 0x05 || buff[7] != 1)) |
nakata | 0:4eaf38ccb19c | 330 | wait(SHORT_WAIT); |
nakata | 0:4eaf38ccb19c | 331 | #endif |
nakata | 0:4eaf38ccb19c | 332 | } |
nakata | 0:4eaf38ccb19c | 333 | |
nakata | 0:4eaf38ccb19c | 334 | void doScan() |
nakata | 0:4eaf38ccb19c | 335 | { |
nakata | 0:4eaf38ccb19c | 336 | int i, len, channel; |
nakata | 0:4eaf38ccb19c | 337 | int count, write_index; |
nakata | 0:4eaf38ccb19c | 338 | |
nakata | 0:4eaf38ccb19c | 339 | apinfo_count = 0; |
nakata | 0:4eaf38ccb19c | 340 | for (channel = 0; channel < TOTAL_CHANNELS; channel++ ) { |
nakata | 0:4eaf38ccb19c | 341 | myled1 = (channel >> 3) & 1; |
nakata | 0:4eaf38ccb19c | 342 | myled2 = (channel >> 2) & 1; |
nakata | 0:4eaf38ccb19c | 343 | myled3 = (channel >> 1) & 1; |
nakata | 0:4eaf38ccb19c | 344 | myled4 = channel & 1; |
nakata | 0:4eaf38ccb19c | 345 | |
nakata | 0:4eaf38ccb19c | 346 | // WID_CURRENT_CHANNEL |
nakata | 0:4eaf38ccb19c | 347 | #ifdef MULTI_CHANNEL |
nakata | 0:4eaf38ccb19c | 348 | unsigned char cmd8[] = { 0x57, 0x02, 0x08, 0x00, 0x02, 0x00, 0x01, 0x10 }; |
nakata | 0:4eaf38ccb19c | 349 | cmd8[7] = channel + 1; // 1 origin |
nakata | 0:4eaf38ccb19c | 350 | wifiWrite(cmd8); |
nakata | 0:4eaf38ccb19c | 351 | while ( wifiRead() <= 0 || (buff[5] != 0x00 || buff[4] != 0x05 || buff[7] != 1)) |
nakata | 0:4eaf38ccb19c | 352 | wait(SHORT_WAIT); |
nakata | 0:4eaf38ccb19c | 353 | #endif |
nakata | 0:4eaf38ccb19c | 354 | // WID_START_SCAN_REQ |
nakata | 0:4eaf38ccb19c | 355 | unsigned char cmd9[] = { 0x57, 0x02, 0x08, 0x00, 0x1e, 0x00, 0x01, 0x01 }; |
nakata | 0:4eaf38ccb19c | 356 | wifiWrite(cmd9); |
nakata | 0:4eaf38ccb19c | 357 | while ( wifiRead() <= 0 || (buff[5] != 0x00 || buff[4] != 0x05 || buff[7] != 1)) |
nakata | 0:4eaf38ccb19c | 358 | wait(SHORT_WAIT); |
nakata | 0:4eaf38ccb19c | 359 | |
nakata | 0:4eaf38ccb19c | 360 | #ifdef PASSIVE_SCAN |
nakata | 0:4eaf38ccb19c | 361 | wait(0.5); |
nakata | 0:4eaf38ccb19c | 362 | #else |
nakata | 0:4eaf38ccb19c | 363 | wait(0.02); |
nakata | 0:4eaf38ccb19c | 364 | #endif |
nakata | 0:4eaf38ccb19c | 365 | |
nakata | 0:4eaf38ccb19c | 366 | // WID_SITE_SURVER_RESULTS |
nakata | 0:4eaf38ccb19c | 367 | unsigned char cmd10[] = { 0x51, 0x03, 0x06, 0x00, 0x12, 0x30 }; |
nakata | 0:4eaf38ccb19c | 368 | wifiWrite(cmd10); |
nakata | 0:4eaf38ccb19c | 369 | while ( (len = wifiRead()) <= 0 || (buff[5] != 0x30 || buff[4] != 0x12)) |
nakata | 0:4eaf38ccb19c | 370 | wait(SHORT_WAIT); |
nakata | 0:4eaf38ccb19c | 371 | if ( len < 10 ) { |
nakata | 0:4eaf38ccb19c | 372 | continue; |
nakata | 0:4eaf38ccb19c | 373 | } |
nakata | 0:4eaf38ccb19c | 374 | count = (buff[7] - 2) / 44; |
nakata | 0:4eaf38ccb19c | 375 | for ( i = 0; i < count; i++ ) { |
nakata | 0:4eaf38ccb19c | 376 | for ( write_index = 0; write_index < apinfo_count; write_index++) { |
nakata | 0:4eaf38ccb19c | 377 | if ( memcmp(apinfos[write_index].essid, buff + (9 + i *44), 33) == 0 && |
nakata | 0:4eaf38ccb19c | 378 | memcmp(apinfos[write_index].bssid, buff + (9 + i * 44 + 36), 6) == 0 ) { |
nakata | 0:4eaf38ccb19c | 379 | break; // already recorded |
nakata | 0:4eaf38ccb19c | 380 | } |
nakata | 0:4eaf38ccb19c | 381 | } |
nakata | 0:4eaf38ccb19c | 382 | if ( write_index == apinfo_count ) { |
nakata | 0:4eaf38ccb19c | 383 | memcpy(apinfos[write_index].essid, buff + (9 + i * 44), 33); |
nakata | 0:4eaf38ccb19c | 384 | memcpy(apinfos[write_index].bssid, buff + (9 + i * 44 + 36), 6); |
nakata | 0:4eaf38ccb19c | 385 | apinfos[write_index].power = (signed char)buff[9 + i * 44 + 42]; |
nakata | 0:4eaf38ccb19c | 386 | apinfo_count++; |
nakata | 0:4eaf38ccb19c | 387 | } else if ( apinfos[write_index].power < (signed char)buff[9 + i * 44 + 42] ) { |
nakata | 0:4eaf38ccb19c | 388 | apinfos[write_index].power = (signed char)buff[9 + i * 44 + 42]; |
nakata | 0:4eaf38ccb19c | 389 | } |
nakata | 0:4eaf38ccb19c | 390 | } |
nakata | 0:4eaf38ccb19c | 391 | } |
nakata | 0:4eaf38ccb19c | 392 | } |
nakata | 0:4eaf38ccb19c | 393 | }; |