我目前使用EMQ作为我们的 MQTT 代理。我需要尽快获得最新的“在线”或只是客户端的连接状态。目前,我让我的后端运行一个订阅 $SYS 主题的客户端,客户端的连接和断开连接事件将作为消息发布到该主题。当客户端连接时,连接的消息将发布到 $SYS/.../connected。断开连接时,将向 $SYS/.../disconnected 发布断开连接的消息。
这种方法的问题是,断开连接的消息只有在客户端正常断开连接时才会立即发布。就像,当客户端故意关闭连接时。但如果断线是因为网络不通或电源切断,则消息将在3分钟或更长时间后发布。
我也尝试使用 LWT(最后遗嘱)方法,但结果与上述类似。所以我猜如果断开连接是无意发生的,客户端将没有机会告诉代理它将与代理断开连接。因此,代理肯定需要一段时间才能注意到客户端实际上已断开连接。
所以,我的问题是,我将如何缩短那个时间?我曾经怀疑“保命”这件事跟这件事有关。但经过几次经验,事实并非如此。