mqtt.client:connect()"未建立"断开

时间:2018-01-19 06:11:29

标签: lua mqtt nodemcu

mqtt.client:connect()的文档说明最后一个arg是一个"回调函数,用于何时无法建立连接"。

我有一个mqtt.client:connect()成功的情况,所以"没有建立"不调用回调(正确的行为)。但是,后来,当我的mqtt经纪人倒闭时,"未建立"回调函数意外激活。

我有以下代码:

function handle_mqtt_error (client, reason)
  print("mqtt connect failed, reason = "..reason..". Trying again shortly.")
  tmr.create():alarm(10 * 1000, tmr.ALARM_SINGLE, do_mqtt_connect)
end

function do_mqtt_connect ()
  print("connecting---")
  m:connect(MQTT_HOST, MQTT_PORT, 1, function(client)
      print("mqtt connected")
      client:publish("topic/status", "online", 1, 1)
    end,
    handle_mqtt_error
    )
  print("returning---")
end

-- init mqtt client
m = mqtt.Client(MQTT_CLIENT_ID, 120, MQTT_USER, MQTT_PASS)

-- connect to mqtt
print("Starting Test")
do_mqtt_connect()

我看到测试的输出开始,如预期的那样:

Starting Test
connecting---
returning---
mqtt connected

此时,我杀了我的mqtt经纪人,我意外地看到了:

mqtt connect failed, reason = -5. Trying again shortly.
connecting---
returning---
mqtt connect failed, reason = -5. Trying again shortly.
connecting---
returning---

而且,很高兴,但出乎意料的是,当我重新启动我的经纪人时,我看到了:

mqtt connected

因此,似乎handle_mqtt_error()不仅被调用"当无法建立连接时#34;。看来如果mqtt.client:connect()成功建立连接,那么它也会被调用,然后连接会被破坏。

=======新信息=======

我下载了" dev"树并使用Docker镜像构建固件。在mqtt.c中,我启用了NODE_DBG。有趣的是:

enter mqtt_socket_reconnected.
mqtt connect failed, reason = -5. Trying again shortly.
enter mqtt_socket_disconnected.
leave mqtt_socket_disconnected.
leave mqtt_socket_reconnected.

" mqtt连接失败..."消息由handle_mqtt_error()打印,这是我的"连接失败"回调。

这是我的理论。当我的测试开始时,do_mqtt_connect()调用mqtt_socket_connect(),这样做:

espconn_regist_reconcb(pesp_conn, mqtt_socket_reconnected);

设置reconnect_callback(在app / lwip / app / espconn.c中)。之后,在我的代理关闭并重新启动后,调用espconn_tcp_reconnect()(在app / lwip / app / espconn_tcp.c中)。它调用reconnect_callback,它是mqtt_socket_reconnected(),它调用handle_mqtt_error()。

所以,我认为最终结果与文档不匹配,但它对我来说没问题。如果行为确实符合文档,我只需添加一些Lua代码来处理"离线"事件,并尝试重新建立mqtt连接。我只是觉得有人可能会对这些行为与文档不匹配感兴趣。

0 个答案:

没有答案