1

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

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

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

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

4

1 回答 1

2

保持活力是你想要的

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

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

于 2017-08-19T10:31:45.307 回答