From 77790764989a1896d91398a2862cd46930b58ac6 Mon Sep 17 00:00:00 2001 From: Yurii Date: Fri, 14 Jun 2024 18:18:43 +0300 Subject: [PATCH] refactor: optimizing work with network --- lib/NetworkUtils/NetworkConnection.cpp | 16 ++++++++++++---- lib/NetworkUtils/NetworkConnection.h | 1 + lib/NetworkUtils/NetworkMgr.h | 12 ++++++++---- src/PortalTask.h | 4 ++++ 4 files changed, 25 insertions(+), 8 deletions(-) diff --git a/lib/NetworkUtils/NetworkConnection.cpp b/lib/NetworkUtils/NetworkConnection.cpp index b5baca1..0f03b88 100644 --- a/lib/NetworkUtils/NetworkConnection.cpp +++ b/lib/NetworkUtils/NetworkConnection.cpp @@ -13,6 +13,7 @@ void NetworkConnection::setup(bool useDhcp) { void NetworkConnection::reset() { status = Status::NONE; + rawDisconnectReason = 0; disconnectReason = DisconnectReason::NONE; } @@ -33,22 +34,25 @@ void NetworkConnection::onEvent(System_Event_t *event) { switch (event->event) { case EVENT_STAMODE_CONNECTED: status = useDhcp ? Status::CONNECTING : Status::CONNECTED; + rawDisconnectReason = 0; disconnectReason = DisconnectReason::NONE; - break; case EVENT_STAMODE_GOT_IP: status = Status::CONNECTED; + rawDisconnectReason = 0; disconnectReason = DisconnectReason::NONE; break; case EVENT_STAMODE_DHCP_TIMEOUT: status = Status::DISCONNECTED; + rawDisconnectReason = 0; disconnectReason = DisconnectReason::DHCP_TIMEOUT; break; case EVENT_STAMODE_DISCONNECTED: status = Status::DISCONNECTED; + rawDisconnectReason = event->event_info.disconnected.reason; disconnectReason = convertDisconnectReason(event->event_info.disconnected.reason); // https://github.com/esp8266/Arduino/blob/d5eb265f78bff9deb7063d10030a02d021c8c66c/libraries/ESP8266WiFi/src/ESP8266WiFiGeneric.cpp#L231 @@ -63,6 +67,7 @@ void NetworkConnection::onEvent(System_Event_t *event) { auto& src = event->event_info.auth_change; if ((src.old_mode != AUTH_OPEN) && (src.new_mode == AUTH_OPEN)) { status = Status::DISCONNECTED; + rawDisconnectReason = 0; disconnectReason = DisconnectReason::OTHER; wifi_station_disconnect(); @@ -79,25 +84,27 @@ void NetworkConnection::onEvent(WiFiEvent_t event, WiFiEventInfo_t info) { switch (event) { case ARDUINO_EVENT_WIFI_STA_CONNECTED: status = useDhcp ? Status::CONNECTING : Status::CONNECTED; + rawDisconnectReason = 0; disconnectReason = DisconnectReason::NONE; - break; case ARDUINO_EVENT_WIFI_STA_GOT_IP: case ARDUINO_EVENT_WIFI_STA_GOT_IP6: status = Status::CONNECTED; + rawDisconnectReason = 0; disconnectReason = DisconnectReason::NONE; break; case ARDUINO_EVENT_WIFI_STA_LOST_IP: status = Status::DISCONNECTED; + rawDisconnectReason = 0; disconnectReason = DisconnectReason::DHCP_TIMEOUT; break; case ARDUINO_EVENT_WIFI_STA_DISCONNECTED: status = Status::DISCONNECTED; + rawDisconnectReason = info.wifi_sta_disconnected.reason; disconnectReason = convertDisconnectReason(info.wifi_sta_disconnected.reason); - break; default: @@ -147,4 +154,5 @@ NetworkConnection::DisconnectReason NetworkConnection::convertDisconnectReason(u bool NetworkConnection::useDhcp = false; NetworkConnection::Status NetworkConnection::status = Status::NONE; -NetworkConnection::DisconnectReason NetworkConnection::disconnectReason = DisconnectReason::NONE; \ No newline at end of file +NetworkConnection::DisconnectReason NetworkConnection::disconnectReason = DisconnectReason::NONE; +uint8_t NetworkConnection::rawDisconnectReason = 0; \ No newline at end of file diff --git a/lib/NetworkUtils/NetworkConnection.h b/lib/NetworkUtils/NetworkConnection.h index e266cf9..313d5e4 100644 --- a/lib/NetworkUtils/NetworkConnection.h +++ b/lib/NetworkUtils/NetworkConnection.h @@ -27,6 +27,7 @@ namespace NetworkUtils { static Status status; static DisconnectReason disconnectReason; + static uint8_t rawDisconnectReason; static void setup(bool useDhcp); static void setUseDhcp(bool value); diff --git a/lib/NetworkUtils/NetworkMgr.h b/lib/NetworkUtils/NetworkMgr.h index aa8b6f3..cd6d9a4 100644 --- a/lib/NetworkUtils/NetworkMgr.h +++ b/lib/NetworkUtils/NetworkMgr.h @@ -212,7 +212,7 @@ namespace NetworkUtils { } #endif*/ - WiFi.disconnect(false, true); + this->disconnect(); } if (!this->hasStaCredentials()) { @@ -266,13 +266,17 @@ namespace NetworkUtils { return false; } + void disconnect() { + WiFi.disconnect(false, true); + } + void loop() { if (this->reconnectFlag) { this->delayCallback(5000); Log.sinfoln(FPSTR(L_NETWORK), F("Reconnecting...")); this->reconnectFlag = false; - this->resetWifi(); + this->disconnect(); NetworkConnection::reset(); this->delayCallback(1000); @@ -297,7 +301,7 @@ namespace NetworkUtils { } if (this->isApEnabled() && millis() - this->connectedTime > this->reconnectInterval && !this->hasApClients()) { - Log.sinfoln(FPSTR(L_NETWORK), F("Stop AP because connected, start only STA")); + Log.sinfoln(FPSTR(L_NETWORK), F("Stop AP because STA connected")); WiFi.mode(WIFI_STA); return; @@ -348,7 +352,7 @@ namespace NetworkUtils { NetworkConnection::reset(); if (!this->connect(true, this->connectionTimeout)) { - Log.straceln(FPSTR(L_NETWORK), F("Connection failed. Status: %d, reason: %d"), NetworkConnection::getStatus(), NetworkConnection::getDisconnectReason()); + Log.straceln(FPSTR(L_NETWORK), F("Connection failed. Status: %d, reason: %d, raw reason: %d"), NetworkConnection::getStatus(), NetworkConnection::getDisconnectReason(), NetworkConnection::rawDisconnectReason); } this->prevReconnectingTime = millis(); diff --git a/src/PortalTask.h b/src/PortalTask.h index d5abc18..0d30543 100644 --- a/src/PortalTask.h +++ b/src/PortalTask.h @@ -623,6 +623,10 @@ protected: if (this->stateWebServer()) { this->webServer->handleClient(); } + + if (!this->stateDnsServer() && !this->stateWebServer()) { + this->delay(250); + } } bool isAuthRequired() {