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 ,使用页面上的用户名密码在命令行上登录:

image.png | center | 752x289

image.png | center | 752x164

看到“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. 创建网关产品和网关测试设备

从项目控制台的左侧菜单进入“设备-产品开发”,进入产品创建流程,创建一个照明设备用来当做我们的网关设备。注意节点类型请选择网关。

image.png | center | 752x487

创建完成后我们点击“进入开发”。

在设备页面上切换到“设备开发”Tab,点击“设备列表”表格上方的“新增测试设备”,弹出的对话框 DeviceName 输入框留空直接点“确定”,我们就得到了一个份设备的“三元组”凭证,网关设备上线时云端根据该凭证进行认证鉴权。

image.png | center | 752x502

3. 创建网关子产品和子测试设备

参考上一篇文章,节点类型选择“设备”,并生成一个测试设备。

image.png | center | 752x560
创建子测试设备

image.png | center | 752x508

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

可以看到控制台输出了子设备属性上报的成功消息。

image.png | center | 752x360

查看拓扑关系

从网关产品的“设备列表”表格里找到刚才创建的网关设备,点击“查看”,可以看到,云端已经成功添加了子设备拓扑。子设备也完成了激活和上线。

image.png | center | 752x338
进入子设备控制台,可以看到子设备的属性已经成功上报了。

image.png | center | 752x577

下线子设备

调用 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 类。

results matching ""

    No results matching ""