[注:本文源自博客园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. Hbase深入学习(六) Java操作HBase

    Hbase深入学习(六) ―― Java操作HBase 本文讲述如何用hbase shell命令和hbase java api对hbase服务器进行操作. 先看以下读取一行记录hbase是如何进行工作 ...

  2. android139 360 黑名单 增删改查-数据库操作

    BlackNumberOpenHelper.java package com.itheima52.mobilesafe.db.dao; import android.content.Context; ...

  3. Keeplived 详解

    http://www.cnblogs.com/pricks/p/3822232.html

  4. 微信朋友圈分享页面(JS-SDK 1.0)

    微信更新sdk后大量分享朋友圈代码失效,标题 缩略图 描述无法自定义 新版SDK分享文章步骤 1.绑定域名 (方法参考 http://mp.weixin.qq.com/wiki/7/aaa137b55 ...

  5. 如何用jquery操作table的方法

    今天我在做你约我吧交友www.niyuewo.com网项目时遇到一个问题,就是如何用qjuery控制table的添加.编辑与删除,经过网上查资料发现用jquery很容易实现,在此整理下来供大家参考: ...

  6. Spring 的微内核与FactoryBean扩展机制--转载

    作者:江南白衣 原文地址: http://www.blogjava.net/calvin/archive/2005/08/30/11099.html http://www.blogjava.net/c ...

  7. 详解ARM的AMBA设备中的 DMA设备PL08X的Linux驱动

    1. 此文目的记录笔者对ARM的PL08x的DMA驱动PL08x.c理解.给其他不熟悉此DMA驱动的读者一点借鉴和参考.2. 适合读者你已经具备一定驱动编程能力,知道一些最基本的概念,比如用于输出输出 ...

  8. Android(java)学习笔记82:我们到底该如何处理异常?

    我们到底该如何处理异常? 原则: 如果该功能内部可以将问题处理,用try,自己能解决就自己解决问题. 如果处理不了,交由调用者处理,这是用throws,自己不能解决的问题,我们就抛出去交个调用者解决这 ...

  9. C#获取CPU等硬件ID(转载)

    System.Management命名空间提供对大量管理信息和管理事件集合的访问,这些信息和事件是与根据 Windows 管理规范 (WMI) 结构对系统.设备和应用程序设置检测点有关的.应用程序和服 ...

  10. cocos2d-x——在一个cpp中展示多个场景

    //20秒后自动运行下一个场景 runAction( CCSequence::create(CCDelayTime::create(20.0f), CCCallFunc::create(this, c ...