溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊(cè)×
其他方式登錄
點(diǎn)擊 登錄注冊(cè) 即表示同意《億速云用戶服務(wù)條款》

如何抓取MQTT協(xié)議數(shù)據(jù)包進(jìn)行調(diào)試分析

發(fā)布時(shí)間:2021-10-19 11:24:53 來源:億速云 閱讀:268 作者:iii 欄目:編程語言

這篇文章主要講解了“如何抓取MQTT協(xié)議數(shù)據(jù)包進(jìn)行調(diào)試分析”,文中的講解內(nèi)容簡單清晰,易于學(xué)習(xí)與理解,下面請(qǐng)大家跟著小編的思路慢慢深入,一起來研究和學(xué)習(xí)“如何抓取MQTT協(xié)議數(shù)據(jù)包進(jìn)行調(diào)試分析”吧!

在使用 MQTT 協(xié)議開發(fā)物聯(lián)網(wǎng)相關(guān)項(xiàng)目或者作為消息隊(duì)列使用時(shí),可能會(huì)遇到一些問題:

例如為什么訂閱失效了?連接為什么斷開了等等

在 MQTT5.0 中存在 code 的屬性,可以通過 code 來分析錯(cuò)誤原因,而在 MQTT3.x 中沒有 code 的屬性,所以對(duì)于分析問題的話,只能借助抓包工具來分析了

可以使用tcpdump來進(jìn)行抓包,命令為:

tcpdump -i en0 port 1883 -w mqtt.pcap
 

這里需要注意修改網(wǎng)卡和對(duì)應(yīng)的端口號(hào),使用ifconfig查看網(wǎng)卡信息

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
 

服務(wù)端 Broker 如果使用外網(wǎng)通訊則可以使用en0,而本地內(nèi)網(wǎng)通訊的話可以使用lo0

端口1883就可以按照實(shí)際對(duì)應(yīng)的端口設(shè)置,一般默認(rèn)為1883,建議使用常規(guī)的端口:

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

在執(zhí)行tcpdump之后,看到如下輸出,就可以發(fā)起請(qǐng)求了

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

出現(xiàn)問題的請(qǐng)求之后,使用CTRL+C結(jié)束,看到如下輸出:

$ 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 個(gè)數(shù)據(jù)包,就可以進(jìn)行分析,分析可以使用 Wireshark,打開生成的 mqtt.pcap 文件

當(dāng)然也可以直接使用 Wireshark 進(jìn)行抓包分析

如何抓取MQTT協(xié)議數(shù)據(jù)包進(jìn)行調(diào)試分析  

而 MQTT 5.0 協(xié)議中有 code 返回碼,可以使用 simps/mqtt 中的 Simps\MQTT\Hex\ReasonCode 轉(zhuǎn)為人類可讀的信息,如:

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 因?yàn)榘l(fā)布了錯(cuò)誤的 qos 等級(jí)3,所以被斷開了鏈接,錯(cuò)誤信息為:QoS not supported

感謝各位的閱讀,以上就是“如何抓取MQTT協(xié)議數(shù)據(jù)包進(jìn)行調(diào)試分析”的內(nèi)容了,經(jīng)過本文的學(xué)習(xí)后,相信大家對(duì)如何抓取MQTT協(xié)議數(shù)據(jù)包進(jìn)行調(diào)試分析這一問題有了更深刻的體會(huì),具體使用情況還需要大家實(shí)踐驗(yàn)證。這里是億速云,小編將為大家推送更多相關(guān)知識(shí)點(diǎn)的文章,歡迎關(guān)注!

向AI問一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場,如果涉及侵權(quán)請(qǐng)聯(lián)系站長郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI