物聯網平臺支持CoAP協議連接通信。CoAP協議適用在資源受限的低功耗設備上,尤其是NB-IoT的設備使用。本文介紹基于CoAP協議進行設備接入的流程,及使用DTLS和對稱加密兩種認證方式下的自主接入流程。
基礎流程
序號 | 描述 |
---|---|
① | 在設備端NB-IoT模塊中,集成阿里云物聯網平臺SDK。廠商在物聯網平臺控制臺申請設備證書(ProductKey、DeviceName和DeviceSecret)并燒錄到設備中。 |
② | NB-IoT設備通過運營商的蜂窩網絡進行入網。需要聯系當地運營商,確保設備所屬地區已經覆蓋NB網絡,并已具備NB-IoT入網能力。 |
③ | 設備入網成功后,NB設備產生的流量數據及產生的費用數據,將由運營商的M2M平臺管理。此部分平臺能力由運營商提供。 |
④ | 設備開發者可通過CoAP/UDP協議,將設備采集的實時數據上報到阿里云物聯網平臺,借助物聯網平臺,實現海量億級設備的安全連接和數據管理能力。并且,可通過規則引擎,將數據轉發至阿里云的大數據產品、云數據庫、表格存儲等服務中進行處理。 |
⑤ | 物聯網平臺提供相關的數據開放接口和消息推送服務,可將數據轉發到業務服務器中,實現設備資產與實際應用的快速集成。 |
使用對稱加密自主接入
- 連接CoAP服務器。Endpoint地址:公共實例和企業版實例中,CoAP的接入域名,請參見查看實例終端節點。
- 如果您使用阿里云提供的設備端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 是 時間戳。 - 設備認證。
設備認證請求:
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方法。 URL URL地址,取值: /auth
。Host Endpoint地址。 Port 端口,取值: 5682
。Accept 設備接收的數據編碼方式。目前,支持兩種方式:application/json和application/cbor。 Content-Format 設備發送給物聯網平臺的上行數據的編碼格式,目前,支持兩種方式:application/json和application/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:是將所有提交給服務器的參數(除version、sign、resources和signmethod外),按照英文字母升序,依次拼接排序(無拼接符號)。 說明 用于簽名計算的參數值需與設備認證請求中提交的參數值一致。
簽名計算示例:
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值。 - 上報數據。
上報數據請求:
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。Host 是 Endpoint地址。 Port 是 端口,取值: 5682
。Accept 是 設備接收的數據編碼方式。目前,支持兩種方式:application/json和application/cbor。 Content-Format 是 上行數據的編碼格式,服務端對此不做校驗。目前,支持兩種方式:application/json和application/cbor。 payload 是 待上傳的數據經高級加密標準(AES)加密后的數據。 說明 AES加密時,Transform為AES/CBC/PKCS5Padding
, 初始向量IV為543yhjy97ae7fyfg
,Key由sha256算法生成。Key生成示例:
假設deviceSecret=zPwChiLh0EaifR809D5Rc6LDIC6A****
,設備認證返回random=8fe3c8d50e10****
。- 將deviceSecret和random按照
${deviceSecret},${random}
格式組成以下字符串。zPwChiLh0EaifR809D5Rc6LDIC6A****,8fe3c8d50e10****
- 使用sha256對以上字符串的UTF-8編碼結果進行加密,并轉換為16進制字符串。
59ea5ac1cb092e5910c405821119959e5297516d185b71e344735cf3f268****
- 從上一步得到的字符串的第17位開始,截取長度為32位的字符串(subString(16,48)),得到密鑰。
10c405821119959e5297516d185b71e3
CustomOptions 是 option值有 2088
和2089
兩種類型:2088
:表示token,取值為設備認證后返回的token值。說明 每次上報數據都需要攜帶token信息。如果token失效,需要重新進行設備認證,獲取token。2089
:表示seq,取值需比設備認證后返回的seqOffset值更大,且在認證生效周期內不重復的隨機值。建議設置為根據每次請求數據包中的seq遞增值,使用上一欄所介紹的方法進行AES加密填充。
option返回示例:
number:2090
2090
:表示物聯網平臺的云端消息ID。token和seq除了寫在options中,還可以寫在URL中,例如
/topic/${topic}?token=xxxx&seq=xxxxx
。如果同時存在于options和URL中,以options為準。消息上行成功后,返回成功狀態碼,同時返回物聯網平臺生成的消息ID。
- 將deviceSecret和random按照
使用DTLS自主接入
- 連接CoAP服務器。 Endpoint地址:公共實例和企業版實例中,CoAP的接入域名,請參見查看實例終端節點。
- 下載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 是 時間戳。 - 設備認證。使用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.05 Content 認證通過:Token對象 正確請求。 4.00 Bad Request no payload 請求發送的Payload非法。 4.01 Unauthorized no payload 未授權的請求。 4.03 Forbidden no payload 禁止的請求。 4.04 Not Found no payload 請求的路徑不存在。 4.05 Method Not Allowed no payload 請求方法不是指定值。 4.06 Not Acceptable no payload Accept不是指定的類型。 4.15 Unsupported Content-Format no payload 請求的content不是指定類型。 5.00 Internal Server Error no payload auth服務器超時或錯誤。 - 上行數據。 設備通過指定自定義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。Host 是 Endpoint地址。 Port 是 端口,取值: 5684
。Accept 是 設備接收的數據編碼方式。目前,支持兩種方式:application/json和application/cbor。 Content-Format 是 上行數據的編碼格式,服務端對此不做校驗。目前,支持兩種方式:application/json和application/cbor。 CustomOptions 是 - number取值:
2088
。 - token為設備認證(auth)返回的token值。
說明 每次上報數據都需要攜帶token信息。如果token失效,需要重新進行設備認證,獲取token。 - number取值: