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 文件夹:存放了几个协议栈实用工具,读者可以根据文档自行安装使用。

es协调节点和主节点 pan协调器节点的作用_zigbee的工作模式

es协调节点和主节点 pan协调器节点的作用_es协调节点和主节点_02

第3 行, 初始化任务的优先级,该优先级是协议栈通过 osalInitTasks( )函数分配的。
第 4 行,初始化网络状态为 DEV_INIT, 我们可通过该变量判断设备的网络状态。
第 5 行,将发送数据包的序号初始化为 0,在 ZigBee 协议栈中,每发送一个数据包,该
变量会自动加一,该操作由协议栈完成,我们可以通过该变量计算丢包率。
第 6-9 行,调用 MT 层的串口初始化函数,并打印测试语句“uart0 is OK!”。
第 12-14 行,配置发送模式以及发送目的地址,这里配置为广播。
第 16-20 行,对节点描述符进行初始化,初始化代码较为固定,不需要修改。
第 22 行,使用 afRegister 函数将节点描述符进行注册,只有注册之后,才可以使用 OSAL
提供的系统服务

es协调节点和主节点 pan协调器节点的作用_zigbee的工作模式_03

es协调节点和主节点 pan协调器节点的作用_zigbee的工作模式_04

es协调节点和主节点 pan协调器节点的作用_初始化_05

协议栈工作原理介绍

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 协议栈已经实现了。同理,终端设备加

入网络的过程也是协议栈完成的。所以我们关心的应该是我们如何通过协议栈提供的接口将

我们的数据发给我们想要发给的设备,接下来我们将会围绕如何发送数据和接收数据这些问题展开。

es协调节点和主节点 pan协调器节点的作用_zigbee的工作模式_06


还记得我们修改过的那四个函数吗?

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 进行修改, 来区分不同的网络