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

如何查找已连接的MQTT客户端详细信息,mqtt,Mqtt,是否有任何方法可以从另一个客户端找到所有连接的客户端详细信息(IP和名称)?我知道有一个主题“$SYS/broker/clients/active”,它给出了当前连接的客户机的数量,但是如果我想了解每个连接的客户机的更多信息,有什么方法吗 我正在开发一个解决方案,其中许多客户端将连接(使用无线网络)到服务器上的MQTT代理。我还将有另一个客户端在同一台机器上运行,并连接到代理,这将观察是否有任何新的客户端连接到代理或一个断开连接的客户端。当新客户端连接或连接的客户端断开连接时,我可以在代理控制台

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

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

提前谢谢


-Dilip

与Knollerary一样,已经声明这是特定于实现的,而不是由MQTT本身提供的

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

有关编写自定义HiveMQ插件的更多信息,请参阅和

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

干杯,
Chris

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

如果没有这些信息,让我们把重点放在协议本身可以做什么

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

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

结合这两个特性,您可以在代理上构建一个简单的状态服务,所有这些都在协议中。它的工作原理如下:

  • 当客户端连接时,它会将保留的消息发布到其独有的主题,例如:

    clients/my\u client\u id/state

    有效负载为
    1
    。(用客户自己的id替换
    my_client_id

  • 在connect上,它还将LWT消息设置为发布到同一主题,但有效负载为
    0
    。这也应该是一条保留消息

  • 当客户端干净地断开连接时,它会将保留的消息发布到负载为
    0
    0的同一主题

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

    为了获得比连接状态更多的信息,客户端可以在connect上发布另一条保留的消息到另一个主题,例如
    clients/my_client\u id/info
    ,该主题包含您感兴趣的所有信息

    只有当你控制了所有连接到你的经纪人的客户,并且能够让他们这样做时,这才有效


    这不是一种理想的方法;希望您的代理实现能够提供一些服务器端的方法来实现这一点。

    您可以添加一些关于您正在使用的工具的详细信息吗?问题非常简单。您所问的问题将是实现特定的-MQTT协议不提供这一点;因此,ralight的q了解您正在使用的工具/客户端/代理。感谢Roger和Knolleray的回复。我正在使用路由器上的c客户端,该路由器将通过internet连接到远程位置上的代理,并在服务器(安装代理的位置)上使用python客户端。在任何时间点都可能有n个路由器。现在,如果路由器的n/w出现故障,代理将断开该客户端的连接,此时我想通知用户路由器(通过使用谷歌API的电子邮件)他/她的n/w已关闭。希望这能让您有所了解,如果您需要更多详细信息,请告诉我。感谢您的建议Goetzchr。电子邮件地址将存储在数据库中,当客户端成功连接到代理时,它将发布所有详细信息,以便在代理计算机上运行的Python客户端获取并将其插入数据库。我不确定现在我们是否想进入HiveMQ,因为我们已经使用MQTT代理进行了大量的开发。我的主要目的是在某个特定客户端与代理断开连接时通知Python客户端。我们已经有了另一个模块,负责将电子邮件发送到所需的电子邮件地址。啊ok、 我认为一个可能的解决方案是使用MQTT的最后遗嘱和测试功能。这使您能够在客户端意外断开连接时向主题发送消息。可以在连接消息中为每个客户端单独指定主题和消息。谢谢Goetzhr。我正在寻找类似的内容。@ChristianGötz:你能告诉我如何打印消息(用于日志记录)吗在订阅服务器时的服务器端?请检查此项。Thanks@Pritam您可以通过在HiveMQ中使用OnPublishSend回调来实现这一点。更多信息请参阅HiveMQ插件开发人员指南,搜索OnPublishSend。感谢Knollery。我一直在寻找类似的内容。希望这能达到我的目的。也感谢大家的支持