千家信息网

如何抓取MQTT协议数据包进行调试分析

发表于:2025-11-08 作者:千家信息网编辑
千家信息网最后更新 2025年11月08日,这篇文章主要讲解了"如何抓取MQTT协议数据包进行调试分析",文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习"如何抓取MQTT协议数据包进行调试分析"吧!在
千家信息网最后更新 2025年11月08日如何抓取MQTT协议数据包进行调试分析

这篇文章主要讲解了"如何抓取MQTT协议数据包进行调试分析",文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习"如何抓取MQTT协议数据包进行调试分析"吧!

在使用 MQTT 协议开发物联网相关项目或者作为消息队列使用时,可能会遇到一些问题:

例如为什么订阅失效了?连接为什么断开了等等

在 MQTT5.0 中存在 code 的属性,可以通过 code 来分析错误原因,而在 MQTT3.x 中没有 code 的属性,所以对于分析问题的话,只能借助抓包工具来分析了

可以使用tcpdump来进行抓包,命令为:

tcpdump -i en0 port 1883 -w mqtt.pcap

这里需要注意修改网卡和对应的端口号,使用ifconfig查看网卡信息

lo0: flags=8049 mtu 16384
options=1203
inet 127.0.0.1 netmask 0xff000000
inet6 ::1 prefixlen 128
inet6 fe80::1%lo0 prefixlen 64 scopeid 0x1
nd6 options=201

en0: flags=8863 mtu 1500
options=400
ether f0:18:98:ae:9e:df
inet6 fe80::1053:12ff:524e:c2a2%en0 prefixlen 64 secured scopeid 0x6
inet 192.168.2.139 netmask 0xffffff00 broadcast 192.168.2.255
nd6 options=201
media: autoselect
status: active

服务端 Broker 如果使用外网通讯则可以使用en0,而本地内网通讯的话可以使用lo0

端口1883就可以按照实际对应的端口设置,一般默认为1883,建议使用常规的端口:

1883 : MQTT, unencrypted 8883 : MQTT, encrypted 8884 : MQTT, encrypted, client certificate required 8887 : MQTT, encrypted, server certificate deliberately expired 8080 : MQTT over WebSockets, unencrypted 8081 : MQTT over WebSockets, encrypted

在执行tcpdump之后,看到如下输出,就可以发起请求了

$ tcpdump -i en0 port 1883 -w mqtt.pcap
tcpdump: listening on en0, link-type EN10MB (Ethernet), capture size 262144 bytes

出现问题的请求之后,使用CTRL+C结束,看到如下输出:

$ tcpdump -i en0 port 1883 -w mqtt.pcap
tcpdump: listening on en0, link-type EN10MB (Ethernet), capture size 262144 bytes
^C14 packets captured
70 packets received by filter
0 packets dropped by kernel

表示捕获到了 14 个数据包,就可以进行分析,分析可以使用 Wireshark,打开生成的 mqtt.pcap 文件

当然也可以直接使用 Wireshark 进行抓包分析

而 MQTT 5.0 协议中有 code 返回码,可以使用 simps/mqtt 中的 Simps\MQTT\Hex\ReasonCode 转为人类可读的信息,如:

use Simps\MQTT\Client;
use Simps\MQTT\Hex\ReasonCode;
use Simps\MQTT\Protocol\V5;
use Simps\MQTT\Config\ClientConfig;
use function Swoole\Coroutine\run;

run(function () {
$config = (new ClientConfig())->setClientId(Client::genClientID())
->setKeepAlive(10)
->setDelay(3000) // 3s
->setMaxAttempts(5)
->setProtocolLevel(V5::MQTT_PROTOCOL_LEVEL_5_0)
->setSwooleConfig([
'open_mqtt_protocol' => true,
'package_max_length' => 2 * 1024 * 1024,
'connect_timeout' => 5.0,
]);

$client = new Client('broker.emqx.io', 1883, $config);
$res = $client->connect();
var_dump('Connect: ' . ReasonCode::getReasonPhrase($res['code']));
$res = $client->publish('simps-mqtt/test', 'hello', 3);
var_dump($res);
var_dump('Publish: ' . ReasonCode::getReasonPhrase($res['code']));
});

connect 可以正常成功,返回Success,而 publish 因为发布了错误的 qos 等级3,所以被断开了链接,错误信息为:QoS not supported

感谢各位的阅读,以上就是"如何抓取MQTT协议数据包进行调试分析"的内容了,经过本文的学习后,相信大家对如何抓取MQTT协议数据包进行调试分析这一问题有了更深刻的体会,具体使用情况还需要大家实践验证。这里是,小编将为大家推送更多相关知识点的文章,欢迎关注!

分析 数据 问题 信息 端口 错误 学习 内容 属性 网卡 通讯 输出 成功 人类 协议开发 原因 口号 可以通过 命令 实际 数据库的安全要保护哪些东西 数据库安全各自的含义是什么 生产安全数据库录入 数据库的安全性及管理 数据库安全策略包含哪些 海淀数据库安全审计系统 建立农村房屋安全信息数据库 易用的数据库客户端支持安全管理 连接数据库失败ssl安全错误 数据库的锁怎样保障安全 网络安全 话题 无锡节能软件开发销售公司 app 游戏 软件开发公司 手机gps就是移动数据库 数据库技术不足 方舟普通服务器和优质服务器区别 漫画网络安全美术 633网络技术基础是哪本书 集成科技互联网公司 提供深信服网络安全解决方案 服务器的几用户几核心是什么意思 高淳区网络软件开发质量保证 分布式数据库开发培训 农村邮政物流供应链数据库 权力软件开发 软件开发流程和项目管理 HDS管理服务器 现代网络技术是文化传播 帆软统计报表数据库查询配置 数据库查询字和倒数 南京微型软件开发方法 黄金行情分析软件开发完整正式版 重庆展览展厅中控服务器 数据库文件组类型 临沂安锐网络技术有限公司 部队网络安全教育案例 南宁哪里有做网络安全专业的 有孚网络技术怎么样 战术小队新手找不到服务器 鞍山每搜网络技术有限公司官网
0