1.4.2.2.7 Node.js 网关 SDK

优质
小牛编辑
134浏览
2023-12-01

Node.js 网关 SDK

更新时间:2018-07-16 09:58:33

本篇文章将介绍使用 Node.js 设备端 SDK 进行网关类设备的开发调试。涉及网关设备与云端建连、子设备拓扑增删查、子设备上线、子设备属性事件上报等内容。

平台流程

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

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

image.png | center | 752x487

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

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

image.png | center | 752x502

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

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

image.png | center | 752x560

创建子测试设备

image.png | center | 752x508

本地编码

网关的开发,一般会涉及网关连接到云、添加子设备到拓扑、子设备上下线(激活)、子设备属性上报、子设备事件上报、子设备服务监听等过程,具体请查看 Alink协议文档,aliyun-iot-device-sdk-js 封装了这些异步过程,提供接近 RPC 的 API 来完成这些流程的调用。

安装 aliyun-iot-device-sdk :

npm install aliyun-iot-device-sdk --save

在目录下创建 gateway.js,内容如下:

const aliyunIot = require('aliyun-iot-device-sdk');
const { hmacSign } = require('aliyun-iot-device-sdk/lib/utils');

// 通过 `Bone.createGateway` 方法创建一个网关设备
// 填入创建网关设备时候得到网关设备三元组 productKey、deviceName、deviceSecret
const gateway = aliyunIot.gateway({
  productKey: '<网关 productKey>',
  deviceName: '<网关 deviceName>',
  deviceSecret: '<网关 deviceSecret>'
});
gateway.on('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('子设备属性上报完成!');
        }
      );
    });
  });
});

网关设备和子设备调试

运行设备脚本

在终端中通过 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();
  }
);