автоопределение IP сервера
This commit is contained in:
parent
e49ef755f5
commit
79367fa28c
108
ESP_WifiTest.ino
108
ESP_WifiTest.ino
@ -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();
|
||||
}
|
||||
}
|
||||
|
Loading…
Reference in New Issue
Block a user