设备的身份认证支持两种方法,不同方法在填写不同信息。

  • 若使用一机一密认证方式,设备上需要烧写product_key、device_name和device_secret

  • 若使用一型一密认证方式,设备上需要烧写product_key、和product_secret,并且厂家需要为每个设备设置一个唯一标识(比如SN、MAC地址),这个唯一标识将被用来作为device_name使用,由于product_key和product_secret对于一个产品来说是固定的数值,烧写的时候是固定的,因此称为一型一密。

注:

  • 阿里云IoT的一型一密,是通过一个动态注册过程去获取设备的device_secret,然后再使用product_key、device_name、device_secret去连接阿里云物联网平台并对设备进行认证,本质上仍然是一机一密

  • 动态注册过程只能执行一次,也即当设备获取到device_secret之后,设备需要将其存入NVRAM/FLASH,当重启或者再次连接阿里云物联网平台时,设备需要判断如果设备已经获取到了device_secret,那么不需要再次通过动态注册去获取device_secret,而是直接使用product_key、device_name、device_secret去连接阿里云物联网平台

  • 如果一个设备已经成功的通过动态注册过程获取到了device_secret,再次调用动态注册接口将会返回错误

认证与连接API描述

API原型 iot.device(options)
功能描述 创建一个设备实例,并连接阿里云IoT
入参 options:- productKey (String)- deviceName (String)- deviceSecret (String)- region (String) :阿里云 region,默认值:cn-shanghai- keepalive (int) :心跳报文时间间隔,默认值60秒- clean (bool) :是否清除连接session设置,默认值false
返回值 MQTT Client连接实例
Event - connect:当连接到云端成功时触发- offline:当连接断开时触发- message:当接收到来自云端消息时触发- error:当发生错误时触发,比如PK、DN、DS有误导致连接失败时

使用示例

一机一密设置

在创建实例时输入设备的三元组信息,下面是代码实例:

// node引入包名
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());
});
			

注:

  • 如果设备异常断开,程序会自动尝试与云端建立连接
  • keep alive默认值是60,设置时不能小于60

设置云端站点 region

阿里云IoT在多个国家与地区部署了服务器,默认地域为上海。厂商可设置设备需要连接的地域,在创建device时将文档中指定的Region ID 填入regionId即可,下面的代码示例指定地域为 ap-northeast-1(东京站点) :

var device = iot.device({
  productKey: '<productKey>',
  deviceName: '<deviceName>',
  deviceSecret: '<deviceSecret>',
  regionId: 'ap-northeast-1'
});

device.on('connect', () => {
  console.log('connect successfully!');
});
			

注:region需要与产品在IoT平台上创建产品时所在的region保持一致。

一型一密设置

若产品被设置为一型一密,设备可以通过iot.register()去获取设备的device_secret,示例代码如下:

const params = {
  productKey:"xxxxxx",
  productSecret:"xxxxxx",
  deviceName:"xxxxxx"
}

var device;

iot.register(params,(res)=>{
  console.log("register:",res);
  if(res.code == '200'){
    // res.data.deviceSecret 是云端反馈的设备密钥,请妥善保存该密钥,
    // 如果设备使用三元组连接物联网平台成功,再次使用本函数去获取DeviceSecret将会失败

    //创建设备对象去连接阿里云IoT
    device = iot.device({
        productKey: '<productKey>',
        deviceName: '<deviceName>',
        deviceSecret: res.data.deviceSecret, //res.data.deviceSecret 是云端反馈的设备密钥
    });
  }
})
			

Git中的示例文件:https://github.com/aliyun/alibabacloud-iot-device-sdk/blob/master/examples/one_model_one_secret.js

动态注册时res.code可能的数值列表:

数值 含义说明
200 成功获取DeviceSecret
5005 无效产品,设备提供的ProductKey有误
6100 无效设备,云端查找不到设备提供的deviceName对应的设备
6288 产品不支持动态注册,请在IoT平台为产品打开动态注册功能
6289 设备已经激活,云端拒绝提供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();