Skip to content

Commit e67c7ea

Browse files
fabik111pennam
authored andcommitted
S3 Wifi scan optimization
1 parent 926389a commit e67c7ea

File tree

2 files changed

+119
-58
lines changed

2 files changed

+119
-58
lines changed

Diff for: libraries/WiFiS3/src/WiFi.cpp

+92-50
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,7 @@
11
#include "WiFi.h"
22

3+
#define SSID_MAX_COUNT 12
4+
35
using 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
/* -------------------------------------------------------------------------- */
260298
int8_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
/* -------------------------------------------------------------------------- */
386450
const 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
/* -------------------------------------------------------------------------- */
395459
int32_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
/* -------------------------------------------------------------------------- */
426468
uint8_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
/* -------------------------------------------------------------------------- */
439481
uint8_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
/* -------------------------------------------------------------------------- */
448490
uint8_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
/* -------------------------------------------------------------------------- */
460502
uint8_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
}

Diff for: libraries/WiFiS3/src/WiFi.h

+27-8
Original file line numberDiff line numberDiff line change
@@ -19,24 +19,43 @@
1919

2020
#define WIFI_FIRMWARE_LATEST_VERSION "0.4.1"
2121

22+
#define WL_MAX_AP_LIST 10
23+
#define WL_MAX_BSSID_LENGTH 17
24+
#define WL_MAX_SSID_LENGHT_S WL_SSID_MAX_LENGTH + 1 // +1 for null terminator
25+
2226
class CAccessPoint {
2327
public:
24-
std::string ssid;
25-
std::string bssid;
28+
CAccessPoint() {}
29+
CAccessPoint(const CAccessPoint &obj)
30+
{
31+
strcpy(ssid, obj.ssid);
32+
rssi = obj.rssi;
33+
channel = obj.channel;
34+
encryption_mode = obj.encryption_mode;
35+
memcpy(uint_bssid, obj.uint_bssid, sizeof(uint_bssid));
36+
}
37+
CAccessPoint &operator=(const CAccessPoint &obj) {
38+
strcpy(ssid, obj.ssid);
39+
rssi = obj.rssi;
40+
channel = obj.channel;
41+
encryption_mode = obj.encryption_mode;
42+
memcpy(uint_bssid, obj.uint_bssid, sizeof(uint_bssid));
43+
}
44+
char ssid[WL_MAX_SSID_LENGHT_S];
2645
uint8_t uint_bssid[6];
27-
std::string rssi;
28-
std::string channel;
29-
std::string encryption_mode;
46+
int rssi;
47+
uint8_t channel;
48+
uint8_t encryption_mode;
3049
};
3150

3251

33-
34-
3552
class CWifi {
3653
private:
3754
void _config(IPAddress local_ip, IPAddress gateway, IPAddress subnet, IPAddress dns1, IPAddress dns2);
55+
void _sortAPlist(uint8_t num);
3856
unsigned long _timeout;
39-
std::vector<CAccessPoint> access_points;
57+
CAccessPoint access_points[WL_MAX_AP_LIST];
58+
uint8_t _apsFound = 0;
4059
std::string ssid;
4160
std::string apssid;
4261

0 commit comments

Comments
 (0)