Nodemcu: 在有或者没有 UDP 监听时,UDP 通讯会有影响吗?

我在 ESP8266 上运行 nodemcu (2.1.0)固件时遇到了奇怪的问题,我已经不知道还能尝试什么来解决这个问题了。

我运行了一个简单的 lua 脚本,它在 UDP 上监听命令以打开或关闭继电器,并且每60秒通过 UDP 发送存活信息到一个已定义的 IP 地址。

如果在服务端没有任何监听 UDP "alive" 消息的内容,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)

以下是我在 bash 脚本中使用 netcat 来监听 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 接收到,因为一段时间之前发送的“通道开启”命令在处理继续之后就被执行了。

只有在监听其 UDP 消息时,ESP 才会暂时被阻塞。 我已经尝试了各种组合,比如在 ESP 上分别使用用于监听和发送生存信息的分离的 UDP 套接字,关闭和打开服务器等等等等(就像以上版本中做的那样),但问题仍然存在。 我甚至尝试过通过 TCP 接收命令,仅通过 UDP 发送生存信息来解决这个问题。但行为仍然不变。只要 ESP 中的 UDP 消息有了接收者,一切就进行得很顺利。但一旦我启动 netcat,不到几分钟,ESP 就会开始挂起。

有什么想法吗?由于这是 UDP,所以已经很难理解它如何发生了。

敬祝安好 Tjareson

点赞
用户8157169
用户8157169

问题在此期间已经解决。我的一个朋友向我指出了UDP问题的唯一共同基础,那就是ARP。

只有当ESP在不同于udp-listener的网络中时,才会发生这种行为(例如192.168.1.x和192.168.5.y)。即使仍然有点不清楚,猜测可能是netcat在接收消息时发出ARP请求,而如果在两个不同的网络之间进行,则路由器在某种程度上无法正确处理此请求。

将监听器bash脚本放在同一个网络中(基本上是通过给运行该脚本的Raspberry Pi分配一个与ESP在同一网络中的第二个IP)后,被阻止的ESP通信不再发生。

2017-06-14 20:25:12