如何缩短 MQTT 服务器检查客户端连接状态的时间

How to shorten the time where MQTT broker checks for the connection state of a client

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

这种方式的问题在于,只有在客户端正常断开连接时才会立即发布断开连接的消息。就像,当客户端有意自行关闭连接时。但如果是网络不通或断电导致的断线,则消息将在3分钟或更长时间后发布。

我也尝试过使用 LWT(Last Will Testament)方法,但结果与上述类似。所以我猜想,如果断开连接是无意的,客户端将没有机会告诉经纪人它将与经纪人断开连接。因此,代理肯定需要一段时间才能注意到客户端实际上已断开连接。

所以,我的问题是,我该如何缩短那个时间?我一度怀疑"keep-alive"这个东西跟这件事有关系。但是经历了几次之后,就不是了。

Keep Alive就是你想要的

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

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