在物聯網平台控制台為產品開啟動態註冊功能後,直連裝置可使用一型一密安全認證方式完成動態註冊,通過MQTT通訊協定串連物聯網平台。裝置先基於TLS建立與物聯網平台的串連,擷取MQTT串連所需的裝置密鑰,再中斷連線,然後重建立立MQTT串連進行通訊。本文介紹裝置的動態註冊流程。
前提條件
一型一密免預註冊的地區限制、執行個體限制、操作流程等資訊,請參見一型一密免預註冊。
已完成一型一密文檔中的以下步驟:
建立產品。
開啟動態註冊。
添加裝置。
產線燒錄。
動態註冊流程
裝置發送CONNECT報文,報文中包含動態註冊參數,請求建立串連。
說明目前,動態註冊只支援使用TLS建立串連,不支援TCP直連。動態註冊時,物聯網平台不會校正MQTT串連的Keep Alive(保活時間),因此可以不用設定Keep Alive時間。
MQTT串連網域名稱說明:公用執行個體和企業版執行個體中,MQTT的接入網域名稱,請參見查看和配置執行個體終端節點資訊(Endpoint)。
說明若直連裝置使用一型一密免預註冊認證方式,則${YourRegionId}值為
cn-shanghai
。CONNECT報文的動態註冊參數:
當裝置屬於新版公用執行個體或企業版執行個體時,動態註冊參數如下:
mqttClientId:clientId+"|securemode=-2,authType=xxxx,random=xxxx,signmethod=xxxx,instanceId=xxxx|" mqttUserName: deviceName+"&"+productKey mqttPassword:sign_hmac(productSecret,content)
當裝置屬於舊版公用執行個體時,動態註冊參數如下:
mqttClientId:clientId+"|securemode=2,authType=xxxx,random=xxxx,signmethod=xxxx|" mqttUserName: deviceName+"&"+productKey mqttPassword:sign_hmac(productSecret,content)
說明執行個體的詳細說明,請參見執行個體概述。
參數說明:
mqttClientId
參數取值中包含的詳細參數如下表所示。
參數
說明
clientId
用戶端ID,可自訂,長度在64個字元內。建議使用裝置的MAC地址或SN碼,方便您識別區分不同的用戶端。
securemode
安全模式。
authType
一型一密認證方式,不同類型將返回不同的認證參數:
random
隨機數。您自訂隨機數。
signMethod
簽名演算法。目前支援hmacmd5、hmacsha1、hmacsha256。
instanceId
執行個體ID。請登入物聯網平台控制台,在執行個體概覽頁面查看。
mqttUserName
組成結構:
deviceName+"&"+productKey
樣本:
device1&al123456789
mqttPassword
計算方法:
sign_hmac(productSecret,content)
其中,content的值是提交給伺服器的必需參數和值(deviceName、productKey、random)按照字母順序排序、拼接(無拼接符號)的字串。然後,將content的值通過mqttClientId中的signMethod指定的演算法,使用產品的ProductSecret進行簽名計算。
樣本:
hmac_sha1(h1nQFYPZS0mW****, deviceNamedevice1productKeyal123456789random123)
物聯網平台返回CONNECT ACK。
返回0,表示裝置動態註冊成功。
返回其他值,表示裝置動態註冊失敗。請根據返回的錯誤碼,確定錯誤原因。
裝置發送串連請求後,物聯網平台返回的結果狀態代碼和說明如下表。
結果碼
訊息
說明
0
CONNECTION_ACCEPTED
動態註冊成功。
2
IDENTIFIER_REJECTED
參數錯誤。原因可能是:
必填參數缺失或格式錯誤。
您使用了TCP直連註冊。動態註冊只能使用TLS通道。
3
SERVER_UNAVAILABLE
雲端錯誤。請稍後再試。
4
BAD_USERNAME_OR_PASSWORD
動態註冊失敗,鑒權未通過。
請檢查傳入的mqttUserName和mqttPassword取值是否正確。
建立串連後,物聯網平台通過推送認證的Topic,根據CONNECT報文中的authType,返回不同的認證參數。
說明裝置無需訂閱推送認證的Topic。
一型一密預註冊認證方式:Topic為
/ext/register
,authType取值為register,返回DeviceSecret。物聯網平台推送的訊息Payload格式如下:
{ "productKey" : "***", "deviceName" : "***", "deviceSecret" : "***" }
一型一密免預註冊認證方式:Topic為
/ext/regnwl
,authType取值為regnwl,返回ClientID、DeviceToken。物聯網平台推送的訊息Payload格式如下:
{ "productKey" : "***", "deviceName" : "***", "clientId" : "***", "deviceToken" : "***" }
裝置收到並儲存DeviceSecret,或ClientID和DeviceToken的組合,斷開當前MQTT串連。
裝置可以通過發送DISCONNECT報文或直接斷開TCP串連,斷開當前串連。
如果裝置未斷開此串連,15秒之後,物聯網平台會主動中斷連線。
如果您使用Eclipse Paho MQTT用戶端,需設定
MqttConnectOptions.setAutomaticReconnect(false)
關閉自動重連。否則,註冊成功且TCP斷連後,重連邏輯會發起新的動態註冊請求。裝置使用DeviceSecret(一型一密預註冊),或將ClientID轉化為mqttClientId後和DeviceToken組合(一型一密免預註冊),再次發起MQTT串連請求,建立裝置與物聯網平台的串連,進行訊息通訊。具體操作,請參見MQTT-TLS串連通訊。
操作範例
直連裝置的動態註冊樣本,請參見一型一密動態註冊(MQTT通道)。