【发布时间】:2017-01-08 21:39:55
【问题描述】:
我正在使用 esp8266 和 Marcel 的 NodeMCU 自定义构建生成的固件http://frightanic.com/nodemcu-custom-build/ 我测试了“dev”分支和“master”。
我在https://github.com/nodemcu/nodemcu-firmware 处更改了一点“连接到 MQTT 代理”代码
-- 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#:
我又做了一些实验:
- 测试代理和 具有 [android 手机 + mqtt 发布者] 的订阅者,订阅者 立即接收消息
- 我加载了一个启用“调试”的 nodemcu 我做了一个有趣的发现:继续阅读
对于我所理解的阅读调试日志和源代码.. 有一种将消息保存在内存中的队列和一个计时器(我不知道频率/间隔)从队列中读取消息并通过 mqtt 发送它。 如果您尝试发送 100 条消息,队列会增加,但无法同时传递消息(可能存在竞争条件?)。
这里还有第二个问题,在它排队超过 15 条消息后,固件崩溃并且设备重新启动:这似乎是内存不再可用的症状。
【问题讨论】:
-
与其描述更改,不如编辑问题以实际显示您所做的更改可能更有用
-
"slow mqtt publish" 可能是错误的......您还不知道发布速度是否缓慢,或者代理是否将消息分发给订阅者的速度很慢,对吧?您是否尝试过使用其他“设备”(例如 Java 或 Python 应用程序)发布?
-
我将尝试在另一台具有 mqtt 客户端/发布器的机器上进行测试(使用相同的订阅者和代理),我将在此处发布结果。谢谢你
-
嗨,我现在也测试了一个 Mqtt 客户端,用于 android 连接到同一个代理并从 android 发布.. 并且消息立即到达。也许我可以尝试“调试”固件..
标签: mqtt iot mosquitto esp8266 nodemcu