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+
639bool 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,23 @@ int arduino::WiFiClass::begin(const char* ssid, const char* passphrase) {
4682 return _currentNetworkStatus;
4783}
4884
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+
49102// Config Wifi to set Static IP && Disable DHCP
50103void arduino::WiFiClass::config (const char * localip, const char * netmask, const char * gateway){
51104 SocketHelpers::config (IPAddress (localip), dnsIP (0 ), IPAddress (gateway), IPAddress (netmask));
@@ -161,25 +214,8 @@ int arduino::WiFiClass::setSSID(const char* ssid) {
161214 return 1 ;
162215}
163216
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-
182217int8_t arduino::WiFiClass::scanNetworks () {
218+ connected_ap = SSID_MAX_COUNT;
183219 uint8_t count = SSID_MAX_COUNT;
184220 if (ap_list != nullptr ) {
185221 free (ap_list);
@@ -189,23 +225,39 @@ int8_t arduino::WiFiClass::scanNetworks() {
189225}
190226
191227char * arduino::WiFiClass::SSID (uint8_t networkItem) {
228+ if (networkItem >= SSID_MAX_COUNT) {
229+ return NULL ;
230+ }
192231 return (char *)ap_list[networkItem].get_ssid ();
193232}
194233
195234int32_t arduino::WiFiClass::RSSI (uint8_t networkItem) {
235+ if (networkItem >= SSID_MAX_COUNT) {
236+ return 0 ;
237+ }
196238 return ap_list[networkItem].get_rssi ();
197239}
198240
199241uint8_t arduino::WiFiClass::encryptionType (uint8_t networkItem) {
242+ if (networkItem >= SSID_MAX_COUNT) {
243+ return ENC_TYPE_NONE;
244+ }
200245 return sec2enum (ap_list[networkItem].get_security ());
201246}
202247
203248uint8_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+ }
205254 return bssid;
206255}
207256
208257uint8_t arduino::WiFiClass::channel (uint8_t networkItem) {
258+ if (networkItem >= SSID_MAX_COUNT) {
259+ return -1 ;
260+ }
209261 return ap_list[networkItem].get_channel ();
210262}
211263
@@ -218,13 +270,21 @@ uint8_t arduino::WiFiClass::status() {
218270}
219271
220272uint8_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+ }
222278}
223279
224280uint8_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+ }
228288 }
229289 return bssid;
230290}
0 commit comments