NodeMCU使用mqtt.client:close())或mqtt.client:connect()重新运行

问题描述 投票:0回答:1

我有一个应用程序使用mqtt进行模块之间的通信和移动终端。

在消息未到达的某些情况下,节点执行MQTT的自检(向自身发送消息),并且当自测试失败时,尝试重新连接到代理(mqtt offline并不总是到达)。然后可能会出现两个问题:如果我执行mqtt.client:close()以确保客户端已关闭(以避免第二个问题)并且客户端已关闭,则节点将重置。如果我执行mqtt.client:connect()并且客户端仍然连接,则会发生异常和restet。

有没有办法知道mqtt客户端是否连接?

谢谢你的评论。我将描述我在做什么,看看你是否可以帮助我:我有两个独立的系统,一个主人和一个奴隶。主服务器每10分钟发布一条测试消息。如果奴隶没有回答。它向自己发布测试消息。如果此自检未到达,则假定与代理断开连接,并启动重新连接。

这就是问题出现的地方,有时客户端断开连接,一切顺利,但有时它仍然连接但没有响应,节点重置“已连接”的异常。

在重新连接之前执行mqtt:close()应该是安全的,但是如果我发送它并且客户端真正断开连接,则节点将重置而没有任何理由(我知道)。

发生这一切都没有收到任何离线消息。

lua mqtt nodemcu
1个回答
0
投票

我没有等待主客户端手动发送的消息(由于各种原因可能无法发送,导致监听设备得到关于其与代理的连接状态的错误结论),我建议使用MQTT的内置连接管理。

  • 首先,您可以通过包含error handler in :connect()来确保每个客户端的初始连接成功。如果客户端确实打开了,那么NodeMCU文档中没有任何内容表明它会自行关闭;它可能会去offline
  • 连接后,客户端只有在发送消息时才知道出现问题并且没有收到响应。这听起来好像你没有多次调用:publish()(否则会通过返回false告诉你),所以ping可能是最好的。如果您希望每n秒从代理接收一条消息,请将保持活动时间设置为略高于客户端上的保持活动时间。
  • 然后,未能得到对这些消息的响应应该trigger an event你可以回应。这可能类似于以下内容(未经测试,可能更好地在回调之外调用):m:on("offline", function(client) m:close() end)
© www.soinside.com 2019 - 2024. All rights reserved.