設備接入物聯網平臺之前,需通過身份認證。本文介紹如何使用Node.js Link SDK,將設備接入物聯網平臺。

前提條件

  • 已準備開發環境
  • 已在物聯網平臺創建產品和設備。具體操作,請參見創建產品單個創建設備

    創建產品時,認證方式選擇為設備密鑰,然后在該產品下添加設備,獲取物聯網平臺頒發的ProductSecret、DeviceSecret等密鑰。設備接入物聯網平臺時,會使用物聯網平臺頒發的密鑰信息,進行身份認證。

背景信息

Node.js Link SDK支持設備密鑰的方式,進行設備身份認證。針對不同的使用環境,物聯網平臺提供以下三種設備密鑰認證方案。

認證方式 說明 相關文檔
一機一密 每臺設備燒錄自己的設備證書(ProductKey、DeviceName和DeviceSecret)。 一機一密
一型一密 一型一密包含以下兩種方式:
  • 一型一密預注冊:
    • 同一產品下設備燒錄相同產品證書(ProductKey和ProductSecret)。
    • 產品需開啟動態注冊功能。
    • 設備通過動態注冊獲取DeviceSecret。
  • 一型一密免預注冊:
    • 同一產品下設備燒錄相同產品證書(ProductKey和ProductSecret)。
    • 產品需開啟動態注冊功能。
    • 設備通過動態注冊獲取ClientID與DeviceToken的組合。
一型一密
說明

一型一密預注冊和免預注冊的區別,請參見預注冊和免預注冊的區別

API描述

  • 原型:iot.device(options)
  • 功能描述:創建一個設備實例,并連接阿里云物聯網平臺。
  • 包括以下請求參數:
    參數 類型 說明
    brokerUrl String 指定MQTT Broker的服務器URI,默認值為mqtt://${productKey}.iot-as-mqtt.cn-shanghai.aliyuncs.com:1883/

    其中${productKey}為您設備的ProductKey。

    productKey String 設備的認證信息,更多信息,請參見獲取設備認證信息
    deviceName String
    deviceSecret String
    regionId String 設備接入的地域ID。更多信息,請參見地域和可用區
    keepalive Integer 設備與物聯網平臺建立保活連接時的心跳間隔時間,默認為60秒。
    clean Boolean 是否清除連接Session。取值:
    • true:是
    • false(默認):否
  • 返回值:MQTT Client連接實例。
  • 在以下情況時,觸發事件:
    • connect:設備與物聯網平臺成功建立連接。
    • offline:設備與物聯網平臺連接斷開。
    • message:設備接收到物聯網平臺的消息。
    • error:發生錯誤時觸發,比如設備認證信息有誤。

設置接入地域

阿里云物聯網平臺支持多種不同的地域,SDK默認的地域為華東2(上海)。更多信息,請參見地域和可用區

您可根據業務需要,在使用SDK接入設備時,設置regionId,將設備接入所需的地域。以下示例代碼指定地域為ap-northeast-1,即亞太東北1(東京站點)。

注意 設備的接入地域需與您在物聯網平臺創建設備的地域保持一致。

您可登錄物聯網平臺,在左側導航欄上方查看您設備所在的地域。

// Node引入包名
const iot = require('alibabacloud-iot-device-sdk');
const device = iot.device({
  productKey: `${productKey}`,
  deviceName: `${deviceName}`,
  deviceSecret: `${deviceSecret}`,
  regionId: 'ap-northeast-1'
});
?
device.on('connect', () => {
  console.log('connect successfully!');
})

設置MQTT broker的服務器URI

格式為schema://host:port

  • host為設備的接入域名,更多信息,請參見獲取設備認證信息

    host示例如下:

    • 企業版實例或2021年07月30日后(含當日)開通的物聯網平臺服務下公共實例:iot-06******.mqtt.iothub.aliyuncs.com

      其中iot-06******為實例ID。

    • 2021年07月30日前(不含當日)開通的物聯網平臺服務下公共實例:a1BOO******.iot-as-mqtt.cn-shanghai.aliyuncs.com

      其中a1BOO******為您設備的ProductKey。

  • schema的可選值為wswsstcpunixssltls tcps
const iot = require('alibabacloud-iot-device-sdk');
const device = iot.device({
  productKey: `${productKey}`,
  deviceName: `${deviceName}`,
  deviceSecret: `${deviceSecret}`,
  brokerUrl: `wss://${productKey}.iot-as-mqtt.${regionId}.aliyuncs.com:443`,
});
?
device.on('connect', () => {
  console.log('connect sucessfully!');
});

一機一密

const iot = require('alibabacloud-iot-device-sdk');
?
// 創建iot.device對象將會發起到阿里云IoT的連接
const device = iot.device({
  productKey: `${productKey}`, //將${productKey}修改為實際產品的ProductKey
  deviceName: `${deviceName}`,//將${deviceName}修改為實際設備的DeviceName
  deviceSecret: `${deviceSecret}`,//將${deviceSecret}修改為實際設備的DeviceSecret
});
?
// 監聽connect事件
device.on('connect', () => {
  //將${productKey}和${deviceName}修改為實際值
  device.subscribe(`/${productKey}/${deviceName}/user/get`);
  console.log('connect successfully!');
  device.publish(`/${productKey}/${deviceName}/user/update`, 'hello world!');
});
?
// 監聽message事件
device.on('message', (topic, payload) => {
  console.log(topic, payload.toString());
});        
注意
  • 如果設備異常斷開,則程序自動嘗試與物聯網平臺重新建立連接。
  • keepalive默認值為60。如果您要設置該參數,其值不能小于60。

一型一密

const iot = require('alibabacloud-iot-device-sdk');
const params = {
  productKey: `${productKey}`,
  productSecret: `${productSecret}`,
  deviceName: `${deviceName}`
};
let device;
iot.register(params, (res) => {
  console.log("register:", res);
  if (res.code == '200') {
    // res.data.deviceSecret 是物聯網平臺返回的設備密鑰,請妥善保存該密鑰,
    // 設備使用設備認證信息連接物聯網平臺成功后,不可再次使用本函數獲取DeviceSecret。
    // 創建設備對象連接阿里云物聯網平臺
    device = iot.device({
      productKey: `${productKey}`,
      deviceName: `${deviceName}`,
      // res.data.deviceSecret 是物聯網平臺返回的設備密鑰
      deviceSecret: res.data.deviceSecret,
    });
  }
});
  • 關于一型一密認證方式的完整示例代碼,請參見one_model_one_secret.js
  • res.code可能的數值如下表所示:
    說明
    200 成功獲取DeviceSecret。
    5005 無效產品,設備提供的ProductKey有誤。
    6100 無效設備,物聯網平臺沒有對應deviceName的設備。
    6288 產品不支持動態注冊,請在物聯網平臺為產品打開動態注冊功能。
    6289 設備已經激活,無法再次注冊。
    說明
    • 同一組設備證書只能用于激活一個物理設備。

      若DeviceName名下已激活物理設備A,但物理設備B需要使用該DeviceName,則您可以在物聯網平臺上刪除設備A,使設備A的DeviceSecret作廢,再使用原DeviceName重新添加設備,激活物理設備B。

    • 若設備因丟失DeviceSecret等原因需要重新激活,需您調用ResetThing接口,重置設備狀態為未激活,然后將設備重新聯網激活。此時,物聯網平臺下發的DeviceSecret不變。
    6600 校驗錯誤,設備的ProductSecret有誤。

斷開與云端的連接

如果您希望主動斷開與物聯網平臺的連接,可以調用end函數。

const iot = require('alibabacloud-iot-device-sdk');
const device = iot.device({
  productKey: `${productKey}`,
  deviceName: `${deviceName}`,
  deviceSecret: `${deviceSecret}`,
});
?
/*Disconnect from aliyun IoT platform*/
device.end();