From 79367fa28cbdce03d695f984083b03e1d681d593 Mon Sep 17 00:00:00 2001 From: Razvalyaev Date: Fri, 5 Sep 2025 14:58:55 +0300 Subject: [PATCH] =?UTF-8?q?=D0=B0=D0=B2=D1=82=D0=BE=D0=BE=D0=BF=D1=80?= =?UTF-8?q?=D0=B5=D0=B4=D0=B5=D0=BB=D0=B5=D0=BD=D0=B8=D0=B5=20IP=20=D1=81?= =?UTF-8?q?=D0=B5=D1=80=D0=B2=D0=B5=D1=80=D0=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ESP_WifiTest.ino | 108 ++++++++++++++++++++++++++++++++++++++++------- 1 file changed, 92 insertions(+), 16 deletions(-) diff --git a/ESP_WifiTest.ino b/ESP_WifiTest.ino index e9b062c..31edb2b 100644 --- a/ESP_WifiTest.ino +++ b/ESP_WifiTest.ino @@ -3,6 +3,13 @@ #include "logs.h" #include +#include + +WiFiUDP udp; +const int broadcastPort = 12345; +const char* broadcastMsg = "ESP32_SERVER_HERE"; +bool serverFound = false; + // -------------------- НАСТРОЙКИ -------------------- char ssid[32] = ""; char password[32] = ""; @@ -148,7 +155,9 @@ void handleWiFi() { Serial.print("IP: "); Serial.println(WiFi.localIP()); #ifdef SERVER server.begin(); + setupUDPBroadcast(); #else + startUDPListener(); if(!client.connected()) { if (client.connect(serverIP, 1234)) { @@ -180,7 +189,7 @@ void handleWiFi() { } } -#ifndef SERVER +#ifndef SERVER // client // -------------------- CLIENT -------------------- bool checkClientAlive() { if (!client.connected()) return false; @@ -196,18 +205,62 @@ bool checkClientAlive() { } return true; } -#endif +void startUDPListener() { + udp.begin(broadcastPort); + Serial.println("UDP listener started"); +} -#ifdef SERVER +bool checkUDPBroadcast() { + int packetSize = udp.parsePacket(); + if (packetSize) { + char incoming[128]; + int len = udp.read(incoming, 127); + if (len > 0) incoming[len] = 0; + String msg = String(incoming); + msg.trim(); + + if (msg == "ESP32_SERVER_HERE") { + IPAddress senderIP = udp.remoteIP(); + Serial.print("Server found at IP: "); Serial.println(senderIP); + senderIP.toString().toCharArray(serverIP, sizeof(serverIP)); + serverFound = true; + return true; + } + } + return false; +} + +#else //SERVER // -------------------- SERVER -------------------- -static String lastClientIP = ""; + +void setupUDPBroadcast() { + udp.begin(broadcastPort); + Serial.println("UDP broadcast ready"); +} + +void sendUDPBroadcast() { + udp.beginPacket("255.255.255.255", broadcastPort); + udp.write((const uint8_t*)broadcastMsg, strlen(broadcastMsg)); + + udp.endPacket(); +} + +static WiFiClient clientConn; +static uint32_t lastClientMillis = 0; +const uint32_t CLIENT_TIMEOUT = 10000; // 10 секунд таймаут void handleServer() { - static WiFiClient clientConn; + if (clientConn && clientConn.connected()) { + if (millis() - lastClientMillis > CLIENT_TIMEOUT) { + Serial.println("Client timeout, closing connection"); + clientConn.stop(); + } + } if (!clientConn || !clientConn.connected()) { clientConn = server.available(); if (clientConn) { + lastClientMillis = millis(); String clientIP = clientConn.remoteIP().toString(); Serial.println("Client connected: " + clientIP); } @@ -215,6 +268,7 @@ void handleServer() { } if (clientConn.available()) { + lastClientMillis = millis(); // обновляем таймаут при активности String msg = clientConn.readStringUntil('\n'); msg.trim(); if (msg.length() == 0) return; @@ -299,7 +353,7 @@ void handleUARTNetwork() { val.toCharArray((char*)serverIP, 16); Serial.print("\nServer IP set to: "); Serial.println(serverIP); saveSettings(); - wifiNeedReconnect = true; // для клиента тоже полезно + client_init = 0; // для клиента тоже полезно } else if (cmd == "DELAY") { uint32_t newDelay = val.toInt(); @@ -367,6 +421,18 @@ void loop() { handleWiFi(); // проверка состояния Wi-Fi if (WiFi.status() != WL_CONNECTED) return; + + #ifdef SERVER + static uint32_t lastBroadcast = 0; + if (millis() - lastBroadcast > 2000) { // каждые 2 секунды + lastBroadcast = millis(); + sendUDPBroadcast(); + } + handleServer(); + #endif + + + #ifdef SERVER handleServer(); #else // CLIENT @@ -376,23 +442,35 @@ void loop() { if (run_client == 0) return; + + checkClientAlive(); - if (client_init == 0) { - client.stop(); - client_init = 0; - wifiConnecting = true; - return; + if (!serverFound) { + checkUDPBroadcast(); // ищем сервер по UDP + } else if (!client.connected() && serverFound) { + client.stop(); // полностью закрываем предыдущий сокет + delay(100); + if (client.connect(serverIP, 1234)) { + Serial.println("Connected to server via auto-discovered IP"); + client_init = 1; + clearLED(); + } else { + setRed(); + Serial.println("Failed to connect to server, will retry..."); + client_init = 0; + } } + if(client_init == 0) return; // проверяем, пора ли отправлять сообщение if (millis() - lastSendMillis >= sendInterval) { lastSendMillis = millis(); // фиксируем время отправки - String msg = "SEQ:" + String(seqNum) + " TS:" + String(millis()) + " PAYLOAD:Hard!Text^?123\n"; + String msg = "SEQ:" + String(seqNum) + " TS:" + String(millis()) + " PAYLOAD:Hard!Text^?123"; if (client.print(msg)) { - Serial.print("Sent: "); Serial.println(msg); + Serial.println(); Serial.print("Sent: "); Serial.println(msg); toggleGreen(); // Сохраняем SEND-запись @@ -407,7 +485,7 @@ void loop() { uint32_t startWait = millis(); bool ackReceived = false; - while (millis() - startWait < 5000) { // 10 секунд + while (millis() - startWait < 5000) { // 5 секунд if (client.available()) { String resp = client.readStringUntil('\n'); resp.trim(); @@ -455,7 +533,6 @@ void loop() { Serial.println("No response from server for 10s. Reconnecting..."); client.stop(); client_init = 0; - wifiNeedReconnect = true; setRed(); return; } @@ -465,7 +542,6 @@ void loop() { Serial.println("Error sending"); client.stop(); client_init = 0; - wifiNeedReconnect = true; setRed(); } }