全部產品
Search
文件中心

IoT Platform:MQTT-WebSocket串連通訊

更新時間:Jun 30, 2024

物聯網平台支援基於WebSocket的MQTT協議。您可以首先使用WebSocket建立串連,然後在WebSocket通道上使用MQTT協議進行通訊,即MQTT over WebSocket。

背景資訊

使用WebSocket方式主要有以下優勢:
  • 使基於瀏覽器的應用程式可以像普通裝置一樣,具備與服務端建立MQTT長串連的能力。
  • WebSocket方式使用443連接埠,訊息可以順利穿過大多數防火牆。

操作步驟

  1. 準備認證。

    WebSocket可以使用ws和wss兩種方式,ws是普通的WebSocket串連,wss是增加了TLS加密。如果使用wss方式進行安全連線,需要使用和TLS直連相同的根憑證

  2. 選擇用戶端。

    直接使用官方用戶端,僅需替換串連URL。其他語言版本用戶端或者是自主接入,請參見開源MQTT用戶端。使用前請閱讀相關用戶端的說明,是否支援WebSocket方式。

  3. 串連說明。

    使用WebSocket方式進行串連,區別主要在MQTT串連URL的協議和連接埠號碼,MQTT串連參數和TCP直接連接方式完全相同,其中要注意securemode參數,使用wss方式串連時,配置securemode=2,使用ws方式串連時,配置securemode=3

    • 接入網域名稱:格式為wss://${MQTT接入地址}ws://${MQTT接入地址}公用執行個體和企業版執行個體中裝置的MQTT接入地址資訊,請參見查看和配置執行個體終端節點資訊(Endpoint)
    • 連接埠: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)
      其中:
      • securemode:表示目前安全模式,可選值有2(wss協議)和3(ws協議)。
    串連樣本以企業版執行個體(執行個體ID為iot-06****9)下裝置為例,預置前提如下:
    clientId = 12345,deviceName = device, productKey = pk, timestamp = 789,signmethod=hmacsha1,deviceSecret=secret
    串連參數如下:
    • 使用ws方式:
      • 串連網域名稱:
        ws://iot-06****9.mqtt.iothub.aliyuncs.com:443
      • 串連參數:
        mqttclientId=12345|securemode=3,signmethod=hmacsha1,timestamp=789|
        mqttUsername=device&pk
        mqttPasswrod=hmacsha1("secret","clientId12345deviceNamedeviceproductKeypktimestamp789").toHexString(); 
    • 使用wss方式:
      • 串連網域名稱:
        wss://iot-06****9.mqtt.iothub.aliyuncs.com:443
      • 串連參數:
        mqttclientId=12345|securemode=2,signmethod=hmacsha1,timestamp=789|
        mqttUsername=device&pk
        mqttPasswrod=hmacsha1("secret","clientId12345deviceNamedeviceproductKeypktimestamp789").toHexString();

    建議您使用裝置端SDK接入物聯網平台。如果您自行開發接入,請參見MQTT串連簽名樣本

操作範例

MQTT-WebSocket認證接入樣本