diff --git a/src/Arduino_ConnectionHandler.h b/src/Arduino_ConnectionHandler.h index 6496b931..8099e79e 100644 --- a/src/Arduino_ConnectionHandler.h +++ b/src/Arduino_ConnectionHandler.h @@ -217,12 +217,13 @@ class ConnectionHandler { virtual NetworkConnectionState update_handleConnected () = 0; virtual NetworkConnectionState update_handleDisconnecting() = 0; virtual NetworkConnectionState update_handleDisconnected () = 0; - + unsigned long _lastConnectionTickTime; + NetworkConnectionState _current_net_connection_state; private: - unsigned long _lastConnectionTickTime; - NetworkConnectionState _current_net_connection_state; + + OnNetworkEventCallback _on_connect_event_callback = NULL, _on_disconnect_event_callback = NULL, _on_error_event_callback = NULL; @@ -230,6 +231,7 @@ class ConnectionHandler { #if defined(BOARD_HAS_WIFI) #include "Arduino_WiFiConnectionHandler.h" + #include "Arduino_WiFiConnectionHandlerDynamic.h" #elif defined(BOARD_HAS_GSM) #include "Arduino_GSMConnectionHandler.h" #elif defined(BOARD_HAS_NB) diff --git a/src/Arduino_WiFiConnectionHandlerDynamic.cpp b/src/Arduino_WiFiConnectionHandlerDynamic.cpp new file mode 100644 index 00000000..fc827219 --- /dev/null +++ b/src/Arduino_WiFiConnectionHandlerDynamic.cpp @@ -0,0 +1,167 @@ +/* + This file is part of ArduinoIoTCloud. + + Copyright 2019 ARDUINO SA (http://www.arduino.cc/) + + This software is released under the GNU General Public License version 3, + which covers the main part of arduino-cli. + The terms of this license can be found at: + https://www.gnu.org/licenses/gpl-3.0.en.html + + You can be released from the requirements of the above licenses by purchasing + a commercial license. Buying such a license is mandatory if you want to modify or + otherwise use the software for commercial activities involving the Arduino + software without disclosing the source code of your own applications. To purchase + a commercial license, send an email to license@arduino.cc. +*/ + +/****************************************************************************** + INCLUDE + ******************************************************************************/ + +#include "Arduino_WiFiConnectionHandlerDynamic.h" + +#ifdef BOARD_HAS_WIFI /* Only compile if the board has WiFi */ + +/****************************************************************************** + CTOR/DTOR + ******************************************************************************/ + +WiFiConnectionHandlerDynamic::WiFiConnectionHandlerDynamic(bool const keep_alive) +: ConnectionHandler{keep_alive} +{ + _current_net_connection_state = NetworkConnectionState::CLOSED; +} +void WiFiConnectionHandlerDynamic::setWiFiCredentials(String ssid, String pass){ + _ssid = ssid; + _pass = pass; + _current_net_connection_state = NetworkConnectionState::INIT; +} +/****************************************************************************** + PUBLIC MEMBER FUNCTIONS + ******************************************************************************/ + +unsigned long WiFiConnectionHandlerDynamic::getTime() +{ +#if !defined(BOARD_ESP8266) && !defined(ESP32) + return WiFi.getTime(); +#else + return 0; +#endif +} + +/****************************************************************************** + PROTECTED MEMBER FUNCTIONS + ******************************************************************************/ + +NetworkConnectionState WiFiConnectionHandlerDynamic::update_handleInit() +{ +#if !defined(BOARD_ESP8266) && !defined(ESP32) +#if !defined(__AVR__) + Debug.print(DBG_INFO, F("WiFi.status(): %d"), WiFi.status()); +#endif + if (WiFi.status() == NETWORK_HARDWARE_ERROR) + { +#if !defined(__AVR__) + Debug.print(DBG_ERROR, F("WiFi Hardware failure.\nMake sure you are using a WiFi enabled board/shield.")); + Debug.print(DBG_ERROR, F("Then reset and retry.")); +#endif + return NetworkConnectionState::ERROR; + } +#if !defined(__AVR__) + Debug.print(DBG_ERROR, F("Current WiFi Firmware: %s"), WiFi.firmwareVersion()); +#endif + +#if defined(WIFI_FIRMWARE_VERSION_REQUIRED) + if (WiFi.firmwareVersion() < WIFI_FIRMWARE_VERSION_REQUIRED) + { +#if !defined(__AVR__) + Debug.print(DBG_ERROR, F("Latest WiFi Firmware: %s"), WIFI_FIRMWARE_VERSION_REQUIRED); + Debug.print(DBG_ERROR, F("Please update to the latest version for best performance.")); +#endif + delay(5000); + } +#endif + +#else + Debug.print(DBG_ERROR, F("WiFi status ESP: %d"), WiFi.status()); + WiFi.disconnect(); + delay(300); + WiFi.begin(_ssid.c_str(), _pass.c_str()); + delay(1000); +#endif /* #if !defined(BOARD_ESP8266) && !defined(ESP32) */ + + return NetworkConnectionState::CONNECTING; +} + +NetworkConnectionState WiFiConnectionHandlerDynamic::update_handleConnecting() +{ +#if !defined(BOARD_ESP8266) && !defined(ESP32) + if (WiFi.status() != WL_CONNECTED) + { + WiFi.begin(_ssid.c_str(), _pass.c_str()); + } +#endif /* ifndef BOARD_ESP8266 */ + + if (WiFi.status() != NETWORK_CONNECTED) + { +#if !defined(__AVR__) + Debug.print(DBG_ERROR, F("Connection to \"%s\" failed"), _ssid.c_str()); + Debug.print(DBG_INFO, F("Retrying in \"%d\" milliseconds"), CHECK_INTERVAL_TABLE[static_cast(NetworkConnectionState::CONNECTING)]); +#endif + return NetworkConnectionState::CONNECTING; + } + else + { +#if !defined(__AVR__) + Debug.print(DBG_INFO, F("Connected to \"%s\""), _ssid.c_str()); +#endif +#if defined(BOARD_ESP8266) || defined(ESP32) + configTime(0, 0, "time.arduino.cc", "pool.ntp.org", "time.nist.gov"); +#endif + return NetworkConnectionState::CONNECTED; + } +} + +NetworkConnectionState WiFiConnectionHandlerDynamic::update_handleConnected() +{ + if (WiFi.status() != WL_CONNECTED) + { +#if !defined(__AVR__) + Debug.print(DBG_VERBOSE, F("WiFi.status(): %d"), WiFi.status()); + Debug.print(DBG_ERROR, F("Connection to \"%s\" lost."), _ssid.c_str()); +#endif + if (_keep_alive) + { +#if !defined(__AVR__) + Debug.print(DBG_ERROR, F("Attempting reconnection")); +#endif + } + + return NetworkConnectionState::DISCONNECTED; + } + return NetworkConnectionState::CONNECTED; +} + +NetworkConnectionState WiFiConnectionHandlerDynamic::update_handleDisconnecting() +{ + WiFi.disconnect(); + return NetworkConnectionState::DISCONNECTED; +} + +NetworkConnectionState WiFiConnectionHandlerDynamic::update_handleDisconnected() +{ +#if !defined(BOARD_ESP8266) && !defined(ESP32) + WiFi.end(); +#endif /* ifndef BOARD_ESP8266 */ + if (_keep_alive) + { + return NetworkConnectionState::INIT; + } + else + { + return NetworkConnectionState::CLOSED; + } +} + +#endif /* #ifdef BOARD_HAS_WIFI */ diff --git a/src/Arduino_WiFiConnectionHandlerDynamic.h b/src/Arduino_WiFiConnectionHandlerDynamic.h new file mode 100644 index 00000000..a30d8391 --- /dev/null +++ b/src/Arduino_WiFiConnectionHandlerDynamic.h @@ -0,0 +1,64 @@ +/* + This file is part of ArduinoIoTCloud. + + Copyright 2019 ARDUINO SA (http://www.arduino.cc/) + + This software is released under the GNU General Public License version 3, + which covers the main part of arduino-cli. + The terms of this license can be found at: + https://www.gnu.org/licenses/gpl-3.0.en.html + + You can be released from the requirements of the above licenses by purchasing + a commercial license. Buying such a license is mandatory if you want to modify or + otherwise use the software for commercial activities involving the Arduino + software without disclosing the source code of your own applications. To purchase + a commercial license, send an email to license@arduino.cc. +*/ + +#ifndef ARDUINO_WIFI_CONNECTION_HANDLER_DYNAMIC_H_ +#define ARDUINO_WIFI_CONNECTION_HANDLER_DYNAMIC_H_ + +/****************************************************************************** + INCLUDE + ******************************************************************************/ + +#include "Arduino_ConnectionHandler.h" + +#ifdef BOARD_HAS_WIFI /* Only compile if the board has WiFi */ + +/****************************************************************************** + CLASS DECLARATION + ******************************************************************************/ + +class WiFiConnectionHandlerDynamic : public ConnectionHandler +{ + public: + + WiFiConnectionHandlerDynamic(bool const keep_alive = true); + + void setWiFiCredentials(String ssid, String pass); + virtual unsigned long getTime() override; + virtual Client & getClient() override{ return _wifi_client; } + virtual UDP & getUDP() override { return _wifi_udp; } + + + protected: + + virtual NetworkConnectionState update_handleInit () override; + virtual NetworkConnectionState update_handleConnecting () override; + virtual NetworkConnectionState update_handleConnected () override; + virtual NetworkConnectionState update_handleDisconnecting() override; + virtual NetworkConnectionState update_handleDisconnected () override; + + private: + + String _ssid; + String _pass; + + WiFiUDP _wifi_udp; + WiFiClient _wifi_client; +}; + +#endif /* #ifdef BOARD_HAS_WIFI */ + +#endif /* ARDUINO_WIFI_CONNECTION_HANDLER_DYNAMIC_H_ */