实现此目的的一种方法是让客户端在每次连接代理时发布主题为"status/client-id"和有效负载"1"的消息,并在断开连接时发布有效负载"0".
然后在服务器(代理)端,设置另一个客户端订阅主题"status /#",当它收到这样的消息时,将client-id和payload(连接或不连接)存储到数据库中.
然后,您可以读取数据库以确切了解哪个客户端处于联机或脱机状态.
您可能可以通过 BASH 命令 netstat、grep 以及 awk(如果需要)获取此信息。如果 Mosquitto 使用端口 1883,那么以下内容将告诉您您想要什么:
sudo netstat -n | grep :1883
Run Code Online (Sandbox Code Playgroud)
正如@user1048839 所说,使用客户端LWT和在线发布消息,在自定义主题上维护客户端状态。订阅此主题并自行维护客户列表。
如果 pub retainmsg,一旦 sub 将获得客户端列表。
官方代码不支持online_list,
所以我修补了 mosquitto 1.5.4,添加了 2 个自定义系统主题:
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)
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上测试源代码:
| 归档时间: |
|
| 查看次数: |
28857 次 |
| 最近记录: |