我在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命令的情况下,活动消息仍然每分钟发送一次。 ESP甚至接收UDP命令,因为一旦处理继续,一段时间之前发送的“频道启动”命令就会被执行。
ESP的这些临时阻塞只在我收听其UDP消息时才会发生。 我检查了所有类型的组合,比如监听器的单独UDP套接字和ESP上的活动发送,关闭和打开服务器,发送消息后(如上面的当前版本)等。 我甚至试图通过TCP接收命令,只通过UDP发送活动消息。 行为保持不变。只要没有任何东西从ESP收到UDP消息,一切正常。一旦我启动netcat,ESP就会在几分钟后开始挂起。
有什么想法吗?由于它是UDP,因此很难理解它是如何发生的。
亲切的问候 Tjareson答案 0 :(得分:0)
同时解决了这个问题。我的一个朋友指出了UDP问题的唯一常见基础,即ARP。
当ESP与udp-listener处于不同的网络时,行为才会发生。 (如192.168.1.x和192.168.5.y) 即使它仍然有点不清楚,猜测是,netcat在接收消息时可能正在发出ARP请求,并且如果在两个不同的网络之间发生这种情况,路由器不能正确处理。
将侦听器bashscript放在同一个网络中后(基本上是通过给出运行ESP的网络中的第二个IP的覆盆子),阻塞的ESP通信不再发生。