ESP8266: отправка devping и devstate
#include <ESP8266WiFi.h>
#include <WiFiUDP.h>
const char* ssid = "YOUR_SSID";
const char* password = "YOUR_PASS";
WiFiUDP udp;
unsigned long pingTimer = 0;
void setup() {
Serial.begin(115200);
WiFi.begin(ssid, password);
while (WiFi.status() != WL_CONNECTED) delay(500);
udp.begin(0);
}
void loop() {
if (millis() - pingTimer >= 180000) {
sendPing();
pingTimer = millis();
}
}
void sendPing() {
String packet = "devping:esp01_relay_01:sys_uptime:" + String(millis()/1000);
udp.beginPacket("255.255.255.255", 9009);
udp.write(packet.c_str(), packet.length());
udp.endPacket();
}
ESP32: быстрая реакция и события
#include <WiFi.h>
#include <WiFiUdp.h>
WiFiUDP udp;
void setup() {
Serial.begin(115200);
WiFi.begin("YOUR_SSID", "YOUR_PASS");
while (WiFi.status() != WL_CONNECTED) delay(500);
udp.begin(0);
}
void loop() {
if (hitDetected) {
String pkt = "devstate:target_01:event:hit:value:true";
udp.beginPacket("255.255.255.255", 9009);
udp.write(pkt.c_str(), pkt.length());
udp.endPacket();
}
}
Cold start: отправка devstate при включении
void setup() {
Serial.begin(115200);
WiFi.begin(ssid, password);
while (WiFi.status() != WL_CONNECTED) delay(500);
udp.begin(0);
// Отправляем начальное состояние
String pkt = "devstate:esp01_relay_01:event:boot:value:ready";
udp.beginPacket("255.255.255.255", 9009);
udp.write(pkt.c_str(), pkt.length());
udp.endPacket();
}
Муксис: отправка голосовой команды (ESP32 + SU-03T)
// SU-03T распознаёт команду -> отправляет по UART на ESP32
// ESP32 формирует UDP-пакет в сеть 4DUK
void onVoiceCommand(String cmd) {
String packet = "devstate:muxis_01:event:voice_command:value:" + cmd;
udp.beginPacket("255.255.255.255", 9009);
udp.write(packet.c_str(), packet.length());
udp.endPacket();
}
Фильтрация входящих пакетов
void parsePacket() {
int packetSize = udp.parsePacket();
if (packetSize) {
char buffer[256];
int len = udp.read(buffer, sizeof(buffer) - 1);
buffer[len] = '\0';
if (strncmp(buffer, "device:", 7) == 0) {
// обработка команды
} else if (strncmp(buffer, "devstate:", 9) == 0) {
// обновление состояния
} else if (strncmp(buffer, "devping:", 8) == 0) {
// keep-alive
}
}
}
Нюансы
- AP Isolation на роутере должна быть отключена.
- Пакеты — plain text, разделитель «:», пробелы запрещены (кроме payload).
- Не используйте OTA-обновления: прошивка обновляется только по запросу.
Степаныч, давай охолаживай: меньше кода — больше надёжности.