全部产品
云市场

认证与连接

更新时间:2019-06-25 09:45:26

设备认证

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

  • 若使用一机一密认证方式,设备上需要烧写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有误导致连接失败时

使用示例

一机一密设置

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

  1. // node引入包名
  2. const iot = require('alibabacloud-iot-device-sdk');
  3. //创建iot.device对象将会发起到阿里云IoT的连接
  4. const device = iot.device({
  5. productKey: '<productKey>', //将<productKey>修改为实际产品的ProductKey
  6. deviceName: '<deviceName>',//将<deviceName>修改为实际设备的DeviceName
  7. deviceSecret: '<deviceSecret>',//将<deviceSecret>修改为实际设备的DeviceSecret
  8. });
  9. //监听connect事件
  10. device.on('connect', () => {
  11. //将<productKey> <deviceName>修改为实际值
  12. device.subscribe('/<productKey>/<deviceName>/get');
  13. console.log('connect successfully!');
  14. device.publish('/<productKey>/<deviceName>/update', 'hello world!');
  15. });
  16. //监听message事件
  17. device.on('message', (topic, payload) => {
  18. console.log(topic, payload.toString());
  19. });

注:

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

设置云端站点 region

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

  1. var device = iot.device({
  2. productKey: '<productKey>',
  3. deviceName: '<deviceName>',
  4. deviceSecret: '<deviceSecret>',
  5. regionId: 'ap-northeast-1'
  6. });
  7. device.on('connect', () => {
  8. console.log('connect successfully!');
  9. });

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

一型一密设置

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

  1. const params = {
  2. productKey:"xxxxxx",
  3. productSecret:"xxxxxx",
  4. deviceName:"xxxxxx"
  5. }
  6. var device;
  7. iot.register(params,(res)=>{
  8. console.log("register:",res);
  9. if(res.code == '200'){
  10. // res.data.deviceSecret 是云端反馈的设备密钥,请妥善保存该密钥,
  11. // 如果设备使用三元组连接物联网平台成功,再次使用本函数去获取DeviceSecret将会失败
  12. //创建设备对象去连接阿里云IoT
  13. device = iot.device({
  14. productKey: '<productKey>',
  15. deviceName: '<deviceName>',
  16. deviceSecret: res.data.deviceSecret, //res.data.deviceSecret 是云端反馈的设备密钥
  17. });
  18. }
  19. })

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函数来断开云端的连接:

  1. const iot = require('alibabacloud-iot-device-sdk');
  2. const device = iot.device({
  3. productKey: '<productKey>',
  4. deviceName: '<deviceName>',
  5. deviceSecret: '<deviceSecret>',
  6. });
  7. ...
  8. /*Disconnect from aliyun IoT platform*/
  9. device.end();