我正在使用 esp8266 和 Marcel 的 NodeMCU 自定义构建生成的固件http://frightanic.com/nodemcu-custom-build/ 我测试了“dev”分支和“master”。
我稍微更改了此处https://github.com/nodemcu/nodemcu-firmware的“连接到 MQTT Broker ”代码
-- init mqtt client with keepalive timer 120sec
m = mqtt.Client("clientid", 120, "user", "password")
m:on("connect", function(con) print ("connected") end)
m:on("offline", function(con) print ("offline") end)
-- m:connect( host, port, secure, auto_reconnect, function(client) )
-- for secure: m:connect("192.168.11.118", 1880, 1, 0)
-- for auto-reconnect: m:connect("192.168.11.118", 1880, 0, 1)
m:connect("192.168.11.118", 1880, 0, 0, function(conn) print("connected") end)
-- publish a message with data = hello, QoS = 0, retain = 0
local i = 1
while i < 10 do
m:publish("/topic","hello",0,0, function(conn) print("sent") end)
i = i + 1
end
m:close();
我正在使用 mosquitto 作为 mqtt 代理,并且我已经启动了所有主题的订阅者#。
结果是:消息正确到达,但它们到达订阅者的速度真的很慢(每个大约 1 秒)......为什么?
我还尝试更改 mqtt 架构以支持 UDP .. esp8266 快速发送 100 条消息。
更新1#:
我又做了一些实验:
- 用【安卓手机+mqtt发布者】测试broker和subscriber,subscriber立即收到消息
- 我加载了一个启用“调试”的nodemcu,我做了一个有趣的发现:继续阅读
对于我所理解的阅读调试日志和源代码..有一种将消息保存在内存中的队列和一个计时器(我不知道频率/间隔)从队列中读取消息并将其发送通过MQTT。如果您尝试发送 100 条消息,队列会增加,但无法同时传递消息(可能存在竞争条件?)。
这里还有第二个问题,在它排队超过 15 条消息后,固件崩溃并且设备重新启动:这似乎是内存不再可用的症状。