物聯網平臺支持基于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接入地址信息,請參見查看實例終端節點
    • 端口: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)
      其中:
      • mqttClientId:格式中| |內為擴展參數。
      • clientId:表示客戶端ID,可自定義,長度不可超過64個字符。建議使用設備的MAC地址或SN碼,方便您識別區分不同的客戶端。
      • securemode:表示目前安全模式,可選值有2(wss協議)和3(ws協議)。
      • signmethod:表示簽名算法類型。支持hmacmd5,hmacsha1和hmacsha256,默認為hmacmd5。
      • timestamp:表示當前時間毫秒值,可以不傳遞。
      • mqttPassword:sign簽名需把提交給服務器的參數按字典排序后,根據signmethod加簽。簽名計算示例,請參見MQTT連接簽名示例
      • content的值為提交給服務器的參數(productKeydeviceNametimestampclientId),按照參數名稱首字母字典排序, 然后將參數值依次拼接。
        重要 此處productKeydeviceName為必填參數,timestampclientId為可選參數。若傳入timestampclientId,必須與mqttClientId中的設置相同。
    連接示例以企業版實例(實例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認證接入示例