设备接入物联网平台之前,需通过身份认证。本文介绍如何使用Node.js Link SDK,将设备接入物联网平台。
前提条件
背景信息
Node.js Link SDK支持设备密钥的方式,进行设备身份认证。针对不同的使用环境,物联网平台提供以下三种设备密钥认证方案。
认证方式 | 说明 | 相关文档 |
---|---|---|
一机一密 | 每台设备烧录自己的设备证书(ProductKey、DeviceName和DeviceSecret)。 | 一机一密 |
一型一密 | 一型一密包含以下两种方式:
|
一型一密 说明
一型一密预注册和免预注册的区别,请参见预注册和免预注册的区别。 |
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。
- 企业版实例或2021年07月30日后(含当日)开通的物联网平台服务下公共实例:
schema
的可选值为ws
、wss
、tcp
、unix
、ssl
、tls
或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();