MQTT-WebSocket連接配接通信
更新時間:2020-09-08 16:57:21
編輯我的收藏
本頁目錄
- 背景資訊
- 操作步驟
物聯網平台支援基于WebSocket的MQTT協定。您可以首先使用WebSocket建立連接配接,然後在WebSocket通道上,使用MQTT協定進行通信,即MQTT over WebSocket。
背景資訊
使用WebSocket方式主要有以下優勢:
- 使基于浏覽器的應用程式可以像普通裝置一樣,具備與服務端建立MQTT長連接配接的能力。
- WebSocket方式使用443端口,消息可以順利穿過大多數防火牆。
操作步驟
-
證書準備。
WebSocket可以使用ws和wss兩種方式,ws就是普通的WebSocket連接配接,wss就是增加了TLS加密。如果使用wss方式進行安全連接配接,需要使用和TLS直連一樣的根證書。
-
用戶端選擇。
直接使用官方用戶端,隻需要替換連接配接URL即可。其他語言版本用戶端或者是自主接入,請參考開源MQTT用戶端參考,使用前請閱讀相關用戶端的說明,是否支援WebSocket方式。
-
連接配接說明。
使用WebSocket方式進行連接配接,差別主要在MQTT連接配接URL的協定和端口号,MQTT連接配接參數和TCP直接連接配接方式完全相同,其中要注意securemode參數,使用wss方式連接配接時securemode=2,使用ws方式連接配接時securemode=3。
- 接入域名:
- 您購買的執行個體的接入域名,請在物聯網平台控制台執行個體管理頁面,單擊執行個體對應的檢視,進入執行個體詳情頁檢視。
- 公共執行個體的接入域名:
。 其中:${YourProductKey}.iot-as-mqtt.${YourRegionId}.aliyuncs.com
- ${YourProductKey}:請替換為裝置所屬産品的的ProductKey。可從物聯網平台控制台裝置詳情頁擷取。
- ${YourRegionId}:請參見地域和可用區替換為您的Region ID。
- 端口:443。
-
可變報頭(variable header):Keep Alive。
Connect指令中需包含Keep Alive(保活時間)。保活心跳時間取值範圍為30至1200秒。如果心跳時間不在此區間内,物聯網平台會拒絕連接配接。建議取值300秒以上。如果網絡不穩定,将心跳時間設定高一些。
裝置端在保活時間間隔内,至少需要發送一次封包,包括PING請求。
如果物聯網平台在保活時間内無法收到任何封包,物聯網平台會斷開連接配接,裝置端需要進行重連。
- MQTT的Connect封包參數如下:
其中,mqttClientId: clientId+"|securemode=3,signmethod=hmacsha1,timestamp=132323232|" mqttUsername: deviceName+"&"+productKey mqttPassword: sign_hmac(deviceSecret,content)sign簽名需要把以下參數按字典序排序後,再根據signmethod加簽。 content=送出給伺服器的參數(productKey,deviceName,timestamp,clientId), 按照字母順序排序, 然後将參數值依次拼接
- clientId:表示用戶端ID,建議mac或sn,64字元内。
- timestamp:表示目前時間毫秒值,可選。
- mqttClientId:格式中
内為擴充參數。||
- signmethod:表示簽名算法類型。
- securemode:表示目前安全模式,可選值有2 (wss協定)和3(ws協定)。
clientId = 12345,deviceName = device, productKey = pk, timestamp = 789,signmethod=hmacsha1,deviceSecret=secret
- 使用ws方式
- 連接配接域名
ws://pk.iot-as-mqtt.cn-shanghai.aliyuncs.com:443
- 連接配接參數
mqttclientId=12345|securemode=3,signmethod=hmacsha1,timestamp=789| mqttUsername=device&pk mqttPasswrod=hmacsha1("secret","clientId12345deviceNamedeviceproductKeypktimestamp789").toHexString();
- 連接配接域名
- 使用wss方式
- 連接配接域名
wss://pk.iot-as-mqtt.cn-shanghai.aliyuncs.com:443
- 連接配接參數
mqttclientId=12345|securemode=2,signmethod=hmacsha1,timestamp=789| mqttUsername=device&pk mqttPasswrod=hmacsha1("secret","clientId12345deviceNamedeviceproductKeypktimestamp789").toHexString();
- 連接配接域名
- 接入域名: