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