温馨提示×

温馨提示×

您好,登录后才能下订单哦!

密码登录×
登录注册×
其他方式登录
点击 登录注册 即表示同意《亿速云用户服务条款》

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

发布时间:2021-10-19 11:24:53 阅读:304 作者:iii 栏目:编程语言
开发者测试专用服务器限时活动,0元免费领,库存有限,领完即止! 点击查看>>

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

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

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

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

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

tcpdump -i en0 port 1883 -w mqtt.pcap
 

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

lo0: flags=8049<UP,LOOPBACK,RUNNING,MULTICAST> mtu 16384	options=1203<RXCSUM,TXCSUM,TXSTATUS,SW_TIMESTAMP>	inet 127.0.0.1 netmask 0xff000000	inet6 ::1 prefixlen 128	inet6 fe80::1%lo0 prefixlen 64 scopeid 0x1	nd6 options=201<PERFORMNUD,DAD>en0: flags=8863<UP,BROADCAST,SMART,RUNNING,SIMPLEX,MULTICAST> mtu 1500	options=400<CHANNEL_IO>	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<PERFORMNUD,DAD>	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.pcaptcpdump: listening on en0, link-type EN10MB (Ethernet), capture size 262144 bytes
 

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

$ tcpdump -i en0 port 1883 -w mqtt.pcaptcpdump: listening on en0, link-type EN10MB (Ethernet), capture size 262144 bytes^C14 packets captured70 packets received by filter0 packets dropped by kernel
 

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

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

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

而 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协议数据包进行调试分析这一问题有了更深刻的体会,具体使用情况还需要大家实践验证。这里是亿速云,小编将为大家推送更多相关知识点的文章,欢迎关注!

亿速云「云服务器」,即开即用、新一代英特尔至强铂金CPU、三副本存储NVMe SSD云盘,价格低至29元/月。点击查看>>

向AI问一下细节

免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。

原文链接:https://my.oschina.net/lufeidot/blog/5026276

AI

开发者交流群×