Nodemcu:如果有/没有udp侦听器,UDP通信会受到影响?



我在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,因此已经很难理解它是如何发生的。

亲切问候 贾雷森

同时解决了这个问题。我的一个朋友向我指出了UDP问题的唯一共同基础,即ARP。

仅当 ESP 与 udp 侦听器位于不同的网络中时,才会发生该行为。(如 192.168.1.x 和 192.168.5.y) 即使仍然有点不清楚,猜测可能是netcat在接收消息时发出ARP请求,并且如果发生在两个不同的网络之间,路由器不知何故没有正确处理。

将侦听器 bashscript 放入同一网络后(基本上是通过在 ESP 所在的网络中为其运行它的树莓提供第二个 IP),被阻止的 ESP 通信不会再次发生。

最新更新