【ZigBee 系列】| ZigBee 3.0 协议栈消息处理流程分析

NXP ZigBee3.0SDK 相比之前的版本有较大的改进,简化了 JenOS 操作系统,采用更容易理解的前后台方式。我们以 ZigBee3.0 例程 JN-AN-1218-Zigbee-3-0-Light-Bulb 为例子,分析收到 On/Off Cluster(0x0006)消息时的函数调用流程。
在程序启动后调用代码入口 vAppMain 函数,初始化 Cluster Instance 实例,并注册 EndPoint 回调函数的过程如下:

vAppMain
→vInitialiseApp
→APP_ZCL_vInitialise
→eApp_ZLO_RegisterEndpoint
→eZLO_RegisterDimmableLightEndPoint
→eCLD_OnOffCreateOnOff





我们以 ZigBee3.0 例程 JN-AN-1218-Zigbee-3-0-Light-Bulb 为例子,分析收到 On/Off Cluster(0x0006)命令时的函数调用流程。



下面 ZigBee 的处理流程图,任务 bdb_taskBDB 主要处理 ZigBee Cluster Library 相关的消息。



APP_vMainLoop
→bdb_taskBDB
→APP_vBdbCallback
→vAppHandleAfEvent
→APP_ZCL_vEventHandler
→vZCL_EventHandler
→vZCL_ZigbeeEventHandler



深入分析 vZCL_HandleDataIndication 函数的处理过程。函数 eZCL_SearchForClusterEntry 通过 u16ClusterId 找到对应的 Cluster Instance 实例,并调用 Cluster 注册的回调函数。这个回调函数在 eZLO_RegisterDimmableLightEndPoint 初始化时作为参数保存在 Cluster Instance 的数据结构内存中。





在函数 eCLD_OnOffCommandHandler 的处理过程中,根据收到的 On,Off, Toggle 命令,分别调用对应的处理函数。

eCLD_OnOffCommandHandler
→eCLD_OnOffHandleOnCommand
→eCLD_OnOffHandleOffCommand
→eCLD_OnOffHandleToggleCommand




当 我 们 考 察 eCLD_OnOffHandleOnCommand 函 数 的 具 体 处 理 过 程 时 会 发 现 在 这 个 函 数 中 , 数 据 结 构 psSharedStruct->bOnOff = 0x01 被修改,从而在逻辑上实现 On 的动作。物理状态改变则在后面的代码中。



函数 eCLD_OnOffHandleOnCommand 修改了 psSharedStruct->bOnOff 数据结构的状态值,改变了灯的逻辑状态。而真正改变 Light 灯的物理状态则在 Endpoint 的注册回调 APP_ZCL_cbEndpointCallback 函数。当改变数据结构状态值后 , 将会调用 Endpoint 的 注册回调函 数,事件类型分别是 E_ZCL_CBET_CLUSTER_CUSTOM 和 E_ZCL_CBET_CLUSTER_UPDATE。在这二个事件的处理过程中,将会调用灯的外设驱动程序 vWhiteLightSetLevels 函数,改变灯的物理状态。





从 JN-AN-1218-Zigbee-3 -0-Light Bulb 处理流程我们可以分析得知,NXP ZigBee 协议栈已经实现了绝大部分处理代码。用户只需要在端点的注册回调函数 APP_ZCL_cbEndpointCallback 中修改并实现业务功能即可。整个 ZigBee 协议栈涉及的代码比较多,但真正需要用户修改、实现的用户代码其实并不多。往往只需要增加几百行代码即可完成一款新产品开发工作。

本文作者 shaozhong

关于 ZigBee 更多的技术知识,欢迎关注“单片大师”账号,
也可以打开微信公众号,搜索并关注“单片大师”,即可了解更多技术资讯。



 

技术文档

类型标题档案
操作手册PDF版本

★博文内容均由个人提供,与平台无关,如有违法或侵权,请与网站管理员联系。

★文明上网,请理性发言。内容一周内被举报5次,发文人进小黑屋喔~

评论