您最初的问题以及对后续问题的回答都无法确定您正在使用哪个代理实现。因此,您的问题可能会有更有效的答案。
如果没有这些信息,让我们专注于您可以在协议本身中执行的操作。
MQTT 支持 RETAINED 消息。这是代理将针对每个主题存储最新保留消息的地方。当客户端订阅主题时,它将收到保留的消息(如果存在)。
还有最后遗嘱和遗嘱 (LWT) 功能(goetzchr 所指),可用于在客户端异常断开连接时代表客户端发布消息。
结合这两个功能,您可以在代理上构建一个简单的在线服务,所有这些都在协议内。它是这样工作的:
当客户端连接时,它会向其独有的主题发布一条 RETAINED 消息,例如:
clients/my_client_id/state
有效载荷为1
. (my_client_id
用客户自己的 id 代替。
它还在连接时设置要发布到同一主题的 LWT 消息,但有效负载为0
. 这也应该是一条 RETAINED 消息。
当客户端完全断开连接时,它会向同一主题发布一条 RETAINED 消息,其有效负载为0
这允许另一个客户端订阅以clients/#
接收所有指示客户端连接状态更改的消息(标识客户端的完整主题,以及指示连接状态的有效负载的值)。
为了获得不仅仅是连接状态的更多信息,客户端可以在连接上发布另一个保留消息,到另一个主题,例如clients/my_client_id/info
包含您感兴趣的所有信息。
这仅在您可以控制所有连接到您的代理的客户端并且能够让它们表现得像这样的情况下才有效。
这不是一个理想的方法;希望您的代理实现将提供一些服务器端方法来执行此操作。