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,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
5090void 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-
182204int8_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
191214char * 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
195221int32_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
199228uint8_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
203235uint8_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
208244uint8_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
220259uint8_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
224267uint8_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}
0 commit comments