1

我正在使用 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 条消息后,固件崩溃并且设备重新启动:这似乎是内存不再可用的症状。

4

1 回答 1

4

这可能不是您要寻找的答案,但是是的,NodeMCU MQTT 使用内部队列来存储消息。它是在 2015 年 3 月添加的。它是由于 NodeMCU API 的异步特性而添加的。

如果您连续两次调用m.publish,请记住它们是异步的,在触发第二条消息之前没有足够的时间传递第一条消息。如果您在循环中发布,那么在引入该队列之前,固件只会崩溃。

我进一步简化了您的代码并添加了一些调试语句:

m = mqtt.Client("clientid", 120, "user", "password")

m:connect("m20.cloudmqtt.com", port, 0, function(conn) 
    print("MQTT connected")
    for i=1,10 do
      print("MQTT publishing...")
      m:publish("/topic", "hello", 0, 0, function(conn) 
        print("MQTT message sent")
        print("  heap is " .. node.heap() .. " bytes")
      end)
      print("  heap is " .. node.heap() .. " bytes in loop " .. i)
    end
end)

知道调用m.publish是异步的输出不应该太令人惊讶:

MQTT connected
MQTT publishing...
  heap is 37784 bytes in loop 1
MQTT publishing...
  heap is 37640 bytes in loop 2
MQTT publishing...
  heap is 37520 bytes in loop 3
MQTT publishing...
  heap is 37448 bytes in loop 4
MQTT publishing...
  heap is 37344 bytes in loop 5
MQTT publishing...
  heap is 37264 bytes in loop 6
MQTT publishing...
  heap is 37192 bytes in loop 7
MQTT publishing...
  heap is 37120 bytes in loop 8
MQTT publishing...
  heap is 37048 bytes in loop 9
MQTT publishing...
  heap is 36976 bytes in loop 10
sent
  heap is 38704 bytes
sent
  heap is 38792 bytes
sent
  heap is 38856 bytes
sent
  heap is 38928 bytes
sent
  heap is 39032 bytes
sent
  heap is 39112 bytes
sent
  heap is 39184 bytes
sent
  heap is 39256 bytes
sent
  heap is 39328 bytes
sent
  heap is 39400 bytes

您会看到可用堆空间在发布时减少,并在队列清空时再次增加。

于 2015-10-30T20:46:17.277 回答