Z-Stack ZMain学习

[注:本文源自博客园http://www.cnblogs.com/cherishui/,为尊重劳动者成果,如需转载请保留此行]

在TI已有的Z-Stack的工程下面,打开已有的demo文件,通过分析不同例子的不同,大体就是,协调器组网,路由器或者设备入网,通过不同的按键来执行不同的任务。以下代码分析基于ZStack-CC2530-2.5.1a,开发环境为 IAR Embedded Workbench for 8051 IDE,版本号为8.30.2.

 image ZMain.c文件中的main函数,自认为最重要的有一下几个地方。

osal_init_system()

     |------->osalInitTasks()

           |--------->osalInitTasks()

 image

每个任务,必须按照在tasksArr[]中定义的顺序来初始化,taskID既表示任务的ID,也表示着任务的优先级,数字越小,优先级越高。

image

在不考虑宏定义的情况下,有六个必须的任务,前五个都是OSAL用来管理ZigBee协议栈的系统任务,最后一个为用户自定义任务,在上图的例子中,用户自定义任务名称为GenericApp,任务ID命名为GenericApp_TaskID,其初始化函数名称为GenericApp_Init,其绑定的事件处理函数名为GenericApp_ProcessEvent(也有可能为***_evert_loop),等等等等,凡是用户自定义程序上用到的变量名和函数名等,基本上都会有GenericApp这个任务名称作为前缀,以示区分。这在纷繁复杂的代码海洋中,是很显眼的,IT的协议栈写的很有水平。下面分析GenericApp_Init这个函数。

 image

接着注册ZDO层的事件于其对于的任务ID的绑定。例如下图显示,针对两种rsp的响应的事件绑定,也就是说,当有这两种rsp消息响应时,GenericApp会响应处理,

image

处理所有的消息响应,都是由GenericApp_ProcessEvent这个最为重要的应用层处理函数汇总执行操作。

ZDO层的响应机制如下图,ZStack协议栈已经写好基本的ZDO请求函数,相关定义在ZDProfile.c中,

例如该文件下的ZDP_DeviceAnnce请求函数(对于的消息为DeviceAnnce),该函数的作用是自动的以广播的方式来报告自己的长短地址,其余在网的节点都可以收到。

例如该文件下的ZDP_EndDeviceBindReq请求函数,会发起一个终端设备绑定请求(对于的消息为End_Device_Bind_req)。

至于何时,如何调用这些函数,就是你自己的事情了。

image

协调器向路由发出req请求,例如通过执行ZDP_EndDeviceBindReq(其他什么类型的请求都可以)来发起请求。

路由器在收到协调器发的req请求时,底层处理完必要的任务后,需要返回给协调器rsp,一旦协调器接收到,将“被触发”接收到SYS_EVENT_MSG事件下的ZDO_CB_MSG消息。随后进入协调器的通用消息处理机制。Z-Stack内部定义了许多req和rsp处理函数,并且实现了绝大多数响应rep的函数。其实想想也是有道理的,主控这边,发送一个消息(要求节点完成什么样的功能)过去,关心的是如何解析收到的消息,并且进行处理,至于被控的那边如何响应,只要是按照双方的约定的格式返回,就可以了。ZStack中的ZDO,对于特定req的响应函数,在ZDProfile.c中已经有定义,见下图:

image 

我们需要做的,不是想着如何响应接收到的ZDO请求(一般ZStack已经实现了),而是如何处理接收到的信息,不同的应用,对于同一个消息的返回,可能有不同的处理方式。

通用消息处理函数在GenericApp.c中的GenericApp_ProcessEvent,这个消息处理函数是整个应用程序中最为重要的,要重点理解。

image

针对ZDO消息反馈的处理,选用GenericApp_ProcessZDOMsgs函数来通用处理,根据消息内部的族来区分不同的响应,并且做出响应的处理。

image

-----------------------------------------2014-04-24晚上,先写这么多,明天上班再继续写--------------------------------------------

-----------------------------------------2014-04-25上午,继续整理--------------------------------------------------------------

如何建立网络和加入网络,关注的重点在ZDApp_Init这个函数里面,这个会有点多,下一篇文章再详细介绍吧。跟着GenericApp_ProcessEvent例子,进入ZStack的消息处理机制中去一探究竟。在分析的过程中,画出大致的流程图,便于理解。这也算把我看了这么久的相关知识点给串起来,形成一个整体的概念。

 image

今天给涛哥大概的讲了整个ZigBee的流程,基本上还满意。不能仅限于此,以后要自多多总结,只有自己写出来,才能让他成为自己的东西。

原文地址:https://www.cnblogs.com/cherishui/p/3689372.html