JIAJIEKEJI
[键入文字]
ZigBee 无线传感器网络提高
佳杰科技
D&J
2012
H T T P : / / J I E L O V E D A N . T A O B A O . C O M
http://jielovedan.taobao.com
佳杰科技
前言
笔者在上一章中给出了一个简单的点对点的无线通信实验,是读者对 ZigBee 无线传感
器网络中的数据通信方法有个感性的认识。使用 ZigBee 协议栈进行应用程序开发过程中,
虽然说读者可以不必关心 ZigBee 协议栈的具体细节,但是读者需要对 ZigBee 协议栈的基本
构成与内部工作原理有个清晰的认识,只有这样才能将 ZigBee 协议栈提供的函数充分地融
入自己的实际项目开发过程中。
本章将着重讨论 ZigBee 协议栈的构成以及内部 OSAL 的工作原理,在此基础上讲解一下
ZigBee 协议栈中的串口工作原理,最后通过一个具体的无线温度检测试验来帮助读者更好地
理解本章内容。
http://jielovedan.taobao.com
佳杰科技
目录
6.3
6.2.1
6.2.2
6.2.3
6.2.4
6.2.5
ZigBee 无线传感器网络提高 ........................................................................................................... 1
前言........................................................................................................................................... 2
6.1 深入理解 ZigBee 协议栈的构成 .................................................................................. 4
ZigBee 协议栈 OSAL 介绍 ............................................................................................ 9
6.2
OSAL 常用术语 ................................................................................................. 9
OSAL 运行机理 ............................................................................................... 10
OSAL 消息队列 ............................................................................................... 15
OSAL 添加新任务 ........................................................................................... 16
OSAL 应用编程接口 ....................................................................................... 17
Zstack 提高知识 .......................................................................................................... 20
6.3.1 地址类型(Address types) ................................................................................ 20
6.3.2 绑定(Binding) .................................................................................................. 22
6.3.3 路由(Routing) .................................................................................................. 25
6.3.4 配置信道(Configuring channel) ...................................................................... 27
6.3.5 描述符(Descriptors) ........................................................................................ 28
6.3.6 非易失性存储项(Non-volatile Memory Items) .............................................. 29
6.3.7 安全(Security) ................................................................................................. 29
Zigbee 与 PC 通信实验 ............................................................................................... 31
6.5.1 提出要求 ......................................................................................................... 32
6.5.2 公共文件的编程 ............................................................................................. 32
6.5.3 协调器编程 ..................................................................................................... 33
6.5.4 实验测试 ......................................................................................................... 37
6.5.5 实验分析 ......................................................................................................... 39
6.5.6 串口工作原理剖析 ......................................................................................... 43
PC 与 Zigbee 任意字符串传输实验 ........................................................................... 48
6.5.1 提出要求 ......................................................................................................... 48
6.5.2 公共文件的编程 ............................................................................................. 48
6.5.3 协调器编程 ..................................................................................................... 49
6.5.4 代码分析 ......................................................................................................... 51
6.5.5 实验现象 ......................................................................................................... 52
6.6 协议栈串口应用扩展实验 ......................................................................................... 53
6.5.1 提出要求 ......................................................................................................... 53
6.5.2 公共头文件编程 ............................................................................................. 54
6.5.3 协调器编程 ..................................................................................................... 54
6.5.4 终端节点编程 ................................................................................................. 58
6.5.5 实例测试 ......................................................................................................... 65
ZigBee 串口控制 LED 灯实验 ..................................................................................... 66
6.6.1 提出要求 ......................................................................................................... 66
6.6.2 头文件的编程 ................................................................................................. 66
6.6.3 协调器编程 ..................................................................................................... 67
6.6.5 实验结果 ......................................................................................................... 74
ZigBee 串口互传实验 ................................................................. 错误!未定义书签。
6.7
6.8
6.4
6.5
http://jielovedan.taobao.com
佳杰科技
6.9
6.10
6.11
ZigBee 按键值串口显示实验 ..................................................... 错误!未定义书签。
ZigBee 官方串口互传实验 ......................................................... 错误!未定义书签。
无线温度检侧实验 ................................................................. 错误!未定义书签。
6.6.1 实验原理及流程图 ......................................................... 错误!未定义书签。
6.6.2 协调器编程 ..................................................................... 错误!未定义书签。
6.6.3 终端节点编程 ................................................................. 错误!未定义书签。
6.6.4 实例测试 ......................................................................... 错误!未定义书签。
ZigBee 协议栈中的 NV 操作 ...................................................... 错误!未定义书签。
NV 操作函数 ................................................................... 错误!未定义书签。
6.7.1
NV 操作基础实验 ........................................................... 错误!未定义书签。
6.7.2
6.7.3 实例测试 ......................................................................... 错误!未定义书签。
本章小结 ......................................................................... 错误!未定义书签。
6.13
扩展阅读之一:ZigBee 协议中规范(Profile)和簇 (Cluester)的概念 ..... 错误!未定义书签。
扩展阅读之二:探究接收数据的存放位置 ............................................ 错误!未定义书签。
6.12
6.1 深入理解 ZigBee 协议栈的构成
ZigBee 协议栈的实现方式采用分层的思想,分为物理层、介质访问控制层、网络层和应
用层,应用层包含应用程序支持子层、应用程序框架层和 ZDO 设备对象。在协议栈中,上
层实现的功能对下层来说是不知道的,上层可以调用下层提供的函数来实现某些功能。
ZigBee 协议栈的构成如图 5-1 所示。
http://jielovedan.taobao.com
佳杰科技
图 5-1 ZigBee 协议栈的构成
物理层(PHY)和介质访问控制层(MAC)是由 IEEE 802.15.4 规范定义的,物理层负责
将数据通过发射天线发送出去以及从天线接收数据;ZigBee 无线网络中的网络号、网络发现
等概念是介质访问控制层的内容,此外,介质访问控制层还提供点对点通信的数据确认
(Per-hop Acknowledgments)以及一些用于网络发现和网络形成的命令,但是介质访问控制
层不支持多跳(Multi-hop)、网型网络(Mesh)等概念。
网络层(NWK)主要是对网型网络提供支持,如在全网范围内发送广播包,为单播数
据包选择路由,确保数据包能够可靠地从一个节点发送到另一节点,此外,网络层还具有安
全特性,用户可以自行选择所需的安全策略。
应用程序支持子层主要是提供了一些 API 函数供用调用,此外,绑定表也是存储在应用
程序支持子层。ZigBee 设备对象 ZDO 是运行在端口 0 的应用程序,主要提供了一些网络管
理方面的函数。每个 ZigBee 设备都与一个特定类别(profile)有关,可能是公共类别或私有
类别。这些类别定义了设备的应用环境、设备类型以及用于设备间通讯的丛集。公共类别可
以确保不同供货商的设备在相同应用领域中的互通作业性。
设备是由类别定义的,并以应用对象(Application Objects)的形式实现(见图 2)。每个应
用对象透过一个端点连接到 ZigBee 堆栈的余下部份,它们都是组件中可寻址的组件。
从应用角度看,通讯的本质就是端点到端点的连接(例如,一个带开关组件的设备与带一个
或多个灯组件的远程设备进行通讯,目的是将这些灯点亮)。
端点之间的通讯是透过称之为丛集的数据结构实现的。这些丛集是应用对象之间共享信
息所需的全部属性的容器,在特殊应用中使用的丛集在类别中有定义。
每个接口都能接收(用于输入)或发送(用于输出)丛集格式的数据。一共有二个特殊的端
点,即端点 0 和端点 255。端点 0 用于整个 ZigBee 设备的配置和管理。应用程序可以透过端
http://jielovedan.taobao.com
佳杰科技
点 0 与 ZigBee 堆栈的其它层通讯,因而实现对这些层的初始化和配置。附属在端点 0 的对
象被称为 ZigBee 设备对象(ZD0)。端点 255 用于向所有端点的广播。端点 241 到 254 是保留
端点。
所有端点都使用应用支持子层(APS)提供的服务。APS 透过网络层和安全服务提供层与端点相
接,并为数据传送、安全和固定服务,因此能够适配不同但兼容的设备,如带灯的开关。
APS 使用网络层(NWK)提供的服务。NWK 负责设备到设备的通讯,并负责网络中设备初始化
所包含的活动、消息路由和网络发现。应用层可以透过 ZigBee 设备对象(ZD0)对网络层参数
进行配置和存取。
每个端口(Endpoint)都能用于收发数据,有如下两个端口较为特殊。
1) 端口 0 该端口用于整个 ZigBee 设备的配置和管理,用户应用程序可以通过端口 0
与 ZigBee 协议栈的应用程序支持子层、网络层进行通信,从而实现对这些层的初
始化工作,在端口 0 上运行的应用程序成为 ZigBee 设备对象(ZDO,ZigBee Device
Object)。
2) 端口 255 该端口用于向所有的端口广播。
在 ZigBee 协议栈中,各层之间进行数据传递是通过服务接入点(Service Access Point)
来实现的。一般使用两种类型的服务接入点:一种用于数据传输的服务接入点,另
一种用于管理的服务接入点。例如:在 ZigBee 2007 协议栈,发送数据时使用的是
APSDE-DATA.request,显然这是一个发送数据请求,是从 APS 层发给下层来请求数
据发送的。
服务接入点常用缩写如表 5-1 所示。
英文缩写
APS
SAP
APSDE-SAP
表 5-1 服务接入点常用缩写
全称
备注
Application Support Sub-Layer
应用程序支持子层
Service Access Points
APS Data Entity-SAP
服务接入点
应用程序支持子层
数据实体服务接入点
应用程序支持子层
管理实体服务接入点
APSME-SAP
APS Management Entity-SAP
NLDE-SAP
NLME-SAP
MCPS-SAP
Network Layer Data Entity-SAP
网络层数据实体服务接入点
Network Layer Management Entity-SAP 网络层管理实体服务接入点
MAC Common Part Service-SAP
MAC 层统用服务接入点
PD-SAP
PLME-SAP
Physical Layer Data Entity-SAP
物理层数据实体服务接入点
Physical Layer Management Entity-SAP 物理层管理实体服务接入点
可以将服务接入点理解为一些 API 函数,在上层可以通过调用这些 API 函数来使用下层
提供的功能(服务)。
在 IAR 工程的左侧有很多文件夹,如 App、HAL、MAC 等,如图 5-2 所示,这些文件夹
下面包含了很多源代码,这种实现方式与 ZigBee 协议的分层思想是相对应的,尽量将实现
某些功能的函数放在同一个文件夹下。
http://jielovedan.taobao.com
佳杰科技
图 5-2 工程主界面
整个协议栈是从哪里开始执行的呢?请观察图 5-2 中,在 Zmain 文件夹下有个 Zmain.c
文件,打开该文件可以找到 main()函数,这就是整个协议栈的入口点,即从该函数开始
执行!
下面看一下 main()函数主要做了哪些工作,main()函数原型如下:
osal_int_disable( INTS_ALL );
HAL_BOARD_INIT();
zmain_vdd_check();
InitBoard( OB_COLD );
HalDriverInit();
osal_nv_init( NULL );
ZMacInit();
zmain_ext_addr();
zgInit();
#ifndef NONWK
afInit();
#endif
osal_init_system();
osal_int_enable( INTS_ALL );
InitBoard( OB_READY );
zmain_dev_info();
#ifdef LCD_SUPPORTED
zmain_lcd_init();
#endif
int main( void )
{
http://jielovedan.taobao.com
佳杰科技
#ifdef WDT_IN_PM1
WatchDogEnable( WDTIMX );
#endif
osal_start_znp();
return 0;
}
在 main() 函 数 中 调 用 了 很 多 其 他 文 件 中 的 函 数 , 在 此 可 以 暂 不 考 虑 , 重 点 是
osal_start_system()函数,在此之前的函数都是对板载硬件以及协议栈进行的初始化,知道调
用 osal_start_system() 函 数 , 整 个 ZigBee 协 议 栈 才 算 是 真 正 的 运 行 起 来 了 , 那 么
osal_start_system()函数是如何将 ZigBee 协议栈调用起来的呢?下面将进行这部分内容的讲
解。
802.15.4 MAC 层
IEEE 802.15.4 标准为低速率无线个人局域网络(LR-WPAN)定义了 OSI 模型开始的两层。
PHY 层定义了无线射频应该具备的特征,它支持二种不同的射频讯号,分别位于 2450MHz
波段和 868/915MHz 波段。2450MHz 波段射频可以提供 250kbps 的数据速率和 16 个不同的
讯息信道。868/915MHz 波段中,868MHz 支持 1 个数据速率为 20kbps 的讯息信道,915MHz
支持 10 个数据速率为 40kbps 的讯息信道。
MAC 层负责相邻设备间的单跳数据通讯。它负责设立与网络的同步,支持关联和去关联以
及 MAC 层安全:它能提供二个设备之间的可靠链接。
关于服务接取点
ZigBee 堆栈的不同层与 802.15.4 MAC 透过服务接取点(SAP)进行通讯。SAP 是某一特定
层提供的服务与上层之间的接口。
ZigBee 堆栈的大多数层有两个接口:数据实体接口和管理实体接口。数据实体接口的目标是
向上层提供所需的常规数据服务。管理实体接口的目标是向上层提供存取内部层参数、配置
和管理数据的机制。
ZigBee 的安全性
安全机制由安全服务提供层提供。然而值得注意的是,系统的整体安全性是在类别级定
义的,这意味着类别应该定义某一特定网络中应该实现何种类型的安全。
每一层(MAC、网络或应用层)都能被保护,为了降低储存要求,它们可以分享安全钥匙。SSP
是透过 ZD0 进行初始化和配置的,要求实现先进加密标准(AES)。ZigBee 规格定义了信任中
心的用途。信任中心是在网络中分配安全钥匙的一种令人信任的设备。
ZigBee 堆栈容量和 ZigBee 设备
根据 ZigBee 堆栈规定的所有功能和支持,我们很容易推测 ZigBee 堆栈实现需要用到设
备中的海量存储器资源。
不过 ZigBee 规格定义了三种类型的设备,每种都有自己的功能要求:
ZigBee 协调器是启动和配置网络的一种设备。协调器可以保持间接寻址用的固定表格,
支持关联,同时还能设计信任中心和执行其它活动。一个 ZigBee 网络只允许有一个 ZigBee
协调器。
ZigBee 路由器是一种支持关联的设备,能够将消息转发到其它设备。ZigBee 网格或树型
网络可以有多个 ZigBee 路由器。ZigBee 星型网络不支持 ZigBee 路由器。
ZigBee 端终设备可以执行它的相关功能,并使用 ZigBee 网络到达其它需要与其通讯的
设备。它的内存容量要求最少。
然而需要特别注意的是,网络的特定架构会戏剧性地影响设备所需的资源。NWK 支持