物聯網平臺華東2(上海)、華北2(北京)、華南1(深圳)地域支持設備使用HTTPS協議接入。設備與物聯網平臺通過HTTPS協議進行連接通信僅適用于單純的設備上報數據場景。請求方式僅支持POST,且設備上報的數據不超過128 KB。

背景信息

本實踐案例以溫濕度采集器為例,介紹設備通過HTTPS協議連接物聯網平臺并上報數據的配置和開發方法。

iot

創建產品和設備

在物聯網平臺控制臺創建產品和設備,獲取設備證書信息(ProdcutKey、DeviceName和DeviceSecret),并定義物模型。

  1. 登錄物聯網平臺控制臺
  2. 實例概覽頁面,找到對應的實例,單擊實例進入實例詳情頁面。
    注意 目前華東2(上海)、華北2(北京)、華南1(深圳)地域開通了企業版實例服務。其他地域,請跳過此步驟。
    實例概覽
  3. 在左側導航欄,選擇設備管理 > 產品,再單擊創建產品,創建一個產品。
    參數 說明
    產品名稱 自定義產品名稱。
    所屬品類 選擇自定義品類
    節點類型 選擇直連設備
    連網方式 選擇Wi-Fi
    數據格式 選擇ICA標準數據格式(Alink JSON)
    認證方式 選擇設備密鑰
  4. 產品創建成功后,單擊前往定義物模型
  5. 產品詳情頁的功能定義頁簽下,選擇編輯草稿 > 添加自定義功能,添加以下屬性。
    本示例中,溫濕度采集器會上報溫度和濕度,因此需為該產品定義對應的兩個屬性。
    功能類型 功能名稱 標識符 數據類型 取值范圍 步長 讀寫類型
    屬性 溫度 temperature int32 -10~50 1 只讀
    屬性 濕度 humidity int32 1~100 1 只讀
  6. 物模型編輯完成后,單擊發布上線,將物模型發布為正式版。
  7. 在左側導航欄,選擇設備,單擊添加設備,在剛創建的產品下添加設備。
    設備創建成功后,獲取設備證書信息(ProductKey、DeviceName和DeviceSecret)。

開發設備端

開發設備端實現設備通過HTTPS協議連接物聯網平臺,并上報溫濕度屬性數據。

  1. 配置設備身份認證。

    設備請求與物聯網平臺建立連接時,物聯網平臺會進行設備身份認證。認證通過后,下發設備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。iot
    注意 設備認證返回的token會在一定周期后失效(目前token有效期是7天),請務必考慮token失效邏輯的處理。
  2. 配置設備上報數據。

    認證通過,設備獲得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);
    }
    配置完成后,可運行以上代碼程序,進行設備上報數據測試。運行程序后,可在本地日志中查看運行結果。iot

    在物聯網平臺控制臺上,在對應實例下,該設備的設備詳情運行狀態頁簽下,可查看設備上報的溫濕度屬性數據。說明設備端已通過HTTPS協議成功接入物聯網平臺,并上報了數據。

使用HTTPS連接通信的更多說明,請參見HTTPS連接通信