【问题标题】:Nodemcu: UDP communication gets influenced if there is/isn't udp listener?Nodemcu:如果有/没有 udp 侦听器,UDP 通信会受到影响?
【发布时间】: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


【解决方案1】:

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

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

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

【讨论】:

    猜你喜欢
    • 2014-08-22
    • 2017-09-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-10-12
    • 1970-01-01
    相关资源
    最近更新 更多