NPM 包 ZCL-Packet 使用教程

阅读时长 6 分钟读完

在前端开发中,我们经常需要处理二进制数据包,而 zcl-packet 是一个帮助我们处理 ZigBee Cluster Library (ZCL) 协议数据包的 Node.js 包。本文将介绍如何使用它来处理 ZCL 数据包。

ZCL-Packet 简介

ZCL 是 ZigBee 网络中设备之间通信时使用的一种协议,它定义了设备之间通信的方式和数据格式。ZCL 数据包由一个 ZCL 帧头和一个 ZCL 负载组成。ZCL-Packet 可以将 ZCL 数据包转化为 JavaScript 数据格式,方便我们进行操作和处理。

ZCL 数据包格式

ZCL 数据包由 ZCL 帧头和 ZCL 负载组成,下面是 ZCL 帧头的格式:

字段名 长度(byte) 描述
frame Control 1 帧控制字
manuf Code 0-2 制造商代码,如果没有则为 0xFFFE
seq Num 1 帧序列号,用于防止数据包重复发送。

ZCL 负载的格式因具体业务而异,可以是一个结构体、一个数组或一个字符串等。例如,一个简单的 ZCL 报文可以是一个包含开关状态和亮度值的 JSON 对象:

安装 ZCL-Packet

首先,我们需要在 Node.js 环境中安装 ZCL-Packet 包。在命令行中输入如下命令即可:

解析一个 ZCL 数据包

使用 ZCL-Packet 解析一个 ZCL 数据包非常简单,只需将收到的数据包(Buffer 类型)传递给 parse 方法:

参数 coordinator 表示解析器是否运行在协调器中,如果是则设为 true,否则设为 false

parse 方法的返回值是一个 JSON 对象,包含 ZCL 帧头和 ZCL 负载。例如,上面提到的 JSON 对象对应的 ZCL 数据包可以这样解析:

-- -------------------- ---- -------
-
  ---------- -- ---- ---
  ---------- -- ---------- ---
  ------- -- ---- ---
  ------ -- -- -- ---
  -------- -
    ------ -- ------- ---- - ------ ---
    ------------- -- ------------
  -
-

注意,解析器只会解析出有规定命令 Id 的数据包内部的负载字段,如果命令 Id 没有定义或不存在,负载将不被解析出来。例如,如果解析器是用于解析 ZCL On/Off 命令中的数据包,则只会解析出 cmdId0x40(On)、0x41(Off)的 ZCL 数据包。

编码一个 ZCL 数据包

使用 ZCL-Packet 也可以很方便地编码一个 ZCL 数据包,只需将需要发送的数据打包为一个 JSON 对象,然后将其传递给 build 方法:

-- -------------------- ---- -------
----- --------- - ----------------------

----- ------- - -
  ------ -----
  ------------- --
--

----- --- - --------------------------- ----------------- -------- --------------------------- ----
-- - --- -----

build 方法的第一个参数是命令集名称(例如 genOnOff),第二个参数是具体命令名称(例如 onWithTimedOff),第三个参数是需要发送的负载数据对象,第四个参数是可选的选项参数,用于设置一些数据包属性,例如帧序列号。这里我们设置了当前的帧序列号为 3

示例代码

下面是一个简单的代码示例,它使用 zcl-packet 接收一个 ZigBee 网络中的数据包,并将其解析和编码后再通过 ZigBee 网络发送出去:

-- -------------------- ---- -------
----- --------- - ----------------------
----- --- - ---------------

----- ------ - ------------------ ----- ----- ------------- ---------- -
  ---------------------- -- ----------
---

----------------- -------------- -
  ------------------------ ------ -- -------
  ----- ------ - --------------------- ------------- --------
  ---------------------- -------- -- ------ ---- --
  ----- ------- - -
    ------ ----------------------
    ------------- --
  --
  ----- --- - --------------------------- --------- -------- --------------------------- ----------------
  -------------------- ----- -- ---------
  ------------------
---

在这个例子中,我们通过 Node.js 的 net 模块建立一个 TCP 连接,然后等待设备发来的数据包。设备发来的数据包将被解析,并将其中的负载 onOff 属性取反后返回给设备(通过「开关切换」命令)。

总结

本文介绍了如何使用 zcl-packet 这个 NPM 包对 ZigBee 网络中的数据包进行解析和编码。通过本文的学习,相信大家已经掌握了使用 zcl-packet 包的基本方法,可以在工作中进行运用了。

来源:JavaScript中文网 ,转载请注明来源 https://www.javascriptcn.com/post/118134