多应用+插件架构,代码干净,二开方便,首家独创一键云编译技术,文档视频完善,免费商用码云13.8K 广告
>[success] 导师视频讲解:[去听课](https://www.bilibili.com/video/BV1k34y1D7Vz/) >[success] **技术支持说明:** >**1**.一般以自主学习为主 > **2**.可到官方问答社区中提问:[**去提问**](https://bbs.csdn.net/forums/zigbee) > **3**.工程师**会尽快**解答社区问题,但他们是一线开发,【**难以保证**】解答时效,解答辛苦,感谢理解! <br/> ## **添加属性** 待开发设备所需要使用的属性均需要在属性列表中定义。如前面章节所述,打开zcl\_samplesw\_data.c文件,可以找到属性列表的代码定义: ![](https://img.kancloud.cn/c3/e1/c3e1f359ceacc0b59fad51c2e34d6a3f_728x864.png =400x) ### 在ZCL内容详解章节已经讲解过这个数组了,此处更进一步讲解一下。属性ATTRID\_ON\_OFF\_SWITCH\_ACTIONS为例讲解,这个属性: * 是一个8位的属性(ZCL\_DATATYPE\_ENUM8) * 可以看到这个属性是可被读取和写入写的(ACCESS\_CONTROL\_READ | ACCESS\_CONTROL\_WRITE)。 * 这个属性被添加进Cluster ZCL\_CLUSTER\_ID\_GEN\_ON\_OFF\_SWITCH\_CONFIG 中 开发者可以套用上述代码来往指定的Cluster中添加指定的属性。 <br/> ## **属性读写命令API** 可以调用属性读写命令API对指定的属性进行读取或写入。打开zcl.h文件,可以找到属性读写命令API的定义,代码如下: ### ``` #ifdef ZCL_READ /* * 发送一个读取属性命令 */ extern ZStatus_t zcl_SendRead( uint8 srcEP, // 源端点号 afAddrType_t *dstAddr, // 目标设备地址信息 uint16 realClusterID, // Cluster ID zclReadCmd_t *readCmd, // “读”信息 uint8 direction, // 通信方向 uint8 disableDefaultRsp, //是否关闭默认响应(目标设备的响应) uint8 seqNum); // 数据包标号,由开发者自定义 /* * 省略部分代码 */ #endif // ZCL_READ #ifdef ZCL_WRITE /* * 发送一个写入属性命令 ZCL_CMD_WRITE * 按以下方式调用: * ZStatus_t zcl_SendWrite( * uint8 srcEP, // 源应用端点 * afAddrType_t *dstAddr, // 目标设备地址信息 * uint16 realClusterID, // Cluster ID * zclWriteCmd_t *writeCmd, // “写”信息 * uint8 direction, // 通信方向 * uint8 disableDefaultRsp, //是否关闭默认响应(目标设备的响应) * uint8 seqNum); // 数据包标号,由开发者自定义 */ #define zcl_SendWrite(a,b,c,d,e,f,g) (zcl_SendWriteRequest( (a), (b), (c), (d), ZCL_CMD_WRITE, (e), (f), (g) )) /* * 省略部分代码 */ #endif // ZCL_WRITE ``` <br/> ## **命令处理** 客户端设备在向服务端设备发送上述命令后,会接收到由服务端的返回来的响应信息并且产生系统事件ZCL\_INCOMING\_MSG。因此,需要处理这个事件。打开zcl\_samplesw.c文件中的zclSampleSw\_event\_loop函数,添加对应的事件处理函数zclSampleSw_ProcessIncomingMsg,代码如下: ![](https://img.kancloud.cn/89/1d/891d211824059826d3ad3f9eaf6fae3e_758x382.png =500x) ### zclSampleSw\_ProcessIncomingMsg是由开发者自定义的函数,代码如下: ### ``` 1.static void zclSampleSw_ProcessIncomingMsg(zclIncomingMsg_t *pInMsg) 2.{   3.  switch ( pInMsg->zclHdr.commandID )   4.  {   5.#ifdef ZCL_READ   6.    case ZCL_CMD_READ_RSP:  // 读命令响应信息 7.      zclSampleSw_ProcessInReadRspCmd( pInMsg );//读响应信息处理函数 8.      break;   9.#endif   10.#ifdef ZCL_WRITE   11.    case ZCL_CMD_WRITE_RSP:  // 写命令响应信息 12.      zclSampleSw_ProcessInWriteRspCmd( pInMsg ); //写命令响应信息处理函数 13.      break;   14.#endif   15.#ifdef ZCL_REPORT   16.    ...... // 暂时不展开 17.#endif   18. 19.    case ZCL_CMD_DEFAULT_RSP:  // 默认响应信息 20.      zclSampleSw_ProcessInDefaultRspCmd( pInMsg );//默认响应信息处理函数 21.      break;   22. 23.#ifdef ZCL_DISCOVER   24.    ...... // 暂时不展开 25.#endif   26. 27.    default:   28.      break;   29.  }   30.   31.  if ( pInMsg->attrCmd )   32.    osal_mem_free( pInMsg->attrCmd );   33.} ``` ### 上述代码用到了默认响应(ZCL\_CMD\_DEFAULT\_RSP)、读响应(ZCL\_CMD\_READ\_RSP)和写响应(ZCL\_CMD\_WRITE\_RSP),分别展开讲解一下。 * **默认响应** 客户端给服务端发送命令时可以指定服务器端是否需要返回一个默认的响应信息。客户端可以据此来确定服务器端是否确实接收到这个命令。 ### * **读响应** 客户端给服务端发送读取属性命令后,服务端会返回一个读响应。这个读响应中包含了属性是否读取成功和属性值等内容。 ### * **写响应** 客户端给服务端发送写命令后,服务端会返回一个写响应。这个写响应中包含属性值是否写入成功等信息。 <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) * 非项目定制**勿扰**,此处**非**技术支持