This program calculate location of Wi-Fi receiver, by using AP beacon. Please check the Japanese magazine "Interface 2012/12".

Dependencies:   TextLCD mbed

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?

UserRevisionLine numberNew 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 };