1
1
#include " WiFi.h"
2
2
3
+ #define SSID_MAX_COUNT 12
4
+
3
5
using namespace std ;
4
6
5
7
/* -------------------------------------------------------------------------- */
@@ -256,6 +258,42 @@ uint8_t* CWifi::macAddress(uint8_t* _mac) {
256
258
return _mac;
257
259
}
258
260
261
+ /* -------------------------------------------------------------------------- */
262
+ void CWifi::_sortAPlist (uint8_t num) {
263
+ /* -------------------------------------------------------------------------- */
264
+ for (uint8_t i = 0 ; i < num; i++) {
265
+ for (uint8_t j = i+1 ; j < num; j++) {
266
+ if (access_points[j].rssi > access_points[i].rssi ) {
267
+ CAccessPoint temp = access_points[i];
268
+ access_points[i] = access_points[j];
269
+ access_points[j] = temp;
270
+ }
271
+ }
272
+ }
273
+ }
274
+
275
+ static uint8_t Encr2wl_enc (string e) {
276
+ if (e == string (" open" )) {
277
+ return ENC_TYPE_NONE;
278
+ } else if (e == string (" WEP" )) {
279
+ return ENC_TYPE_WEP;
280
+ } else if (e == string (" WPA" )) {
281
+ return ENC_TYPE_WPA;
282
+ } else if (e == string (" WPA2" )) {
283
+ return ENC_TYPE_WPA2;
284
+ } else if (e == string (" WPA+WPA2" )) {
285
+ return ENC_TYPE_WPA2;
286
+ } else if (e == string (" WPA2-EAP" )) {
287
+ return ENC_TYPE_WPA2_ENTERPRISE;
288
+ } else if (e == string (" WPA2+WPA3" )) {
289
+ return ENC_TYPE_WPA3;
290
+ } else if (e == string (" WPA3" )) {
291
+ return ENC_TYPE_WPA3;
292
+ } else {
293
+ return ENC_TYPE_UNKNOWN;
294
+ }
295
+ }
296
+
259
297
/* -------------------------------------------------------------------------- */
260
298
int8_t CWifi::scanNetworks () {
261
299
/* -------------------------------------------------------------------------- */
@@ -264,30 +302,56 @@ int8_t CWifi::scanNetworks() {
264
302
modem.avoid_trim_results ();
265
303
modem.read_using_size ();
266
304
267
- access_points.clear ();
305
+ memset (access_points,0x00 ,sizeof (access_points));
306
+ _apsFound = 0 ;
268
307
string res;
269
-
270
- vector<string> aps;
271
308
if (modem.write (string (PROMPT (_WIFISCAN)),res,CMD (_WIFISCAN))) {
272
-
273
- split (aps, res, string ( " \r\n " ) );
274
- for (uint16_t i = 0 ; i < aps. size (); i++ ) {
309
+ char *startAp = ( char *)res. c_str ();
310
+ char *endAP = strstr (startAp, " \r\n " );
311
+ for (; endAP != NULL ; startAp = endAP, endAP = strstr (startAp, " \r\n " ) ) {
275
312
CAccessPoint ap;
276
- vector<string> tokens;
277
- split (tokens, aps[i], string (" |" ));
278
- if (tokens.size () >= 5 ) {
279
- ap.ssid = tokens[0 ];
280
- ap.bssid = tokens[1 ];
281
- macStr2macArray (ap.uint_bssid , ap.bssid .c_str ());
282
- ap.rssi = tokens[2 ];
283
- ap.channel = tokens[3 ];
284
- ap.encryption_mode = tokens[4 ];
285
- access_points.push_back (ap);
313
+ char *token[5 ];
314
+ *endAP++ = ' \0 ' ; // Replace \r with \0
315
+ endAP++;
316
+ char *startToken = startAp;
317
+ char *endToken = strstr (startAp, " | " );
318
+ uint8_t i = 0 ;
319
+ for (; i < 5 && endToken != NULL ; i++){
320
+ token[i] = startToken;
321
+ *endToken++ = ' \0 ' ;
322
+ endToken = endToken + 2 ;
323
+ startToken = endToken;
324
+ endToken = strstr (startToken, " | " );
325
+ if (endToken == NULL ){
326
+ token[++i] = startToken;
327
+ }
328
+ }
329
+
330
+ if (i>=5 ) {
331
+ if (strlen (token[0 ]) > WL_MAX_SSID_LENGTH || strlen (token[1 ]) != WL_MAX_BSSID_LENGTH){
332
+ continue ;
333
+ }
334
+ strcpy (ap.ssid , token[0 ]);
335
+ macStr2macArray (ap.uint_bssid , token[1 ]);
336
+ ap.rssi = atoi (token[2 ]);
337
+ ap.channel = atoi (token[3 ]);
338
+ ap.encryption_mode = Encr2wl_enc (token[4 ]);
339
+ // insert in list
340
+ if ( _apsFound < WL_MAX_AP_LIST ){
341
+ access_points[_apsFound] = ap;
342
+ _apsFound++;
343
+ _sortAPlist (_apsFound);
344
+ }else {
345
+ if (ap.rssi > access_points[WL_MAX_AP_LIST-1 ].rssi ){
346
+ access_points[WL_MAX_AP_LIST-1 ] = ap;
347
+ _sortAPlist (WL_MAX_AP_LIST);
348
+ }
349
+ }
286
350
}
287
351
}
288
352
}
289
353
290
- return ( int8_t )access_points. size () ;
354
+ return _apsFound ;
291
355
}
292
356
293
357
/* -------------------------------------------------------------------------- */
@@ -385,51 +449,29 @@ IPAddress CWifi::gatewayIP() {
385
449
/* -------------------------------------------------------------------------- */
386
450
const char * CWifi::SSID (uint8_t networkItem) {
387
451
/* -------------------------------------------------------------------------- */
388
- if (networkItem < access_points. size () ) {
389
- return access_points[networkItem].ssid . c_str () ;
452
+ if (networkItem < _apsFound ) {
453
+ return access_points[networkItem].ssid ;
390
454
}
391
455
return nullptr ;
392
456
}
393
457
394
458
/* -------------------------------------------------------------------------- */
395
459
int32_t CWifi::RSSI (uint8_t networkItem) {
396
460
/* -------------------------------------------------------------------------- */
397
- if (networkItem < access_points. size () ) {
398
- return atoi ( access_points[networkItem].rssi . c_str ()) ;
461
+ if (networkItem < _apsFound ) {
462
+ return access_points[networkItem].rssi ;
399
463
}
400
464
return -1000 ;
401
465
}
402
466
403
- static uint8_t Encr2wl_enc (string e) {
404
- if (e == string (" open" )) {
405
- return ENC_TYPE_NONE;
406
- } else if (e == string (" WEP" )) {
407
- return ENC_TYPE_WEP;
408
- } else if (e == string (" WPA" )) {
409
- return ENC_TYPE_WPA;
410
- } else if (e == string (" WPA2" )) {
411
- return ENC_TYPE_WPA2;
412
- } else if (e == string (" WPA+WPA2" )) {
413
- return ENC_TYPE_WPA2;
414
- } else if (e == string (" WPA2-EAP" )) {
415
- return ENC_TYPE_WPA2_ENTERPRISE;
416
- } else if (e == string (" WPA2+WPA3" )) {
417
- return ENC_TYPE_WPA3;
418
- } else if (e == string (" WPA3" )) {
419
- return ENC_TYPE_WPA3;
420
- } else {
421
- return ENC_TYPE_UNKNOWN;
422
- }
423
- }
424
-
425
467
/* -------------------------------------------------------------------------- */
426
468
uint8_t CWifi::encryptionType () {
427
469
/* -------------------------------------------------------------------------- */
428
470
scanNetworks ();
429
471
string myssid (SSID ());
430
- for (unsigned int i = 0 ; i < access_points. size () ; i++) {
472
+ for (unsigned int i = 0 ; i < _apsFound ; i++) {
431
473
if (myssid == access_points[i].ssid ) {
432
- return Encr2wl_enc ( access_points[i].encryption_mode ) ;
474
+ return access_points[i].encryption_mode ;
433
475
}
434
476
}
435
477
return ENC_TYPE_UNKNOWN;
@@ -438,16 +480,16 @@ uint8_t CWifi::encryptionType() {
438
480
/* -------------------------------------------------------------------------- */
439
481
uint8_t CWifi::encryptionType (uint8_t networkItem) {
440
482
/* -------------------------------------------------------------------------- */
441
- if (networkItem < access_points. size () ) {
442
- return Encr2wl_enc ( access_points[networkItem].encryption_mode ) ;
483
+ if (networkItem < _apsFound ) {
484
+ return access_points[networkItem].encryption_mode ;
443
485
}
444
486
return 0 ;
445
487
}
446
488
447
489
/* -------------------------------------------------------------------------- */
448
490
uint8_t * CWifi::BSSID (uint8_t networkItem, uint8_t * bssid) {
449
491
/* -------------------------------------------------------------------------- */
450
- if (networkItem < access_points. size () ) {
492
+ if (networkItem < _apsFound ) {
451
493
for (int i = 0 ; i < 6 ; i++) {
452
494
*(bssid + i) = access_points[networkItem].uint_bssid [i];
453
495
}
@@ -459,8 +501,8 @@ uint8_t* CWifi::BSSID(uint8_t networkItem, uint8_t* bssid) {
459
501
/* -------------------------------------------------------------------------- */
460
502
uint8_t CWifi::channel (uint8_t networkItem) {
461
503
/* -------------------------------------------------------------------------- */
462
- if (networkItem < access_points. size () ) {
463
- return atoi ( access_points[networkItem].channel . c_str ()) ;
504
+ if (networkItem < _apsFound ) {
505
+ return access_points[networkItem].channel ;
464
506
}
465
507
return 0 ;
466
508
}
0 commit comments