怎么抓取 MQTT 協(xié)議數(shù)據(jù)包進(jìn)行調(diào)試分析
在使用 mqtt 協(xié)議開發(fā)物聯(lián)網(wǎng)相關(guān)項(xiàng)目或者作為消息隊(duì)列使用時,可能會遇到一些問題:
例如為什么訂閱失效了?連接為什么斷開了等等
在 MQTT5.0 中存在 code 的屬性,可以通過 code 來分析錯誤原因,而在 MQTT3.x 中沒有 code 的屬性,所以對于分析問題的話,只能借助抓包工具來分析了
可以使用tcpdump來進(jìn)行抓包,命令為:
tcpdump -i en0 port 1883 -w mqtt.pcap
這里需要注意修改網(wǎng)卡和對應(yīng)的端口號,使用ifconfig查看網(wǎng)卡信息
lo0: flags=8049
服務(wù)端 Broker 如果使用外網(wǎng)通訊則可以使用en0,而本地內(nèi)網(wǎng)通訊的話可以使用lo0
端口1883就可以按照實(shí)際對應(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ā)起請求了
$ tcpdump -i en0 port 1883 -w mqtt.pcap tcpdump: listening on en0, link-type EN10MB (Ethernet), capture size 262144 bytes
出現(xiàn)問題的請求之后,使用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 個數(shù)據(jù)包,就可以進(jìn)行分析,分析可以使用 Wireshark,打開生成的 mqtt.pcap 文件
當(dāng)然也可以直接使用 Wireshark 進(jìn)行抓包分析
而 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ā)布了錯誤的 qos 等級3,所以被斷開了鏈接,錯誤信息為:QoS not supported
具體的上下文還是要用過 Wireshark 來抓包進(jìn)行分析的
關(guān)于 PHPMQTT
MQTT 協(xié)議解析 & 協(xié)程客戶端
適用于 PHP 的 MQTT 協(xié)議解析和協(xié)程客戶端
支持 MQTT 協(xié)議 3.1、3.1.1 和 5.0 版本,支持 QoS 0、QoS 1、QoS 2
首個支持 MQTT v5.0 協(xié)議的 PHP library
文檔:https://mqtt.simps.io
GitHub:https://github.com/simps/mqtt
Gitee:https://gitee.com/phpiot/mqtt
支持記得點(diǎn)個 Star~
MQTT TCP/IP
版權(quán)聲明:本文內(nèi)容由網(wǎng)絡(luò)用戶投稿,版權(quán)歸原作者所有,本站不擁有其著作權(quán),亦不承擔(dān)相應(yīng)法律責(zé)任。如果您發(fā)現(xiàn)本站中有涉嫌抄襲或描述失實(shí)的內(nèi)容,請聯(lián)系我們jiasou666@gmail.com 處理,核實(shí)后本網(wǎng)站將在24小時內(nèi)刪除侵權(quán)內(nèi)容。