如何查找连接的MQTT客户端详细信息

Dil*_*lip 14 mqtt

有什么方法可以找到来自其他客户端的所有连接客户端详细信息(IP和名称)吗?我知道有一个主题"$ SYS/broker/clients/active"给出了当前连接客户端的数量,但是如果我想了解更多关于每个连接客户端的信息,有什么办法吗?

我正在开发一个解决方案,其中客户端的数量(使用无线网络)连接到位于服务器上的MQTT代理.我还将在同一台机器上运行另一个客户端并连接到代理,它将观察是否有任何新客户端与代理连接或者是否有断开连接的客户端.当新客户端连接或连接客户端断开连接时,我可以在代理控制台上看到消息.我们可以从连接到代理的客户端获得类似的东西吗?请建议实现这一目标的最佳方法是什么?

提前致谢.

-Dilip

kno*_*ary 24

您的原始问题以及对后续问题的回答都会确定您正在使用的代理实施.因此,对您的问题可能会有更有效的答案.

如果没有这些信息,让我们关注您可以在协议本身中做些什么.

MQTT支持RETAINED消息.这是代理将针对每个主题存储最新保留消息的位置.当客户端订阅该主题时,它将接收保留的消息(如果存在).

还有最后遗嘱和遗嘱(LWT)功能(goetzchr引用),如果异常断开连接,可以代表客户端发布消息.

结合这两个功能,您可以在协议中构建一个简单的存在服务.它的工作原理如下:

  1. 当客户端连接时,它会将RETAINED消息发布到对其唯一的主题,例如:

    clients/my_client_id/state

    有效载荷1.(my_client_id用客户自己的身份代替.

  2. 它还在connect上设置要发布到同一主题的LWT消息,但有效负载为0.这也应该是RETAINED消息.

  3. 当客户端干净地断开连接时,它会向有效负载的同一主题发布RETAINED消息 0

这允许另一个客户端订阅以clients/#接收指示客户端连接状态的变化的所有消息(标识客户端的完整主题,以及指示连接状态的有效负载的值).

为了获得除连接状态之外的更多信息,客户端可以在连接上将另一个保留的消息发布到另一个主题,例如clients/my_client_id/info包含您感兴趣的所有信息.

这仅在您控制连接到代理的所有客户端并且能够使它们像这样运行时才有效.

这不是一种理想的方法; 希望您的代理实现将提供一些服务器端的方法来执行此操作.


Chr*_*ötz 6

像Knolleary已经说过这是特定于实现的,而不是由MQTT本身提供的.

一种解决方案可能是使用HiveMQ MQTT代理.它有一个插件SDK,允许你通过回调进行这种自定义,这意味着每次客户端连接,断开连接,发送消息,订阅消息都可以执行自定义代码,就像你发送电子邮件一样.编写自定义代码时,您可以访问有关调用回调的客户端的所有信息.因此,实现您的行为会很容易.唯一的问题是你在哪里存储电子邮件地址?是用户名吗?

有关编写自定义HiveMQ插件的更多信息,请参阅GitHub上的入门指南示例插件

(披露:我是HiveMQ开发人员之一)

干杯,克里斯