HA规范的理解3 - 初始化函数里的注册回调函数的分析
2015-08-20 21:20
543 查看
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规范文档里颜色可调灯设备的功能来做实验验证。
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规范文档里颜色可调灯设备的功能来做实验验证。
相关文章推荐
- Rabbitmq集群搭建笔记
- wma tag 批量修改[原代码-从wmfsdk中修改]
- 网站被黑后的处理方法及批量删除恶意代码
- 再谈反向链接,又学了东西
- 大家要经常更新内容啊-针对百度的原创收录速度测试
- jsp 定制标签(Custom Tag)
- DEDECMS TAG伪静态 IIS_rewrite配置方法附rewrite下载
- 个人经验总结:网站被百度“拔毛”如何恢复?
- JSP自定义分页标签TAG全过程
- 网站优化细节之服务器的选择真没见过
- jQuery实现tag便签去重效果的方法
- 3种高效的Tags标签系统数据库设计方案分享
- Javascript让DEDECMS告别手写Tag
- 国内第一篇详细讲解hadoop2的automatic HA+Federation+Yarn配置的教程
- Kafka设计解析(三)- Kafka High Availability (下)
- How to Setup a windows 2008 Failover cluster[01]
- 非常不错的rabbitmq集群高可用部署
- JuniperFW HA
- vMotion、SvMotion、HA和FT的详细对比说明
- vMotion、SvMotion、HA和FT的详细对比说明