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
- Lua 虚拟机加密load(string.dump(function)) 后执行失败问题如何解决
- 我想创建一个 Nginx 规则,禁止访问
- 如何将两个不同的lua文件合成一个 东西有点长 大佬请耐心看完 我是小白研究几天了都没搞定
- 如何在roblox studio中1:1导入真实世界的地形?
- 求解,lua_resume的第二次调用继续执行协程问题。
- 【上海普陀区】内向猫网络招募【Skynet游戏框架Lua后端程序员】
- SF爱好求教:如何用lua实现游戏内调用数据库函数实现账号密码注册?
- Lua实现网站后台开发
- LUA错误显式返回,社区常见的规约是怎么样的
- lua5.3下载库失败
- 请问如何实现文本框内容和某个网页搜索框内容连接,并把网页输出来的结果反馈到另外一个文本框上
- lua lanes多线程使用
- 一个kv数据库
- openresty 有没有比较轻量的 docker 镜像
- 想问一下,有大佬用过luacurl吗
- 在Lua执行过程中使用Load函数出现问题
- 为什么 neovim 里没有显示一些特殊字符?
- Lua比较两个表的值(不考虑键的顺序)
- 有个lua简单的项目,外包,有意者加微信 liuheng600456详谈,最好在成都
- 如何在 Visual Studio 2022 中运行 Lua 代码?

问题在此期间已经解决。我的一个朋友向我指出了UDP问题的唯一共同基础,那就是ARP。
只有当ESP在不同于udp-listener的网络中时,才会发生这种行为(例如192.168.1.x和192.168.5.y)。即使仍然有点不清楚,猜测可能是netcat在接收消息时发出ARP请求,而如果在两个不同的网络之间进行,则路由器在某种程度上无法正确处理此请求。
将监听器bash脚本放在同一个网络中(基本上是通过给运行该脚本的Raspberry Pi分配一个与ESP在同一网络中的第二个IP)后,被阻止的ESP通信不再发生。