物聯網平臺華東2(上海)、華北2(北京)、華南1(深圳)地域支持設備使用HTTPS協議接入。設備與物聯網平臺通過HTTPS協議進行連接通信僅適用于單純的設備上報數據場景。請求方式僅支持POST,且設備上報的數據不超過128 KB。
背景信息
本實踐案例以溫濕度采集器為例,介紹設備通過HTTPS協議連接物聯網平臺并上報數據的配置和開發方法。
創建產品和設備
在物聯網平臺控制臺創建產品和設備,獲取設備證書信息(ProdcutKey、DeviceName和DeviceSecret),并定義物模型。
- 登錄物聯網平臺控制臺。
- 在實例概覽頁面,找到對應的實例,單擊實例進入實例詳情頁面。注意 目前華東2(上海)、華北2(北京)、華南1(深圳)地域開通了企業版實例服務。其他地域,請跳過此步驟。
- 在左側導航欄,選擇設備管理 > 產品,再單擊創建產品,創建一個產品。
參數 說明 產品名稱 自定義產品名稱。 所屬品類 選擇自定義品類。 節點類型 選擇直連設備。 連網方式 選擇Wi-Fi。 數據格式 選擇ICA標準數據格式(Alink JSON)。 認證方式 選擇設備密鑰。 - 產品創建成功后,單擊前往定義物模型。
- 在產品詳情頁的功能定義頁簽下,選擇編輯草稿 > 添加自定義功能,添加以下屬性。本示例中,溫濕度采集器會上報溫度和濕度,因此需為該產品定義對應的兩個屬性。
功能類型 功能名稱 標識符 數據類型 取值范圍 步長 讀寫類型 屬性 溫度 temperature int32 -10~50 1 只讀 屬性 濕度 humidity int32 1~100 1 只讀 - 物模型編輯完成后,單擊發布上線,將物模型發布為正式版。
- 在左側導航欄,選擇設備,單擊添加設備,在剛創建的產品下添加設備。設備創建成功后,獲取設備證書信息(ProductKey、DeviceName和DeviceSecret)。
開發設備端
開發設備端實現設備通過HTTPS協議連接物聯網平臺,并上報溫濕度屬性數據。
- 配置設備身份認證。
設備請求與物聯網平臺建立連接時,物聯網平臺會進行設備身份認證。認證通過后,下發設備token。設備token將在設備上報數據時使用。
設備身份認證請求參數如下表。
參數 說明 method 請求方法。必須指定為POST。 uri 指定為https://iot-as-http.cn-shanghai.aliyuncs.com/auth。 productKey 設備所屬產品的Key。可從物聯網平臺的控制臺對應實例下的設備詳情頁獲取。 deviceName 設備名稱。從物聯網平臺的控制臺對應實例下的設備詳情頁獲取。 clientId 客戶端ID。長度為64字符內,可使用設備的MAC地址或SN碼。本示例中,使用函數random()生成隨機數。 timestamp 時間戳。本示例中使用函數now()獲取當前時間戳。 signmethod 算法類型,支持hmacmd5和hmacsha1。 sign 簽名,即計算出的password。password計算方法示例如下。 password = signHmacSha1(params, deviceConfig.deviceSecret)
設備身份認證示例代碼如下。
var rp = require('request-promise'); const crypto = require('crypto'); const deviceConfig = { productKey: "<yourProductKey>", deviceName: "<yourDeviceName>", deviceSecret: "<yourDeviceSecret>" } //獲取身份token。 rp(getAuthOptions(deviceConfig)) .then(function(parsedBody) { console.log('Auth Info :',parsedBody) }) .catch(function(err) { console.log('Auth err :'+JSON.stringify(err)) }); //生成Auth認證的參數。 function getAuthOptions(deviceConfig) { const params = { productKey: deviceConfig.productKey, deviceName: deviceConfig.deviceName, timestamp: Date.now(), clientId: Math.random().toString(36).substr(2), } //生成clientId、username和password。 var password = signHmacSha1(params, deviceConfig.deviceSecret); var options = { method: 'POST', uri: 'https://iot-as-http.cn-shanghai.aliyuncs.com/auth', body: { "version": "default", "clientId": params.clientId, "signmethod": "hmacsha1", "sign": password, "productKey": deviceConfig.productKey, "deviceName": deviceConfig.deviceName, "timestamp": params.timestamp }, json: true }; return options; } //HmacSha1 sign function signHmacSha1(params, deviceSecret) { let keys = Object.keys(params).sort(); // 按字典序排序。 keys = keys.sort(); const list = []; keys.map((key) => { list.push(`${key}${params[key]}`); }); const contentStr = list.join(''); return crypto.createHmac('sha1', deviceSecret).update(contentStr).digest('hex'); }
配置完成后,可運行以上程序代碼,進行設備認證測試。認證成功,則獲得token。注意 設備認證返回的token會在一定周期后失效(目前token有效期是7天),請務必考慮token失效邏輯的處理。 - 配置設備上報數據。
認證通過,設備獲得token后,便可使用token作為上報數據的password。
設備上報數據的請求參數如下表。
參數 說明 method 請求方法。必須指定為POST。 uri endpoint地址和Topic組成uri: https://iot-as-http.cn-shanghai.aliyuncs.com/topic + topic
。后一個topic需指定為設備上報屬性的Topic:/sys/${deviceConfig.productKey}/${deviceConfig.deviceName}/thing/event/property/post
body 設備上報的消息內容。 password 指定為設備認證返回的token。 Content-Type 設備上報的數據的編碼格式。目前僅支持:application/octet-stream。 設備上報數據示例代碼如下。
const topic = `/sys/${deviceConfig.productKey}/${deviceConfig.deviceName}/thing/event/property/post`; //上報數據。 pubData(topic, token, getPostData()) function pubData(topic, token, data) { const options = { method: 'POST', uri: 'https://iot-as-http.cn-shanghai.aliyuncs.com/topic' + topic, body: data, headers: { password: token, 'Content-Type': 'application/octet-stream' } } rp(options) .then(function(parsedBody) { console.log('publish success :' + parsedBody) }) .catch(function(err) { console.log('publish err ' + JSON.stringify(err)) }); } //模擬物模型數據。 function getPostData() { var payloadJson = { id: Date.now(), params: { humidity: Math.floor((Math.random() * 20) + 60), temperature: Math.floor((Math.random() * 20) + 10) }, method: "thing.event.property.post" } console.log("===postData\n topic=" + topic) console.log(payloadJson) return JSON.stringify(payloadJson); }
配置完成后,可運行以上代碼程序,進行設備上報數據測試。運行程序后,可在本地日志中查看運行結果。在物聯網平臺控制臺上,在對應實例下,該設備的設備詳情頁運行狀態頁簽下,可查看設備上報的溫濕度屬性數據。說明設備端已通過HTTPS協議成功接入物聯網平臺,并上報了數據。
使用HTTPS連接通信的更多說明,請參見HTTPS連接通信。