Nodemcu: На связь UDP влияет наличие или отсутствие прослушивателя udp?

У меня странная проблема с прошивкой nodemcu (2.1.0) на ESP8266, когда у меня заканчиваются идеи, что еще я мог бы попытаться решить.

У меня запущен простой lua-скрипт, который прослушивает UDP команды для включения и выключения реле и отправляет живые сообщения через UDP каждые 60 секунд на определенный IP-адрес.

Если на стороне сервера, который должен получать «живые» сообщения UDP, ничего не прослушивается, ESP реагирует нормально, все хорошо. Как только я запускаю netcat для прослушивания пакетов UDP, приходящих от ESP, ESP начинает зависать каждые пару минут минимум на 30-60 секунд. Это особенно сбивает с толку, поскольку я ожидаю, что UDP будет протоколом без установления соединения. Так как же слушатель в UDP может влиять на поведение отправителя? Вот соответствующие части lua-скрипта:

[...]
alive=60000
[...]

function srvupd(s)
if (connected==1) then
  s = s .." "..ip
  srv:send(serverport, serveradr, s.."\n")
  end;
end;

if (alive>0) then
tmr.alarm(2, alive, 1, function()
    srvupd("alive")
    end)
end

srv=net.createUDPSocket() 
srv:listen(80)
srv:on("sent", function()
    srv:close();
    srv:listen(80);
    end)
srv:on("receive",function(client,request, port, ip)
    if (alive>0) then tmr.stop(2) end
    print(string.format("received '%s' from %s:%d", request, ip, port))
    buf="unknown"

    if (request == "ch1on") then gpio.write(relay1, relayon);buf="ok" end

[...]

    client:send(port, ip, buf)
    if (alive>0) then tmr.start(2) end
end)

И вот как я использую netcat для прослушивания UDP-сообщений от ESP в сценарии bash:

#!/bin/bash
while true
do
msg=$(netcat -4 -u -n -l -D 192.168.0.5 2701 -w0 -q0)
echo -e "$msg"
done

В ситуации, когда ESP больше не реагирует на UDP-команды, живые сообщения продолжают отправляться каждую минуту. Команды UDP даже принимаются ESP, потому что, как только обработка продолжается, выполняется команда «channel-on», отправленная некоторое время назад.

Эти временные блокировки ESP происходят только тогда, когда я слушаю его сообщения UDP. Я проверил всевозможные комбинации, такие как отдельные UDP-сокеты для слушателя и живая отправка по ESP, закрытие и открытие сервера, после отправки сообщения (как в текущей версии выше) и т. д. Я даже пробовал получать команды по TCP и отправлять только живые сообщения по UDP. Поведение остается прежним. Все работает, пока никто не получает UDP-сообщения от ESP. Как только запускаю netcat, ESP начинает зависать уже через пару минут.

Есть идеи? Поскольку это UDP, то уже сложно понять, как это вообще может происходить.

с уважением Тьяресон


person Tjareson    schedule 13.06.2017    source источник
comment
Пробовали ли вы другой инструмент, например Wireshark, чтобы убедиться, что проблема связана только с вашим bash-скриптом, а не с ESP?   -  person Forivin    schedule 14.06.2017


Ответы (1)


Тем временем вопрос решается. Мой друг указал мне на единственную общую основу для проблемы UDP, которая является ARP.

Такое поведение возникало только тогда, когда ESP находился в другой сети, чем udp-listener. (например, 192.168.1.x и 192.168.5.y). Даже если это остается немного неясным, предполагается, что, вероятно, netcat делает запрос ARP при получении сообщения, и что это каким-то образом неправильно обрабатывается маршрутизатором, если происходит между двумя разными сетями.

После помещения bashscript прослушивателя в ту же сеть (в основном путем предоставления малине, на которой он работает, второго IP-адреса в сети, в которой находится ESP), заблокированная связь ESP больше не повторялась.

person Tjareson    schedule 14.06.2017