一.前言

从今天开始,我们要正式开始进行zigbee相关的通信实验了,我所使用的协议栈是ZStack 是TI ZStack-CC2530-2.3.0-1.4.0版本,大家也可以从TI的官网上直接下载TI公司为cc2530写的协议栈代码,毕竟,我们作为初学者,应该先不要去深究协议栈是怎么用代码编写的,毕竟zigbee已经相当成熟了,我们应该先学会使用zigbee协议栈进行通信,并能应用于实际项目中,比如说智能家具,不知道大家是不是有同感,所以下面我就先给大家介绍一下zigbee通信的原理以及体系架构。

二.ZStack 体系架构

ZStack 的体系结构由称为层的各模块组成。每一层为其上层提供特定的服务:即由数据服务实体提供数据传输服务;管理实体提供所有的其他管理服务。每个服务实体通过相应的服务接入点(SAP) 为其上层提供一个接口,每个服务接入点通过服务原语来完成所对应的功能。

ZStack 根据IEEE 802.15.4 和ZigBee 标准分为物理层,介质接入控制层,网络层,应用层。物理层提供了基础的服务,数据传输和接收,网络层提供了各个节点连入的服务,是zigbee网络通信的关键,应用层是我们关注的重点,提供了应用的框架和ZDO。大家如果想了解体系结构的具体内容,可以自己去看说明文档,下面我给大家介绍一下zigbee工作原理。

ZStack 采用操作系统的思想来构建,采用事件轮循机制,而且有一个专门的Timer2 来负责定时。从CC2530 工作开始,Timer2 周而复始地计时,有采集、发送、接收、
显示…等任务要执行时就执行。当各层初始化之后,系统进入低功耗模式,当事件发生时,唤醒系统,开始进入中断处理事件,结束后继续进入低功耗模式。如果同时有几个事件发生,判断优先级,逐次处理事件。这种软件构架可以极大地降级系统的功耗。

整个ZStack 的主要工作流程,如图所示,大致分为以下6 步:
(1) 关闭所有中断;
(2) 芯片外部(板载外设)初始化;
(3) 芯片内部初始化;
(4) 初始化操作系统;
(5) 打开所有中断;
(6) 执行操作系统。

这就是zigbee处理任务的大致过程。

三.代码分析

协议栈的代码很多,而且很复杂,上图就明白了。。。

这还只是一部分,所以我们先不用太过于专注于协议栈的编写,而是要学会如何用,我们主要学习和配置的就是图中SampleApp.c这个文件,它主要就是应用于应用的,我们面对不同的应用,只要修改它和底层的配置文件就行了。它里面有6个非常重要的函数,这6 个函数,有关于初始化用户功能
的;有关于所有事件的 处理的;有按键服务功能编写的;有接收数据的处理的;有数据发送函数的编写的。下面我们就对这6 个函数进行分析:

void SampleApp_Init( uint8 task_id )

这是一个用户用于初始化任务的函数,它是在系统初始化阶段被调用的,而且,在调用它的时候,它里面应该有相应任务的初始化(也就是说,用户有什么初始化,都是放在这个函数里),比如:硬件初始化、数据表初始化、电源初始化等等。

uint16 SampleApp_ProcessEvent( uint8 task_id, uint16 events )

这是一个事件处理函数(所有事件都是它管理),当有已登记的事件发生时,它就被主函数调用来对事件进行处理,这些事件包括:定时器、消息、以及用户定义的事件等
等。
这个函数的功能包括:按键处理,数据接收,数据发送。当然,用户可以自己添加其它事件,我们就在这个函数添加自己的串口事件。

void SampleApp_HandleKeys( uint8 shift, uint8 keys )

这个函数是给SampleApp_ProcessEvent( uint8 task_id, uint16 events )调用的:当按键按下后,就会执行SampleApp_ProcessEvent 函数里的case KEY_CHANGE ,这个case 的服务函数就是SampleApp_HandleKeys( uint8 shift, uint8 keys ),我们可以在这个函数里添加按键判断,判断哪个按键,然后执行相关任务。

void SampleApp_MessageMSGCB( afIncomingMSGPacket_t *pkt )

这个函数管理所有接收到的数据,至于数据来自哪个设备,它是根据簇ID 来分辨的。
函数里面就是一个switch 语句,关键是case 及其后面的服务函数。用户可以根据不同的功能,定义不同的簇ID(在SampleApp.h 里进行),然后在这个switch 语句里添加一个以簇ID 来命名的case,并在case 里面编写自己的应用程序。

void SampleApp_SendPeriodicMessage( void )

这个函数,是一个周期性数据发送函数,它是设备设置为周期性广播的时候调用的,它是我们设置发送数据的地方。

void SampleApp_SendFlashMessage( uint16 flashTime )

这个函数是void SampleApp_HandleKeys( uint8 shift, uint8 keys )函数的一个服务函数,我们也是极少用到这个函数的,故不作详解。

上述就是常用的6个函数,对于初学者,会使用zigbee协议进行应用就够了,先对驱动进行移植,在进行硬件进行初始化,在修改这6个函数,就可以对zigbee进行简单的应用了,今天就先写到这里了,协议栈代码太多了我就不贴出来了,需要的朋友联系我,大家相互学习,这只是我的一点体会。

zigbee学习之路(十二):zigbee协议原理介绍的更多相关文章

  1. zigbee学习之路(十五):基于协议栈的按键实验

    一.前言 经过上次的学习,相信大家已经初步学会使用zigbee协议进行发送和接受数据了.今天,我们要进行的实验是按键的实验,学会如何在协议栈里实现按键中断. 二.实验功能 在协议栈上实现按键中断,BU ...

  2. zigbee学习之路(十四):基于协议栈的无线数据传输

    一.前言 上次实验,我们介绍了zigbee原理的应用与使用,进行了基于zigbee的串口发送协议,但是上个实验并没有实现数据的收发.在这个实验中,我们要进行zigbee的接受和发送实验. 二.实验功能 ...

  3. zigbee学习之路(十):串口(接收)

    一.前言 上次我们学习了串口的发送,今天我们要学习串口的接收,要实现的功能是接收电脑发来的数据,控制LED 灯闪烁,而且将收到的数据发回给电脑显示出来.而且要采用不占用cpu资源的中断. 二原理与分析 ...

  4. Object-c学习之路十二(OC的copy)

    oc中的拷贝分为:copy(浅拷贝)和mutablecopy(深拷贝). 浅拷贝也为指针拷贝,拷贝后原来的对象计数器会+1: 深拷贝为对象拷贝,原来的对象计数器不变. 注意:自定义对象拷贝时要实现NS ...

  5. Java学习之路(十二):IO流<二>

    字符流 字符流是可以直接读写字符的IO流 使用字符流从文件中读取字符的时候,需要先读取到字节数据,让后在转换为字符 使用字符流向文件中写入字符时,需要把字符转为字节在写入文件 Reader和Write ...

  6. 嵌入式Linux驱动学习之路(十二)按键驱动-poll机制

    实现的功能是在读取按键信息的时候,如果没有产生按键,则程序休眠在read函数中,利用poll机制,可以在没有退出的情况下让程序自动退出. 下面的程序就是在读取按键信息的时候,如果5000ms内没有按键 ...

  7. IOS学习之路十二(UITableView下拉刷新页面)

    今天做了一个下拉刷新的demo,主要用到了实现的开源框架是:https://github.com/enormego/EGOTableViewPullRefresh 运行结果如下: 实现很简单下载源代码 ...

  8. Java学习之路(十二):IO流<三>

    复习:序列流 序列流可以把多个字节输入整合成一个,从序列流中读取到数据时,将从被整合的第一个流开始读取,读完这个后,然后开始读取第二个流,依次向后推. 详细见上一篇文章 ByteArrayOutput ...

  9. Java学习之路(十二):IO流

    IO流的概述及其分类 IO流用来处理设备之间的数据传输,Java对数据的操作是通过流的方式 Java用于操作流的类都在IO包中 流按流向分为两种:输入流(读写数据)     输出流(写数据) 流按操作 ...

随机推荐

  1. iOS缓存功能

    之前做缓存,没有考虑过这个具体的实现. 移动应用在处理网络资源时,一般都会做离线缓存处理,其中以图片缓存最为典型,其中很流行的离线缓存框架为SDWebImage. 但是,离线缓存会占用手机存储空间,所 ...

  2. windows + python + dlib

    我试了网上的各种教程,结果都是屁话 pip install dlib

  3. 使用MapReduce实现join操作

     在关系型数据库中,要实现join操作是非常方便的,通过sql定义的join原语就可以实现.在hdfs存储的海量数据中,要实现join操作,可以通过HiveQL很方便地实现.不过HiveQL也是转化成 ...

  4. python知识点总结

    此知识要点,是根据学习廖雪峰phthon3.0教程总结的,所以结构基本和这个教程的结构相同. 背景知识 python是什么?(1)python是一门编程语言,意味着可以用python编写程序,完成一定 ...

  5. JMX

    一.为什么使用JMX,解决那些问题 举一个应用实例:在一个系统中常常会有一些配置信息,比如服务的IP地址,端口号什么的,那么如何来写这些代码呢? 写死在程序里,到要改变时就去改程序,然后再编译发布: ...

  6. SpringMVC参数自动绑定

    SpringMVC的各种参数绑定方式 1. 基本数据类型(以int为例,其他类似):Controller代码: @RequestMapping("saysth.do") publi ...

  7. nmon监控工具的使用

    该工具的使用主要参考自http://blog.itpub.net/23135684/viewspace-626439/ http://nmon.sourceforge.net/pmwiki.php 生 ...

  8. C# 提供两种切割圆形图片的方式

    效果: private void Form1_Load(object sender, EventArgs e) { string file =System.IO.Path.Combine(Enviro ...

  9. C#中一些常用的正则表达式

    需要引用using System.Text.RegularExpressions; Regex r = new Regex("^\\s*([A-Za-z0-9_-]+(\\.\\w+)*@( ...

  10. ANDROID L——Material Design详解(UI控件)

    转载请注明本文出自大苞米的博客(http://blog.csdn.net/a396901990),谢谢支持! Android L: Google已经确认Android L就是Android Lolli ...