千家信息网

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

发表于:2025-01-18 作者:千家信息网编辑
千家信息网最后更新 2025年01月18日,这篇文章主要讲解了"如何抓取MQTT协议数据包进行调试分析",文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习"如何抓取MQTT协议数据包进行调试分析"吧!在
千家信息网最后更新 2025年01月18日如何抓取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安全错误 数据库的锁怎样保障安全 河南运营网络技术服务代理品牌 浙江鼎启网络科技服务器 软件防止数据库密码泄露 千人基因组计划数据库 华中科技大学 数据库试卷 流放之路魔卫复苏数据库 中国社会与经济发展数据库 网络安全检查工作简报题名 蚌埠飞天网络技术 网络技术破解入侵博客批量 河北水淼网络技术有限公司 2019网络安全案例及分析 中国主服务器谁管理 宜兴网络营销软件开发预算 peer强震数据库 用pc学人工智能还是弄服务器 江陵租房软件开发 买手机一直显示服务器未接入 软件开发工资高还是建筑工程 网络安全服务公司业务 线性代数和数据库应用技术 xp 代理服务器设置 网络安全的十不要 三级网络技术的序列号 全省法院网络技术应用培训班 广东pdu服务器电源有什么作用 精通网络安全技术 服务器新建安全策略 相城区正规网络技术优势 广州京远系统网络技术有限公司
0