設備接入物聯網平臺之前,需通過身份認證。本文介紹如何使用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();