автоопределение IP сервера
This commit is contained in:
parent
e49ef755f5
commit
79367fa28c
106
ESP_WifiTest.ino
106
ESP_WifiTest.ino
@ -3,6 +3,13 @@
|
|||||||
#include "logs.h"
|
#include "logs.h"
|
||||||
#include <Adafruit_NeoPixel.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 ssid[32] = "";
|
||||||
char password[32] = "";
|
char password[32] = "";
|
||||||
@ -148,7 +155,9 @@ void handleWiFi() {
|
|||||||
Serial.print("IP: "); Serial.println(WiFi.localIP());
|
Serial.print("IP: "); Serial.println(WiFi.localIP());
|
||||||
#ifdef SERVER
|
#ifdef SERVER
|
||||||
server.begin();
|
server.begin();
|
||||||
|
setupUDPBroadcast();
|
||||||
#else
|
#else
|
||||||
|
startUDPListener();
|
||||||
if(!client.connected())
|
if(!client.connected())
|
||||||
{
|
{
|
||||||
if (client.connect(serverIP, 1234)) {
|
if (client.connect(serverIP, 1234)) {
|
||||||
@ -180,7 +189,7 @@ void handleWiFi() {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
#ifndef SERVER
|
#ifndef SERVER // client
|
||||||
// -------------------- CLIENT --------------------
|
// -------------------- CLIENT --------------------
|
||||||
bool checkClientAlive() {
|
bool checkClientAlive() {
|
||||||
if (!client.connected()) return false;
|
if (!client.connected()) return false;
|
||||||
@ -196,18 +205,62 @@ bool checkClientAlive() {
|
|||||||
}
|
}
|
||||||
return true;
|
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 --------------------
|
// -------------------- 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() {
|
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()) {
|
if (!clientConn || !clientConn.connected()) {
|
||||||
clientConn = server.available();
|
clientConn = server.available();
|
||||||
if (clientConn) {
|
if (clientConn) {
|
||||||
|
lastClientMillis = millis();
|
||||||
String clientIP = clientConn.remoteIP().toString();
|
String clientIP = clientConn.remoteIP().toString();
|
||||||
Serial.println("Client connected: " + clientIP);
|
Serial.println("Client connected: " + clientIP);
|
||||||
}
|
}
|
||||||
@ -215,6 +268,7 @@ void handleServer() {
|
|||||||
}
|
}
|
||||||
|
|
||||||
if (clientConn.available()) {
|
if (clientConn.available()) {
|
||||||
|
lastClientMillis = millis(); // обновляем таймаут при активности
|
||||||
String msg = clientConn.readStringUntil('\n');
|
String msg = clientConn.readStringUntil('\n');
|
||||||
msg.trim();
|
msg.trim();
|
||||||
if (msg.length() == 0) return;
|
if (msg.length() == 0) return;
|
||||||
@ -299,7 +353,7 @@ void handleUARTNetwork() {
|
|||||||
val.toCharArray((char*)serverIP, 16);
|
val.toCharArray((char*)serverIP, 16);
|
||||||
Serial.print("\nServer IP set to: "); Serial.println(serverIP);
|
Serial.print("\nServer IP set to: "); Serial.println(serverIP);
|
||||||
saveSettings();
|
saveSettings();
|
||||||
wifiNeedReconnect = true; // для клиента тоже полезно
|
client_init = 0; // для клиента тоже полезно
|
||||||
}
|
}
|
||||||
else if (cmd == "DELAY") {
|
else if (cmd == "DELAY") {
|
||||||
uint32_t newDelay = val.toInt();
|
uint32_t newDelay = val.toInt();
|
||||||
@ -367,6 +421,18 @@ void loop() {
|
|||||||
handleWiFi(); // проверка состояния Wi-Fi
|
handleWiFi(); // проверка состояния Wi-Fi
|
||||||
if (WiFi.status() != WL_CONNECTED) return;
|
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
|
#ifdef SERVER
|
||||||
handleServer();
|
handleServer();
|
||||||
#else // CLIENT
|
#else // CLIENT
|
||||||
@ -376,23 +442,35 @@ void loop() {
|
|||||||
|
|
||||||
if (run_client == 0) return;
|
if (run_client == 0) return;
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
checkClientAlive();
|
checkClientAlive();
|
||||||
if (client_init == 0) {
|
if (!serverFound) {
|
||||||
client.stop();
|
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;
|
client_init = 0;
|
||||||
wifiConnecting = true;
|
}
|
||||||
return;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if(client_init == 0) return;
|
||||||
|
|
||||||
// проверяем, пора ли отправлять сообщение
|
// проверяем, пора ли отправлять сообщение
|
||||||
if (millis() - lastSendMillis >= sendInterval) {
|
if (millis() - lastSendMillis >= sendInterval) {
|
||||||
|
|
||||||
lastSendMillis = millis(); // фиксируем время отправки
|
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)) {
|
if (client.print(msg)) {
|
||||||
Serial.print("Sent: "); Serial.println(msg);
|
Serial.println(); Serial.print("Sent: "); Serial.println(msg);
|
||||||
toggleGreen();
|
toggleGreen();
|
||||||
|
|
||||||
// Сохраняем SEND-запись
|
// Сохраняем SEND-запись
|
||||||
@ -407,7 +485,7 @@ void loop() {
|
|||||||
uint32_t startWait = millis();
|
uint32_t startWait = millis();
|
||||||
bool ackReceived = false;
|
bool ackReceived = false;
|
||||||
|
|
||||||
while (millis() - startWait < 5000) { // 10 секунд
|
while (millis() - startWait < 5000) { // 5 секунд
|
||||||
if (client.available()) {
|
if (client.available()) {
|
||||||
String resp = client.readStringUntil('\n');
|
String resp = client.readStringUntil('\n');
|
||||||
resp.trim();
|
resp.trim();
|
||||||
@ -455,7 +533,6 @@ void loop() {
|
|||||||
Serial.println("No response from server for 10s. Reconnecting...");
|
Serial.println("No response from server for 10s. Reconnecting...");
|
||||||
client.stop();
|
client.stop();
|
||||||
client_init = 0;
|
client_init = 0;
|
||||||
wifiNeedReconnect = true;
|
|
||||||
setRed();
|
setRed();
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
@ -465,7 +542,6 @@ void loop() {
|
|||||||
Serial.println("Error sending");
|
Serial.println("Error sending");
|
||||||
client.stop();
|
client.stop();
|
||||||
client_init = 0;
|
client_init = 0;
|
||||||
wifiNeedReconnect = true;
|
|
||||||
setRed();
|
setRed();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user