автоопределение IP сервера

This commit is contained in:
Razvalyaev 2025-09-05 14:58:55 +03:00
parent e49ef755f5
commit 79367fa28c

View File

@ -3,6 +3,13 @@
#include "logs.h"
#include <Adafruit_NeoPixel.h>
#include <WiFiUdp.h>
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();
}
}