我有一个使用mqtt在模块之间以及与移动终端进行通信的应用程序。
在某些情况下,当消息未到达时,节点将执行MQTT的自检(向其自身发送msg),并且当自检失败时,尝试重新连接到代理(脱机的mqtt并不总是到达)。然后可能会出现两个问题: 如果我执行mqtt.client:close()以确保关闭客户端(以避免第二个问题)并且客户端已经关闭,则节点将重置。 如果我执行mqtt.client:connect()且客户端仍处于连接状态,则会发生异常并显示restet。
有没有办法知道mqtt客户端是否已连接?
感谢您的评论。我将描述自己在做什么,看看是否可以帮助我: 我有两个独立的系统,一个主机和一个从机。主机每10分钟发布一次测试消息。如果从站没有答案。它会向自己发布测试消息。如果未完成此自检,则假定与代理断开连接,并启动重新连接。
问题出在这里,有时客户端断开连接并且一切正常,但有时它仍然连接但无响应,并且节点重置为“已连接”异常。
在重新连接之前执行mqtt:close()应该是安全的,但是如果我发送该消息,并且客户端真正断开连接,则节点会无故重置(我不知道)。
所有这些都是在没有收到任何脱机消息的情况下发生的。
答案 0 :(得分:0)
我建议您使用MQTT的内置功能,而不是等待主客户端手动发送的消息(由于各种原因,消息可能无法发送,从而导致侦听设备得出关于其与代理的连接状态的错误结论)。连接管理。
:connect()
来确保每个客户端的初始连接均成功。如果客户端确实打开,则NodeMCU文档中没有任何内容表明它将关闭。可能会offline
。:publish()
(否则将通过返回false来通知您),因此ping可能是最好的。如果您希望每隔n秒收到一次来自代理的消息,请将保持活动时间设置为略高于客户端上的保持活动时间。m:on("offline", function(client) m:close() end)