17

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

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

提前致谢。

-迪利普

4

2 回答 2

28

您最初的问题以及对后续问题的回答都无法确定您正在使用哪个代理实现。因此,您的问题可能会有更有效的答案。

如果没有这些信息,让我们专注于您可以在协议本身中执行的操作。

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

还有最后遗嘱和遗嘱 (LWT) 功能(goetzchr 所指),可用于在客户端异常断开连接时代表客户端发布消息。

结合这两个功能,您可以在代理上构建一个简单的在线服务,所有这些都在协议内。它是这样工作的:

  1. 当客户端连接时,它会向其独有的主题发布一条 RETAINED 消息,例如:

    clients/my_client_id/state

    有效载荷为1. (my_client_id用客户自己的 id 代替。

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

  3. 当客户端完全断开连接时,它会向同一主题发布一条 RETAINED 消息,其有效负载为0

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

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

这仅在您可以控制所有连接到您的代理的客户端并且能够让它们表现得像这样的情况下才有效。

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

于 2013-09-28T21:43:51.260 回答
6

就像 Knolleary 已经说过的那样,这是特定于实现的,而不是 MQTT 本身提供的。

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

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

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

干杯,克里斯

于 2013-09-28T07:34:30.313 回答