一.前言

从今天开始,我们要正式开始进行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. LoadRunner函数示例:lr_paramarr_random()

    lr_paramarr_random()函数的作用为:从一个参数数组中随机抽取一个值并以字符串形式返回.其使用方式及返回方式如下: char * lr_paramarr_random( const c ...

  2. css 文字溢出隐藏 带省略号

    .demo{ width:100px; white-space: nowrap; overflow: hidden; text-overflow: ellipsis; } 注意宽度要设置

  3. Spark相关下载

    HBase: http://hbase.apache.org/ Hadoop hadoop.apache.org spark http://spark.apache.org/

  4. SQL编码乱码解决方法

    摘自 http://www.cnblogs.com/keke/archive/2011/08/05/2128557.html 使用SQL SERVER2005的时候常常遇到中文字符为乱码的情况,经过研 ...

  5. ssh 使用密钥与登录进行远程cp

    scp -P 50000 -i abc.pem  ubuntu@10.223.191.105://srv/log/webserver/main/nginx.access.2015-08-07.log ...

  6. border-radius详解

    语法: border-radius : none | <length>{1,4} [/ <length>{1,4} ]? 取值范围: <length>: 由浮点数字 ...

  7. 磁盘io的那些事

    1.使用hdparm命令  hdparm -Tt /dev/sda /dev/sda: Timing cached reads: 6676 MB in 2.00 seconds = 3340.18 M ...

  8. Java实现冒泡排序

    冒泡排序思想就是将数列的相邻两个数比较,较大的数往后保存,小的数往前. package Sort; import java.util.Arrays; public class BubbleSort { ...

  9. MWeb 1.7.1 版发布!支持导出为 RTF 和 Docx、发布到 Evernote 带样式、文档库备份和新网站主题等大量改进!

    编辑器及发布服务改进 增加设置图片宽度和居左.居右.居中的语法. 如:![图片说明-w450](pic.jpg) 这样表示设置图片宽度为 450.其中 -w450 为设置语法,生成 HTML 时会自动 ...

  10. Molile App(HTTP/HTML)—Analyze Traffic