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.
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学习的更多相关文章
- C# Stack 集合学习
Stack 集合学习 学习自:博客园相关文章 Stack<T>集合 这个集合的特点为:后进先出,简单来说就是新元素都放到第一位,而且顺序移除元素也是从第一位开始的. 方法一:Push(T ...
- 蓝牙stack bluez学习(1)Stack Architecture
Bluez支持的features Core Specification 4.2 (GAP, L2CAP, RFCOMM, SDP, GATT) Classic Bluetooth (BR/EDR) B ...
- [ZOJ 4016] Mergable Stack
题目链接:http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemCode=4016 直接用栈爆内存,看网上大神用数组实现的,构思巧妙,学习了! ...
- ufldl学习笔记与编程作业:Multi-Layer Neural Network(多层神经网络+识别手写体编程)
ufldl学习笔记与编程作业:Multi-Layer Neural Network(多层神经网络+识别手写体编程) ufldl出了新教程,感觉比之前的好,从基础讲起,系统清晰,又有编程实践. 在dee ...
- Stack的三种含义(数据超过栈的大小,就发生stack overflow)
非常典型的基础知识,转自http://www.ruanyifeng.com/blog/2013/11/stack.html 学习编程的时候,经常会看到stack这个词,它的中文名字叫做"栈& ...
- 有效的括号序列——算法面试刷题4(for google),考察stack
给定一个字符串所表示的括号序列,包含以下字符: '(', ')', '{', '}', '[' and ']', 判定是否是有效的括号序列. 括号必须依照 "()" 顺序表示, & ...
- [转帖]Stack的三种含义
Stack的三种含义 http://www.ruanyifeng.com/blog/2013/11/stack.html 学习编程的时候,经常会看到stack这个词,它的中文名字叫做"栈&q ...
- 学习笔记GAN002:DCGAN
Ian J. Goodfellow 论文:https://arxiv.org/abs/1406.2661 两个网络:G(Generator),生成网络,接收随机噪声Z,通过噪声生成样本,G(z).D( ...
- 201621123037 《Java程序设计》第9周学习总结
作业09-集合与泛型z 1. 本周学习总结 1.1 以你喜欢的方式(思维导图或其他)归纳总结集合与泛型相关内容. 这次改一个方式,就不用思维导图了,用图文结合方式来总结 1. Map三视图 键值: S ...
随机推荐
- androidstudio构建(或导入)工程(不用gradle)
获取源代码: ---assets ---libs ---res ---src 先备份AndroidManifest.xml,然后工程中只保留这四个文件夹,其他文件删除, 然后在studio中导入工程, ...
- 【android】在eclipse中查看genymotion模拟器的sd卡文件夹
假设用google自带模拟器或者真机调试时,sd卡文件夹是在/mnt/sdcard.这个相信大家都知道. 但是今天用genymotion调试时.发现根本打不开/mnt/sdcard这个文件夹,当时也没 ...
- android4.0蓝牙使能的详细解析
本文详细分析了android4.0 中蓝牙使能的过程,相比较android2.3,4.0中的蓝牙最大的差别在于UI上on/off的伪开关.在android4.0中加入了 adapter的状态机.所谓的 ...
- [AngularJS] Introduction to ui-router
Introduce to basic $stateProvider.state() with $stateParams services. Understand how nested router w ...
- shell脚本分为三类:登录脚本、交互式脚本、非交互式脚本
shell脚本分为三类:登录脚本.交互式脚本.非交互式脚本 一. 登录脚本类似于windows下的计算机设置中的登录脚本和账户设置下的登录脚本的合集(我是这么理解的哈). 其配置文件的关键词为pref ...
- 一个想法(续二):换个角度思考如何解决IT企业招聘难的问题!
前言: 上一篇文章:一个想法:成立草根技术联盟对开发人员进行技术定级解决企业员工招聘难问题! 当时写文的思维,是从一个公益组织的角度的思考. 因此,有不少关于从利出发的反方观点,的确是值的思考! 任何 ...
- 实例源码--Android软件更新模块
下载源码 技术要点: (1) 通过网络检测服务器版本与本地版本 (2) 通过服务器下载最新版本 (3) 自动覆盖安装本地版本 详细介绍: 主要源码实现如下:
- 分布式ActiveMQ集群--转载
原文地址:http://shensy.iteye.com/blog/1752529 回顾总结前一段时间学习的ActiveMQ分布式集群相关的知识,分享出来希望对看到的人有所帮助. 一.分布式Activ ...
- 每天2个android小例子----简单计算器源代码
通过Android4.0 网格布局GridLayout来实现一个简单的计算器界面布局 package com.android.xiong.gridlayoutTest; import java.mat ...
- 琐碎-同步centos集群的时间
想马上上手HBase,其对集群时间同步要求很高,当然,hadoop也是
