1. 背景[]
當我們進行物聯網開發過程中,裝置調試有時候很難進行,就需要借助網絡抓包工具Wireshark來幫我們分析裝置行為,定位問題。下面我們通過一個簡單案例,給大家講解使用Wireshark分析裝置與阿裡雲IoT物聯網平台通信的過程。
2. 準備工作
2.1 建立裝置
在阿裡雲IoT物聯網平台建立産品,并注冊裝置,擷取三元組。
2.2 裝置模拟程式
我們在電腦上用Nodejs編寫device模拟程式,建立連接配接,訂閱,釋出,斷開連接配接。
/**
* node aliyun-iot-device.js
*/
const mqtt = require('aliyun-iot-mqtt');
//裝置身份三元組+區域
const options = {
"productKey": "裝置PK",
"deviceName": "裝置DN",
"deviceSecret": "裝置Secret",
"regionId": "cn-shanghai"
};
//1.建立連接配接
const client = mqtt.getAliyunIotMqttClient(options);
//2.訂閱主題
setTimeout(function() {
client.subscribe(`/${options.productKey}/${options.deviceName}/user/get`)
}, 3 * 1000);
//3.釋出消息
setTimeout(function() {
client.publish(`/${options.productKey}/${options.deviceName}/user/update`, getPostData(),{qos:1});
}, 5 * 1000);
//4.關閉連接配接
setTimeout(function() {
client.end();
}, 8 * 1000);
function getPostData() {
const payloadJson = {
temperature: Math.floor((Math.random() * 20) + 10),
humidity: Math.floor((Math.random() * 20) + 10)
}
console.log("payloadJson " + JSON.stringify(payloadJson))
return JSON.stringify(payloadJson);
}
2.3 使用Wireshark抓取網絡包
IoT物聯網平台使用MQTT協定通信,我們隻需要配置如下規則即可:
tcp and port 1883
2.4 啟動模拟程式
3. 網絡抓包分析
随着模拟腳本執行完畢,完整的MQTT網絡互動過程都在wireshark捕捉到了。
為了友善我把裝置ip标記成了 device,本次連接配接的阿裡雲IoT的IP保持不變。
3.1 TCP的三次握手
上面截圖紅框部分就是 TCP 的三次握手行為。由device的發起,裝置端用的端口是 56150。
3.2 MQTT的CONNECT行為
下圖展示了MQTT的Connect的行為。
點選Connect記錄,在底部可以看到詳細封包。其中client id,user name,password是這次CONNECT用來驗證裝置合法性的身份資訊。想了解細節請
移步這裡。
身份驗證完成,IoT物聯網平台會回複CONNACK作為CONNECT的響應。
3.3 MQTT的SUBSCRIBE行為
下圖展示了device向IoT物聯網平台訂閱topic的過程。這裡device主動訂閱了一個Topic,見紅框部分。
下圖展示了IoT物聯網平台響應device訂閱的行為。
3.3 MQTT的PUBLISH行為
下圖展示了device向IoT物聯網平台PUBLISH一條QoS=1的消息。在封包資訊裡,我們可以看到消息對應的Topic和Payload。
由于是QoS=1消息,IoT物聯網平台會回複一條PUBACK給device。
在IoT物聯網控制台的日志服務也能看到這條消息日志。
3.4 MQTT的DISCONNECT行為
下圖展示了device主動發起DISCONNECT指令,斷開MQTT連接配接通道。
3.5 TCP的四次揮手
在IoT物聯網控制台的日志服務也能看到完整的裝置上下線日志,如下。
4. 結束語
至此,我們掌握了使用Wireshark抓包工具分析裝置和阿裡雲IoT物聯網平台網絡通信的基本技能,希望對大家IoT物聯網開發有所幫助。
5. 附錄
TCP層的幾個辨別
SYN | 表示建立連接配接 |
---|---|
FIN | 表示關閉連接配接 |
ACK | 表示響應 |
PSH | 表示有 DATA資料傳輸 |
RST | 表示連接配接重置 |