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