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/* -------------------------------------------------------------------------- */
@@ -376,51 +440,29 @@ IPAddress CWifi::gatewayIP() {
376440/* -------------------------------------------------------------------------- */
377441const char * CWifi::SSID (uint8_t networkItem) {
378442/* -------------------------------------------------------------------------- */
379- if (networkItem < access_points. size () ) {
380- return access_points[networkItem].ssid . c_str () ;
443+ if (networkItem < _apsFound ) {
444+ return access_points[networkItem].ssid ;
381445 }
382446 return nullptr ;
383447}
384448
385449/* -------------------------------------------------------------------------- */
386450int32_t CWifi::RSSI (uint8_t networkItem) {
387451/* -------------------------------------------------------------------------- */
388- if (networkItem < access_points. size () ) {
389- return atoi ( access_points[networkItem].rssi . c_str ()) ;
452+ if (networkItem < _apsFound ) {
453+ return access_points[networkItem].rssi ;
390454 }
391455 return -1000 ;
392456}
393457
394- static uint8_t Encr2wl_enc (string e) {
395- if (e == string (" open" )) {
396- return ENC_TYPE_NONE;
397- } else if (e == string (" WEP" )) {
398- return ENC_TYPE_WEP;
399- } else if (e == string (" WPA" )) {
400- return ENC_TYPE_WPA;
401- } else if (e == string (" WPA2" )) {
402- return ENC_TYPE_WPA2;
403- } else if (e == string (" WPA+WPA2" )) {
404- return ENC_TYPE_WPA2;
405- } else if (e == string (" WPA2-EAP" )) {
406- return ENC_TYPE_WPA2_ENTERPRISE;
407- } else if (e == string (" WPA2+WPA3" )) {
408- return ENC_TYPE_WPA3;
409- } else if (e == string (" WPA3" )) {
410- return ENC_TYPE_WPA3;
411- } else {
412- return ENC_TYPE_UNKNOWN;
413- }
414- }
415-
416458/* -------------------------------------------------------------------------- */
417459uint8_t CWifi::encryptionType () {
418460/* -------------------------------------------------------------------------- */
419461 scanNetworks ();
420462 string myssid (SSID ());
421- for (unsigned int i = 0 ; i < access_points. size () ; i++) {
463+ for (unsigned int i = 0 ; i < _apsFound ; i++) {
422464 if (myssid == access_points[i].ssid ) {
423- return Encr2wl_enc ( access_points[i].encryption_mode ) ;
465+ return access_points[i].encryption_mode ;
424466 }
425467 }
426468 return ENC_TYPE_UNKNOWN;
@@ -429,16 +471,16 @@ uint8_t CWifi::encryptionType() {
429471/* -------------------------------------------------------------------------- */
430472uint8_t CWifi::encryptionType (uint8_t networkItem) {
431473/* -------------------------------------------------------------------------- */
432- if (networkItem < access_points. size () ) {
433- return Encr2wl_enc ( access_points[networkItem].encryption_mode ) ;
474+ if (networkItem < _apsFound ) {
475+ return access_points[networkItem].encryption_mode ;
434476 }
435477 return 0 ;
436478}
437479
438480/* -------------------------------------------------------------------------- */
439481uint8_t * CWifi::BSSID (uint8_t networkItem, uint8_t * bssid) {
440482/* -------------------------------------------------------------------------- */
441- if (networkItem < access_points. size () ) {
483+ if (networkItem < _apsFound ) {
442484 for (int i = 0 ; i < 6 ; i++) {
443485 *(bssid + i) = access_points[networkItem].uint_bssid [i];
444486 }
@@ -450,8 +492,8 @@ uint8_t* CWifi::BSSID(uint8_t networkItem, uint8_t* bssid) {
450492/* -------------------------------------------------------------------------- */
451493uint8_t CWifi::channel (uint8_t networkItem) {
452494/* -------------------------------------------------------------------------- */
453- if (networkItem < access_points. size () ) {
454- return atoi ( access_points[networkItem].channel . c_str ()) ;
495+ if (networkItem < _apsFound ) {
496+ return access_points[networkItem].channel ;
455497 }
456498 return 0 ;
457499}
0 commit comments