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,23 @@ 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, uint8_t key_idx, const char * key) {
86
+ // The low-level driver expects all 4 keys to be passed in a buffer with the following format:
87
+ // <idx> <len> <key>, <idx> <len> <key>, etc..
88
+ uint8_t buf[(2 + 32 ) * 4 ] = { 0 };
89
+ size_t keylen = min (32 , strlen (key));
90
+ size_t buflen = (keylen + 2 ) * 4 ;
91
+
92
+ // Repeat the key.
93
+ for (int i=0 ; i<buflen; i += (keylen + 2 )) {
94
+ buf[i+0 ] = i / (keylen + 2 );
95
+ buf[i+1 ] = keylen;
96
+ memcpy (&buf[i+2 ], key, keylen);
97
+ }
98
+
99
+ return begin (ssid, (const char *) buf, ENC_TYPE_WEP);
100
+ }
101
+
49
102
// Config Wifi to set Static IP && Disable DHCP
50
103
void arduino::WiFiClass::config (const char * localip, const char * netmask, const char * gateway){
51
104
SocketHelpers::config (IPAddress (localip), dnsIP (0 ), IPAddress (gateway), IPAddress (netmask));
@@ -161,25 +214,8 @@ int arduino::WiFiClass::setSSID(const char* ssid) {
161
214
return 1 ;
162
215
}
163
216
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
217
int8_t arduino::WiFiClass::scanNetworks () {
218
+ connected_ap = SSID_MAX_COUNT;
183
219
uint8_t count = SSID_MAX_COUNT;
184
220
if (ap_list != nullptr ) {
185
221
free (ap_list);
@@ -189,23 +225,39 @@ int8_t arduino::WiFiClass::scanNetworks() {
189
225
}
190
226
191
227
char * arduino::WiFiClass::SSID (uint8_t networkItem) {
228
+ if (networkItem >= SSID_MAX_COUNT) {
229
+ return NULL ;
230
+ }
192
231
return (char *)ap_list[networkItem].get_ssid ();
193
232
}
194
233
195
234
int32_t arduino::WiFiClass::RSSI (uint8_t networkItem) {
235
+ if (networkItem >= SSID_MAX_COUNT) {
236
+ return 0 ;
237
+ }
196
238
return ap_list[networkItem].get_rssi ();
197
239
}
198
240
199
241
uint8_t arduino::WiFiClass::encryptionType (uint8_t networkItem) {
242
+ if (networkItem >= SSID_MAX_COUNT) {
243
+ return ENC_TYPE_NONE;
244
+ }
200
245
return sec2enum (ap_list[networkItem].get_security ());
201
246
}
202
247
203
248
uint8_t * arduino::WiFiClass::BSSID (uint8_t networkItem, uint8_t * bssid) {
204
- memcpy (bssid, ap_list[networkItem].get_bssid (), 6 );
249
+ if (networkItem >= SSID_MAX_COUNT) {
250
+ memset (bssid, 0 , 6 );
251
+ } else {
252
+ memcpy (bssid, ap_list[networkItem].get_bssid (), 6 );
253
+ }
205
254
return bssid;
206
255
}
207
256
208
257
uint8_t arduino::WiFiClass::channel (uint8_t networkItem) {
258
+ if (networkItem >= SSID_MAX_COUNT) {
259
+ return -1 ;
260
+ }
209
261
return ap_list[networkItem].get_channel ();
210
262
}
211
263
@@ -218,13 +270,21 @@ uint8_t arduino::WiFiClass::status() {
218
270
}
219
271
220
272
uint8_t arduino::WiFiClass::encryptionType () {
221
- return sec2enum (ap_list[connected_ap].get_security ());
273
+ if (connected_ap >= SSID_MAX_COUNT) {
274
+ return sec2enum (_security);
275
+ } else {
276
+ return sec2enum (ap_list[connected_ap].get_security ());
277
+ }
222
278
}
223
279
224
280
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];
281
+ if (connected_ap >= SSID_MAX_COUNT) {
282
+ memset (bssid, 0 , 6 );
283
+ } else {
284
+ const uint8_t * reverse_bssid = ap_list[connected_ap].get_bssid ();
285
+ for (int b = 0 ; b < 6 ; b++) {
286
+ bssid[b] = reverse_bssid[5 - b];
287
+ }
228
288
}
229
289
return bssid;
230
290
}
0 commit comments