11#include " WiFi.h"
22
3+ #define SSID_MAX_COUNT 12
4+
35using namespace std ;
46
57/* -------------------------------------------------------------------------- */
@@ -256,6 +258,42 @@ uint8_t* CWifi::macAddress(uint8_t* _mac) {
256258 return _mac;
257259}
258260
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+
259297/* -------------------------------------------------------------------------- */
260298int8_t CWifi::scanNetworks () {
261299/* -------------------------------------------------------------------------- */
@@ -264,30 +302,56 @@ int8_t CWifi::scanNetworks() {
264302 modem.avoid_trim_results ();
265303 modem.read_using_size ();
266304
267- access_points.clear ();
305+ memset (access_points,0x00 ,sizeof (access_points));
306+ _apsFound = 0 ;
268307 string res;
269-
270- vector<string> aps;
271308 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 " ) ) {
275312 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_SSID_MAX_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+ }
286350 }
287351 }
288352 }
289353
290- return ( int8_t )access_points. size () ;
354+ return _apsFound ;
291355}
292356
293357/* -------------------------------------------------------------------------- */
@@ -385,51 +449,29 @@ IPAddress CWifi::gatewayIP() {
385449/* -------------------------------------------------------------------------- */
386450const char * CWifi::SSID (uint8_t networkItem) {
387451/* -------------------------------------------------------------------------- */
388- if (networkItem < access_points. size () ) {
389- return access_points[networkItem].ssid . c_str () ;
452+ if (networkItem < _apsFound ) {
453+ return access_points[networkItem].ssid ;
390454 }
391455 return nullptr ;
392456}
393457
394458/* -------------------------------------------------------------------------- */
395459int32_t CWifi::RSSI (uint8_t networkItem) {
396460/* -------------------------------------------------------------------------- */
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 ;
399463 }
400464 return -1000 ;
401465}
402466
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-
425467/* -------------------------------------------------------------------------- */
426468uint8_t CWifi::encryptionType () {
427469/* -------------------------------------------------------------------------- */
428470 scanNetworks ();
429471 string myssid (SSID ());
430- for (unsigned int i = 0 ; i < access_points. size () ; i++) {
472+ for (unsigned int i = 0 ; i < _apsFound ; i++) {
431473 if (myssid == access_points[i].ssid ) {
432- return Encr2wl_enc ( access_points[i].encryption_mode ) ;
474+ return access_points[i].encryption_mode ;
433475 }
434476 }
435477 return ENC_TYPE_UNKNOWN;
@@ -438,16 +480,16 @@ uint8_t CWifi::encryptionType() {
438480/* -------------------------------------------------------------------------- */
439481uint8_t CWifi::encryptionType (uint8_t networkItem) {
440482/* -------------------------------------------------------------------------- */
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 ;
443485 }
444486 return 0 ;
445487}
446488
447489/* -------------------------------------------------------------------------- */
448490uint8_t * CWifi::BSSID (uint8_t networkItem, uint8_t * bssid) {
449491/* -------------------------------------------------------------------------- */
450- if (networkItem < access_points. size () ) {
492+ if (networkItem < _apsFound ) {
451493 for (int i = 0 ; i < 6 ; i++) {
452494 *(bssid + i) = access_points[networkItem].uint_bssid [i];
453495 }
@@ -459,8 +501,8 @@ uint8_t* CWifi::BSSID(uint8_t networkItem, uint8_t* bssid) {
459501/* -------------------------------------------------------------------------- */
460502uint8_t CWifi::channel (uint8_t networkItem) {
461503/* -------------------------------------------------------------------------- */
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 ;
464506 }
465507 return 0 ;
466508}
0 commit comments