From e36aaa9901747a40f16cd25ea716f9232a2498a2 Mon Sep 17 00:00:00 2001 From: Sebastian Hunkeler Date: Thu, 20 Aug 2020 13:03:58 +0200 Subject: [PATCH 1/3] Set SSID in AP mode --- libraries/WiFi/src/WiFi.cpp | 48 +++++++++++++++++++++---------------- libraries/WiFi/src/WiFi.h | 2 +- 2 files changed, 28 insertions(+), 22 deletions(-) diff --git a/libraries/WiFi/src/WiFi.cpp b/libraries/WiFi/src/WiFi.cpp index 76edf3796..474a1f642 100644 --- a/libraries/WiFi/src/WiFi.cpp +++ b/libraries/WiFi/src/WiFi.cpp @@ -1,5 +1,7 @@ #include "WiFi.h" +#define SSID_MAX_LENGTH 32 + bool arduino::WiFiClass::isVisible(const char* ssid) { for (int i=0; i<10; i++) { if (strncmp(ap_list[i].get_ssid(), ssid, 32) == 0) { @@ -21,34 +23,22 @@ SocketAddress arduino::WiFiClass::socketAddressFromIpAddress(arduino::IPAddress } int arduino::WiFiClass::begin(const char* ssid, const char *passphrase) { - if (_ssid) free(_ssid); - - _ssid = (char*)malloc(33); - if (!_ssid) { - //tr_error("Could not allocate ssid buffer"); - return WL_CONNECT_FAILED; - } - if (wifi_if == nullptr) { //Q: What is the callback for? _initializerCallback(); if(wifi_if == nullptr) return WL_CONNECT_FAILED; - } - - memcpy(_ssid, ssid, 33); - // too long? break it off - if (strlen(ssid) > 32) _ssid[32] = 0; + } scanNetworks(); // use scan result to populate security field - if (!isVisible(_ssid)) { + if (!isVisible(ssid)) { _currentNetworkStatus = WL_CONNECT_FAILED; return _currentNetworkStatus; } - nsapi_error_t ret = wifi_if->connect(_ssid, passphrase, ap_list[connected_ap].get_security()); - - _currentNetworkStatus = ret == NSAPI_ERROR_OK ? WL_CONNECTED : WL_CONNECT_FAILED; + nsapi_error_t result = wifi_if->connect(ssid, passphrase, ap_list[connected_ap].get_security()); + + _currentNetworkStatus = (result == NSAPI_ERROR_OK && setSSID(ssid)) ? WL_CONNECTED : WL_CONNECT_FAILED; return _currentNetworkStatus; } @@ -59,16 +49,17 @@ int arduino::WiFiClass::beginAP(const char* ssid, const char *passphrase, uint8_ #endif if (_softAP == NULL) { - return WL_CONNECT_FAILED; + return WL_AP_FAILED; } ensureDefaultAPNetworkConfiguration(); //Set ap ssid, password and channel static_cast(_softAP)->set_network(_ip, _netmask, _gateway); - nsapi_error_t ret = static_cast(_softAP)->start(ssid, passphrase, NSAPI_SECURITY_WPA2, channel, true /* dhcp server */, NULL, true /* cohexistance */); - - return ret == NSAPI_ERROR_OK ? WL_AP_LISTENING : WL_CONNECT_FAILED; + nsapi_error_t result = static_cast(_softAP)->start(ssid, passphrase, NSAPI_SECURITY_WPA2, channel, true /* dhcp server */, NULL, true /* cohexistance */); + + _currentNetworkStatus = (result == NSAPI_ERROR_OK && setSSID(ssid)) ? WL_AP_LISTENING : WL_AP_FAILED; + return _currentNetworkStatus; } void arduino::WiFiClass::ensureDefaultAPNetworkConfiguration() { @@ -136,6 +127,21 @@ char* arduino::WiFiClass::SSID() { return _ssid; } +int arduino::WiFiClass::setSSID(const char* ssid){ + if (_ssid) free(_ssid); + + _ssid = (char*)malloc(SSID_MAX_LENGTH + 1); + if (!_ssid) { + //tr_error("Could not allocate ssid buffer"); + return 0; + } + + memcpy(_ssid, ssid, SSID_MAX_LENGTH + 1); + // too long? break it off + if (strlen(ssid) > SSID_MAX_LENGTH) _ssid[SSID_MAX_LENGTH] = 0; + return 1; +} + static const char *sec2str(nsapi_security_t sec) { switch (sec) { diff --git a/libraries/WiFi/src/WiFi.h b/libraries/WiFi/src/WiFi.h index 8eac00930..394d1c7c4 100644 --- a/libraries/WiFi/src/WiFi.h +++ b/libraries/WiFi/src/WiFi.h @@ -308,7 +308,7 @@ class WiFiClass voidPrtFuncPtr _initializerCallback; WiFiAccessPoint* ap_list = nullptr; uint8_t connected_ap; - + int setSSID(const char* ssid); void ensureDefaultAPNetworkConfiguration(); bool isVisible(const char* ssid); arduino::IPAddress ipAddressFromSocketAddress(SocketAddress socketAddress); From cc4d69e2957e0e9a47e1961bba3c33f660fafa34 Mon Sep 17 00:00:00 2001 From: Sebastian Hunkeler Date: Thu, 20 Aug 2020 13:26:37 +0200 Subject: [PATCH 2/3] Improve error handling of connect functions --- libraries/WiFi/src/WiFiClient.cpp | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/libraries/WiFi/src/WiFiClient.cpp b/libraries/WiFi/src/WiFiClient.cpp index 6ff25dbf9..6306e7968 100644 --- a/libraries/WiFi/src/WiFiClient.cpp +++ b/libraries/WiFi/src/WiFiClient.cpp @@ -31,7 +31,9 @@ void arduino::WiFiClient::getStatus() { int arduino::WiFiClient::connect(SocketAddress socketAddress) { if (sock == NULL) { sock = new TCPSocket(); - static_cast(sock)->open(WiFi.getNetwork()); + if(static_cast(sock)->open(WiFi.getNetwork()) != NSAPI_ERROR_OK){ + return 0; + } } //sock->sigio(mbed::callback(this, &WiFiClient::getStatus)); //sock->set_blocking(false); @@ -54,7 +56,9 @@ int arduino::WiFiClient::connect(const char *host, uint16_t port) { int arduino::WiFiClient::connectSSL(SocketAddress socketAddress){ if (sock == NULL) { sock = new TLSSocket(); - static_cast(sock)->open(WiFi.getNetwork()); + if(static_cast(sock)->open(WiFi.getNetwork()) != NSAPI_ERROR_OK){ + return 0; + } } if (beforeConnect) { beforeConnect(); From 361aee7689a8b01b97486975f5abb951112e4157 Mon Sep 17 00:00:00 2001 From: Sebastian Hunkeler Date: Thu, 20 Aug 2020 13:40:12 +0200 Subject: [PATCH 3/3] Use SSID_MAX_LENGTH in isVisible --- libraries/WiFi/src/WiFi.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/libraries/WiFi/src/WiFi.cpp b/libraries/WiFi/src/WiFi.cpp index 474a1f642..4f4b085fd 100644 --- a/libraries/WiFi/src/WiFi.cpp +++ b/libraries/WiFi/src/WiFi.cpp @@ -4,7 +4,7 @@ bool arduino::WiFiClass::isVisible(const char* ssid) { for (int i=0; i<10; i++) { - if (strncmp(ap_list[i].get_ssid(), ssid, 32) == 0) { + if (strncmp(ap_list[i].get_ssid(), ssid, SSID_MAX_LENGTH) == 0) { connected_ap = i; return true; }