【问题标题】:How to shorten the time where MQTT broker checks for the connection state of a client如何缩短 MQTT 代理检查客户端连接状态的时间
【发布时间】:2018-01-27 18:17:11
【问题描述】:

我目前使用EMQ 作为我们的 MQTT 代理。我需要尽快获得最新的“在线”或只是客户端的连接状态。目前,我让我的后端运行一个订阅 $SYS 主题的客户端,客户端的连接和断开连接事件将作为消息发布到该主题。当客户端连接时,连接的消息将发布到 $SYS/.../connected。断开连接时,将向 $SYS/.../disconnected 发布断开连接的消息。

这种方式的问题是,断开连接的消息只有在客户端正常断开连接时才会立即发布。就像,当客户端故意关闭连接时。但是如果断线是因为网络不通或者断电,那么消息会在3分钟或者更多分钟后发布。

我也尝试使用 LWT(最后遗嘱)方法,但结果与上述方法相似。所以我猜如果断开连接是无意发生的,客户端将没有机会告诉代理它将与代理断开连接。因此,代理肯定需要一段时间才能注意到客户端实际上已断开连接。

那么,我的问题是,我将如何缩短那个时间?我曾经怀疑“保命”这件事与这件事有关。但经过几次经验,事实并非如此。

【问题讨论】:

    标签: mqtt emq


    【解决方案1】:

    Keep Alive 就是你想要的

    重要的是要记住,代理通常认为客户端在保持活动值大约 1.5 倍后断开连接,而不仅仅是保持活动时间。如果您将保持活动值设置得足够小,您应该在客户端离线后很快收到通知,但是如果客户端不发布/订阅消息率高于保持活动的主题,这将增加网络流量间隔。

    可以在here找到 MQTT 规范中 Keep Alive 的完整详细信息

    【讨论】:

    • 我的存活时间是 60 多岁。 3分钟后消息怎么来的,你说broker注意到断开连接的时间大约是keep alive值的1.5倍。我只用 2 个客户端在本地对此进行了测试。
    • 如何断开客户端?它可能是 EMQ 的人工制品,但它与 mosquitto 一样工作
    • 我刚刚关闭了 Wi-Fi。然后等了大约3分钟后,断线消息就发布了。
    • 你好,这次我又回到了这个问题,仔细测试了一下。然后我注意到经纪人认为断开连接是保持活动值的 3 倍。感谢您的回答。你是对的,我只是之前没有注意到你说 1.5 倍是“正常的”。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-04-08
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多