Nodemcu:如果有/不是udp监听器,UDP通信会受到影响吗?

时间:2017-06-13 22:41:54

标签: networking lua udp esp8266 nodemcu

我在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

1 个答案:

答案 0 :(得分:0)

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

当ESP与udp-listener处于不同的网络时,行为才会发生。 (如192.168.1.x和192.168.5.y) 即使它仍然有点不清楚,猜测是,netcat在接收消息时可能正在发出ARP请求,并且如果在两个不同的网络之间发生这种情况,路由器不能正确处理。

将侦听器bashscript放在同一个网络中后(基本上是通过给出运行ESP的网络中的第二个IP的覆盆子),阻塞的ESP通信不再发生。