From 1e66ecff607ab92fc4410c00f81e040035b6cc04 Mon Sep 17 00:00:00 2001 From: Alexander Balya Date: Mon, 6 Jul 2026 17:21:24 +0200 Subject: [PATCH] Fix Ethernet MQTT reconnect handling (#10896) Co-authored-by: Ben Meadors --- src/mesh/udp/UdpMulticastHandler.h | 6 ++++++ src/mesh/wifi/WiFiAPClient.cpp | 5 +++++ src/mqtt/MQTT.cpp | 10 +++++++++- 3 files changed, 20 insertions(+), 1 deletion(-) diff --git a/src/mesh/udp/UdpMulticastHandler.h b/src/mesh/udp/UdpMulticastHandler.h index 2cf718ec6..625dc008a 100644 --- a/src/mesh/udp/UdpMulticastHandler.h +++ b/src/mesh/udp/UdpMulticastHandler.h @@ -33,6 +33,8 @@ class UdpMulticastHandler final #if defined(ARCH_NRF52) || defined(ARCH_PORTDUINO) LOG_DEBUG("UDP Listening on IP: %u.%u.%u.%u:%u", udpIpAddress[0], udpIpAddress[1], udpIpAddress[2], udpIpAddress[3], UDP_MULTICAST_DEFAUL_PORT); +#elif defined(USE_WS5500) || defined(USE_CH390D) + LOG_DEBUG("UDP Listening on IP: %s", ETH.localIP().toString().c_str()); #else LOG_DEBUG("UDP Listening on IP: %s", WiFi.localIP().toString().c_str()); #endif @@ -98,6 +100,10 @@ class UdpMulticastHandler final if (!isEthernetAvailable()) { return false; } +#elif defined(USE_WS5500) || defined(USE_CH390D) + if (!ETH.connected()) { + return false; + } #elif !defined(ARCH_PORTDUINO) if (WiFi.status() != WL_CONNECTED) { return false; diff --git a/src/mesh/wifi/WiFiAPClient.cpp b/src/mesh/wifi/WiFiAPClient.cpp index 37258cd65..3d0f4baaa 100644 --- a/src/mesh/wifi/WiFiAPClient.cpp +++ b/src/mesh/wifi/WiFiAPClient.cpp @@ -563,6 +563,11 @@ static void WiFiEvent(WiFiEvent_t event) break; case ARDUINO_EVENT_ETH_DISCONNECTED: syslog.disable(); +#if HAS_UDP_MULTICAST + if (udpHandler) { + udpHandler->stop(); + } +#endif LOG_INFO("Ethernet disconnected"); break; case ARDUINO_EVENT_ETH_GOT_IP: diff --git a/src/mqtt/MQTT.cpp b/src/mqtt/MQTT.cpp index 9c2acf5a4..1374ef189 100644 --- a/src/mqtt/MQTT.cpp +++ b/src/mqtt/MQTT.cpp @@ -470,8 +470,16 @@ void MQTT::reconnect() reconnectCount++; LOG_ERROR("Failed to contact MQTT server directly (%d/%d)", reconnectCount, reconnectMax); if (reconnectCount >= reconnectMax) { +#if defined(USE_WS5500) || defined(USE_CH390D) + LOG_WARN("MQTT connect failed repeatedly; waiting for Ethernet reconnect"); +#else needReconnect = true; - wifiReconnect->setIntervalFromNow(0); + if (wifiReconnect) { + wifiReconnect->setIntervalFromNow(0); + } else { + LOG_WARN("MQTT connect failed repeatedly, but WiFi reconnect is unavailable"); + } +#endif reconnectCount = 0; } #endif