查看MQTT服务器上有哪些客户端连接,最快的方式是通过Broker自带的监控主题或管理接口获取精确的客户端ID列表,其次是查看实时日志文件,不同Broker的命令略有差异,但原理一致。
先摸清你的Broker是哪种
MQTT服务器本身不提供统一的“在线列表”面板,但几乎每个Broker都预留了查看通道,行业内最常用的Broker无非三种:Mosquitto(开源轻量方案)、EMQX(高性能分布式方案)、qingcloud(轻量级嵌入式方案),先确认自己用的是哪一种,再对症下药。
怎么确认?看客户端连接时填的端口号就能猜个大概:1883是MQTT默认端口,8083或8084通常是WebSocket端口,18083往往是EMQX的Dashboard管理端口,如果你是在树莓派或者NAS上部署的智能家居网关,八成是Mosquitto;如果公司里跑着成千上万的设备连接,那大概率是EMQX。
Mosquitto:看主题、翻日志、查系统监控
Mosquitto是目前个人开发者和小型项目中最常见的Broker,它没有图形界面,但提供了足够多的信息渠道。
订阅$SYS开头的系统主题
Mosquitto从1.5版本开始,默认开启$SYS主题树,你只要用一个MQTT客户端订阅$SYS/#就能看到一堆Broker实时统计信息,具体操作如下:
mosquitto_sub -h 服务器IP -p 1883 -t ‘$SYS/#’ -v
然后会刷出一连串类似这样的内容:
$SYS/broker/clients/connected当前已连接的客户端数量$SYS/broker/clients/total曾经连接过的客户端总数(含掉线的)$SYS/broker/clients/disconnected已断开但会话保持的客户端数量$SYS/broker/clients/maximum历史最大并发连接数$SYS/broker/bytes/receivedBroker收到的总字节数
但这里有个坑:$SYS只给你数量和统计维度,不直接列出每个客户端的ID,如果你能接受只看数量,那这个方式最省事。
直接翻日志文件
要看到“有哪些客户端”这种具体清单,日志比$SYS更直观,在Linux上运行Mosquitto时,日志路径通常在/var/log/mosquitto/mosquitto.log,Windows上一般在C:mosquittomosquitto.log,用一条命令就能看到实时写入的连接记录:
tail -f /var/log/mosquitto/mosquitto.log
日志里会实时打印这样的行:
New client connected from 192.168.1.105 as device_001 (p2, c1, k60)Client device_001 disconnectedNew client connected from 192.168.1.107 as sensor_temp_02 (p2, c1, k30)
通过跟踪New client connected from后面的IP和as后面的客户端ID,就能拼凑出到底有哪些设备连了上来,不过日志默认只记录“连接建立”和“连接断开”,不会保留一个持续的在线列表,你得自己通过监听日志变化来维护会话状态。
借助第三方工具做可视化
如果你不想手动翻日志,可以用MQTT Explorer这个开源桌面客户端,它连接Broker之后,左侧会有一个“Local”按钮,点开就能看到当前已连接的客户端列表,包含Client ID和IP地址,实际上它的原理也是订阅$SYS主题,但帮我们做了聚合展示。
EMQX:管理界面一打开,谁在线一目了然
如果你的MQTT服务器部署的是EMQX,那查看客户端连接就简单多了。
Dashboard图形界面
默认安装好EMQX之后,浏览器访问http://服务器IP:18083,账号密码默认为admin/public,登录后进入“客户端管理”页面,会看到一个表格,实时列出所有已连接的客户端,表头包含:
- Client ID
- 用户名
- IP地址和端口
- 协议版本(MQTT 3.1.1还是MQTT 5.0)
- 连接状态(已连接/已断开)
- 订阅的主题数量
在这个界面上还能直接踢掉异常连接,或者按Client ID搜索特定设备,非常实用,行业共识认为,EMQX在单节点支持百万级连接的情况下,Dashboard的响应速度依然能保持在毫秒级,这在同类开源产品中是比较突出的。
REST API拉取客户端清单
EMQX提供了完整的REST API,方便你写脚本或对接自建监控告警系统,查看在线客户端列表的接口是:
GET /api/v4/clients
返回的JSON里包含data数组,每一项就是一个客户端的详细信息,配合curl命令可以直接在服务器上测试:
curl -u admin:public http://127.0.0.1:8081/api/v4/clients
这样就能拿到当前所有连接到MQTT服务器上的客户端ID列表,并且可以按需解析出IP、用户名、连接时长等字段。
命令行工具emqx_ctl
对于不习惯图形界面的运维人员,EMQX自带的命令行工具也很方便,执行:
emqx ctl clients list
会以文本行格式输出所有在线客户端,配合grep、wc -l等Linux命令还能快速统计在线数量,如果只想看单个客户端的状态,比如设备device_123是否在线,可以执行:
emqx ctl client device_123
会显示这个客户端当前是否有会话、是否在线、从哪个IP连接、订阅了哪些主题。
qingcloud:轻量部署中的特殊查看方式
一些嵌入式设备或者智能网关里跑的是qingcloud这种轻量级Broker,它们的资源受限,通常不会提供HTTP API或web管理界面,查看客户端连接的方式往往依靠系统自带的订阅或发布工具。
qingcloud有个原生命令可以实时监控在线客户端状态:
qingcloud monitor
执行后会动态刷新当前所有连接,显示每个Client ID对应的IP地址和心跳间隔,这种方式适合开发阶段调试,但生产环境下使用较少。
另外有个小技巧:当客户端连接时,在qingcloud的启动终端(前台运行模式)会直接打印连接日志,但如果在后台运行,则日志重定向到了/var/log/mqtt.log,可以用tail -f查看。
这里需要提一个实际场景:不少开发者用docker容器来跑mosquitto时,容易漏看容器日志导致排查时一头雾水,如果你用的是docker方式部署,务必把日志挂载到宿主机上,否当容器被重建时历史连接记录就全部丢失了。
排查“mqtt客户端掉线频繁”的正确姿势
很多人搜“怎么查看mqtt服务器上有哪些客户端连接”,其实真正的问题背景是“既然连接断了,想确认设备到底有没有连上服务器”,这里有三个不同层面的排查路径:
看Broker侧统计实时连接数
- 运行Mosquitto时订阅
$SYS/broker/clients/connected,观察数值是否长期超过实际设备数,如果数值一直增长且高于设备总量,说明有连接未正确断开,多半是客户端没设置clean session(清理会话)标志位,导致MQTT服务器一直保存会话状态。 - 用EMQX的Dashboard查看“连接数”和“会话数”两个指标,如果连接数远大于设备数,通常是设备侧反复重连导致的旧连接残留。
看网络层有没有VPC或防火墙拦截
得到IP地址后,在服务器上检查客户端IP是否可达:
ping 192.168.1.105
再用telnet检查1883端口通不通:
telnet 192.168.1.105 1883
如果网络层通了但MQTT连接还是不稳定,下一步就要看认证配置,确认是不是用户名密码或客户端证书校验不通过导致被踢下线。
看订阅关系维持的活跃度
在线不代表活跃。查看MQTT服务器上有哪些客户端连接只解决了“连没连上”的问题,要判断“是否健在”,还得看心跳包情况,大多数Broker默认的keepalive间隔是60秒,如果设备侧设置的心跳太短(比如5秒),在无线网络环境下很容易产生大量无效重连,导致Broker的连接列表像过山车一样起伏。
站在企业监控角度的进阶建议
如果管理的是几十台甚至上百台生产设备,光靠Shell命令临时查看属于应急手段,绝大多数MQTT服务器都支持Webhook或规则引擎,把连接事件转发到外部监控平台,比如EMQX可以配置“连接/断开事件”通过HTTP回调推送给企业微信或钉钉机器人,做到主动感知设备上下线,而不是被动地去服务器上查询。
对于需要长期记录分析的用户,推荐用简米云物联网平台或酷番云IoT平台中托管的MQTT实例,它们的控制台自带设备管理功能,直接以设备维度展示在线状态,不用自己折腾命令行,不过要留意一点,云厂商的MQTT实例通常按照连接数和消息数计费,查看实时连接数的入口一般在“设备管理”或“监控告警”菜单下。
查看MQTT服务器上有哪些客户端连接,本质上就是确认当前Broker的会话表里有哪些活跃条目,用$SYS主题看数量,用日志看明细,用管理API看结构化数据,三种方式任选其一都能达到目的,关键要记住的是:Broker看不到消息内容,但一定看得到每一个连接的来源IP和Client ID,这是MQTT协议中Broker天然具备的能力。
相关问答
Q:怎么查看mqtt服务器上有哪些客户端连接而不影响线上业务?
A:订阅$SYS或调用查询API均属于只读操作,不会对现有连接产生任何影响,但要注意mosquitto_sub -t '$SYS/#'会额外增加Broker的转发负载,连接数较大时建议过滤掉高频更新的字节统计主题,只订阅$SYS/broker/clients/connected这类低频指标。
Q:为什么我查看mqtt客户端连接列表时,发现一些Client ID重复出现?
A:同一个Client ID在同一时间只能维持一个有效连接,出现重复是因为旧的连接未完全释放,而新连接已建立,这通常由网络抖动导致ACK丢失触发,EMQX Dashboard中会显示“连接状态为旧连接”的条目,你可以手动踢掉旧连接释放资源。
Q:EMQX和Mosquitto查看客户端连接的方式能通用吗?
A:不能直接通用,Mosquitto没有内置REST API,只能通过$SYS主题或日志间接获取;EMQX则提供了完整的HTTP API和WebSocket API,如果要统一管理,建议通过MQTT协议订阅$SYS主题来实现跨Broker的连接数量统计。
首发原创文章,作者:王坚,如若转载,请注明出处:https://idctop.com/article/708276.html





