3
3
#define SSID_MAX_LENGTH 32
4
4
#define SSID_MAX_COUNT 64
5
5
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
+
6
39
bool arduino::WiFiClass::isVisible (const char * ssid) {
7
40
for (int i = 0 ; i < SSID_MAX_COUNT; i++) {
8
41
if (strncmp (ap_list[i].get_ssid (), ssid, SSID_MAX_LENGTH) == 0 ) {
@@ -13,18 +46,21 @@ bool arduino::WiFiClass::isVisible(const char* ssid) {
13
46
return false ;
14
47
}
15
48
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 ) {
17
50
if (wifi_if == nullptr ) {
18
51
return 0 ;
19
52
}
20
53
21
54
wifi_if->attach (&arduino::WiFiClass::statusCallback);
22
55
23
56
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);
28
64
}
29
65
30
66
wifi_if->set_dhcp (!_useStaticIP);
@@ -36,7 +72,7 @@ int arduino::WiFiClass::begin(const char* ssid, const char* passphrase) {
36
72
wifi_if->add_dns_server (_dnsServer1, if_name); // pushes dnsServer2 at index 1
37
73
}
38
74
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 );
40
76
41
77
if (result == NSAPI_ERROR_IS_CONNECTED) {
42
78
wifi_if->disconnect ();
@@ -46,6 +82,10 @@ int arduino::WiFiClass::begin(const char* ssid, const char* passphrase) {
46
82
return _currentNetworkStatus;
47
83
}
48
84
85
+ int arduino::WiFiClass::begin (const char * ssid) {
86
+ return begin (ssid, NULL , ENC_TYPE_NONE);
87
+ }
88
+
49
89
// Config Wifi to set Static IP && Disable DHCP
50
90
void arduino::WiFiClass::config (const char * localip, const char * netmask, const char * gateway){
51
91
SocketHelpers::config (IPAddress (localip), dnsIP (0 ), IPAddress (gateway), IPAddress (netmask));
@@ -161,25 +201,8 @@ int arduino::WiFiClass::setSSID(const char* ssid) {
161
201
return 1 ;
162
202
}
163
203
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
-
182
204
int8_t arduino::WiFiClass::scanNetworks () {
205
+ connected_ap = SSID_MAX_COUNT;
183
206
uint8_t count = SSID_MAX_COUNT;
184
207
if (ap_list != nullptr ) {
185
208
free (ap_list);
@@ -189,23 +212,39 @@ int8_t arduino::WiFiClass::scanNetworks() {
189
212
}
190
213
191
214
char * arduino::WiFiClass::SSID (uint8_t networkItem) {
215
+ if (networkItem >= SSID_MAX_COUNT) {
216
+ return NULL ;
217
+ }
192
218
return (char *)ap_list[networkItem].get_ssid ();
193
219
}
194
220
195
221
int32_t arduino::WiFiClass::RSSI (uint8_t networkItem) {
222
+ if (networkItem >= SSID_MAX_COUNT) {
223
+ return 0 ;
224
+ }
196
225
return ap_list[networkItem].get_rssi ();
197
226
}
198
227
199
228
uint8_t arduino::WiFiClass::encryptionType (uint8_t networkItem) {
229
+ if (networkItem >= SSID_MAX_COUNT) {
230
+ return ENC_TYPE_UNKNOWN;
231
+ }
200
232
return sec2enum (ap_list[networkItem].get_security ());
201
233
}
202
234
203
235
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
+ }
205
241
return bssid;
206
242
}
207
243
208
244
uint8_t arduino::WiFiClass::channel (uint8_t networkItem) {
245
+ if (networkItem >= SSID_MAX_COUNT) {
246
+ return -1 ;
247
+ }
209
248
return ap_list[networkItem].get_channel ();
210
249
}
211
250
@@ -218,13 +257,21 @@ uint8_t arduino::WiFiClass::status() {
218
257
}
219
258
220
259
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
+ }
222
265
}
223
266
224
267
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
+ }
228
275
}
229
276
return bssid;
230
277
}
0 commit comments