автоопределение 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