设备接入物联网平台之前,需通过身份认证。本文介绍如何使用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();