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 );

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

  1. 9. Zigbee应用程序框架开发指南 - 属性管理

    1 Zigbee应用程序框架开发指南 - 概述 2 Zigbee应用程序框架开发指南 - 应用程序框架结构 3 Zigbee应用程序框架开发指南 - 应用程序框架目录结构 4 Zigbee应用程序框架 ...

  2. 王者级微信小程序开发实战教学 从零到高手搭建微信小程序框架开发教程

    王者级微信小程序开发实战教学 从零到高手搭建微信小程序框架开发教程 小程序进阶 王者级微信小程序开发实战教学课程,讲师手把手对同学们进行微信小程序开发的进阶实战,从零开始搭建,从本地到云端开始系统化的 ...

  3. 开发跨端微信小程序框架选型指南

    多端框架uni-app和Taro选型对比 一. 背景 小程序原生开发有不少槽点: 1.原生wxml开发对Node.预编译器.webpack支持不好,影响开发效率和工程构建流程.所以大公司都会用框架开发 ...

  4. 使用Taro小程序框架开发一个学习、刷题、论坛、聊天交流的微信小程序

    本项目小程序端采用Taro技术框架,可将React代码编译为微信小程序.安卓APP.IOS程序.H5页面等,管理端采用React Hook + TypeScript来进行开发 项目介绍 当代大学生上课 ...

  5. 「小程序」开发 指南(里面是小程序开发的各种论坛和文档)

    之前研究小程序,看到了一篇小程序的开发帖子,在这分享给大家. 什么是微信小程序? 微信之父张小龙是这样描述小程序的: 小程序是一个不需要下载安装就可使用的应用,它实现了应用触手可及的梦想,用户扫一扫或 ...

  6. Jdon框架开发指南

    Jdon框架快速开发指南 开发主要步骤如下: JdonFramework6.0以上两步开发见这里. 快速配置指南 新增/查询/修改/删除(CRUD); 批量查询和分页显示 本文Step By Step ...

  7. 【微信小程序-原生开发】实用教程20 - 生成海报(实战范例为生成活动海报,内含生成指定页面的小程序二维码,保存图片到手机,canvas 系列教程)

    可在系列教程的基础上继续开发,也可以单独使用 [微信小程序-原生开发]系列教程 效果预览 代码实现 点击触发生成海报 在活动详情页,指定点击某图标/按钮,触发跳转到生成海报的页面 pages\comp ...

  8. 《Boost程序完全开发指南》

    1.3开发环境 由于Boost大量使用了C++高级特性(如模板偏特化.ADL),因此不是所有的编译器都 能够很好地支持Boost. 在VC集成环境中使用嵌入工程编译的方式需要定义宏BOOST_ALL_ ...

  9. 程序员开发指南!半路出家Android程序员看我轻松逆袭!实战篇

    前言 不清楚你是不是知道,咱们中国有相当大的一部分软件公司,他们的软件开发团队都小的可怜,甚至只有1-3个人,连一个项目小组都算不上,而这样的团队却要承担一个软件公司所有的软件开发任务,在软件上线和开 ...

  10. 全志Tina Linux MPP (多媒体框架)开发指南支持百问网T113 D1-H哪吒DongshanPI-D1s V853-Pro等开发板

    1 简述 整理 MPP sample 使用说明文档的目的是:使 MPP sample 更好用. 2 简介 MPP sample 一般存放在 MPP Middleware 的 sample 目录下.此外 ...

最新文章

  1. Python核心编程:第十四章
  2. shell 字符串操作(长度,查找,替换)详解
  3. postman使用介绍
  4. 关于TxQBService报的错,腾讯你真牛B啊
  5. 非关系型数据库mongodb的打开与连接
  6. 神策数据获华农保险2020年“最佳合作机构”荣誉称号
  7. preg使用。还是一样,只是个人记录,不放博客园首页
  8. 计算机五大逻辑部件数据流,211计算机基础知识综合篇.ppt
  9. 聊聊restful和restframework
  10. 自定义action消息
  11. 美国自动驾驶研发国家队NASA入局,还提供了航天跑道做测试
  12. LeetCode Golang 答案
  13. 2021-08-10小米盒子3增强版挂U盘刷v1.46版历程
  14. 定投计算器和年化利率计算器
  15. js实现table中td单元格合拼并求和
  16. oracle删除lob对象,ORACLE LOB大对象处理
  17. 算法简介:不撞南墙不回头----深度优先搜索算法(DFS)
  18. Html怎么判断ie5,css怎样判断IE浏览器?
  19. 初学者怎么快速学习3D建模?零基础必备建模知识,你都明白吗?
  20. 芯洲科技SCT2462Q车规DCDC,完全替代LM61460。

热门文章

  1. 简单实用的查询ip地址、mac地址,修改ip地址的方法,ping命令检测网络是否通畅
  2. IP地址分为A,B,C,D,E五类
  3. cisco是什么公司(cisco是什么公司新加坡)
  4. 自定义jsx解析工厂函数
  5. django generic view - ListView
  6. ThinkPad E430 蓝牙驱动 BCM43142A0
  7. ORACLE局域网连接
  8. 企业微信最全17种获客+4种自动转化玩法
  9. 计量经济学及Stata应用 陈强 第九章模型设定与数据问题习题9.3
  10. 高级计量经济学及Stata应用 第2版 陈强+stata十八讲+应用STATA做统计分析