概述
ZigBee 标准将网络节点按照功能划分为
PAN(Personal AreaNetwork)
协调器 ZC(Zigbee Coordinator)、
路由器 ZR(ZigBee Router)和
终端设备 ZE(ZigBee EndDevice)三种类型。
1,协调器:一个 ZigBee 网络中仅有一个 PAN 协调器,且是 PAN
的总控制器。 PAN 协调器控制网络并且执行以下职责:
为网络中每个设备分配一个唯一地址(16 位或 64 位);
初始化、终止、转发网络中的消息;
为网络选择一个唯一的 PAN 标识符。这个 PAN 标识符使得
网络中的设备可以使用 16 位短地址来和网络中的其他设
备通信。
2. 路由器:路由器主要允许设备加入网络、扩展网络覆盖的物理
范围和数据包路由的功能。
3.终端设备:主要负责无线网络数据的采集。
ZigBee 的特点
在这三种标准中, ZigBee 具有最低的数据速率和复杂度,但提供
了最长的电池寿命。由此我们知道 ZigBee 主要用在短距离无线控制
系统,传输少量的控制信息。特别适用于电池供电的系统
协议栈Z-Stack 安装目录结构
安装完成后,我们在 C 盘的根目录下出现了 Texas Instruments 目录,我们进入该文件夹。
由于我们安装的协议栈的版本是ZStack-CC2530-2.3.0-1.4.0,将会出现一个相同命名的文件夹。
Components 文件夹:存放 Z-Stack 开源的主要程序代码,主要包括硬件接口层、 MAC
层、操作系统代码等。
Documents 文件夹:这个目录中的文档在开发中很实用,希望读者可以查阅学习。
Projects 文件夹:存放用户自己的工程,同时也包含了 TI 公司提供的几个官方例程和编程模板,我们以后的例程都是基于 Samples 中的工程模版。
Tools 文件夹:存放了几个协议栈实用工具,读者可以根据文档自行安装使用。
第3 行, 初始化任务的优先级,该优先级是协议栈通过 osalInitTasks( )函数分配的。
第 4 行,初始化网络状态为 DEV_INIT, 我们可通过该变量判断设备的网络状态。
第 5 行,将发送数据包的序号初始化为 0,在 ZigBee 协议栈中,每发送一个数据包,该
变量会自动加一,该操作由协议栈完成,我们可以通过该变量计算丢包率。
第 6-9 行,调用 MT 层的串口初始化函数,并打印测试语句“uart0 is OK!”。
第 12-14 行,配置发送模式以及发送目的地址,这里配置为广播。
第 16-20 行,对节点描述符进行初始化,初始化代码较为固定,不需要修改。
第 22 行,使用 afRegister 函数将节点描述符进行注册,只有注册之后,才可以使用 OSAL
提供的系统服务
协议栈工作原理介绍
ZigBee 协议栈包含了 ZigBee 协议所规定的基本功能,这些功能是以函数的形式实现的,
为了便于管理这些函数集,从 ZigBee 2006 协议栈开始, ZigBee 协议栈内加入了实时操作系
统,称为 OSAL(操作系统抽象层, Operating System Abstraction Layer)。
ZigBee 协议栈与 ZigBee 协议之间并不能完全画等号。 ZigBee 协议栈仅仅是 ZigBee 协议
的具体实现。 OSAL 就是一种支持多任务运行的系统资源分配机制。
在 ZigBee 协议栈中, OSAL 负责调度各个任务的运行,如果有事件发生了,则会调用相
应的事件处理函数进行处理。
那么,事件和任务的事件处理函数是如何联系起来的呢?
ZigBee 中采用的方法是:建立一个事件表,保存各个任务的对应的事件,建立另一个函
数表,保存各个任务的事件处理函数的地址,然后将这两张表建立某种对应关系,当某一事
件发生时则查找函数表找到对应的事件处理函数即可。
在 ZigBee 协议栈中,有三个变量至关重要。
tasksCnt—该变量保存了任务的总个数。
该变量的声明为: uint8 tasksCnt,其中 uint8 的定义为: typedef unsigned char uint8
tasksEvents—这是一个指针,指向了事件表的首地址。该变量的声明为: uint16 *tasksEvents,其中 uint16 的定义为: typedef unsigned short
uint16
tasksArr—这是一个数组,数组的每一项都是一个函数指针,指向了事件处理函数。
该数组的声明为: const pTaskEventHandlerFn tasksArr[],其中 pTaskEventHandlerFn 的定
义为: typedef unsigned short (*pTaskEventHandlerFn)( unsigned char task_id, unsigned short
event ),这是定义了一个函数指针。 tasksArr 数组的每一项都是一个函数指针,指向了事件
处理函数。
总结下 OSAL 的工作原理:通过 tasksEvents 指针访问事件表的每一项,如果
有事件发生,则查找函数表找到事件处理函数进行处理,处理完后,继续访问事件表,查看
是否有事件发生,无限循环。 OSAL 就是一种基于事件驱动的轮询式操作系统。事件驱动是
指发生事件后采取相应的事件处理方法,轮询指的是不断地查看是否有事件发生。
整个协议栈是从哪里开始执行的呢?在 Zmain 文件夹下有个 Zmain.c 文件,打开该文件
可以找到 main()函数,这就是整个协议栈的入口点。
总结下 OSAL 的运行机理:
通过不断地查询事件表来判断每个任务中是否有事件发生,如果有事件发生,则查
找函数表找到对应的事件处理函数对事件进行处理。
事件表使用数组来实现,数组的每一项对应一个任务的事件,每一位表示一个事件;
函数表使用函数指针数组来实现,数组的每一项是一个函数指针,指向了事件处理
函数。
通信流程图
协调器上电后,会按照编译时给定的参数,选择合适的信道、合适的 PanID, 建立 ZigBee
无线网络,这部分代码不需要用户自己实现, ZigBee 协议栈已经实现了。同理,终端设备加
入网络的过程也是协议栈完成的。所以我们关心的应该是我们如何通过协议栈提供的接口将
我们的数据发给我们想要发给的设备,接下来我们将会围绕如何发送数据和接收数据这些问题展开。
还记得我们修改过的那四个函数吗?
SampleApp_Init()、 SampleApp_ProcessEvent()、 SampleApp_MessageMSGCB()、
SampleApp_SendPeriodicMessage()。其实这就是数据收发的基本框架了。这四个函数中的
代码呢又比较固定。所以我们只需要知道收发的基本流程即可。我们先来总结下发送和接收
数据的流程
发送数据:填充并注册端点描述符-》配置发送模式及目的地址 -》AF_DataRequest()发送
数据接收数据:填充并注册端点描述符->处理系统事件 SYS_EVENT_MSG 中的AF_INCOMING_MSG_CMD 消息
PanID 及频段信道
ZigBee 协议使用一个 16 位的个域网标志符( PAN ID)来标识一个网络。 ZStack 允许用两种方式配置 PAN
ID,当 ZDAPP_CONFIG_PAN_ID 值不设置为 0xFFFF 时,那么设备建立或加入网络的 PAN ID 由 ZDAPP_CONFIG
_PAN_ID 指定;如果设置 ZDAPP_CONFIG_PAN_ID 为 0xFFFF,那么设备就将建立或加入一个“最优”的网络。
可以对工程中的 PAN ID 进行修改, 来区分不同的网络
最后
以上就是过时小伙为你收集整理的zigbee的学习分析的全部内容,希望文章能够帮你解决zigbee的学习分析所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
发表评论 取消回复