Node.js 网关 SDK
更新时间:2018-03-24 16:54:14
本篇文章将介绍使用 Node.js 设备端 SDK 进行网关类设备的开发调试。涉及网关设备与云端建连、子设备拓扑增删查、子设备上线、子设备属性事件上报等内容。
环境准备
硬件和操作系统
准备可以运行 Linux 系统的硬件设备(如树莓派),或是可以运行 Mac OS 和 Windows 操作系统的 PC 设备。
安装 Node.js 运行环境
需要安装 8.9 LTS 以及以上版本:https://nodejs.org/zh-cn/
安装 bnpm 包管理工具
bnpm 是 Bone 应用开发方案的包管理工具,用来安装工具和模块,执行:
npm install -g bnpm --registry=https://npm.aliplus.com/api
Unix* 系统(macOS、Linux)如果提示 EACCES 权限不足的错误,请尝试执行以下命令进行修复:
sudo chown -R $(whoami) /usr/local/bin
sudo chown -R $(whoami) /usr/local/lib
登录 bnpm
在命令行终端里执行:
bnpm login
访问 https://bone.aliyun.com/profile ,使用页面上的用户名密码在命令行上登录:
看到“Logged in as ...”消息表示登录成功。
安装设备端 Node.js SDK
在终端运行以下命令以创建目录和安装 Node.js SDK:
mkdir test-device && cd test-device # 创建并进入新目录
bnpm install --save @bone/bone-device-sdk # 安装 SDK
开发过程
1. 创建项目
参考上一篇文章。
2. 创建网关产品和网关测试设备
从项目控制台的左侧菜单进入“设备-产品开发”,进入产品创建流程,创建一个照明设备用来当做我们的网关设备。注意节点类型请选择网关。
创建完成后我们点击“进入开发”。
在设备页面上切换到“设备开发”Tab,点击“设备列表”表格上方的“新增测试设备”,弹出的对话框 DeviceName 输入框留空直接点“确定”,我们就得到了一个份设备的“三元组”凭证,网关设备上线时云端根据该凭证进行认证鉴权。
3. 创建网关子产品和子测试设备
参考上一篇文章,节点类型选择“设备”,并生成一个测试设备。
创建子测试设备
4. 网关开发
编码
网关的开发,一般会涉及网关连接到云、添加子设备到拓扑、子设备上下线(激活)、子设备属性上报、子设备事件上报、子设备服务监听等过程,具体请查看 Alink协议文档,@bone/bone-device-sdk 封装了这些异步过程,提供接近 RPC 的 API 来完成这些流程的调用。
在目录下创建 gateway.js,内容如下:
const Bone = require('@bone/bone-device-sdk');
const { hmacSign } = require('@bone/bone-device-sdk/lib/utils');
// 通过 `Bone.createGateway` 方法创建一个网关设备
// 填入创建网关设备时候得到网关设备三元组 productKey、deviceName、deviceSecret
const gateway = Bone.createGateway({
productKey: '<网关 productKey>',
deviceName: '<网关 deviceName>',
deviceSecret: '<网关 deviceSecret>'
});
gateway.connect((err) => {
if (err) {
return console.log('connect error: ', err);
}
console.log('connect succesfully!');
// 填入子设备三元组
const device = {
productKey: '<子设备 productKey>',
deviceName: '<子设备 deviceName>',
deviceSecret: '<子设备 deviceSecret>'
};
// 加签
const deviceConfig = {
productKey: device.productKey,
deviceName: device.deviceName,
clientId: `${device.productKey}&${device.deviceName}`,
timestamp: String(Date.now())
};
deviceConfig.signMethod = `hmacsha1`;
const signcontent = `clientId${deviceConfig.clientId}deviceName${
device.deviceName
}productKey${device.productKey}timestamp${deviceConfig.timestamp}`;
deviceConfig.sign = hmacSign('sha1', device.deviceSecret, signcontent);
// 添加子设备到拓扑
gateway.addTopo(deviceConfig, (err, result) => {
console.log(err, result);
// 子设备上线
gateway.login(deviceConfig, (err, result) => {
console.log(err, result);
// 子设备属性数据上报
gateway.postSubDeivceProps(
deviceConfig,
{
LightStatus: 1
},
(err, result) => {
console.log(err, result);
console.log('子设备属性上报完成!');
}
);
});
});
});
5. 网关设备和子设备调试
运行设备脚本
在终端中通过 Node.js 运行设备脚本:
$ node gateway.js
可以看到控制台输出了子设备属性上报的成功消息。
查看拓扑关系
从网关产品的“设备列表”表格里找到刚才创建的网关设备,点击“查看”,可以看到,云端已经成功添加了子设备拓扑。子设备也完成了激活和上线。
进入子设备控制台,可以看到子设备的属性已经成功上报了。
下线子设备
调用 logout 方法:
gateway.logout(deviceConfig, (err, res) => {
if (!err) {
// 下线完成
}
});
在调试界面上可以看到子设备已下线。
获取设备拓扑关系
调用 getTopo 方法:
gateway.getTopo(deviceConfig, (err, res) => {
if (!err) {
// 拓扑关系获取成功
}
});
移除子设备拓扑关系
调用 deleteTopo 方法:
gateway.deleteTopo(deviceConfig, (err, res) => {
if (!err) {
// 移除拓扑关系成功
}
});
子设备事件上报
通过调用 postSubDeviceEvent 方法:
gateway.postSubDeviceEvent(
deviceConfig,
'PM25Warn', // 自定义一个告警事件
{
PM25Value: 200
},
(err, result) => {
console.log(err, result);
console.log('子设备事件上报完成!');
}
);
监听子设备服务topic
通过调用 subTopicAndOnMessage 方法,值得注意的是,这个方法会返回一个 unsub 函数,用来取消监听:
const unsub = gateway.subTopicAndOnMessage(
`/sys/${deviceConfig.productKey}/${deviceConfig.deviceName}/thing/service/#`,
(err, topic, message) => {
console.log('收到 topic', err, topic, message);
// 取消监听
unsub();
}
);
Node.js SDK API
Bone
createGateway
通过设备激活凭证(三元组)创建一个网关设备实例,示例代码:
const gateway = Bone.createGateway({
productKey: 'xxx',
deviceName: 'yyy',
deviceSecret: 'xxx'
});
gateway API
addTopo(deviceConfig, (err, res) => {})
添加子设备到拓扑关系
getTopo(deviceConfig, (err, res) => {})
获取子设备拓扑关系
removeTopo(deviceConfig, (err, res) => {})
删除子设备拓扑关系
login(deviceConfig, (err, res) => {})
子设备上线
logout(deviceConfig, (err, res) => {})
子设备下线
postSubDeviceProps(deviceConfig, params, (err, res) => {})
上报子设备属性
postSubDeviceEvent(deviceConfig, params, (err, res) => {})
上报子设备事件
继承自设备 Device 类的 API:
connect((err) => {})
postProps(params, (err, res) => {})
postEvent(params, (err, res) => {})
serve(serviceIdentifier, (params) => {})
subTopicAndOnMessage(topic, (err, topic, message) =>{})
gateway event
事件全部继承自 Device 类。