物聯網平臺支持CoAP協議連接通信。CoAP協議適用在資源受限的低功耗設備上,尤其是NB-IoT的設備使用。本文介紹基于CoAP協議進行設備接入的流程,及使用DTLS和對稱加密兩種認證方式下的自主接入流程。

基礎流程

基于CoAP協議將NB-IoT設備接入物聯網平臺的流程如下圖所示。coap
序號描述
在設備端NB-IoT模塊中,集成阿里云物聯網平臺SDK。廠商在物聯網平臺控制臺申請設備證書(ProductKey、DeviceName和DeviceSecret)并燒錄到設備中。
NB-IoT設備通過運營商的蜂窩網絡進行入網。需要聯系當地運營商,確保設備所屬地區已經覆蓋NB網絡,并已具備NB-IoT入網能力。
設備入網成功后,NB設備產生的流量數據及產生的費用數據,將由運營商的M2M平臺管理。此部分平臺能力由運營商提供。
設備開發者可通過CoAP/UDP協議,將設備采集的實時數據上報到阿里云物聯網平臺,借助物聯網平臺,實現海量億級設備的安全連接和數據管理能力。并且,可通過規則引擎,將數據轉發至阿里云的大數據產品、云數據庫、表格存儲等服務中進行處理。
物聯網平臺提供相關的數據開放接口和消息推送服務,可將數據轉發到業務服務器中,實現設備資產與實際應用的快速集成。

使用對稱加密自主接入

  1. 連接CoAP服務器。
    Endpoint地址:公共實例和企業版實例中,CoAP的接入域名,請參見查看實例終端節點
  2. 如果您使用阿里云提供的設備端SDK:CoAP接入,則對稱加密默認使用PSK加密算法。
    如果您未使用阿里云提供的設備端SDK,則需要下載安全通道根證書,使用對稱加密自主連接物聯網平臺,PSK對應的加密方式如下:
    psk_id: "${authType}" + "|" + "${signMethod}" + "|" + "${productKey}" + "&" + "${deviceName}" + "timestamp"
    psk: signMethod(DeviceSecret, "${productKey}" + "&" + "${deviceName}" + "${timestamp}")
    表 1. 字段說明
    字段是否必需說明
    authType認證類型,這里設為固定值:devicename。
    signMethod算法類型,支持hmacmd5、hmacsha1、hmacsha256。
    productKey設備所屬產品的ProductKey。
    deviceName設備名稱,DeviceName。
    DeviceSecret設備的DeviceSecret
    timestamp時間戳。
  3. 設備認證。

    設備認證請求:

    POST /auth
    Host: ${YourEndpoint}
    Port: 5682
    Accept: application/json or application/cbor
    Content-Format: application/json or application/cbor
    payload: {"productKey":"a1NUjcV****","deviceName":"ff1a11e7c08d4b3db2b1500d8e0e55","clientId":"a1NUjcV****&ff1a11e7c08d4b3db2b1500d8e0e55","sign":"F9FD53EE0CD010FCA40D14A9FE******", "seq":"10"}
    表 2. 設備認證參數說明
    參數說明
    Method請求方法,只支持POST方法。
    URLURL地址,取值:/auth
    HostEndpoint地址。
    Port端口,取值:5682
    Accept設備接收的數據編碼方式。目前,支持兩種方式:application/jsonapplication/cbor
    Content-Format設備發送給物聯網平臺的上行數據的編碼格式,目前,支持兩種方式:application/jsonapplication/cbor
    payload設備認證信息內容,JSON數據格式。具體參數,請參見下表Payload說明。
    表 3. Payload 說明
    字段名稱是否必需說明
    productKey設備證書信息中ProductKey的值,是物聯網平臺為產品頒發的全局唯一標識。可從物聯網平臺控制臺對應實例下設備詳情頁面獲取。
    deviceName設備證書信息中DeviceName的值,在注冊設備時自定義或自動生成的設備名稱。可從物聯網平臺控制臺對應實例下設備詳情頁面獲取。
    ackMode通信模式。取值:
    • 0:request/response是攜帶模式,即客戶端發送請求到服務端后,服務端處理完業務,回復業務數據和ACK。
    • 1:request/response是分離模式,即客戶端發送請求到服務端后,服務端先回復一個確認ACK,然后再處理業務,回復業務數據。

    若不傳入此參數,則默認為攜帶模式。

    sign簽名。

    您需將根據簽名計算方法signmethod(DeviceSecret,content)計算出的值,作為sign的值。支持hmacmd5和hmacsha1方法。

    簽名計算所需參數:

    • signmethod:簽名方法,需與您的傳入signmethod取值一致。
    • DeviceSecret:設備的DeviceSecret。可在物聯網平臺控制臺對應實例下設備詳情頁面查看。
    • content:是將所有提交給服務器的參數(除versionsignresourcessignmethod外),按照英文字母升序,依次拼接排序(無拼接符號)。
      說明 用于簽名計算的參數值需與設備認證請求中提交的參數值一致。

    簽名計算示例:

    hmac_md5(mRPVdzSMu2nVBxzK77ERPIMxSYIv****, clientIda1NUjcV****&ff1a11e7c08d4b3db2b1500d8e0e55deviceNameff1a11e7c08d4b3db2b1500d8e0e55productKeya1NUjcV****seq10timestamp1524448722000)
    signmethod算法類型,支持hmacmd5和hmacsha1。默認是hmacmd5。
    clientId客戶端ID,長度需在64字符內。建議使用設備的MAC地址或SN碼作為clientId的值。
    timestamp時間戳。目前,時間戳不做時間窗口校驗。
    seq認證消息中攜帶的序號,是設備端生成的隨機數。

    返回結果示例:

    {"random":"ad2b3a5eb51d6****","seqOffset":1,"token":"MZ8m37hp01w1SSqoDFzo001050****.ad2b"}
    表 4. 返回參數說明
    字段名稱說明
    random用于后續上、下行加密,組成加密Key。
    seqOffset認證seq偏移初始值。
    token設備認證成功后,返回的Token值。
  4. 上報數據。

    上報數據請求:

    POST /topic/${topic}
    Host: ${YourEndpoint}
    Port: 5682
    Accept: application/json or application/cbor
    Content-Format: application/json or application/cbor
    payload: ${your_data}
    CustomOptions: number:2088, 2089
    表 5. 上報數據參數說明
    字段名稱是否必需說明
    Method請求方法,只支持POST方法。
    URL傳入格式:/topic/${topic}。其中,變量${topic}需替換為設備數據上行Topic。
    HostEndpoint地址。
    Port端口,取值:5682
    Accept設備接收的數據編碼方式。目前,支持兩種方式:application/jsonapplication/cbor
    Content-Format上行數據的編碼格式,服務端對此不做校驗。目前,支持兩種方式:application/jsonapplication/cbor
    payload待上傳的數據經高級加密標準(AES)加密后的數據。
    說明 AES加密時,Transform為AES/CBC/PKCS5Padding, 初始向量IV為543yhjy97ae7fyfg,Key由sha256算法生成。

    Key生成示例:

    假設deviceSecret=zPwChiLh0EaifR809D5Rc6LDIC6A****,設備認證返回random=8fe3c8d50e10****
    1. deviceSecretrandom按照${deviceSecret},${random}格式組成以下字符串。
      zPwChiLh0EaifR809D5Rc6LDIC6A****,8fe3c8d50e10****
    2. 使用sha256對以上字符串的UTF-8編碼結果進行加密,并轉換為16進制字符串。
      59ea5ac1cb092e5910c405821119959e5297516d185b71e344735cf3f268****
    3. 從上一步得到的字符串的第17位開始,截取長度為32位的字符串(subString(16,48)),得到密鑰。
      10c405821119959e5297516d185b71e3
    CustomOptionsoption值有20882089兩種類型:
    • 2088:表示token,取值為設備認證后返回的token值。
      說明 每次上報數據都需要攜帶token信息。如果token失效,需要重新進行設備認證,獲取token
    • 2089:表示seq,取值需比設備認證后返回的seqOffset值更大,且在認證生效周期內不重復的隨機值。建議設置為根據每次請求數據包中的seq遞增值,使用上一欄所介紹的方法進行AES加密填充。

    option返回示例:

    number:2090

    2090:表示物聯網平臺的云端消息ID。

    tokenseq除了寫在options中,還可以寫在URL中,例如/topic/${topic}?token=xxxx&seq=xxxxx。如果同時存在于options和URL中,以options為準。

    消息上行成功后,返回成功狀態碼,同時返回物聯網平臺生成的消息ID。

使用DTLS自主接入

  1. 連接CoAP服務器。
    Endpoint地址:公共實例和企業版實例中,CoAP的接入域名,請參見查看實例終端節點
  2. 下載DTLS安全通道根證書,使用DTLS庫連接物聯網平臺,PSK對應的加密方式如下。
    psk_id: "${authType}" + "|" + "${signMethod}" + "|" + "${productKey}" + "&" + "${deviceName}" + "timestamp"
    psk: signMethod(DeviceSecret, "${productKey}" + "&" + "${deviceName}" + "${timestamp}")
    表 6. 字段說明
    字段是否必需說明
    authType認證類型,這里設為固定值:devicename。
    signMethod算法類型,支持hmacmd5、hmacsha1、hmacsha256。
    productKey設備所屬產品的ProductKey。
    deviceName設備名稱,DeviceName。
    DeviceSecret設備的DeviceSecret
    timestamp時間戳。
  3. 設備認證。使用auth接口認證設備,獲取Token。上報數據時,需攜帶Token信息。

    設備認證請求:

    POST /auth
    Host: ${YourEndpoint}
    Port: 5684
    Accept: application/json or application/cbor
    Content-Format: application/json or application/cbor
    payload: {"productKey":"ZG1EvTE****","deviceName":"NlwaSPXsCpTQuh8FxBGH","clientId":"mylight1000002","sign":"bccb3d2618afe74b3eab12b94042****"}

    Port參數外,其他參數及Payload內容說明,可參見使用對稱加密自主接入

    返回結果示例:

    response:{"token":"f13102810756432e85dfd351eeb4****"}
    表 7. 返回碼說明
    Code描述Payload備注
    2.05Content認證通過:Token對象正確請求。
    4.00Bad Requestno payload請求發送的Payload非法。
    4.01Unauthorizedno payload未授權的請求。
    4.03Forbiddenno payload禁止的請求。
    4.04Not Foundno payload請求的路徑不存在。
    4.05Method Not Allowedno payload請求方法不是指定值。
    4.06Not Acceptableno payloadAccept不是指定的類型。
    4.15Unsupported Content-Formatno payload請求的content不是指定類型。
    5.00Internal Server Errorno payloadauth服務器超時或錯誤。
  4. 上行數據。
    設備通過指定自定義Topic將數據發送到物聯網平臺。

    可在物聯網平臺控制臺,設備所屬產品的產品詳情頁面的Topic類列表中,創建自定義Topic。僅支持發布權限的Topic用于數據上報。

    例如:Topic為/${YourProductKey}/${YourDeviceName}/pub,假設當前設備名稱為device,所屬產品的ProductKey為a1GFjLP****,那么您可使用 a1GFjLP****.coap.cn-shanghai.link.aliyuncs.com:5684/topic/a1GFjLP****/device/pub 地址來上報數據。

    上報數據請求:

    POST /topic/${topic}
    Host: ${YourEndpoint}
    Port: 5684
    Accept: application/json or application/cbor
    Content-Format: application/json or application/cbor
    payload: ${your_data}
    CustomOptions: number:2088
    表 8. 上報數據請求參數說明
    參數是否必需說明
    Method請求方法。支持POST方法。
    URL/topic/${topic}。其中,變量${topic}需替換為當前設備對應的Topic。
    HostEndpoint地址。
    Port端口,取值:5684
    Accept設備接收的數據編碼方式。目前,支持兩種方式:application/jsonapplication/cbor
    Content-Format上行數據的編碼格式,服務端對此不做校驗。目前,支持兩種方式:application/jsonapplication/cbor
    CustomOptions
    • number取值:2088
    • token為設備認證(auth)返回的token值。
    說明 每次上報數據都需要攜帶token信息。如果token失效,需要重新進行設備認證,獲取token

示例

設備通過CoAP協議接入物聯網平臺的示例,請參見: