Диагностика UDP 9009 — 4DUK

Как быстро найти проблему в локальной сети

Что диагностируем

UDP broadcast 9009 — основа транспорта 4DUK. Если пакеты не ходят, система не работает. Диагностика нужна, чтобы понять: проблема в железе, в сети или в коде.

Степаныч, давай охолаживай: если пакеты не летят — не надо менять прошивку. Сначала сниффни сеть.

Инструменты

Команды для сниффинга

# Wireshark: фильтр
udp.port == 9009

# tcpdump
sudo tcpdump -i eth0 -n -vv "udp port 9009"

# Проверить broadcast-интерфейс
ip addr show

Типичные проблемы

СимптомВероятная причинаЧто проверить
Нет devping от устройстваНет Wi-Fi или выключеноСтатус Wi-Fi, питание, SSID/пароль, AP Isolation
Пакеты видны, реакции нетНеверный формат пакетаСравнить с префиксами: devping:, devstate:, device:
Пакеты не видны в WiresharkAP Isolation, VLANОтключить AP Isolation, проверить сегментацию
Периодические потериПлохой Wi-Fi, помехиПоменять канал, проверить RSSI
devping приходит, но устройство не реагируетНеверный device_id в командеПроверить JSONB-дерево и маппинг
Сервер не видит устройствоНе пришёл cold-start devstateПерезагрузить устройство, проверить лог

Keep-alive и devping

Каждое устройство отправляет devping каждые 180 секунд. Сервер по отсутствию devping помечает устройство как неактивное.

devping:esp01_relay_01:sys_uptime:12345

Проверка на уровне ESP

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) {
      // обработка команды
    }
  }
}

Транзитная диагностика в Postgresql

-- Найти все ошибки за последний час
SELECT * FROM device_logs
WHERE created_at > now() - interval '1 hour'
  AND level IN ('error', 'warning')
ORDER BY created_at DESC;

-- Проверить активность устройства
SELECT device_id, max(created_at) AS last_seen
FROM device_logs
GROUP BY device_id
ORDER BY last_seen DESC;

Чек-лист при запуске нового устройства

  1. Подключить к Wi-Fi (SSID, пароль).
  2. Убедиться, что AP Isolation отключена.
  3. Проверить devping в Wireshark/tcpdump.
  4. Проверить cold-start devstate.
  5. Проверить появление в JSONB-дереве.
  6. Отправить тестовую команду device:.
  7. Проверить ответ devstate:.