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

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

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

osal_init_system()

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

Z-Stack ZMain学习的更多相关文章

  1. C# Stack 集合学习

    Stack 集合学习 学习自:博客园相关文章 Stack<T>集合 这个集合的特点为:后进先出,简单来说就是新元素都放到第一位,而且顺序移除元素也是从第一位开始的. 方法一:Push(T ...

  2. 蓝牙stack bluez学习(1)Stack Architecture

    Bluez支持的features Core Specification 4.2 (GAP, L2CAP, RFCOMM, SDP, GATT) Classic Bluetooth (BR/EDR) B ...

  3. [ZOJ 4016] Mergable Stack

    题目链接:http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemCode=4016 直接用栈爆内存,看网上大神用数组实现的,构思巧妙,学习了! ...

  4. ufldl学习笔记与编程作业:Multi-Layer Neural Network(多层神经网络+识别手写体编程)

    ufldl学习笔记与编程作业:Multi-Layer Neural Network(多层神经网络+识别手写体编程) ufldl出了新教程,感觉比之前的好,从基础讲起,系统清晰,又有编程实践. 在dee ...

  5. Stack的三种含义(数据超过栈的大小,就发生stack overflow)

    非常典型的基础知识,转自http://www.ruanyifeng.com/blog/2013/11/stack.html 学习编程的时候,经常会看到stack这个词,它的中文名字叫做"栈& ...

  6. 有效的括号序列——算法面试刷题4(for google),考察stack

    给定一个字符串所表示的括号序列,包含以下字符: '(', ')', '{', '}', '[' and ']', 判定是否是有效的括号序列. 括号必须依照 "()" 顺序表示, & ...

  7. [转帖]Stack的三种含义

    Stack的三种含义 http://www.ruanyifeng.com/blog/2013/11/stack.html 学习编程的时候,经常会看到stack这个词,它的中文名字叫做"栈&q ...

  8. 学习笔记GAN002:DCGAN

    Ian J. Goodfellow 论文:https://arxiv.org/abs/1406.2661 两个网络:G(Generator),生成网络,接收随机噪声Z,通过噪声生成样本,G(z).D( ...

  9. 201621123037 《Java程序设计》第9周学习总结

    作业09-集合与泛型z 1. 本周学习总结 1.1 以你喜欢的方式(思维导图或其他)归纳总结集合与泛型相关内容. 这次改一个方式,就不用思维导图了,用图文结合方式来总结 1. Map三视图 键值: S ...

随机推荐

  1. delphi 11 编辑模式 浏览模式

    编辑模式 浏览模式 设置焦点 //在使用前需要Webbrowser已经浏览过一个网页 否则错误 uses MSHTML; ///获取Webbrowser编辑模式里面的内容procedure EditM ...

  2. C++技术问题总结-第12篇 设计模式原则

    设计模式六大原则,參见http://www.uml.org.cn/sjms/201211023.asp. 1. 单一职责原则 定义:不要存在多于一个导致类变更的原因.通俗的说,即一个类仅仅负责一项职责 ...

  3. myeclipse-10.7-offline-installer-windows安装图解及注意事项

    MyEclipse企业级工作平台(MyEclipseEnterprise Workbench ,简称MyEclipse)是对EclipseIDE的扩展,利用它我们能够在数据库和JavaEE的开发.公布 ...

  4. linux下tomcat开机自启动

    tomcat自启动配置: 方法一: vi /etc/rc.local 添加如下一行 /opt/apache-tomcat-7.0.29/bin/startup.sh (脚本绝对路径) 注意:要添加在e ...

  5. [Angular 2] Start with Angular2

    Create a index.html: <!DOCTYPE html> <html> <head> <title>Really Understandi ...

  6. Swift常用语法示例代码(一)

    此篇文章整理自我以前学习Swift时的一些练习代码,其存在的意义多是可以通过看示例代码更快地回忆Swift的主要语法. 如果你想系统学习Swift或者是Swift的初学者请绕路,感谢Github上Th ...

  7. 具体解释Android中AsyncTask的使用

    在Android中实现异步任务机制有两种方式,Handler和AsyncTask. Handler模式须要为每个任务创建一个新的线程,任务完毕后通过Handler实例向UI线程发送消息,完毕界面的更新 ...

  8. Linux shell 脚本攻略之比较与测试

    摘自:<Linux shell 脚本攻略>Page30-33

  9. Android基本控件之GridView

    我们在使用手机的过程中,会看到一些图片配上文字的一些情况,今天我们就来介绍一下安卓控件的GridView GridView组件用来以网格方式排列视图,与矩阵类似,当屏幕上有很多元素(文字.图片或其他元 ...

  10. cocos2d-x触摸分发器原理

    屏幕捕捉到触摸消息的派发流程: 如果有一个组件如果想要接收触摸事件,会通过继承一个CCTouchDelegate接口注册给CCTouchDispatcher,CCTouchDispatcher 中维护 ...