💎一站式轻松地调用各大LLM模型接口,支持GPT4、智谱、星火、月之暗面及文生图 广告
>[success] 导师视频讲解:[去听课](https://www.bilibili.com/video/BV1k34y1D7Vz/) >[success] **技术支持说明:** >**1**.一般以自主学习为主 > **2**.可到官方问答社区中提问:[**去提问**](https://bbs.csdn.net/forums/zigbee) > **3**.工程师**会尽快**解答社区问题,但他们是一线开发,【**难以保证**】解答时效,解答辛苦,感谢理解! <br/> 前面章节讲解到在应用层可以调用ZCL API 来进行数据通信,本节课讲解一下在应用层调用 ZCL API 的基本模式。 <br/> 打开zcl\_samplesw.c文件中的应用层初始化函数zclSampleSw\_Init,可以找到如下代码: ### ``` // Register the ZCL General Cluster Library callback functions   zclGeneral_RegisterCmdCallbacks(SAMPLESW_ENDPOINT,   &zclSampleSw_CmdCallbacks);   zclSampleSw_ResetAttributesToDefaultValues();     // Register the application's attribute list     zcl_registerAttrList(SAMPLESW_ENDPOINT,zclSampleSw_NumAttributes,                                           zclSampleSw_Attrs);   // Register the Application to receive the unprocessed Foundation command/response messages     zcl_registerForMsg( zclSampleSw_TaskID ); ``` ### 简单讲解一下它们的工作内容。 * **zclGeneral\_RegisterCmdCallbacks** 注册一个命令执行回调(Call Back)。这个回调中包含一个命令处理函数列表。当设备接收到命令时,就在在这个列表中找打到对应的命令处理函数,处理该命令。 ### * **zclSampleSw\_ResetAttributesToDefaultValues** 把一些属性设置为默认值 ### * **zcl\_registerAttrList** 为设备注册属性列表。前面章节已将结果,函数参数zclSampleSw\_Attrs是一个属性列表。可在zcl\_samplesw\_data.c文件找到其定义。 ### * **zcl\_registerForMsg** 告诉设备需要接收未处理的Foundation(基础)命令或者响应消息。调用该函数后,在接收到例如读命令、写命令或上报命令等基础命令时,就会发生系统事件ZCL\_INCOMING\_MSG,开发者在该事件处理函数中做相关处理即可。 <br/> ## **zclSampleSw\_CmdCallbacks** 可在zcl\_samplesw.c文件中找到命令执行回调的定义,代码如下: ![](https://img.kancloud.cn/53/64/5364b5449a0e2c0afefd145d30e48e23_832x556.png =600x) ### zclSampleSw\_CmdCallbacks是一个命令处理函数列表(数组),其中的每个元素均表示某个特定命令的处理函数。可以通过注释或者查看该函数列表的类型定义可以查看每个元素代表的是哪个命令的处理函数。如果元素值为NULL,表示该命令无处理函数,即不处理该命令。如果需要on/off Cluster的命令,那么在其对应的元素位置设置处理处理函数即可。 <br/> ## **ZCL\_INCOMING\_MSG** 在AF通信章节中,当设备接收到AF层的数据时就会产生系统事件AF\_INCOMING\_MSG\_CMD,开发者只需在对应的事件处理函数中做相应处理即可。ZCL\_INCOMING\_MSG的意义与之类似,如果发生系统事件ZCL\_INCOMING\_MSG就表示有基础命令或消息需要处理。 ### 打开zcl\_samplesw.c文件中的zdSampleSw\_event\_loop函数,可以找到ZCL\_INCOMING\_MSG的事件处理函数zclSamplesw\_ProcessIncomingMsg: ![](https://img.kancloud.cn/f1/7e/f17ec9fbeda2a340c02479ef563a8d65_830x290.png =600x) ### zclSampleSw\_ProcessIncomingMsg函数的定义如下: ### ``` 1.static void zclSampleSw_ProcessIncomingMsg(zclIncomingMsg_t *pInMsg)    2.{     3.  switch ( pInMsg->zclHdr.commandID )//根据不同的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.    case ZCL_CMD_CONFIG_REPORT:     17.      //zclSampleSw_ProcessInConfigReportCmd( pInMsg );     18.      break;     19.    case ZCL_CMD_CONFIG_REPORT_RSP:     20.      //zclSampleSw_ProcessInConfigReportRspCmd( pInMsg );     21.      break;     22.    case ZCL_CMD_READ_REPORT_CFG:     23.      //zclSampleSw_ProcessInReadReportCfgCmd( pInMsg );     24.      break;     25.    case ZCL_CMD_READ_REPORT_CFG_RSP:     26.      //zclSampleSw_ProcessInReadReportCfgRspCmd( pInMsg ); 27.      break;     28.    case ZCL_CMD_REPORT:     29.      //zclSampleSw_ProcessInReportCmd( pInMsg );     30.      break;     31.#endif 32.     case ZCL_CMD_DEFAULT_RSP: //默认响应 33.      zclSampleSw_ProcessInDefaultRspCmd( pInMsg );     34.      break; 35.#ifdef ZCL_DISCOVER  // 扫描命令   36.    ... ... // 不展开   37.#endif 38.    default:     39.      break;     40.  } 41.  if ( pInMsg->attrCmd )     42.    osal_mem_free( pInMsg->attrCmd );     43.} ``` ### 该函数的内容还是挺好理解的,大致就是根据不同的commandID做相应的处理。 >[warning] 读者暂时只需大致了解该函数的内容即可,无需深入了解每一行代码 ### 需要注意的是,使用ZCL的基础命令前,需要开启相应的宏的,例如使用“读”命令需要开启ZCL\_READ 。其开启方式与HAL宏的开启方式是相同的,如图所示。 ![](https://img.kancloud.cn/91/2e/912e5ca361562e340346bce95a731557_680x776.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) * 非项目定制**勿扰**,此处**非**技术支持