ARTICLE DETAIL

建站实战干货

来自一线的建站与推广经验沉淀,每一条都经过真实交付验证。

三款开源MQTT调试工具实测对比:MQTT X、MQTT Explorer与mosquitto命令行

2026/9/9 1:19:59 拓冰建站 浏览量
三款开源MQTT调试工具实测对比:MQTT X、MQTT Explorer与mosquitto命令行 1. 先捋清楚一件事MQTT调试到底是在调什么做了几年物联网设备接入我对MQTT这协议又爱又恨。爱的是它够轻、够简单一条发布订阅链路就能把设备端和平台端串起来恨的是等设备真的跑起来之后调试工具不给力一个问题能从上午拖到傍晚。MQTT和HTTP最大的区别在于它不是请求响应式的客户端通过Broker中转消息设备与设备之间解耦。这意味着你不能像调REST接口一样拿个带URL和Header的请求工具直接怼上去看返回值而是要先建立一个长连接、配置好ClientID、订阅对应的主题然后才能观察有没有消息进来、Payload对不对、QoS级别有没有生效。很多入门的人用通用网络调试助手去连MQTT踩过坑的都懂要么握手失败要么报文得自己拼要么压根看不出连接是被谁断开的。所以行业内慢慢形成了一个共识——调试MQTT场景还是得用专门的MQTT调试工具。这也是这篇文章的由来我陆陆续续试过市面上能接触到的开源MQTT工具最近又筛出三款实测好用的分别覆盖了日常开发、现场排查和服务器脚本三种完全不同的场景。第一款是MQTT X主打全功能图形化调试第二款是MQTT Explorer靠topic树状可视化把模糊的问题变清晰第三款是Eclipse Mosquitto自带的命令行客户端mosquitto_pub/mosquitto_sub没有图形界面也能稳定发力。三款都是开源项目代码透明社区活跃不是那种作者跑路没人维护的仓库。接下来我按实际使用心得展开说每款都能干到哪些事、有什么短板、适合谁用后面会给出三款工具的横向对比和组合套路。如果你正在准备物联网相关开发或者手头就有设备在对接这篇文章应该能帮你少走不少弯路。1.1 为什么通用网络工具搞不定MQTT调试我在带新人时经常被问到一个问题既然MQTT本质也是TCP上的协议那我用现成的TCP调试工具手动发CONNECT报文行不行理论上可以实际上非常痛苦。MQTT的报文头是二进制的一个CONNECT报文要拆成固定报头、可变报头、Payload三部分还得自己算剩余长度、填协议名、协议版本、连接标志、保活时间。就算你把这些都弄对了后续的心跳/发布/订阅/断开全都得自己编码解码消息一多根本看不过来。而且MQTT调试工具并非只是“能发能收”就行真正关键的能力是把协议交互过程可视化、解析出主题和Payload、保留QoS等关键上下文信息。这也是MQTT调试工具的立身之本。它们本身就是一个合格的MQTT客户端把底层的报文解析、连接维护、心跳逻辑都封装好你只需要关心要连哪个Broker、订阅什么主题、发什么数据。调试门槛一下子就降下来了。1.2 我筛选这几款工具时的硬性标准坦白说市面上的MQTT客户端/插件多如牛毛但我拿去跑真实项目时能留下来的不多。混用了一年后我给自己定了几条筛选标准这几条标准同时决定了这篇文章的选品方向。第一必须开源。开源的调试工具意味着我可以直接看它的源码出了问题能定位到具体逻辑而不是对着一个黑盒干瞪眼同时也方便团队内部做二次定制比如把调试数据对接到内部平台。第二协议支持不能太老。MQTT 3.1.1必须稳如果能支持MQTT 5.0更佳这样可以提前验证会话过期、用户属性等新特性。第三发布订阅都必须顺手不能只擅长订阅而发布时要疯狂打勾选参数。第四跨平台或至少能在无GUI环境运行因为现场排查经常是在一台没装桌面的Linux工控机上进行的。按这个标准筛下来MQTT X、MQTT Explorer、mosquitto命令行工具刚好对应了三条完全不同的使用路径而且三款我都至少用了小半年这才能叫“实测好用”。2. MQTT X连接管理最顺手长期开发主力工具MQTT X是我PC上装得最频繁的MQTT客户端也是我日常开发的主力。它是EMQ团队开源的项目Apache 2.0协议客户端基于Electron和TypeScript实现支持Windows、macOS、Linux还提供了纯Web的在线版本。界面属于典型的现代化工具风格左侧连接列表、中间消息窗口、右侧操作面板第一次打开基本不需要看文档就能上手。我用它最深的感受是MQTT调试里的那些繁琐动作它几乎都给到了对应的交互优化。尤其是多连接管理、Json格式化、历史消息这几个点每一个都在实际项目里帮我省过时间。2.1 同时挂多个Broker连接切换像开聊天窗口一样自然一个很容易被忽略的需求是调试时你可能开着本地开发环境的Broker同时又挂着云端或客户现场的Broker。很多工具只支持一个连接来回切换要重新填地址烦得很。MQTT X把“多连接”作为一等公民来设计每个连接在左侧独立展示可以同时建立多个连接连接状态一目了然。我在调一个智慧园区项目时本地跑着emqx做联调同时又要把一台已上线的边缘网关数据转发到云端测试实例。如果没有多连接我只能在两个配置文件之间来回改。用MQTT X我建一个“本机联调”连接和一个“云端测试”连接两个都保持在线抓消息时切换一下就看到了。这种体验非常接近工作聊天软件的窗口切换没有重新建连的等待过程。连接配置也支持保存和分组可以按项目、按环境给不同的Broker打标签。公司内部几个常用环境地址我提前都配好放进去后面哪次接手新模块、需要连对应环境时不用再翻内部文档找地址直接点连接即可。2.2 发布与订阅的细节设计JSON格式化、历史消息、通配符MQTT X的订阅功能值得单独拿出来说。它可以同时订阅多个主题而且支持在订阅时直接写通配符比如我常写device//status来观察所有设备的状态上报。每条进入的消息都会在中间窗口按时间线展示主题名、QoS、Payload、时间戳都有点一条消息可以在右侧看到完整解析结果。对物联网场景来说Payload绝大多数是JSON。MQTT X内置了JSON格式化能力收到一长串压缩过的JSON点一下格式化就变成缩进清晰的层级结构。调试一个设备上报异常的问题时这个功能几乎每天都要用。它还支持把Payload按Hex或Base64显示在处理传感器二进制数据时非常有用——有些设备上报的是原始字节流转成Hex一眼就能看出帧格式对不对。另一个让我依赖的功能是历史消息。MQTT X会把当前连接收到的消息缓存在会话里你可以回看之前出现的消息不用一直盯着屏幕等下一次上报。我在调一个定时上报设备时就是靠历史记录把它几个小时的payload拉出来对比才发现设备端时间戳偶尔会跳变。发布端同样做得比较细可以选择QoS级别、设置retain标记、选择payload编码格式还支持在一个窗口内编辑并发送多条消息。更贴心的是它的“脚本”能力可以用内置脚本对payload做动态处理比如加时间戳、改某个字段虽然实际场景不一定天天用但需要造测试数据时很省事。2.3 几个让我回不去的细节设计MQTT X在细节体验上做得不够惊艳但在真实使用中却有存在感。首先是密码本功能内置了一批公共Broker地址比如EMQX官方测试Broker、HiveMQ公共Broker等打开客户端后直接点一下就能连上做连通性测试。团队联调或者写文章做演示时不用起本地Broker就能快速验证消息收发逻辑这对刚接触MQTT的人来说门槛低了很多。其次是连接失败的报错信息它不只是弹一个“连接失败”了事而是尽可能给出错误原因。比如认证失败会提示用户名密码问题地址不通会提示连接超时密码错误会直接显示5MQTT标准返回码中的认证失败。刚转来做物联网开发的人看到这种提示基本能自己定位问题省得每次都要来问“Broker连不上怎么回事”。再有就是日志窗口。正常使用时日志默认折叠起来但一旦勾选“显示日志”它就能把MQTT协议层面的收发过程展开能看到CONNECT报文、SUBSCRIBE报文、PUBLISH报文这些底层交互。需要较深层排查时这个日志窗口已经很接近抓包工具的效果了。当然MQTT X也不是完美的。Electron应用的通病就是内存占用偏高长挂一整天内存能到几百MB。对PC调试来说还好但如果想在树莓派这类小设备上跑就比较吃力了。不过日常在开发机、笔记本上使用完全不成问题。3. MQTT Explorer把topic当树来观察排查现场问题的一把好手如果说MQTT X是一个功能全面的工具箱那MQTT Explorer更像一个观察镜。它的思路非常独特把Broker上的topic按层级关系展示成一棵树设备上报的实时数据挂在对应的节点上不用订阅、不用翻列表打开就能看到一个动态更新的“主题地图”。这个设计在物联网现场排查时价值极大。MQTT Explorer是开源项目基于Electron实现同样跨平台UI布局和MQTT X差异很大。它默认左侧是topic树右侧是节点详情顶部是历史记录相关操作。刚接触时你可能会觉得它功能少但实际用下来会发现它的目标用户很明确——就是“我要看当前Broker上到底有哪些主题、数据是什么样的”。3.1 主题树状视图一眼看出设备上报结构物联网项目的topic设计如果规范通常是多级结构比如sensor/{deviceId}/temperature、sensor/{deviceId}/humidity。前端如果用表格一条条列消息看多了容易眼花。MQTT Explorer把topic按/分隔成多级节点展开后像文件管理器一样每个节点显示最新一条消息的值。这个交互对排查“设备数据有没有上报”这个问题几乎是降维打击。有一次现场反馈设备经常“掉线”我登上MQTT Explorer连接Broker把整个sensor/#树展开一眼就看到某台设备的三个子主题里temperature节点是红的、humidity节点在闪、door节点长时间不变。再点进节点看时间戳发现door状态半小时没更新定位到是门磁设备电池耗尽。整个排查过程不到五分钟如果换成普通订阅列表我得手动翻几十条消息才能得出同样结论。它还能自动区分保留消息和实时更新的消息节点旁边会有小图标显示是否有retain。这对判断设备是否发送了保留消息很有帮助。比如某设备配置了遗嘱保留在线状态如果看到节点下方有retain标志就能确认设备在启动后确实更新过保留值。3.2 利用历史topic记录快速“恢复现场”MQTT Explorer还有一个实用特性它在连接期间会自动记录所有出现过的topic以及对应的历史消息即使设备后来不再上报只要不手动清理这些topic节点仍然保留在界面里。重新连接Broker后它还能用之前记录的topic作为提示重新进行“补订阅”。这里一定要说清楚这并不违背MQTT协议语义它不会私自开启retain、也不会去Broker上拉历史消息它只是把“客户端在本次会话中已经见到的topic路径”缓存下来等下次连接时自动重新订阅这些路径。好处是现场排查这类场景。比如现场网络抖动我重连一次Broker之前观察的topic不会丢可以继续看。换了别的工具每次重连订阅列表可能被清掉又得重新填一遍。此外它支持按前缀和通配符进行filtering也可以针对某个topic做搜索。界面上方有历史消息列表能翻看每条payload的变化过程。3.3 用MQTT Explorer排查topic层级错位的真实案例有一个项目我印象很深设备端的温度数据始终不在预期topic下上报管理平台拿不到数据。用MQTT Explorer连上Broker后我没有订阅具体的devices/路径而是订阅了#看整棵topic树。结果发现设备端实际发布到了home/livingroom/temperature而平台订阅的是devices/livingroom/temperature。两个路径只差一级但consumer永远收不到。代码里压根看不出来设备端和平台端都觉得自己配得没问题。如果没有可视化topic树我只能把两边的配置文件翻来覆去对比还要靠抓包或日志才能发现在topic路径上有差异。但MQTT Explorer把这个差异直接摆在屏幕上路径树里就是两棵长得几乎一样的挂载点对比着看问题五秒钟就锁定了。从那之后我已经习惯把它放在常用工具列表里凡是要跟设备对接先连一遍看topic树。当然它的短板也很明显它更偏向“观察”在发布多条自定义消息、做复杂payload编辑、多连接同步管理等场景下不如MQTT X灵活。但它最擅长的“让模糊的设备状态清晰起来”这件事目前没有哪个同类工具能比它做得更直观。4. mosquitto_pub/sub没有图形界面也能稳定发力图形化工具虽好但有些场景它们派不上用场。最常见的就是你SSH到一台服务器上Broker装好了设备也连上来了但服务器没有桌面环境你想快速验证一条消息能不能通。这时候最顺手的就是mosquitto自带的命令行客户端mosquitto_pub和mosquitto_sub。它们来自Eclipse Mosquitto项目是跟随Mosquitto Broker一起维护的官方工具开源、无依赖、体积小几乎在所有Linux发行版里都能用包管理器直接安装。我一直把它们当作“不起眼但可靠”的调试底牌。4.1 一条命令验证Broker连通性刚装好一个Broker或者发现设备连不上时第一个动作往往不是打开电脑上的图形客户端而是在服务器本地跑一次mosquitto_sub订阅测试。我的习惯是mosquitto_sub -h 127.0.0.1 -p 1883 -t test/topic -v然后另一个终端执行mosquitto_pub -h 127.0.0.1 -p 1883 -t test/topic -m hello mqtt如果订阅终端能收到test/topic hello mqtt说明Broker进程正常、端口监听正常、本地消息路由正常。接下来再拿设备端去连排查范围就进一步缩小了。这个“先本地验证Broker再连设备”的顺序能过滤掉一堆因为地址配错、端口不通、用户名密码错误导致的问题往回看几乎每次排查都用得上。4.2 常用参数速查和几个实测好用的脚本片段这两条命令的参数非常规整掌握高频的几个基本就够用。我把常用的整理成表格放在下面方便大家直接抄。参数作用示例-hBroker地址默认localhost-h 192.168.1.10-pBroker端口默认1883-p 1883-ttopic-t sensor/01/temp-m发布的消息内容-m {v:1}-u/-P用户名/密码-u admin -P password-qQoS级别0/1/2-q 1-r保留消息-r-d打印调试信息-d-n发布空消息多用于清除retain-n -r -t tem-f从文件读取内容发布-f /tmp/payload.json-l从标准输入逐行发布echo hi | mosquitto_pub -t a/b -l-C收到指定数量消息后退出submosquitto_sub -t a/b -C 5实际调试中命令行工具配合Shell能完成很多图形界面很别扭才能做的事。比如模拟一个设备连续上报数据可以用循环加随机值实现for i in $(seq 1 100); do mosquitto_pub -h broker.local -t sensor/$i/temp -m $(echo $((RANDOM % 40))) sleep 0.5 done再比如只需要订阅到一条消息就停下来方便写自动化脚本mosquitto_sub -h broker.local -t cmd/device01 -C 1这种“干完活就退出”的交互方式在CI或测试脚本里很有用。4.3 为什么命令行工具反而在真实场景中最可靠结合这些年的使用经历我认为命令行工具的可靠性主要体现在三点。第一它不依赖GUI也不依赖网络配置图形环境。边缘计算节点、Docker容器、无头Linux服务器统统都能跑。第二它启动快、资源占用小哪怕一次起几百个连接也没有心理负担而图形客户端开几十个窗口就会明显卡顿。第三它天然适合脚本化和管道操作。输出可以交给jq解析输入可以从文件或标准输入读入。这些都是图形化工具难以比拟的。当然它的代价是不够直观。如果你要观察整个topic空间的消息流或者反复编辑复杂payload命令行工具会比较吃力。所以我的建议是把它定位成“验证工具”和“自动化工具”而不是日常浏览工具。它和MQTT X、MQTT Explorer能形成很好的互补。5. 横向对比与组合套路谁在什么阶段最管用我始终认为工具没有绝对的好坏关键看放到什么场景里。为了让选择更清晰我基于实际使用经验做了一张横向对比表覆盖了界面、协议支持、核心优势、适用阶段等维度。维度MQTT XMQTT Explorermosquitto_pub/sub界面形态图形化全功能IDE风格图形化topic树可视化命令行无GUI跨平台Win/macOS/Linux/WebWin/macOS/Linux几乎所有平台协议支持MQTT 3.1.1/5.0MQTT 3.1.15.0支持有限MQTT 3.1.1/5.0核心优势连接管理、消息编辑、多连接观察topic结构、现场排查轻量、脚本化、无头环境资源占用偏高Electron中等Electron极低适用阶段日常开发、功能测试现场排查、协议理解服务器验证、自动化学习成本低低中需记参数从表格能看出来三款工具的定位差异非常明显。它们不是替代关系而是互补关系。我习惯的组合方式是开发阶段用MQTT X现场联调/排查用MQTT Explorer服务器和自动化场景用命令行工具。5.1 不同阶段的推荐组合先看开发阶段。你在写设备端固件或者说写平台接入模块时需要频繁地发布测试消息、订阅反馈消息、调整payload格式这个阶段MQTT X最顺手。多连接让你可以在本地Broker和云端Broker之间反复横跳JSON格式化和历史消息让你能快速确认数据内容变化。我通常会在MQTT X里建好固定的订阅模板比如device//status、device//telemetry换一个项目就改一个前缀即可。再看现场排查阶段。只要拿到现场Broker的访问权限我第一时间不是看日志而是用MQTT Explorer订阅一把梭把整个topic树拉出来。注意第一次不要只订阅你认为有数据的路径最好直接订阅#看看全貌。很多时候设备端的topic命名和文档对不上只有看到真实的树结构才能发现。在低功耗设备网络不稳定的场景里MQTT Explorer自动重新订阅的历史topic列表也能让你少做很多重复动作。最后是服务器/自动化阶段。批量模拟、连通性验证、CI测试、边缘端调试选命令行工具。比如在自动化测试脚本里先用mosquitto_sub -C 1等一个消息再结合Python或Shell断言消息内容整个过程完全不需要有人在电脑前盯着。5.2 一个完整排查示例三款工具接力使用我拿最近一次处理设备消息丢失的经历具体展示一下这个组合套路。问题描述某设备周期性上报位置信息平台侧经常丢消息时好时坏。我先是SSH到Broker服务器上用mosquitto_sub -h 127.0.0.1 -p 1883 -t loc/# -v订阅整个位置topic空间确认Broker端确实能收到设备消息。又用mosquitto_pub -t loc/check -m ping -r发了一条retain消息确认消息路由正常。然后回到电脑上用MQTT X以同样的ClientID前缀连接Broker订阅loc/#抓了十分钟消息发现设备其实每分钟都会发一次但平台侧只收到了部分。这说明问题不在Broker而在平台消费端——要么是平台订阅的topic错了要么是消费进程有瓶颈。最后我用MQTT Explorer连上Broker看了一眼整个topic树确认loc/下面只有设备上报的topic没有平台侧的日志topic。再回头翻平台接入代码发现平台自带的一套过滤规则把某些时间段内的重复位置消息自动丢弃了。最终定位到是业务过滤规则太严和设备上报频率冲突。这次排查大约花了四十分钟其中真正花时间的不是工具操作而是业务代码逻辑推演。6. 实际调试中最容易踩的几个坑附完整排查链路工具再顺手如果对MQTT协议本身理解不到位一样会绕远路。下面几个坑是我在调试过程中反复见过的每个都配上了完整的排查链路和解决方案。单独拎出来说是因为它们比工具功能更能影响你的调试效率。6.1 Broker监听地址对不上现象是连接超时这个坑出现频率极高尤其在使用Docker跑Broker时。容器内的Mosquitto默认配置文件里listener可能只绑定了127.0.0.1或者监听的是1883但Docker端口映射有问题。从客户端工具连不上的时候先不要怀疑工具按下面的顺序排查在Broker所在机器上执行ss -lntp | grep 1883确认端口在监听执行mosquitto_sub -h 127.0.0.1 -p 1883 -t test -C 1验证本机链路是否通如果本机通、外网通不了检查listener是否绑了0.0.0.0或者容器端口映射是否把宿主端口和容器端口正确对应检查防火墙和安全组是否放行1883端口如果使用TLS确认客户端工具连接的是8883而不是1883。MQTT X连接超时后不要急着反复重连。先按上述链路理一遍大多数情况下问题都出在Broker监听地址或防火墙而不是工具本身。6.2 Client ID重复导致设备被踢下线这个坑在调试中最隐蔽因为现象特别像“网络不稳定”。如果你的设备端指定了固定的ClientID很多固件默认用MAC地址或固定字符串而MQTT调试工具也用了相同的ClientID去连接Broker那么Broker会把后连接的客户端当作同一个会话前一个连接会被强制断开。协议规定相同ClientID只能存在一个连接后连接会把旧连接踢掉。现象就是你一打开MQTT X连上Broker现场设备就掉线一关掉MQTT X设备又自己恢复。排查链路如下查看设备端日志确认断开原因是否是“reuse of ClientID”或类似消息查看Broker端日志看是否存在两个来源IP使用同一ClientID交错连接的记录把MQTT X连接配置里的ClientID改成随机值工具默认会生成随机ID但如果你为了复用会话手动填了固定ID就会踩坑让设备端和调试端使用完全不同的ClientID前缀。在MQTT 5.0里Broker还增加了“会话过期”和“干净启动”的概念比3.1.1稍微复杂一点但核心原则不变同一时刻同一ClientID只能有一个在线连接。6.3 Retain消息清不掉发空payload且置retain才是正确姿势很多刚接触MQTT的人会把retain理解成“离线消息”这是不对的。retain消息是Broker为某个topic保留的最后一则消息任何新订阅者在订阅时都会立刻收到它不管发送者是否在线。它和“离线期间积累消息”完全没有关系。踩坑场景设备端上线时发布了一条retain状态onlinetrue后来设备下线你想把这则保留消息清除。你可能会想重新发布一条onlinefalse不就行了这在业务语义上是对的协议层面Broker确实保留了新值。但如果你想彻底清除retain比如某个topic已经废弃、不想让新订阅者收到任何旧值正确做法是向该topic发布一条空payload且带retain标记的消息mosquitto_pub -h broker.local -t sensor/old -n -r这相当于告诉Broker“这个topic的保留值清空。”订阅这个topic的人会收到一条payload长度为0的消息之后topic下不再有保留值。在MQTT X里发布空payload时同样要勾选retain选项否则删不掉。很多图形工具在右键清除retain时本质也是先暴露“空payloadretain”这个操作。搞清楚这层原理你就不会疑惑为什么直接删除无效了。6.4 通配符订阅看不到$SYS主题MQTT协议约定以$开头的主题属于Broker的系统主题用来发布Broker自身运行状态比如$SYS/broker/uptime、$SYS/broker/load等。特殊之处在于用#通配符订阅根级时默认不会匹配$SYS开头的主题。也就是说你订阅sensor/#没问题但如果想监控Broker运行指标必须显式订阅$SYS/#。我在调试中用MQTT Explorer会偶尔发现“怎么有些主题看不到”排查一圈才发现忘了单独订阅$SYS/#。这倒不是工具的问题而是协议本身的设计——避免普通业务通配符把系统主题大量拉进来。所以当你需要观察Broker内存、客户端数、消息收发统计时记得手动添加$SYS/#订阅。如果用的是MQTT X在订阅框里输入$SYS/#即可如果用mosquitto_sub也是加一条订阅即可。另外提一句有些公共Broker会关闭$SYS主题输出或者只输出部分指标。遇到这种情况可以先查一下Broker配置里的sys_interval参数把它设成大于0的值才能看到系统主题。聊到这儿我把这三款工具的功能边界、使用场景和常见坑都过了一遍。如果你最近也在为设备接入、Broker联调、topic规划发愁建议直接在电脑上把MQTT X和MQTT Explorer都装上再在服务器上顺手装个mosquitto-clients。三样东西都不大却几乎覆盖了从开发到现场排查的每一个环节。