什么是 ZigBee 协议栈呢?
它和 ZigBee 协议有什么关系呢?协议是一系列的通信标准,通信双方需要共同按照这一标准 进行正常的数据发射和接收。协议栈是协议的具体实现形式,通俗点来理解就是协议栈是协 议和用户之间的一个接口,开发人员通过使用协议栈来使用这个协议的,进而实现无线数据 收发。 图 1 展示了 ZigBee 无线网络协议层的架构图。ZigBee 的协议分为两部分,IEEE 802.15.4 定义了 PHY(物理层)和 MAC(介质访问层)技术规范;ZigBee 联盟定义了 NWK
(网络层)、APS(应用程序支持子层)、APL(应用层)技术规范。ZigBee 协议栈就是将 各个层定义的协议都集合在一直,以函数的形式实现,并给用户提供 API(应用层),用户可 以直接调用。
图 1 ZigBee 无线网络协议层
协议栈是协议的实现,可以理解为代码,函数库,供上层应用调用,协议较底下的层与应用是相互独立的。商
业化的协议栈就是给你写好了底层的代码,符合协议标准,提供给你一个功能模块给你调用。你需要关心的就 是你的应用逻辑,数据从哪里到哪里,怎么存储,处理;还有系统里的设备之间的通信顺序什么的,当你的应 用需要数据通信时,调用组网函数给你组建你想要的网络;当你想从一个设备发数据到另一个设备时,调用无 线数据发送函数;当然,接收端就调用接收函数;当你的设备没事干的时候,你就调用睡眠函数;要干活的时 候就调用唤醒函数。所以当你做具体应用时,不需要关心协议栈是怎么写的,里面的每条代码是什么意思。除 非你要做协议研究。每个厂商的协议栈有区别,也就是函数名称和参数可能有区别,这个要看具体的例子、说 明文档。
怎么使用 ZigBee 协议栈?举个例子,用户实现一个简单的无线数据通信时的一般步骤:
1、组网:调用协议栈的组网函数、加入网络函数,实现网络的建立与节点的加入。
2、发送:发送节点调用协议栈的无线数据发送函数,实现无线数据发送。
3、接收:接收节点调用协议栈的无线数据接收函数,实现无线数据接收。 是不是看上去很简单啊,其实协议栈很多都封装好了,下面我们大概看看无线发送函数:
afStatus_t AF_DataRequest( afAddrType_t *dstAddr,endPointDesc_t *srcEP,uint16 cID,
uint16 len,uint8 *buf, uint8 *transID,uint8 options,uint8 radius)
用户调用该函数即可实现数据的无线数据的发送,此函数中有 8 个参数,用户需要将每个参数的含义理解以后, 才能熟练使用该函数进行无线数据通信的目的。现在只讲其中最重要的两个参数,其它参数不需要死记硬背, 以后用多了自然就记住了。
uint16 len, //发送数据的长度;
uint8 *buf, //指向存放发送数据的缓冲区的指针。
至于调用该函数后,如何初始化硬件进行数据发送等工作,用户不需要关心,ZigBee 协议栈己经将所需要的工 作做好了,我们只需要调用相应的 API 函数即可,而不必关心具体实现细节。看起来是不是很简单呢,是不是 有动手试试的冲动。先别急还要先安装 ZigBee 协议栈才能进行开发调试呢,下面就动手安装 ZigBee 协议栈 吧。
2. ZigBee 协议栈的安装、编译与下载
双击..\相关资料与软件\Zigbee 开发软件\ZStack-CC2530-2.5.1a.exe 进行安装,路径你可以选择默认,同样 你也可以选择你想要安装的位置。也许有人就困惑了,装完之后不是应该有个桌面图标的么?其实所谓的安装 协议栈只是把一些文件解压到你安装的目录下。好了,协议栈是安装好了,可是怎么用它呢?装了肯定要用啊 是吧,别急,我们先来看看这个协议栈的目录。
Components,顾名思义这个是放我们的库的文件夹,里面放了一些我们用到的 ZDO,driver,hal,zcl 等库 的代码
Documents,这个不用说大家都知道是放 TI 的开发文档的,里面很多都是讲述协议栈的 API 的有空时可以看 看
Projects,这个文件夹放的是 TI 协议栈的例子程序,一个个例子程序都是以一个个 project 的形式给我们的,
学好这些例子程序里面的一两个,基本你能做事情了。
Tools,这个文件夹是放 TI 的例子程序的一些上位机之类的程序,作为工具使用。 好了,基本明白了基本架构之后,我们以一个简单的实验开始。先掌握一点必要的理论再实验效果比较好。喜 欢看书的人还可以看下面的“ZigBee 理论”掌握更多理论知识,不喜欢看书的朋友可以学完第 5 章后,再看视 频加强理论知识。
3. 协议栈无线收发控制 LED
打开工程: \1. 协议栈工作流程和无线收发控制 LED\ZStack-2.5.1a\Projects\zstack\Samples\SampleApp\CC2530DB\ SampleApp.eww ,从软件开发专业角 度讲建议大家复制工程到非中文目录,因为有些开发环境对中文路径支持的不好,虽然 IAR 支持但在实际工作 中你想别人看到你的工程,认为你很专业就照着上面做吧。有时把文件放的太深,目录太长,打开工程时 IAR 会关闭;只要将工程上移几层即可,用英文路径最专业了。我们演示就不修改,容易引起大家误会;打开工程 如下图:
如果使用 IAR 打开工程停止响应或关闭,说明你路径太长,IAR 不识别,把路径改短或移上几层目录即可解决。
App:应用层目录,这是用户创建各种不同工程的区域,在这个目录中包含了应用层的内容和这 个项目的主要内容。 HAL:硬件层目录,包含有与硬件相关的配置和 驱动及操作函数。
MAC:MAC 层目录,包含了 MAC 层的参数配 置文件及其 MAC 的 LIB 库的函数接口文件。 MT:实现通过串口可控制各层,并与各层进行 直接交互 NWK:网络层目录,包含网络层配置参数文件 网络层库的函数接口文件及 APS 层库的函数接 口。
OSAL:协议栈的操作系统。
Profile: Application framework 应用框架层 目录,包含 AF 层处理函数文件。应用框架层是 应用程序和 APS 层的无线数据接口。 Security:安全层目录,包含安全层处理函数, 比如加密函数等 Services:地址处理函数目录,包括地址模式的 定义及地址处理函数。 Tools:工程配置目录,包括空间划分及 Z-Stack 相关配置信息。
ZDO:ZDO 目录
ZMac:MAC 层目录,包括 MAC 层参数配置 及 MAC 层 LIB 库函数回调处理函数。 ZMain:主函数目录,包括入口函数及硬件配 置文件。
Output:输出文件目录,由 IAR IDE 自动生成。
带协议栈的工程怎么这么多文件夹和文件,都有什么用啊?现阶段大家只要带着这个疑问照着做实验就行了,后
面实验接触多了自然就懂了。
1. 编译协调器的程序,在 Workspace 下拉框中选择“CoordinatorEB”,在工程名上点右键选择”Rebuild All”, 第一次一定要用“Rebuild All”,后面再修改代码只用“Make”即可,没错误提示再下载到开发板当中。尽量教 大家用一些快捷方法。编译结果会有以下警告,警告可忽略的,只要没有错误就可运行的,以下警告是用来生成 量产的文件用的,想消除可看看" 2530\相关资料与软件\IAR 编译 CC2530 生成 HEX 文件.pdf"
2.下载好协调器后,再编译终端设备的程序选择“EndDeviceEB”,把仿真器换到另一块板子上,编译下载即可。
注意:旧版本协议栈显示为 EndDeviceEB-Pro,与 EndDeviceEB 只是显示名称不同,新协议栈取消了-Pro,没 影响。
两个 zigbee 节点都下载好后,分别上电看效果吧。协调器、终端通过底板上的 usb 供电并打开开关,组网成 功 后 D1 灯闪烁。协议栈工作流程分析:
zigbee 工作流程:
下面列出实验中涉及到比较重要的函数进行详解,由于是带协议栈第一个实验,我们对源码也进行注释,方便习惯看源码的同志学习。我建议大家先看 看下面的文章,再阅读一次源码加深印象,后面的例子结构基本相同,所以学好此实验,再做后面的实验就得 心应手了。用户自己添加的应用任务程序在 Zstack 中的调用过程:
main()---> osal_init_system()---> osalInitTasks()---> SampleApp_Init()
实验步骤:
1.选择 CoordinatorEB, 下载到开发板 A;作为协调器
2.选择 EndDeviceEB, 下载到开发板 B;作为终端设备
3.给两块开发板上电,通过观察 D3 来判断组网是否成功,协调器 D3 熄灭说明已建立 zigbee 网络,有终端时可入网;当终端 D3 熄灭时说明连网成功,请观察 Led1 灯的变化。下载好程 序后可以不需要仿真器了,通过底板供电即可。有显示屏的用户可以通过显示屏来观察组网 情况。