您好,登錄后才能下訂單哦!
這篇文章主要講解了“如何抓取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.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協議數據包進行調試分析這一問題有了更深刻的體會,具體使用情況還需要大家實踐驗證。這里是億速云,小編將為大家推送更多相關知識點的文章,歡迎關注!
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。