10. Zigbee应用程序框架开发指南 - 命令处理和生成

10 命令处理和生成

10.1 发送命令和命令响应

Zigbee应用程序框架API包含许多有用的宏,用于发送和响应ZCL命令。所有宏都在文件client-command-macro.h中定义。这个文件是为每个项目生成的。例如,在构建项目Z3Light之后,可以在<user workspace>/Z3Light/client-command-macro.h中找到该文件。

要发送命令,请执行以下操作:
发送一个命令:

  1. 使用client-command-macro.h 文件中的填充宏构造一个命令:
    例如:
emberAfFillCommandIdentifyClusterIdentify(identifyTime);

identifyTime是一个int16u,在规范中定义为设备应该继续标识自身的秒数。
这个宏用适当的值填充命令缓冲区。
2. 检索指向命令EmberApsFrame的指针,并用命令的适当源和目标端点填充它。ApsFrame中的其他值(如序列号)由框架处理,因此您不需要担心它们。
3. 一旦构造了命令,就可以使用以下函数之一将命令作为单播、多播或广播发送

EmberStatus emberAfSendCommandMulticast(int16u multicastId); 
EmberStatus emberAfSendCommandUnicast(EmberOutgoingMessageType type, int16u indexOrDestination); 
EmberStatus emberAfSendCommandBroadcast(int16u destination);

发送响应到传入命令:
使用类似的机制向传入命令发送响应。

  1. 使用app/framework/gen/client-command .h中包含的命令响应宏来填充响应命令缓冲区,例如:
emberAfFillCommandIdentifyClusterIdentifyQueryResponse(timeout)

Timeout是一个int16u,表示设备将继续标识自己的秒数。

  1. 您不需要担心响应EmberApsFrame中设置的 endpoints ,因为它们是由框架处理的。
  2. 通过调用emberAfSendResponse()发送响应命令。

10.2 ZCL命令处理

当Zigbee应用程序框架接收到一个ZCL命令时,它会在位于app/framework/util/util.c中的实用程序函数emberAfProcessMessage中传递以进行命令处理。process message函数解析该命令并填充类型为EmberAfClusterCommand的本地结构。一旦填充了这个结构,就将它分配给全局指针emAfCurrentCommand,以便在命令处理期间调用的每个函数都可以使用它。

EmberAfProcessMessage首先调用emberAfPreCommandReceivedCallback来给应用程序一个机会来处理这个命令。如果该命令是全局命令,则将其传递给process-global-message.c进行处理;否则,它将被传递到process-cluster-message.c进行处理。

注意:有关命令处理流程的更多信息,请参见第6章中包含的有关回调接口的消息流程图。

10.2.1 app/framework/util/process-global-message.c

Process-global-message.c处理所有全局命令,例如读取和写入属性。全局命令目前不像特定于Cluster的命令那样具有相关的命令回调。

10.2.2 app/framework/util/process-cluster-message.c

Process-cluster-message.c处理所有特定于Cluster的命令。大多数特定于Cluster的命令依次传递到位于app/framework/gen/call-command-handler.c的生成文件call-command-handler.c。这个生成的文件解析命令的参数,并选择性地调用相关的特定于Cluster的回调。

生成的文件call-command-handler.c目前不处理Key的建立。对于当前的命令处理程序生成器来说,命令处理程序被认为过于复杂。在app/framework/cluster/key-establishment.c中,用于建立密钥的命令直接传递给Cluster代码进行处理。

注意:由于特定于Cluster的命令回调是在命令处理上下文中调用的,所以与在这些回调中处理的任何命令相关联的所有元数据都可以从全局指针emAfCurrentCommand中获得。

始终使用app/framework/include/af.h中提供的名为emberAfCurrentCommand()的方便宏来访问全局指针emAfCurrentCommand。

10.3 发送默认应答

Zigbee应用程序框架不会自动为应用程序实现的命令回调发送默认响应。为了提高系统的可靠性和灵活性,我们将所有默认的响应处理都交给了应用程序。这意味着,虽然您现在可以完全控制发送您所处理的命令的默认响应,但您也要负责发送所有这些命令的默认响应。对于没有特定响应且本身不是默认响应的任何单播消息,必须发送默认响应。有关默认响应何时应该发送,何时不应该发送的更多信息,请参考ZigBee文档。

Zigbee创建了一个插件来处理为他们处理的所有命令发送默认响应。插件不能处理的任何命令都会自动返回EMBER_ZCL_STATUS_UNSUP_CLUSTER_COMMAND或类似的命令。应用程序需要对其处理的所有命令执行相同的操作,这些命令本身没有特定的命令响应。

我们创建了一个默认的响应API,以使这尽可能简单。emberAfSendDefaultResponse命令接受两个参数:当前命令和状态字节。可以使用emberAfCurrentCommand()从Ember应用程序框架中检索当前命令。用于默认响应的ZCL状态字节在app/framework/gen/ enuml .h中枚举。

void emberAfSendDefaultResponse(EmberAfClusterCommand *cmd, EmberAfStatus status);

这个函数的典型用法如下:

emberAfSendDefaultResponse( emberAfCurrentCommand(), EMBER_ZCL_STATUS_SUCCESS );
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Smartlabs

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值