三款开源MQTT调试工具实测:MQTTX、MQTT Explorer与MQTT CLI使用指南

发布时间:2026/9/8 21:54:08
三款开源MQTT调试工具实测:MQTTX、MQTT Explorer与MQTT CLI使用指南 做物联网开发这些年我几乎天天都在跟 MQTT 协议打交道。设备离线了、指令没回执、某个主题的数据格式不对问题一大半都能在调试工具里现出原形。最近项目里又用到几款开源 MQTT 调试工具实测下来确实好用今天专门抽时间整理成一篇使用笔记分享给同样被 MQTT 调试折磨过的朋友。无论你是刚入门物联网的新手还是已经在嵌入式、智能家居、工业采集领域摸爬滚打多年的老手这三款工具都能帮你省下大量抓包分析的时间值得人手一份。我这次要聊的是 MQTTX、MQTT Explorer、MQTT CLI 这三款开源工具。它们的定位完全不同一个像是“聊天软件”专门处理收发消息一个像是“文件树浏览器”专门把主题层级摊开给人看还有一个是“命令行利器”用来写自动化测试脚本。三者组合起来基本覆盖了我日常调试 MQTT 的绝大多数场景。1. 为什么你需要一套趁手的 MQTT 调试工具1.1 调试 MQTT 到底在“调”什么很多人一听到“调试 MQTT”第一反应就是“不就是订阅一个主题、发一条消息吗”。但真正做过量产设备接入的人都知道MQTT 调试远不只是“能连上、能说话”这么简单。它涉及连接鉴权、主题设计、QoS 语义、保留消息、遗嘱消息、心跳保活、会话恢复等一系列细枝末节任何一个环节出问题表现都是“消息发不出来”或者“订阅收不到”。举个例子设备端上报数据用的是publish云平台或者 App 端用subscribe来收。如果设备端的 Client ID 跟其他设备重了Broker 会把旧连接踢掉表现就是设备一会儿在线一会儿离线如果发布端用的是 QoS 0而订阅端期望 QoS 1消息在网络抖动时可能直接丢再比如你订阅了/dev/#但设备实际发布到了/dev/device01/data通配符中间多了一层那也一样收不到。这些现象光凭肉眼看日志基本看不出来必须有一个趁手的调试工具把“连接状态、主题关系、消息内容”同时摆在你面前才行。所以我认为调试 MQTT 本质上是在调五样东西第一Broker 地址、端口、TLS 配置是否正确第二Client ID、用户名密码是否被 Broker 接受第三主题字符串是否完全匹配通配符是否写对第四QoS 和 Retain 标志是否符合业务预期第五Payload 内容是否被上下游正确解析。只要这五样都通了设备接入才算真正跑通。而这三款工具恰好能在不同层面帮你验证这五样东西。1.2 选型思路三款工具如何各司其职最开始我其实只用一款命令行工具后来发现不同的调试场景对工具的要求完全不同。日常联调时我需要一个图形界面能快速创建连接、输入主题、点按钮发消息最好还能看到消息时间线这时候 MQTTX 最合适。等到设备数量多一些、主题层级复杂起来我又需要一种“全局视角”把整个 Topic 树可视化展开看看那台设备到底有没有在某个子主题上报数据这时候 MQTT Explorer 的价值就体现出来了。而到了写回归测试、做持续集成、或者跑到服务器上用 SSH 一台裸机抓问题时GUI 反而碍事一条命令完成发布订阅的模式才是刚需这时候 MQTT CLI 出手。这三款都是纯正的开源项目代码托管在 GitHub 上社区活跃度都很高。MQTTX 由 EMQX 团队维护适合中文用户文档也全MQTT Explorer 是个人开发者作品界面简洁克制MQTT CLI 是 HiveMQ 出品的命令行客户端理念是“把所有能力都藏进参数里”。我在下表里把它们的核心差异列了出来方便你按需选择工具主要形态核心优势最适用的场景开源地址关键词MQTTX桌面 GUI收发消息直观、多连接管理、脚本模拟日常手动联调、新人上手emqx/MQTTXMQTT Explorer桌面 GUI主题树可视化、历史数据记录观察主题结构、排查数据是否上报thomasnordquist/MQTT-ExplorerMQTT CLI命令行参数全面、易集成脚本自动化测试、远程服务器排查hivemq/mqtt-cli如果说我对选型有什么心得那就是千万别指望一款工具包打天下。图形化工具适合“人肉排查”命令行工具适合“机器执行”。平时我电脑上三款都装着哪个顺手用哪个。2. MQTTX最像“聊天软件”的桌面客户端2.1 核心功能与特色MQTTX 是我用得最多的桌面客户端界面设计得非常直观。它把 MQTT 的发布和订阅做成了类似聊天软件的形式左边是消息列表输入框在下面你发出去的消息和订阅到的消息会按时间顺序混排在一起。这种交互设计的优点是你一眼就能看出“上一条消息是什么时候发的”“对方有没有回复”调试请求和响应的对应关系时特别省力。MQTTX 的核心功能远不止发收消息这么简单。它支持同时创建多个连接每个连接可以绑定不同的 Broker、不同的 Client ID、不同的鉴权信息。这一点在做多设备模拟时很有用——我可以同时模拟一个网关和三个子设备分别连接到 Broker然后观察它们之间通过主题交互的数据流。它还支持常见的 Payload 格式切换包括 Plaintext、JSON、Hex、Base64遇到二进制帧数据时可以直接看 Hex不用自己手动转码。更让我满意的是内置脚本功能可以编写 JavaScript 脚本对收到的消息做一些自动处理比如模拟设备端收到下行指令后自动回复一条状态消息这比一个个手动点按钮高效太多了。MQTTX 是跨平台的Windows、macOS、Linux 都有安装包同时还支持 WebSocket 连接方式。如果你的 Broker 开了 WebSocket 端口用 MQTTX 也能直接连这对于前端调试物联网应用特别方便。它解决了我在实际项目里最头疼的一个问题连不连得上、消息有没有到全都在一个界面里看明白不用再反复看 Broker 端日志。2.2 安装与常用操作流程安装 MQTTX 没什么难度去 GitHub Release 页面下载对应系统的安装包就行也可以到官网下载。我一般建议直接下载绿色免安装版本解压就能跑。首次打开后主界面会提示你添加连接。我习惯把连接配置分成三类场景。第一类是本地开发环境Broker 地址写127.0.0.1端口通常是1883不需要用户名密码适合直接连本机跑的 EMQX、Mosquitto 或 NanoMQ。第二类是测试环境Broker 地址写服务器 IP端口可能是1883或8883如果开了 TLS就要在 MQTTX 里勾选 SSL/TLS 选项并加载 CA 证书。第三类是公共测试 Broker比如broker.emqx.io或test.mosquitto.org这类环境适合临时验证工具本身是否正常不适合传输生产数据。配置完连接后点“连接”按钮。如果连接成功界面变绿你就能看到 Broker 返回的 CONNACK 信息。接下来在订阅主题输入框里填#点击订阅你就能看到当前 Broker 上所有已发布的消息。如果是第一次玩我建议你先自己给自己发一条主题填test/helloPayload 填{msg:hello mqtt}QoS 选 1点发送。如果你订阅了#这条消息马上就会出现在列表里。这个过程虽然简单但能把 MQTT 最基本的“发布-订阅”模型直观地跑一遍。提示调试阶段我建议把 Retain 标志保留为 false除非你明确想测试保留消息。否则 Broker 上会残留一堆旧消息下次订阅时突然刷出来一片很容易误导判断。3. MQTT Explorer把 MQTT 主题变成“文件树”3.1 为什么推荐 MQTT Explorer如果说 MQTTX 是为“收发消息”设计的那 MQTT Explorer 就是为“理解主题结构”设计的。它会把 Broker 上目前存在的所有主题动态展开成一棵可折叠的树状结构。比如你设备上报到factory/line1/machine01/temperature树状结构就会逐级展开为factory→line1→machine01→temperature每一层都可以点击查看当前值。这种展示方式让我一下子就能看出整个设备网络的主题规划是否合理、哪些设备挂了、哪些数据在更新。MQTT Explorer 另一个让我印象深刻的地方是它会保留历史记录。当我展开一个主题节点时不仅能看到当前最新的一条消息还能看到一段时间内的历史变化曲线。对于传感器数据调试来说这相当于内置了一个简易报表工具不用再额外连数据库就直接能看到某个温度值在过去 5 分钟里的大致波动趋势排查“设备有没有周期性上报”这种问题非常直接。它的界面非常克制没有太多花哨的功能核心就是“把 Broker 上正在流动的消息结构可视化”。它同样支持连接多个 Broker支持用户名密码、TLS 配置也可以直接发消息到一个主题。虽然发消息的手感不如 MQTTX 那么顺畅但在需要边看结构边发指令的场景下也够用。尤其适合做智能家居项目的人家里几十个设备、上百个主题用 MQTTX 一条一条手动订阅效率极低用 MQTT Explorer 打开一棵主题树哪个设备在线、哪个设备已经离线一目了然。3.2 主题可视化的实战价值我举个之前做过的智能大棚项目例子。大棚里有几十个传感器节点每个节点上报空气温湿度、土壤湿度、光照强度主题格式是shed/area/node_id/metric。调试期间有一个节点的土壤湿度数据一直不刷新。用 MQTTX 订阅#后消息刷得飞快根本来不及定位是哪条消息异常。这时候我换成 MQTT Explorer 打开主题树展开shed→area→ 各node_id看到大部分叶子节点下面都有更新只有那台异常节点对应的叶子节点没有新的消息出现。我立刻断定问题出在设备端而不是 Broker 端于是直接到现场看设备日志果然是传感器 I2C 总线偶尔掉线导致上报线程挂死。这个案例很好地说明了主题可视化的实战价值它把“消息内容是否正确”和“消息是否真的存在”这两件事分开了。MQTTX 专注于前者MQTT Explorer 擅长后者。在调试复杂系统时先用 MQTT Explorer 找到“异常缺失”的主题再用 MQTTX 去精确定位某一条消息的 Payload是我屡试不爽的组合拳。顺带说一句MQTT Explorer 也可以当一个主题设计审查看板。如果你刚搭好一套主题规范拿它连上 Broker 跑一天第二天去看主题树如果某个分支出现了乱七八糟的节点那说明设备端代码里肯定有人把主题写错了。这种“用调试工具反推设计缺陷”的方式比单纯看代码走查要直观得多。4. MQTT CLI脚本自动化与线上排查利器4.1 命令行工具使用场景MQTT CLI 和前面两款图形界面工具完全走了另一条路它没有界面所有的操作都通过命令完成。最开始我总觉得“图形界面都这么强了命令行还有什么用”直到我在服务器上排查问题才意识到它的价值。生产环境的 Broker 往往部署在远程 Linux 服务器上没有图形桌面这时候想用一个 GUI 客户端去调试要么得做端口转发把服务暴露到本地要么得在服务器上装桌面环境都很麻烦。MQTT CLI 直接通过 SSH 登录服务器后就能运行轻量、无依赖只需要有 Java 运行时或直接使用官方编好的二进制非常适合线上排查。另外在自动化测试和持续集成场景里MQTT CLI 几乎是不可替代的。它可以把发布、订阅、等消息、断言结果全部写进 shell 脚本里一条命令跑完一套流程。比如我要验证“Broker 重启后设备是否能自动恢复连接并重新上报”以前我只能手动重启、手动观察现在我可以写一段脚本启动 MQTT CLI 订阅设备主题然后重启 Broker等待 60 秒再用命令查询事件是否发生。整个过程不再需要人工盯屏幕结果直接输出为脚本返回值。4.2 常用命令与参数示例MQTT CLI 的命令风格非常清晰核心子命令有pub、sub、con、dis等支持连接时指定 host、port、protocol、username、password 等参数。我常用的几个命令给你列出来。先看连接并订阅一个主题mqttcli sub -h broker.emqx.io -p 1883 -t sen/device01/data -q 1 -C 1这里的-C 1表示只接收一条消息后自动退出配合超时参数做稳定性测试很好用。如果要持续订阅去掉-C即可。再看发布一条消息mqttcli pub -h 127.0.0.1 -p 1883 -t factory/line01/machine01/status -m {state:running,temp:32.5} -q 1 -r-r表示 Retain 消息-q 1表示 QoS 1。如果你要发布二进制数据可以用-m指向文件路径或者配合 stdin 输入。实际工作中我还经常这样组合使用把发布命令写进循环模拟大量设备周期性上报测试 Broker 在高并发下的稳定性for i in $(seq 1 100); do mqttcli pub -h 127.0.0.1 -p 1883 -t dev/$i/data -m {\id\:\$i\,\ts\:$(date %s)} -q 1 done这条命令一秒之内发布了 100 条不同主题的消息。如果想模拟更真实的负载还可以在循环里加sleep模拟真实设备的发送间隔。除了 HiveMQ MQTT CLIMosquitto 自带的mosquitto_pub和mosquitto_sub也值得一提它们的实现更“老派”但稳定可靠很多服务器里已经预装不需要额外下载。两者的区别是MQTT CLI 支持更丰富的输出格式和参数更适合高级调试mosquitto_pub/sub则轻量到极致适合在资源受限的嵌入式设备里快速验证。我的建议是本地开发优先用 MQTT CLI生产环境排查哪个命令现成用哪个不用死磕工具。注意在 shell 脚本里使用密码参数时尽量通过环境变量或配置文件传入避免密码出现在 shell 历史记录或进程列表里。MQTT CLI 支持从配置文件读取连接信息正式环境建议用这种方式。5. 三款工具的联合实测从单条消息到全量报文5.1 连接统一的测试 Broker前面我分别讲了三款工具的特点但实际调试时它们往往是配合使用的。为了让你有更直观的感受我设计了一个完整的联调小场景。假设我们已经在本地启动了一个 MQTT Broker。如果你还没有 Broker用 Docker 一条命令就能拉起来一个官方 Mosquittodocker run -it --name mqtt-test -p 1883:1883 eclipse-mosquitto:2.0这条命令会在本机映射1883端口Broker 启动后没有任何鉴权规则默认本机可访问适合本地调试。生产环境一定要配置用户名密码和 ACL这里只是为了演示。现在假设场景是有一台温湿度传感器节点它每隔 5 秒向主题sensor/node01/data发布一条 JSON 消息内容包含温度和湿度。同时还周期性地向sensor/node01/status发布在线状态。我们要验证三件事第一传感器是否在周期上报第二上报的数据格式是否完整第三平台端订阅后能不能正确收到这些消息。三款工具在这个验证过程中的分工是MQTTX 负责“单点查看”MQTT Explorer 负责“全局观察”MQTT CLI 负责“模拟自动上报和最终验收”。5.2 用三款工具完成同一个调试任务先用 MQTTX 连上本地 Broker订阅sensor/#。这个通配符的写法有点讲究#放在末尾表示匹配sensor/下所有层级所以sensor/node01/data和sensor/node01/status都能收到。然后我手动向sensor/node01/data发布一条测试消息看消息是否能出现在订阅列表中。这一步的主要目的是确认 Broker 链路通不通、鉴权对不对、Payload 是否能正常显示。如果 MQTTX 这里能正常收发说明连接层基本没问题。接着打开 MQTT Explorer也连接同一个 Broker。它会自动把当前所有主题展开成树状。我盯着sensor这个根节点观察它的子节点是否持续刷新。如果data节点的值每隔几秒更新一次那说明传感器确实在正常上报如果status节点很久都没变化那我就要怀疑设备是不是只上报了数据而没有更新状态。这一步验证的是“设备实际在做什么”而不是“你以为它在做什么”。主题树不会撒谎设备上报什么它就展示什么。最后用 MQTT CLI 做一次自动化验收。我先用下面的命令订阅sensor/#持续 5 秒统计收到的消息数timeout 5 mqttcli sub -h 127.0.0.1 -p 1883 -t sensor/# -q 1 -x 5s参数-x 5s表示 Bounded subscription即订阅最多维持 5 秒自动退出。命令执行结束后统计出来的消息数量如果接近“设备 5 秒上报一条数据”的预期那说明端到端通信稳定。接下来我再模拟一个新的传感器节点sensor/node02持续向 Broker 发布模拟数据for i in $(seq 1 10); do mqttcli pub -h 127.0.0.1 -p 1883 -t sensor/node02/data \ -m {\temp\:$((20 i)),\hum\:$((50 i))} -q 1 sleep 1 done跑完这条命令后回到 MQTTX 或 MQTT Explorer就能看到sensor/node02/data这个主题下陆续出现了 10 条递增的数据。这一整套流程走下来相当于把“人工查看、全局观察、自动化验证”三个层次全部覆盖了。如果你平时开发中遇到“设备数据有时有有时没有”这种问题我强烈推荐用类似的方式从这三个角度分别排查一遍。6. 常见问题与避坑实录6.1 连接类问题MQTT 调试中遇到最多的就是连接失败。第一个坑是端口写错。明文端口通常是1883TLS 加密端口通常是8883WebSocket 端口可能是8083或8084不同 Broker 配置还不一样。我见过很多人拿着1883去连 SSL 端口或者反过来结果自然是连接超时。第二个坑是 Client ID 冲突。同一个 Client ID 同时被多个连接使用时新的连接会把旧的踢下线。排查方法很简单先用 MQTTX 建一个连接再故意用 MQTT CLI 用同样的 Client ID 去连Broker 端日志就会提示 session takeover。第三个坑是防火墙和安全组没放行端口这个在本地开发时最容易忽略。你本机连127.0.0.1:1883没问题但换到局域网 IP 就连不上八成就是防火墙拦住了。还有一个容易被忽略的问题公共 Broker 的可用性。broker.emqx.io或者test.mosquitto.org这类公共服务虽然方便但经常有其他开发者也在上面测试你可能会收到别人发布的消息也可能因为网络问题连不上。所以公共 Broker 只适合“试试工具是否正常”不适合做正式联调。我建议所有严肃一点的开发任务都使用本地 Broker成本很低又不会受外部干扰。6.2 消息消费与订阅问题订阅了主题但收不到消息这可能是新手碰到最多的怪问题。我总结了几个最常见的元凶。第一个是主题写错包括大小写、斜杠、多级通配符放错位置等。MQTT 主题是严格区分大小写的Sensor/Node01和sensor/node01是两个完全不同的主题。第二个是通配符使用错误。sport/tennis/player1/#能匹配sport/tennis/player1及其所有子主题但sport/tennis/player1/#/score这种写法是无效的#必须位于主题末尾。第三个是 Retain 消息带来的误导。Broker 会保留最后一条 Retain 消息新订阅者一进来就收到如果你没意识到这点可能会误以为设备又在发消息。建议调试时把 Retain 关掉除非你刻意在验证这个特性。QoS 也是一个容易踩坑的点。发布端和订阅端 QoS 的最终生效规则是取两者间的较低值。比如发布端 QoS 1、订阅端 QoS 0那这条消息实际是按 QoS 0 投递的网络抖动就可能丢消息。调试端只用 QoS 0 看起来没问题但生产环境对可靠性有要求时就要显式把 QoS 设为 1 或 2。另外cleanSession参数也很重要。如果订阅端cleanSession为 falseBroker 会在会话恢复时补发离线期间的消息如果为 true离线消息会直接丢弃。很多人在应用端反复重连却收不到离线消息就是因为 Broker 把会话清掉了。6.3 工具使用中的主观感受与局限性这三款工具虽然整体体验都很好但也各有各的脾气。MQTTX 在消息吞吐量特别大时会显得有点卡毕竟它要把每条消息都渲染到界面上如果你想看高频率的原始报文建议用 MQTT CLI 直接输出到终端更流畅。MQTT Explorer 的主题树在 Broker 上主题特别多时渲染效率会下降而且它的发消息功能相对简陋不适合做复杂消息的编辑和重发。MQTT CLI 的参数确实多但有些参数的组合方式一开始比较反直觉比如-x 5s这种带单位的时间写法我第一次用的时候翻了好一会儿文档。我的建议是日常开发中给三款工具做一个固定的分工看消息、发消息、回放消息用 MQTTX看主题结构、找数据缺失用 MQTT Explorer自动化验证、线上排查、写回归脚本用 MQTT CLI。不要试图在任何一个工具里完成所有事情工具选对了调试效率能翻倍。另外在团队协作时尽量让所有成员统一使用同一套调试工具并约定主题命名和消息格式规范这样在排查问题时大家看到的数据是一致的沟通成本会低很多。最后再分享一个小技巧我平时会把 MQTTX 和 MQTT CLI 结合着用刚开始开发和调试一个新功能时先用 MQTTX 人工把消息链路摸一遍确认问题和数据格式都清晰之后就会把重复的验证动作写成 MQTT CLI 脚本放到仓库里作为回归测试的一部分下次改了代码直接一条命令跑完。这些年下来光是“设备上报-平台下发-设备回复确认”这一条链路的回归脚本我就攒了几十个。根据我个人的经验调试工具的进化真的会改变物联网开发的节奏——以前是盯着十六进制报文发呆现在打开客户端就能看懂每条消息的来龙去脉。趁手的工具加上清晰的调试流程这套组合拳带给你的效率提升远比你想象的大。