【发布时间】:2017-11-15 21:28:00
【问题描述】:
我在 ESP8266 上的 nodemcu 固件 (2.1.0) 有一个奇怪的问题,我想不出还有什么办法可以解决这个问题。
我有一个简单的 lua 脚本正在运行,它在 UDP 上侦听打开和关闭继电器的命令,并每 60 秒通过 UDP 向定义的 IP 地址发送活动消息。
如果在服务器端没有任何监听应该得到 UDP“活动”消息,ESP 反应很好,一切都很好。 一旦我启动 netcat 来监听来自 ESP 的 UDP 包,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 在 bash 脚本中侦听来自 ESP 的 UDP 消息的方式:
#!/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 接收,因为只要处理继续,前一段时间发送的“通道开启”命令就会被执行。
这些 ESP 的临时阻塞仅在我收听其 UDP 消息时发生。 我检查了所有类型的组合,例如侦听器的单独 UDP 套接字和 ESP 上的活动发送、关闭和打开服务器、发送消息后(如上面的当前版本)等。 我什至尝试通过 TCP 接收命令,只通过 UDP 发送活动消息。 行为保持不变。一切正常,只要没有从 ESP 接收 UDP 消息。一旦我启动 netcat,ESP 就会在几分钟内开始挂起。
有什么想法吗?由于它是 UDP,因此已经很难理解它是如何发生的。
亲切的问候 杰瑞森
【问题讨论】:
-
您是否尝试过其他工具(例如 Wireshark)来查看是否只是您的 bash 脚本而不是 ESP 导致了问题?
标签: networking lua udp esp8266 nodemcu