Skip to content

Commit 1338021

Browse files
authored
Merge pull request #874 from iabdalkader/wifi_updates
WiFi: Support for hidden networks and misc fixes.
2 parents 2d27acf + 79d35ef commit 1338021

File tree

2 files changed

+78
-40
lines changed

2 files changed

+78
-40
lines changed

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

+76-29
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,39 @@
33
#define SSID_MAX_LENGTH 32
44
#define SSID_MAX_COUNT 64
55

6+
static uint8_t sec2enum(nsapi_security_t sec) {
7+
switch (sec) {
8+
case NSAPI_SECURITY_NONE:
9+
return ENC_TYPE_NONE;
10+
case NSAPI_SECURITY_WEP:
11+
return ENC_TYPE_WEP;
12+
case NSAPI_SECURITY_WPA:
13+
return ENC_TYPE_TKIP;
14+
case NSAPI_SECURITY_WPA2:
15+
return ENC_TYPE_CCMP;
16+
case NSAPI_SECURITY_WPA_WPA2:
17+
return ENC_TYPE_CCMP;
18+
case NSAPI_SECURITY_UNKNOWN:
19+
default:
20+
return ENC_TYPE_AUTO;
21+
}
22+
}
23+
24+
static nsapi_security_t enum2sec(wl_enc_type sec) {
25+
switch (sec) {
26+
case ENC_TYPE_NONE:
27+
return NSAPI_SECURITY_NONE;
28+
case ENC_TYPE_WEP:
29+
return NSAPI_SECURITY_WEP;
30+
case ENC_TYPE_TKIP:
31+
return NSAPI_SECURITY_WPA;
32+
case ENC_TYPE_CCMP:
33+
return NSAPI_SECURITY_WPA_WPA2;
34+
default:
35+
return NSAPI_SECURITY_UNKNOWN;
36+
}
37+
}
38+
639
bool arduino::WiFiClass::isVisible(const char* ssid) {
740
for (int i = 0; i < SSID_MAX_COUNT; i++) {
841
if (strncmp(ap_list[i].get_ssid(), ssid, SSID_MAX_LENGTH) == 0) {
@@ -13,18 +46,21 @@ bool arduino::WiFiClass::isVisible(const char* ssid) {
1346
return false;
1447
}
1548

16-
int arduino::WiFiClass::begin(const char* ssid, const char* passphrase) {
49+
int arduino::WiFiClass::begin(const char* ssid, const char* passphrase, wl_enc_type security) {
1750
if (wifi_if == nullptr) {
1851
return 0;
1952
}
2053

2154
wifi_if->attach(&arduino::WiFiClass::statusCallback);
2255

2356
scanNetworks();
24-
// use scan result to populate security field
25-
if (!isVisible(ssid)) {
26-
_currentNetworkStatus = WL_CONNECT_FAILED;
27-
return _currentNetworkStatus;
57+
58+
if (isVisible(ssid)) {
59+
// Set the network security mode from the scan result.
60+
_security = ap_list[connected_ap].get_security();
61+
} else {
62+
// For hidden networks, the security mode must be set explicitly.
63+
_security = enum2sec(security);
2864
}
2965

3066
wifi_if->set_dhcp(!_useStaticIP);
@@ -36,7 +72,7 @@ int arduino::WiFiClass::begin(const char* ssid, const char* passphrase) {
3672
wifi_if->add_dns_server(_dnsServer1, if_name); // pushes dnsServer2 at index 1
3773
}
3874

39-
nsapi_error_t result = wifi_if->connect(ssid, passphrase, ap_list[connected_ap].get_security());
75+
nsapi_error_t result = wifi_if->connect(ssid, passphrase, _security);
4076

4177
if(result == NSAPI_ERROR_IS_CONNECTED) {
4278
wifi_if->disconnect();
@@ -46,6 +82,10 @@ int arduino::WiFiClass::begin(const char* ssid, const char* passphrase) {
4682
return _currentNetworkStatus;
4783
}
4884

85+
int arduino::WiFiClass::begin(const char* ssid) {
86+
return begin(ssid, NULL, ENC_TYPE_NONE);
87+
}
88+
4989
//Config Wifi to set Static IP && Disable DHCP
5090
void arduino::WiFiClass::config(const char* localip, const char* netmask, const char* gateway){
5191
SocketHelpers::config(IPAddress(localip), dnsIP(0), IPAddress(gateway), IPAddress(netmask));
@@ -161,25 +201,8 @@ int arduino::WiFiClass::setSSID(const char* ssid) {
161201
return 1;
162202
}
163203

164-
static uint8_t sec2enum(nsapi_security_t sec) {
165-
switch (sec) {
166-
case NSAPI_SECURITY_NONE:
167-
return ENC_TYPE_NONE;
168-
case NSAPI_SECURITY_WEP:
169-
return ENC_TYPE_WEP;
170-
case NSAPI_SECURITY_WPA:
171-
return ENC_TYPE_TKIP;
172-
case NSAPI_SECURITY_WPA2:
173-
return ENC_TYPE_CCMP;
174-
case NSAPI_SECURITY_WPA_WPA2:
175-
return ENC_TYPE_CCMP;
176-
case NSAPI_SECURITY_UNKNOWN:
177-
default:
178-
return ENC_TYPE_AUTO;
179-
}
180-
}
181-
182204
int8_t arduino::WiFiClass::scanNetworks() {
205+
connected_ap = SSID_MAX_COUNT;
183206
uint8_t count = SSID_MAX_COUNT;
184207
if (ap_list != nullptr) {
185208
free(ap_list);
@@ -189,23 +212,39 @@ int8_t arduino::WiFiClass::scanNetworks() {
189212
}
190213

191214
char* arduino::WiFiClass::SSID(uint8_t networkItem) {
215+
if (networkItem >= SSID_MAX_COUNT) {
216+
return NULL;
217+
}
192218
return (char*)ap_list[networkItem].get_ssid();
193219
}
194220

195221
int32_t arduino::WiFiClass::RSSI(uint8_t networkItem) {
222+
if (networkItem >= SSID_MAX_COUNT) {
223+
return 0;
224+
}
196225
return ap_list[networkItem].get_rssi();
197226
}
198227

199228
uint8_t arduino::WiFiClass::encryptionType(uint8_t networkItem) {
229+
if (networkItem >= SSID_MAX_COUNT) {
230+
return ENC_TYPE_UNKNOWN;
231+
}
200232
return sec2enum(ap_list[networkItem].get_security());
201233
}
202234

203235
uint8_t* arduino::WiFiClass::BSSID(uint8_t networkItem, uint8_t* bssid) {
204-
memcpy(bssid, ap_list[networkItem].get_bssid(), 6);
236+
if (networkItem >= SSID_MAX_COUNT) {
237+
memset(bssid, 0, 6);
238+
} else {
239+
memcpy(bssid, ap_list[networkItem].get_bssid(), 6);
240+
}
205241
return bssid;
206242
}
207243

208244
uint8_t arduino::WiFiClass::channel(uint8_t networkItem) {
245+
if (networkItem >= SSID_MAX_COUNT) {
246+
return -1;
247+
}
209248
return ap_list[networkItem].get_channel();
210249
}
211250

@@ -218,13 +257,21 @@ uint8_t arduino::WiFiClass::status() {
218257
}
219258

220259
uint8_t arduino::WiFiClass::encryptionType() {
221-
return sec2enum(ap_list[connected_ap].get_security());
260+
if (connected_ap >= SSID_MAX_COUNT) {
261+
return sec2enum(_security);
262+
} else {
263+
return sec2enum(ap_list[connected_ap].get_security());
264+
}
222265
}
223266

224267
uint8_t* arduino::WiFiClass::BSSID(unsigned char* bssid) {
225-
const uint8_t* reverse_bssid = ap_list[connected_ap].get_bssid();
226-
for (int b = 0; b < 6; b++) {
227-
bssid[b] = reverse_bssid[5 - b];
268+
if (connected_ap >= SSID_MAX_COUNT) {
269+
memset(bssid, 0, 6);
270+
} else {
271+
const uint8_t* reverse_bssid = ap_list[connected_ap].get_bssid();
272+
for (int b = 0; b < 6; b++) {
273+
bssid[b] = reverse_bssid[5 - b];
274+
}
228275
}
229276
return bssid;
230277
}

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

+2-11
Original file line numberDiff line numberDiff line change
@@ -67,16 +67,6 @@ class WiFiClass : public MbedSocketClass {
6767
*/
6868
int begin(const char* ssid);
6969

70-
/* Start Wifi connection with WEP encryption.
71-
* Configure a key into the device. The key type (WEP-40, WEP-104)
72-
* is determined by the size of the key (5 bytes for WEP-40, 13 bytes for WEP-104).
73-
*
74-
* param ssid: Pointer to the SSID string.
75-
* param key_idx: The key index to set. Valid values are 0-3.
76-
* param key: Key input buffer.
77-
*/
78-
int begin(const char* ssid, uint8_t key_idx, const char* key);
79-
8070
void MACAddress(uint8_t *mac_address);
8171

8272
/* Start Wifi connection with passphrase
@@ -86,7 +76,7 @@ class WiFiClass : public MbedSocketClass {
8676
* param passphrase: Passphrase. Valid characters in a passphrase
8777
* must be between ASCII 32-126 (decimal).
8878
*/
89-
int begin(const char* ssid, const char* passphrase);
79+
int begin(const char* ssid, const char* passphrase, wl_enc_type security = ENC_TYPE_CCMP);
9080

9181
// Inherit config methods from the parent class
9282
using MbedSocketClass::config;
@@ -201,6 +191,7 @@ class WiFiClass : public MbedSocketClass {
201191
WiFiInterface* wifi_if = nullptr;
202192
WiFiAccessPoint* ap_list = nullptr;
203193
uint8_t connected_ap;
194+
nsapi_security_t _security;
204195
int setSSID(const char* ssid);
205196
void ensureDefaultAPNetworkConfiguration();
206197
static void* handleAPEvents(whd_interface_t ifp, const whd_event_header_t* event_header, const uint8_t* event_data, void* handler_user_data);

0 commit comments

Comments
 (0)