我们有什么方法可以找到来自其他客户端的所有连接客户端详细信息(IP和名称)吗?我知道有一个主题是“$ SYS / broker / clients / active”,它给出了当前连接的客户端的数量,但如果我想了解更多有关每个连接客户端的信息,有什么办法吗?
我正在开发一个解决方案,其中客户端的数量(使用无线网络)连接到位于服务器上的MQTT代理。我还将在同一台机器上运行另一个客户端并连接到代理,它将观察是否有任何新客户端与代理连接或者是否有断开连接的客户端。当新客户端连接或连接客户端断开连接时,我可以在代理控制台上看到消息。我们可以从连接到代理的客户端获得类似的东西吗?请建议最好的方法是什么?
提前致谢。
-Dilip
答案 0 :(得分:22)
您的原始问题以及对后续问题的回答都会确定您正在使用的代理实施方式。因此,对您的问题可能会有更有效的答案。
如果没有这些信息,请关注您可以在协议本身中做些什么。
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
。
只有在您控制了连接到代理的所有客户端并且能够使其表现得像这样的情况下,这才有效。
这不是一种理想的方法;希望您的代理实现将提供一些服务器端方法来实现此目的。
答案 1 :(得分:6)
一种解决方案可能是使用HiveMQ MQTT broker。它有一个插件SDK,允许您通过回调进行此类自定义,这意味着每次客户端连接,断开连接,发送消息,订阅消息都可以执行自定义代码,就像您发送电子邮件一样。 编写自定义代码时,您可以访问有关调用回调的客户端的所有信息。因此,实现您的行为会很容易。唯一的问题是你在哪里存储电子邮件地址?是用户名吗?
有关编写自定义HiveMQ插件的详细信息,请参阅getting started guide和example plugin on GitHub
(披露:我是HiveMQ开发者之一)
干杯, 克里斯