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:
Fri Aug 24 03:21:43 2012 +0000
Revision:
0:4eaf38ccb19c
Child:
1:2f2f793fcf4f
CQ test version

Who changed what in which revision?

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