在前端开发中,我们经常需要处理二进制数据包,而 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 对象:
{ "cmdId": 1, "payload": { "on": true, "brightness": 100 } }
安装 ZCL-Packet
首先,我们需要在 Node.js 环境中安装 ZCL-Packet 包。在命令行中输入如下命令即可:
npm install zcl-packet --save
解析一个 ZCL 数据包
使用 ZCL-Packet 解析一个 ZCL 数据包非常简单,只需将收到的数据包(Buffer 类型)传递给 parse
方法:
const zclPacket = require('zcl-packet'); const buf = /* 从设备接收到的 Buffer 类型数据包 */; const parsed = zclPacket.parse(buf, {coordinator: false}); console.log(parsed); // 解析后的 JSON 对象
参数 coordinator
表示解析器是否运行在协调器中,如果是则设为 true
,否则设为 false
。
parse
方法的返回值是一个 JSON 对象,包含 ZCL 帧头和 ZCL 负载。例如,上面提到的 JSON 对象对应的 ZCL 数据包可以这样解析:
-- -------------------- ---- ------- - ---------- -- ---- --- ---------- -- ---------- --- ------- -- ---- --- ------ -- -- -- --- -------- - ------ -- ------- ---- - ------ --- ------------- -- ------------ - -
注意,解析器只会解析出有规定命令 Id 的数据包内部的负载字段,如果命令 Id 没有定义或不存在,负载将不被解析出来。例如,如果解析器是用于解析 ZCL On/Off 命令中的数据包,则只会解析出 cmdId
为 0x40
(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