多应用+插件架构,代码干净,二开方便,首家独创一键云编译技术,文档视频完善,免费商用码云13.8K 广告
>[success] 导师视频讲解:[去听课](https://www.bilibili.com/video/BV1k34y1D7Vz/) >[success] **技术支持说明:** >**1**.一般以自主学习为主 > **2**.可到官方问答社区中提问:[**去提问**](https://bbs.csdn.net/forums/zigbee) > **3**.工程师**会尽快**解答社区问题,但他们是一线开发,【**难以保证**】解答时效,解答辛苦,感谢理解! <br/> 在ZCL通信过程章节中,笔者举了一个网关(协调器)和智能插座(终端或路由器)的例子,下面基于该例子介绍ZCL 命令收发API。 <br/> ## **发送命令API** 前文提及到的On/Off命令是一个Cluster限定命令,在On/Off Cluster中。On/Off Cluster中还包含其他的命令,例如Toggle(反转状态)。可以调用专门的API来使用命令。打开Profile文件夹,可以找到zcl\_general.h文件,如下图所示。 ![](https://img.kancloud.cn/b7/42/b742c2796ff82183e2a5c3c840f2bea7_264x440.png =200x) ### 在zcl\_general.h文件中可以找如下3个API: ``` #ifdef ZCL_ON_OFF /* * Send an On Off Command - COMMAND_ONOFF_OFF * Use like: * ZStatus_t zclGeneral_SendOnOff_CmdOff( uint16 srcEP, afAddrType_t *dstAddr, uint8 disableDefaultRsp, uint8 seqNum ); */ #define zclGeneral_SendOnOff_CmdOff(a,b,c,d) zcl_SendCommand( (a), (b), ZCL_CLUSTER_ID_GEN_ON_OFF, COMMAND_OFF, TRUE, ZCL_FRAME_CLIENT_SERVER_DIR, (c), 0, (d), 0, NULL ) /* * Send an On Off Command - COMMAND_ONOFF_ON * Use like: * ZStatus_t zclGeneral_SendOnOff_CmdOn( uint16 srcEP, afAddrType_t *dstAddr, uint8 disableDefaultRsp, uint8 seqNum ); */ #define zclGeneral_SendOnOff_CmdOn(a,b,c,d) zcl_SendCommand( (a), (b), ZCL_CLUSTER_ID_GEN_ON_OFF, COMMAND_ON, TRUE, ZCL_FRAME_CLIENT_SERVER_DIR, (c), 0, (d), 0, NULL ) /* * Send an On Off Command - COMMAND_ONOFF_TOGGLE * Use like: * ZStatus_t zclGeneral_SendOnOff_CmdToggle( uint16 srcEP, afAddrType_t *dstAddr, uint8 disableDefaultRsp, uint8 seqNum ); */ #define zclGeneral_SendOnOff_CmdToggle(a,b,c,d) zcl_SendCommand( (a), (b), ZCL_CLUSTER_ID_GEN_ON_OFF, COMMAND_TOGGLE, TRUE, ZCL_FRAME_CLIENT_SERVER_DIR, (c), 0, (d), 0, NULL ) ``` ### 这3个API分别实现了发送关闭、打开和反转状态命令。它们均是使用#define来定义,并且最终是调用zcl\_SendCommand函数来发送命令的。zcl_SendCommand函数的定义如下: ### ``` extern ZStatus_t zcl_SendCommand( uint8 srcEP,//源端点,发送者的端点号 afAddrType_t *dstAddr,//目标设备地址 uint16 clusterID, uint8 cmd,//Cluster ID和命令 uint8 specific,//是否为属性关联命令 uint8 direction,//通信方向 uint8 disableDefaultRsp,//是否关闭默认响应(目标设备的响应) uint16 manuCode,//manu code uint8 seqNum,//数据包标识号,由开发者自定义 uint16 cmdFormatLen,//命令格式长度 uint8 *cmdFormat//命令格式 ); ``` ### 以zclGeneral\_SendOnOff\_CmdOff为例子展开简介一下其对zcl\_SendCommand的调用,代码如下: ``` zcl_SendCommand( (a), (b), ZCL_CLUSTER_ID_GEN_ON_OFF,//Cluster ID COMMAND_OFF,//待发送命令为关闭命令 TRUE,//TRUE表示属性关联命令 ZCL_FRAME_CLIENT_SERVER_DIR,//表示通信方向为从Client到Server (c), 0,//manu code为0 (d), 0,//命令格式长度为0 NULL)//命令格式为空 ``` 通常,开发者调用基于zcl\_SendCommand封装出来的各种命令发送API即可,例如上述的3个命令发送API。 <br/> ## **接收命令** 接收On/Off命令的方法比较简单,只需要在ZCL命令处理函数列表zclSampleSw\_CmdCallbacks的对应位置添加命令处理函数即可实现命令的接收和处理了。下节课将结合具体案例进行讲解。 <br/> <br/> ## **项目定制** * 如需项目定制开发,可扫码添加项目经理好友(注明“**项目定制**”) * 定制范围:**NB-IoT**、**CATn(4G)**、**WiFi**、**ZigBee**、**BLE Mesh**以及**STM32**、**嵌入式Linux**等IoT技术方案 * 善学坊官网:[www.sxf-iot.com](https://www.sxf-iot.com/) ![](https://img.kancloud.cn/ca/73/ca739f92cab220a3059378642e3bd502_430x430.png =200x) * 非项目定制**勿扰**,此处**非**技术支持