|
1 | 1 | #include "WiFi.h" |
2 | 2 |
|
| 3 | +#define WIFI_MAX_BSSID_STRING_LENGTH 17 |
| 4 | + |
3 | 5 | using namespace std; |
4 | 6 |
|
5 | 7 | /* -------------------------------------------------------------------------- */ |
@@ -306,44 +308,48 @@ int8_t CWifi::scanNetworks() { |
306 | 308 | if(modem.write(string(PROMPT(_WIFISCAN)),res,CMD(_WIFISCAN))) { |
307 | 309 | char *startAp = (char*)res.c_str(); |
308 | 310 | char *endAP = strstr(startAp, "\r\n"); |
309 | | - for(; endAP != NULL; startAp = endAP, endAP = strstr(startAp, "\r\n")) { |
310 | | - CAccessPoint ap; |
| 311 | + for(; endAP != NULL; startAp = endAP + 2, endAP = strstr(startAp, "\r\n")) { |
| 312 | + /* split the modem response in multiple lines and parse once at time. |
| 313 | + * The output will be something like: |
| 314 | + * SSID | BSSID | RSSI | CHANNEL | SECURITY |
| 315 | + */ |
| 316 | + *endAP = '\0'; // Replace \r with \0 |
| 317 | + |
311 | 318 | char *token[5]; |
312 | | - *endAP++ = '\0'; // Replace \r with \0 |
313 | | - endAP++; |
314 | | - char *startToken = startAp; |
315 | | - char *endToken = strstr(startAp, " | "); |
316 | | - uint8_t i = 0; |
317 | | - for(; i < 5 && endToken != NULL; i++){ |
318 | | - token[i] = startToken; |
319 | | - *endToken++ = '\0'; |
320 | | - endToken = endToken + 2; |
321 | | - startToken = endToken; |
322 | | - endToken = strstr(startToken, " | "); |
| 319 | + uint8_t i = 1; |
| 320 | + token[0] = startAp; |
| 321 | + for(; i < 5; i++){ |
| 322 | + char *endToken = strstr(token[i-1], " | "); |
323 | 323 | if(endToken == NULL){ |
324 | | - token[++i] = startToken; |
| 324 | + break; |
325 | 325 | } |
| 326 | + memset(endToken, '\0', 3); |
| 327 | + token[i] = endToken + 3; |
326 | 328 | } |
327 | 329 |
|
328 | | - if(i>=5) { |
329 | | - if(strlen(token[0]) > WL_SSID_MAX_LENGTH || strlen(token[1]) != WL_MAX_BSSID_LENGTH){ |
330 | | - continue; |
331 | | - } |
332 | | - strcpy(ap.ssid, token[0]); |
333 | | - macStr2macArray(ap.uint_bssid, token[1]); |
334 | | - ap.rssi = atoi(token[2]); |
335 | | - ap.channel = atoi(token[3]); |
336 | | - ap.encryption_mode = Encr2wl_enc(token[4]); |
337 | | - // insert in list |
338 | | - if( _apsFound < WL_MAX_AP_LIST ){ |
339 | | - access_points[_apsFound] = ap; |
340 | | - _apsFound++; |
341 | | - _sortAPlist(_apsFound); |
342 | | - }else{ |
343 | | - if (ap.rssi > access_points[WL_MAX_AP_LIST-1].rssi){ |
344 | | - access_points[WL_MAX_AP_LIST-1] = ap; |
345 | | - _sortAPlist(WL_MAX_AP_LIST); |
346 | | - } |
| 330 | + if(i < 5 || strlen(token[0]) == 0 || strlen(token[0]) > WL_SSID_MAX_LENGTH || |
| 331 | + strlen(token[1]) != WIFI_MAX_BSSID_STRING_LENGTH || |
| 332 | + strlen(token[2]) == 0 || strlen(token[3]) == 0 || strlen(token[4]) == 0){ |
| 333 | + /* Skip the row and process the next one */ |
| 334 | + continue; |
| 335 | + } |
| 336 | + |
| 337 | + CAccessPoint ap; |
| 338 | + strcpy(ap.ssid, token[0]); |
| 339 | + macStr2macArray(ap.uint_bssid, token[1]); |
| 340 | + ap.rssi = atoi(token[2]); |
| 341 | + ap.channel = atoi(token[3]); |
| 342 | + ap.encryption_mode = Encr2wl_enc(token[4]); |
| 343 | + |
| 344 | + // insert in list |
| 345 | + if( _apsFound < WIFI_MAX_SSID_COUNT ){ |
| 346 | + access_points[_apsFound] = ap; |
| 347 | + _apsFound++; |
| 348 | + _sortAPlist(_apsFound); |
| 349 | + }else{ |
| 350 | + if (ap.rssi > access_points[WIFI_MAX_SSID_COUNT-1].rssi){ |
| 351 | + access_points[WIFI_MAX_SSID_COUNT-1] = ap; |
| 352 | + _sortAPlist(WIFI_MAX_SSID_COUNT); |
347 | 353 | } |
348 | 354 | } |
349 | 355 | } |
|
0 commit comments