ZigBee 3.0教程-步骤7:物理接口-Switch

我们现在处于最后阶段,准备构建我们的开关以连接按钮。我们需要做的第一件事是在我们的项目中添加一些钩子,以便为我们提供放置代码的地方。

如果您还记得创建 switch 项目时,我们启用了 Button Interface 插件,顾名思义,这为您提供了回调部分中的按钮接口。如果您查看回调选项卡,您将在插件特定回调下看到这些回调。有针对不同按钮状态以及长按和短按的回调。对于这个例子,让我们选择按钮 0,因为它通常没有 Thunderboard 上的带状电缆。我们也只需要按下一个按钮,所以让我们使用 Button0 Pressed Short 回调,选中该标识符旁边的框。*

* 快速说明——默认情况下,短按定义为小于 250 毫秒,您可以查看插件代码和插件中的按钮超时定义以了解这是如何定义的。

ZigBee 3.0教程-步骤7:物理接口-Switch

像灯一样,确保在回调页面的底部选中了“生成项目特定的回调文件”框。这将确保为您的应用程序生成新的回调文件。然后,您可以保存您的 .ISC 文件并点击生成以添加此新回调。你会得到一个关于覆盖文件的框。确保检查您的 Project_callsbacks.c 文件,您还应该创建备份,以防万一。然后点击确定。

当您看到“生成成功”窗口时,您就可以进行下一步了。

在标题为Project Explorer的左侧视图中找到您的项目回调文件,然后在编辑器中打开该文件。您将看到您的回调文件现在包含一个名为 emberAfPluginButtonInterfaceButton0PressedShortCallback() 的新的空白函数。只要短按按钮,就会调用此函数。

现在我们需要进行 CLI 调用并使用此函数使这些调用在此函数中发生。回顾我们的配置,我们通过 CLI 发送两条命令来发送消息:

zcl on-off toggle
然后要么

send 0 1 1
它将我们的消息直接发送到我们指定的节点和端点,或者

bsend 1
它使用绑定表条目来消除我们需要知道我们发送消息的确切设备的需要。

首先让我们看一下 zcl 开关。为此,我们需要一些可以为我们构建信息的东西。我们可以查看应用程序框架参考指南,然后参考 Ember 应用程序框架 API 参考,然后是应用程序框架命令缓冲区加载接口。在这里,您将找到许多有助于加载命令或响应缓冲区的命令,这些命令或响应缓冲区可以通过某种形式的发送命令发送出去。

如果您通过此文档搜索单词“toggle”,它应该会找到该功能

emberAfFillCommandOnOffClusterToggle()
这是一个自动为我们构建命令缓冲区的基本命令。这个命令的好处是它通过利用命令缓冲区处理了大部分开销,使以后发送消息变得更加容易。因此,将对该函数的调用添加到您的按钮回调函数中。

现在我们需要找到一个命令来为我们发送我们的缓冲区。所以让我们回到Application Framework,点击General Application Framework Interface,搜索处理发送消息的函数。在这个页面,你可以搜索messaging这个词,它定位到应用程序框架中处理发送消息的函数。如果您浏览本节,您可以调用很多函数。

您可以使用类似 emberAfSendUnicast 的函数。但这有很多参数。正如我们所指出的,使用 FillCommand 函数的好处是已经为我们处理了命令缓冲区开销。如果您查看列表,您会发现许多以 emberAfSendCommand 开头的函数……这些是我们要查看的函数。由于这是直接发送到单个节点的特定命令,您可以使用 emberAfSendCommandUnicast()。这有两个选项,第一个是消息类型,第二个是某种整数参数,根据您的消息类型而有所不同。

emberAfSendCommandUnicast (EmberOutgoingMessageType type, uint16_t indexOrDestination)
如果您点击 EmberOutgoingMessageType 的链接,您将看到许多不同的消息类型。EMBER_OUTGOING_DIRECT 将允许您直接向节点 ID 发送消息。或者,向下几行,您会发现 EMBER_OUTGOING_VIA_BINDING,这将允许您利用以前进行的绑定来发送您的消息。让我们看一下其中的每一个,您可以选择发送切换的方式。

EMBER_OUTGOING_DIRECT
如果您选择向您的节点 ID 发送直接单播,这与使用命令 send 0 1 1 发送消息的操作相同。如果您查看 send 命令的帮助,您将看到您提供的带有数字的部分:

send (args)
short id of the device to send the message to
The endpoint to send the message from
The endpoint to send the message to
查看 emberAfSendCommandUnicast 函数,您的两个选项是类型和目标。在使用 EMBER_OUTGOING_DIRECT 类型的情况下,目的地是我们目标的短 ID。正如我们之前提到的,您可以使用 0x0000,因为这是一个短 ID。

emberAfSendCommandUnicast (EMBER_OUTGOING_DIRECT, 0x0000);
这会处理您的节点地址。但是我们在发送命令中设置了端点,这些还没有被处理。我们需要一些函数来配置端点。我们需要在发送消息之前进行配置,否则为时已晚。让我们回到应用程序框架的顶层,看看操作端点的操作。如果您搜索端点一词,您最终会遇到命令 emberAfSetCommandEndpoints(),它需要源端点和目标端点。在我们的例子中,我们知道两个端点都是 1,因此您可以硬编码,如果您愿意,可以使用 emberAfPrimaryEndpoint() 作为第一个参数,因为它是我们设备的唯一端点。但是,对于目标端点,您只能指定 1,因为您需要对其进行硬编码。

emberAfSetCommandEndpoints(emberAfPrimaryEndpoint(),1);
现在你可以测试一下了。保存回调文件并编译代码。将这个新应用程序放在您的“开关”Thunderboard 上并按下按钮 0,您应该会看到您的灯打开和关闭。

EMBER_OUTGOING_VIA_BINDING
除了向您的节点发送直接消息之外,您还可以利用您已经创建绑定并直接发送到该节点的事实。这样做的好处是它已经处理了您的所有设置,例如节点地址和端点。但是,现在您必须知道您可以将其发送到开/关集群的绑定条目。

所以去你的控制台并输入命令'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

开关簇是 0x0006,所以我们想把它发送到绑定表条目 1。你可以把它作为函数的第二个参数:

emberAfSendCommandUnicast (EMBER_OUTGOING_VIA_BINDING, 1);

就像 _DIRECT 格式一样,现在测试一下。保存回调文件并编译代码。将这个新应用程序放在您的“开关”Thunderboard 上并按下按钮 0,您应该会看到您的灯打开和关闭。

跟进
最后,这可能不是最干净的代码。因为这个函数在按钮上是硬编码的,所以我们总是发送我们的消息。在包含的 MySwitch_callbacks.c 文件中,我们包含了一些代码,您可以使用它们来检查您的网络当前是否已启动。当您的灯或开关工作时,我们还提供打印声明以显示明智的消息。