ThinkChat🤖让你学习和工作更高效,注册即送10W Token,即刻开启你的AI之旅 广告
* 导师视频讲解:[**去听课**](https://www.bilibili.com/video/BV1k34y1D7Vz/) >[success] **技术支持说明:** >**1**.一般以自主学习为主 > **2**.可到官方问答社区中提问:[**去提问**](https://bbs.csdn.net/forums/zigbee) > **3**.工程师**会尽快**解答社区问题,但他们是一线开发,【**难以保证**】解答时效,解答辛苦,感谢理解! <br/> 终端设备开发内容主要有以下这几部分: * 定义和启动属性上报事件 * 定义事件处理函数,进行属性上报 * 启用对应的宏定义 <br/> ## **定义和启动属性上报事件** 在zcl_samplesw.h文件中添加事件定义和事件发生时间定义,代码如下: ### ``` #ifdef ZDO_COORDINATOR #else /* * 此处省略了部分代码 */ #define SAMPLEAPP_REPORT_EVT 0x0040 #define SAMPLEAPP_REPORT_PERIOD 3000 #endif ``` <br/> 在zcl\_samplesw.c文件中的应用层初始化函数zclSample\_Init中添加启动属性上报事件代码: ``` osal_start_timerEx(zclSampleSw_TaskID, SAMPLEAPP_REPORT_EVT,//事件 SAMPLEAPP_REPORT_PERIOD);//延迟处理事件的时间长度 ``` <br/> ## **定义事件处理函数** 定义事件后,需要添加事件处理函数。打开zcl\_samplesw.c文件找到事件处理函数zclSampleSw\_event\_loop,添加如下代码: ~~~ #ifdef ZDO_COORDINATOR #else /* * 此处省略了部分代码 */ if ( events & SAMPLEAPP_REPORT_EVT ) { zclSampleSw_ReportTest();//属性上报事件的处理函数 //启动下一个属性上报事件 osal_start_timerEx(zclSampleSw_TaskID, SAMPLEAPP_REPORT_EVT, SAMPLEAPP_REPORT_PERIOD); return ( events ^ SAMPLEAPP_REPORT_EVT ); } #endif ~~~ <br/> #### **属性上报API 简介** 只需调用属性上报API即可完成属性上报功能。在zcl.c文件中,可以找到属性上报API,代码如下: ### ~~~ /* * 上报一个或多个属性值 */ extern ZStatus_t zcl_SendReportCmd( uint8 srcEP, //源端点号 afAddrType_t *dstAddr, //目标设备地址信息 uint16 realClusterID, //属性所属Cluster ID zclReportCmd_t *reportCmd,//描述待上报的属性值 uint8 direction, //通信方向 uint8 disableDefaultRsp, //是否关闭默认响应(目标设备的响应) uint8 seqNum); //数据包标号,由开发者自定义 ~~~ ### <br/> #### **属性上报处理函数** 学习完API后,即可编写属性上报事件处理函数zclSampleSw_ReportTest,其代码定义如下: ### ``` /* * 数据上报事件的处理函数,用于上报数据 */ static void zclSampleSw_ReportTest(void) {   static uint8 seqNum = 0;   zclReportCmd_t *reportCmd;   //目标设备的地址信息 afAddrType_t destAddr;   destAddr.addrMode = afAddr16Bit; destAddr.endPoint = SAMPLESW_ENDPOINT; destAddr.addr.shortAddr = 0x0000;//0x0000表示协调器的网络地址 reportCmd = (zclReportCmd_t *)osal_mem_alloc(sizeof(zclReportCmd_t)+sizeof(zclReport_t));//申请内存空间 if(reportCmd == NULL)//判断内存空间是否申请成功   return;   reportCmd->attrList[0].attrData = (uint8 *)osal_mem_alloc(sizeof(uint8));//申请内存空间 if(reportCmd->attrList[0].attrData == NULL)//判断内存空间是否申请成功 return;   reportCmd->numAttr = 1;//属性数量为1 reportCmd->attrList[0].attrID = ATTRID_ON_OFF_SWITCH_TYPE;//属性ID reportCmd->attrList[0].dataType = ZCL_DATATYPE_ENUM8;//数据类型 *((uint8 *)(reportCmd->attrList[0].attrData)) = seqNum;//属性值 //上报数据 zcl_SendReportCmd(SAMPLESW_ENDPOINT,//源端点号 &destAddr,//地址信息 ZCL_CLUSTER_ID_GEN_ON_OFF_SWITCH_CONFIG,//Cluster ID reportCmd, ZCL_FRAME_CLIENT_SERVER_DIR,//通信方向为从客户端到服务端 TRUE,//关闭默认响应(目标设备的响应)   seqNum++ );//数据包标号,每上报一次数据seqNum的值就会增加1 HalLcdWriteStringValue("Report: ", (seqNum-1), 10, 4);//显示 // 释放内存空间! osal_mem_free(reportCmd->attrList[0].attrData);   osal_mem_free(reportCmd); } ``` <br/> ## **启用对应的宏定义** 最后,还需要开启一个宏定义ZCL\_REPORTING\_DEVICE,如下图所示。 ![](https://img.kancloud.cn/7b/c5/7bc589cc8cdb932b0496d63841460a1b_650x810.png =500x) <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) * 非项目定制**勿扰**,此处**非**技术支持