ZigBee 3.0教程-步骤5:通信
现在我们已经形成了一个网络,是时候验证我们是否可以在我们的灯和开关之间成功发送消息了。为此,将使用简单的 ZCL 命令来启动和
首先单击交换机的串行控制台。在提示符处输入:
zcl on-off toggle
这将构建一个 Zigbee 集群库命令框架。由于输出,您可以判断它是正确构造的:
Msg: clus 0x0006, cmd 0x02, len 3
buffer: 01 00 02
簇 0x0006 对应于开关簇。
命令 0x02 是切换命令,长度 3 对应于命令缓冲区的长度。
帧控制的缓冲区为 01,序列号为 00,toggle 的命令 id 为 02。
现在我们想把这个命令发送到我们的灯。因为我们的灯是协调器,所以我们知道它的 Zigbee 节点 ID 是 0x0000。因为我们想从交换机上的端点 1 和灯上的端点 1 发送这些命令,所以我们发送的命令将是:
send 0 1 1
按回车键,您将看到它收到一条消息,提示它是 0x0006 集群,命令为 02。
T00000000:RX len 3, ep 01, clus 0x0006 (On/off) FC 01 seq 00 cmd 02 payload[]
在交换机上,您也会看到它收到一条消息。
T00000000:RX len 5, ep 01, clus 0x0006 (On/off) FC 08 seq 05 cmd 0B payload[02 00 ]
这是默认响应,因为它从灯发送回开关。
如果我们查看 App Builder,您可以看到在事务视图中发送的这些消息,一个 ZCL: Toggle 后跟一个 ZCL: DefaultResponse。您可以查看在侧面板上发送的每条消息的详细信息。例如,如果您查看 DefaultResponse 的事件详细信息,您可以看到响应为 Status: SUCCESS,这意味着消息已发送并得到正确处理。
因为我们的灯是我们的网络协调器,所以我们知道它的地址是 0x0000。但是,大多数时候我们不能相信会是这样。我们需要某种功能来让我们的开关寻找并找到我们的灯,然后加入灯,这样它就可以轻松地向灯发送消息,而不需要知道灯的地址。此外,开关和灯需要一些方法来发现它们是否共享公共集群,例如关闭集群。为了帮助解决这个问题,Zigbee 提供了查找和绑定作为执行此操作的标准方法。
如果您还记得我们创建灯和开关的时候,我们为每个设备添加了一个查找和绑定插件。Light 使用 Find and Bind Target 插件,而 Switch 使用 Find and Bind Initiator 插件。使用这些插件,它使查找和绑定变得容易。而不是让我们的灯光寻找 ZCL 消息进行端点发现,并且必须手动构建要通过我们的网络发送的全套 ZCL 消息,要求节点识别自己以及它们的端点和集群,然后像集群一样绑定,插件将为我们处理这一切。
我们首先要做的是让灯光成为其端点的查找和绑定目标。这将使其监控网络流量并查找正在执行查找和绑定启动的设备。为此,我们将输入以下命令:
plugin find-and-bind target 1
这告诉端点 1 作为端点目标。您将知道该命令有效,因为您将看到:
Find and Bind Target: Start target: 0x00
现在在交换机上,我们必须将其作为启动器启动。这是一个类似的函数,但我们使用的是:
plugin find-and-bind initiator 1
当您输入此内容时,您将在串行窗口和网络捕获窗口中看到流量。当您看到时,该过程将完成
Find and Bind Initiator: Complete: 0x00
在串行控制台中。
查看网络流量,可以看到:
1. 我们的交换机发出一个广播 ZCL:IdentifyQuery。这是由我们的光来回应的。
2. 然后开关向灯询问其完整的 EUI64 地址,灯用其 EUI64 对此作出响应。
3. 然后最后交换机发送一个简单的描述符请求从灯中获取集群信息。灯以作为服务器的 5 个集群进行响应:0、3、4、5 和 6,并且没有作为客户端的集群。
根据这些信息,我们的交换机将创建与其匹配的集群的绑定。对于灯上的 5 个服务器集群,它会查看它是否是其中任何一个上的客户端集群,对于交换机,它们是集群 3(识别)和 6(开关)。因此,如果您转到交换机的 CLI 并打印绑定表,您将看到这些新绑定,它们绑定到 EUI64,而不仅仅是短 ID。要打印绑定表,请使用以下命令:
option binding-table print
输出将如下所示:
# type nwk loc rem clus node eui
0: UNICA 0 0x01 0x01 0x0003 0x0000 (>)000B57FFFEDEA263
1: UNICA 0 0x01 0x01 0x0006 0x0000 (>)000B57FFFEDEA263
通过这些绑定,我们可以使用 bsend 命令告诉我们的设备将命令发送到特定端点的绑定。
zcl on-off toggle
bsend 1
这会向端点 1 上的绑定发送一个命令。
有了这些信息,我们就可以让我们的灯和开关像灯和开关一样工作。灯将根据属性状态打开或关闭 LED,而我们的开关将响应按钮按下,而不是由于 CLI 条目而发送命令。