[注:本文源自博客园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 TreeView修改选中的节点的颜色和背景

      TreeView修改选中的节点的颜色和背景     TCustomDrawTarget = (dtControl, dtItem, dtSubItem);   TCustomDrawStage = ...

  2. xcode 左边导航栏中,类文件后面的标记“A”,&quot;M&quot;,&quot;?&quot;……等符号的含义???

    "M" = Locally modified    "U" = Updated in repository  "A" = Locally a ...

  3. 免费的天气预报API--谷歌,雅虎,中央气象台

    Google Weather API 仅仅支持美国地区使用邮政编码进行查询,比如:  http://www.google.com/ig/api?hl=zh-cn&weather=94043  ...

  4. C++函数的传入参数是指针的指针(**)的详解

    要修改变量的值,需要使用变量类型的指针作为参数或者变量的引用.如果变量是一般类型的变量,例如int,则需要使用int 类型的指针类型int *作为参数或者int的引用类型int&.但是如果变量 ...

  5. Ruby on Rails Tutorial 第三章 静态页面

    1.生成静态页面 $ rails generate controller StaticPages home help    #生成主页和帮助页面的路由.控制器及静态页面 $ rails destroy ...

  6. linq小知识总结

    1linq的左连接查询 var boundList = from x in text.S_Outbound join y in text.S_Outbound_Per on x.Shipment_ID ...

  7. focuskye 学习及下载

    学习:http://www.focusky.com.cn/tutorials/ 下载:http://www.focusky.com.cn/download/

  8. 用count(*)还是count(列名) || Mysql中的count()与sum()区别

    Mysql中的count()与sum()区别   首先创建个表说明问题 CREATE TABLE `result` (   `name` varchar(20) default NULL,   `su ...

  9. 纯C++ 连接SQL Server2005 数据库读写操作的小例子

    一个测试c++链接 sql server 数据库的例子// 数据库说明// 数据库用户为 sa , 密码为 空// 数据库为 MyDB// 表为 UserInfo// 表字段为 Name . Pass ...

  10. [转]IIS7.5 添加expires头 提高性能

    本文转自:http://niutuku.com/tech/www/271454.shtml 对于页面中不经常变化的静态内容通过指定expires头,来进行浏览器端的缓存,减少每次访问时的请求. 原理: ...