У меня странная проблема с прошивкой 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, то уже сложно понять, как это вообще может происходить.
с уважением Тьяресон