1、 在 zclSampleLight_Init(); 里可以找到回调函数的注册函数: zclGeneral_RegisterCmdCallbacks(SAMPLELIGHT_ENDPOINT, &zclSampleLight_CmdCallbacks ); 在该函数里需要理解两个静态全局指针结构体变量和两个函数: (1) 两个变量(查看它的类型,需要理解其含义和作用): static zclLibPlugin_t *plugins; static zclGenCBRec_t *zclGenCBs; 其中zclGenCBs指向了功能域里真正的回调函数。而plugins指向的是消息处理时的第一层回调函数zclGeneral_HdlIncoming ();。 (2) 两个函数(以下加红的): zcl_registerPlugin( ZCL_CLUSTER_ID_GEN_BASIC, ZCL_CLUSTER_ID_GEN_MULTISTATE_VALUE_BASIC, zclGeneral_HdlIncoming ); 2、 分析: Plugins在zcl_registerPlugin();里,它指向了消息收入处理函数zclGeneral_HdlIncoming();。(在消息接收时有一个语句:status =pInPlugin->pfnIncomingHdlr( &inMsg );就是执行该函数的。) 在消息收入处理函数zclGeneral_HdlIncoming();里,有以下程序: if ( zcl_ClusterCmd( pInMsg->hdr.fc.type ) ) { // Is this a manufacturerspecific command? if (pInMsg->hdr.fc.manuSpecific == 0 ) { stat =zclGeneral_HdlInSpecificCommands(pInMsg ); } … … } 在zclGeneral_HdlInSpecificCommands( pInMsg ); 里做了两件事: (1) pCBs = zclGeneral_FindCallbacks( pInMsg->msg->endPoint ); 匹配该消息所指向的端口号并将该端口注册好的回调函数地址给pCBs。 (即正是将zclGenCBs指向的功能域里的回调函数地址调出来给pCBs) (2) 匹配消息里的簇,进入对应的簇里将命令引入处理函数,处理函数里有该簇所对应的回调函数(用pCBs所指向的对应功能域里的函数)。
3、 小结: (1) 通过以上对回调函数的注册函数的分析之后,估计可以根据这里的理解来构建协议栈里没有给出的部分功能域回调函数集,应该可以解决上一篇《HA规范的理2》 里留下的问题了吧。 (2) 另外上一篇《HA规范的理2》里最后提到的ZCL API 的问题,这个问题只是按照目前对规范和协议栈理解的进度而做出的一种想法上的提问(即是说根据目前对Light_Switch例程的理解,感觉按键节点就是通过调用General 功能域的API来发送控制命令的,这么说的话应该每个控制命令都得对应一个API。而实际上ZCL API里并没有给出所有功能域下的命令API,不知是要自己构建发送命令函数,还是还有哪里需要理解的。) 而HA的开发只要符合规范就行了,具体实现TI给出了一个框架,剩下的事情也许就是自己构建各种实现函数和类型了。 (3) 以上问题的理解和验证或许可以通过实践HA规范文档里颜色可调灯设备的功能来做实验验证。
|
感谢分享