一.前言

从今天开始,我们要正式开始进行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. 在win10里打开.hlp文件

    D7的帮助都是.hlp格式的,  目前win10还没有相应的补丁, 导致无法打开 自己手动来处理一下: 1. 下载连接中的winhlp32.rar, 这个是从XP系统里提取的 2. 修改windows ...

  2. Title Case a Sentence

    解决思路 将字符串转换成小写 把字符串分割成字符串数组 循环数组将每一个单词首字母大写 把数组所有的元素转换成一个字符串 第一种方法 function titleCase(str) { str=str ...

  3. js 转码 和 .Net 后台解码

    为防止 中文乱码,js传值要转码,当js 用 escape() 转码时,.Net 后台可以用 HttpUtility.UrlDecode() 进行解码. 例如:   document.cookie = ...

  4. 图解GCD

    线程.任务和队列的概念 异步.同步 & 并行.串行的特点 一条重要的准则 一般来说,我们使用GCD的最大目的是在新的线程中同时执行多个任务,这意味着我们需要两项条件: 能开启新的线程 任务可以 ...

  5. oracle中的使用总结一

    1.ORA-12560: TNS: 协议适配器错误 造成ORA-12560: TNS: 协议适配器错误的问题的原因有三个: 1.监听服务没有起起来.windows平台个一如下操作:开始---程序--- ...

  6. 合并分区(merge range)对事务日志的影响

    分区维护作业执行失败,错误信息如下:数据库 'XXX' 的事务日志已满.若要查明无法重用日志中的空间的原因,请参阅 sys.databases 中的 log_reuse_wait_desc 列. [S ...

  7. varnish4.1 配置文件default.vcl

    varnish4.1 配置文件default.vcl # This .x VCL file vcl 4.0; backend default { .host = "127.0.0.1&quo ...

  8. mac安装paramiko

    $ brew install openssl $ /usr/local/opt/openssl/bin/c_rehash $ export ARCHFLAGS="-arch x86_64&q ...

  9. SLP测试记录

    个人感觉来说这个游戏对我没有什么吸引力...完全不知道用户需求在哪...是我最不喜欢的一个游戏 不过听制作团队之前的介绍,这应该不算是一个游戏,而是一个游戏练习器?所以从游戏的角度来评判的话感觉有很多 ...

  10. nyist 78 圈水池

    http://acm.nyist.net/JudgeOnline/problem.php?pid=78 圈水池 时间限制:3000 ms  |  内存限制:65535 KB 难度:4   描述 有一个 ...