从MQTT客户端获取已连接客户端ID的列表

And*_*den 9 client mqtt

作为连接到mosquitto的mqtt客户端,是否可以检索也连接到代理的客户端ID列表?

hor*_*cex 9

实现此目的的一种方法是让客户端在每次连接代理时发布主题为"status/client-id"和有效负载"1"的消息,并在断开连接时发布有效负载"0".

然后在服务器(代理)端,设置另一个客户端订阅主题"status /#",当它收到这样的消息时,将client-id和payload(连接或不连接)存储到数据库中.

然后,您可以读取数据库以确切了解哪个客户端处于联机或脱机状态.


CMP*_*CMP 6

您可能可以通过 BASH 命令 netstat、grep 以及 awk(如果需要)获取此信息。如果 Mosquitto 使用端口 1883,那么以下内容将告诉您您想要什么:

sudo netstat -n | grep :1883
Run Code Online (Sandbox Code Playgroud)


yur*_*hen 5

方法一:在客户端逻辑中处理

正如@user1048839 所说,使用客户端LWT和在线发布消息,在自定义主题上维护客户端状态。订阅此主题并自行维护客户列表。

如果 pub retainmsg,一旦 sub 将获得客户端列表。

方法二:修改mosquitto代理代码

官方代码不支持online_list
所以我修补了 mosquitto 1.5.4,添加了 2 个自定义系统主题:

1.在线列表

mosquitto_sub -i DDD -v -t '$SYS/broker/chen_list'
$SYS/broker/chen_list
0 - CLOUD0_19108
1 - EEE
2 - DDD
Run Code Online (Sandbox Code Playgroud)

2.线上线下活动

mosquitto_sub -i DDD -v -t '$SYS/broker/chen_state/#'
$SYS/broker/chen_state/DDD 1
$SYS/broker/chen_state/EEE 1
$SYS/broker/chen_state/CLOUD0_19108 1
$SYS/broker/chen_state/EEE 0
$SYS/broker/chen_state/EEE 1
Run Code Online (Sandbox Code Playgroud)

// 如果pub retainmsg, sub 这个topic可以获取所有客户端的在线状态(在payload中)。

在github上测试源代码:

4-在线列表

5-在线活动