MQTT服务器完全能够监控所有连接的客户端,通过Broker内置的统计接口、管理工具或主题订阅即可实时获取客户端列表及状态。
MQTT服务器如何查看在线客户端列表
查看客户端列表是MQTT运维中最基础的需求,无论你用的是开源Broker还是商业版,都提供了至少一种方式来获取当前连接的设备信息,行业共识认为,标准化监控手段能显著降低物联网设备管理成本,下面介绍三种主流方法。
通过Web管理界面监控
多数现代MQTT Broker都附带图形化Web控制台,比如EMQX的Dashboard、HiveMQ的Control Center,登录后通常在“Clients”或“Sessions”页面能看到所有在线客户端的ID、IP地址、协议版本、Keep Alive时长等,部分平台还支持按Client ID搜索,或直接断开异常连接,这种方式对新手最友好,无需记住任何命令,打开浏览器就能掌握全局设备状态。
通过命令行或API查询
如果你习惯终端操作或需要批量获取数据,Broker的CLI工具和REST API更高效。
- Mosquitto:使用
mosquitto_sub -t '$SYS/broker/clients/connected'订阅系统主题,即可实时收到连接数变化,但要查看具体客户端ID,需配合mosquitto_sub -v -t '$SYS/broker/clients/#',并解析JSON输出。 - EMQX:调用
GET /api/v5/clients接口,返回JSON格式的客户端列表,支持分页和过滤,API Key可在管理后台生成,适合自动化脚本。 - VerneMQ:通过
vmq-admin session show命令,在节点上直接输出所有会话信息,包括Client ID、用户名、是否在线等。
通过订阅$SYS主题
MQTT协议定义的$SYS主题树专门用于Broker内部状态发布,只要客户端订阅$SYS/broker/clients/connected,就能收到新连接事件;订阅
$SYS/broker/clients/disconnected则能感知设备离线。最高效的方式是订阅$SYS/broker/clients/#,但需注意流量开销,生产环境建议只订阅必要路径,部分Broker(如Mosquitto)默认不开启$SYS,需在配置文件中设置sys_interval为一个正数(如10秒)。
常见MQTT Broker的客户端监控方法
不同Broker的监控功能有差异,但核心思路一致,下表对比了四款主流Broker的客户端监控方式,帮助你在项目立项时快速选择。
| Broker | 监控方式 | 是否支持Web端 | 是否需要额外插件 |
|---|---|---|---|
| Mosquitto | $SYS主题 + 插件 | 否(需第三方) | 部分需配置 |
| EMQX | Web控制台 + REST API | 是 | 无 |
| VerneMQ | vmq-admin命令 + 指标导出 | 否(可通过Prometheus) | 可选 |
| HiveMQ | Web控制台 + 扩展插件 | 是 | 无 |
Mosquitto的设置与命令
Mosquitto是轻量级代表,本身不提供Web界面,但自带系统主题,在mosquitto.conf中开启sys_interval 10后,订阅$SYS/broker/clients/total可获得总数,要获取具体ID,需要安装mosquitto_sub客户端并订阅$SYS/broker/clients/connected,输出格式为Client ID列表。注意:Mosquitto 2.0后默认只允许本地访问$SYS,需在配置中设置allow_anonymous true并绑定到0.0.0才能远程使用。
EMQX的仪表盘与API
EMQX是国产开源Broker,Web管理界面非常直观,登录后点击“集群监控”->“客户端”,按客户端ID、IP、用户名等条件筛选,支持导出CSV,API方面,GET /api/v5/clients
返回所有客户端信息,支持分页参数page和limit,适合集成到自建运维平台,EMQX还提供WebSocket订阅,可以直接在浏览器中查看实时客户端连接变化。
VerneMQ的监控手段
VerneMQ基于Erlang/OTP,性能稳定,使用vmq-admin session show列出所有会话,包括离线会话(保留消息的墓碑会话),通过vmq-admin metrics show可查看连接数、订阅数等指标。要想图形化监控,可以配置Prometheus Exporter,将客户端数据导入Grafana,VerneMQ不提供开箱即用Web界面,但社区有第三方插件实现。
监控MQTT客户端连接状态的进阶技巧
基础监控只能看到在线列表,但生产环境中往往需要更细粒度的状态追踪,比如连接时长、报文速率、丢包率等,下面几个方向能帮你掌握客户端健康度。
启用连接事件日志
大多数Broker支持将客户端连接、断开、订阅等事件写入日志,例如EMQX在emqx.conf中设置log.level = debug,日志会记录每条连接的Client ID、IP、原因码,Mosquitto启动时加-v参数,在控制台输出所有协议交互。日志文件是排查故障的宝库,但注意磁盘空间,建议轮转。
使用WebHook推送状态
EMQX和HiveMQ支持WebHook,当客户端连接或断开时会向指定URL发送HTTP POST请求,包含Client ID、事件时间、原因等,通过这个机制可以实时同步状态到业务系统,比如更新设备在线状态到数据库,配置时注意加上鉴权Token,避免伪造请求。
集成Prometheus与Grafana
对于大规模部署,推荐使用Prometheus抓取Broker指标,EMQX自带Prometheus Exporter,开启listener.http.prometheus后,访问9091/metrics获取客户端连接数、订阅数、消息速率等,Grafana社区有现成的MQTT监控面板,导入即可实现
可视化客户端趋势图,便于分析峰谷流量和异常波动。
MQTT服务器能监听有哪些客户端吗?常见问题解答
Q1: MQTT服务器能监控客户端断开连接吗?
能,Broker会为每个客户端维护会话状态,当网络断开或客户端主动发送DISCONNECT报文时,Broker都会记录断开事件,通过订阅$SYS/broker/clients/disconnected(Mosquitto)或调用WebHook(EMQX)即可捕获。注意:非正常断开(如网络掉线)需要等待Keep Alive超时才会被识别,超时时间由客户端设置的Keep Alive决定。
Q2: 如何查看MQTT服务器上所有客户端ID,包括历史离线的?
无法直接查看历史所有客户端ID,因为Broker通常只保留在线会话和持久会话信息,但可以通过以下方式间接获取:一是启用日志记录,解析日志中的Client ID去重;二是让客户端在连接时主动上报自己的标识到特定主题,服务端订阅该主题汇总,对于持久会话的客户端,Broker会保留其Session直到过期,此时可通过$SYS/broker/sessions/#主题查看。
Q3: 免费MQTT服务器有客户端数量限制吗?
有限制,但不同Broker策略不同,Mosquitto开源版无硬性限制,但受内存和文件描述符制约;EMQX开源版免费支持50个客户端连接,商业版无限制;VerneMQ开源版无限制,可水平扩展;HiveMQ免费版限制25个客户端。如果你的项目超过免费额度,可以考虑Mosquitto或VerneMQ,或购买EMQX商业许可证,实际部署时,建议先压测确定稳定性。
监控客户端是MQTT运维的基础能力,选择合适的方法取决于你的Broker类型和团队习惯,无论是通过Web界面一键查看,还是用API自动化脚本,都能让你对设备连接状态了如指掌,掌握这些技巧,物联网设备管理才能游刃有余。
首发原创文章,作者:王坚,如若转载,请注明出处:https://idctop.com/article/519005.html



