APS层主要功能:
(1)APS层协议数据单元APDU的处理。
(2)APSDE提供在同一个网络中的应用实体之间的数据传输机制。
(3)APSME提供多种服务给应用对象,这些服务包括安全服务何绑定设备,并维护管理对象的数据库,也就是我们常说的AIB。
1.3.3.2 应用框架AF
应用框架(Application Framework)为各个用户自定义的应用对象提供了模板式的活动空间,为每个应用对象提供了键值对KVP服务和报文MSG服务两种服务供数据传输使用。
每个节点除了64位的IEEE地址,16位的网络地址,每个节点还提供了8位的应用层入口地址,对应于用户应用对象。端点0为ZDO接口,端点1至240供用户自定义用于对象使用,端点255为广播地址,端点241 -254保留将来使用。每一个应用都对应一个配置文件(Profile)。配置文件包括:设备ID(Device ID),事务集群ID(cluster ID),属性ID(Attribute ID)等。AF可以通过这些信息来决定服务类型。
1.3.3.3 ZigBee设备对象ZDO
ZDO是一个特殊的应用层的端点(Endpoint)。它是应用层其他端点与应用子层管理实体交互的中间件。它主要提供的功能如下:
(1)初始化应用支持子层,网络层。
(2)发现节点和节点功能。在无信标的网络中,加入的节点只对其父节点可见。而其他节点可以通过ZDO的功能来确定网络的整体拓扑结构已经节点所能提供的功能。
(3)安全加密管理:主要包括安全key的建立和发送,已经安全授权。 (4)网络的维护功能。
(5)绑定管理:绑定的功能由应用支持子层提供,但是绑定功能的管理却是由ZDO提供,它确定了绑定表的大小,绑定的发起和绑定的解除等功能。
(6)节点管理:对于网络协调器和路由器,ZDO提供网络监测、获取路由和绑定信息、发起脱离网络过程等一系列节点管理功能。
ZDO实际上是介于应用层端点和应用支持子层中间的端点,其主要功能集中在网络管理和维护上。应用层的端点可以通过 ZDO提供的功能来获取网络或者是其他节点的信息,包括网络的拓扑结构、其它几点的网络地址和状态以及其他几点的类型和提供的服务等信息。
1.4 ZigBee网络拓扑结构
Zigbee网络支持多种网络拓扑结构,最典型的网络结构是星型网络的拓扑结构。对于星型网络,由一个协调器和多个终端节点组成。在星型网络中,所有的通信都是通过协调器转发。这样的网络结构有三个缺点:一是会增加协调器的负载,对协调器的性能要求很高;二是协调协作都通过协调器转发的话,会极大的增加系统的延时,使得系统的实时性受到影响;三是单一节点的破坏造成整个网络的瘫痪,降低了网络的鲁棒性。
除了支持星型网络以外,ZigBee还支持树状(Tree)和网状(Mesh)等对等网络,如图2-11。在对等网络中,也存在一个PAN协调器(Coordinator),但是它已经不是网络的主控制器,而是主要起到发起网络和组网的作用。在对等网络中,一个设备在另一设备的通信
第 16 页 共 107 页
范围之内,他们就可以互相通信。因此,对等网络拓扑结构统一构成较为复杂的网络结构。对等网络拓扑结构主要在工业检测和控制,无线传感网络,供应物资跟踪,农业智能化以及安全监控方面都有广泛的应用。在网络中,各个设备之间发送消息时,使用了多跳传输,以增大网络的覆盖范围。其中,组网的路由协议是采用了无线自组网按需平面距离矢量AODV路由协议(Ad Hoc On Demand Distance Vector Routing),无论是星型拓扑还是对等拓扑,每个独立的PAN都有一个唯一的标志符PAN ID,用以同一个网络之内节点的互相识别和通信。[23][24]
2.7 TI Z-stack协议栈开发环境和工作流程
系统软件设计是在硬件设计的基础上进行的,良好的软件设计是实现系统功能的重要环节,也是提高系统性能的关键所在。节点设计基于通用性及便于开发的考虑,移植了TI公司的Z-Stack协议栈,其主要特点就是其兼容性,完全支持IEEE 802. 15. 4/ZigBee的CC2430片上系统解决方案。Z-Stack还支持丰富的新特性,如无线下载,可通过ZigBee网状网络(Mesh Network)下载节点更新。
图 ZigBee节点开发环境
TI的Z-Stack装载在一个基于IAR开发环境的工程里。强大的IAR Embedded Workbench除了提供编译下载功能外,还可以结合编程器进行单步跟踪调试和监测片上寄存器、Flash数据等。Z-Stack根据IEEE 802. 15.4和ZigBee标准分为以下几层:API(Application Programming Interface),HAL (Hardware Abstract Layer),MAC(Media Access Control), NWK(Zigbee Network Layer),OSAL(Operating System Abstract System),Security,Service,ZDO(Zigbee Device Objects)。使用IAR打开工程文件SampleApp.eww后,即可查看到整
第 17 页 共 107 页
个协议栈从HAL层到APP层的文件夹分布。该协议栈可以实现复杂的网络链接,在协调器节点中实现对路由表和绑定表的非易失性存储,因此网络具有一定的记忆功能。
Z-Stack采用操作系统的思想来构建,采用事件轮循机制,当各层初始化之后,系统进入低功耗模式,当事件发生时,唤醒系统,开始进入中断处理事件,结束后继续进入低功耗模式。如果同时有几个事件发生,判断优先级,逐次处理事件。这种软件构架可以极大地降级系统的功耗。
整个Z-stack的主要工作流程,大致分为系统启动,驱动初始化,OSAL初始化和启动,进入任务轮循几个阶段,下面将逐一详细分析。
图 Z-Stack系统运行流程图
Figure . The Flow Chart of Z-Stack
n 系统初始化
系统上电后,通过执行ZMain文件夹中ZMain.c的ZSEG int main( )函数实现硬件的初始化,其中包括关总中断osal_int_disable( INTS_ALL )、初始化板上硬件设置HAL_BOARD_INIT( )、初始化I/O口InitBoard( OB_COLD )、初始化HAL层驱动HalDriverInit( )、初始化非易失性存储器sal_nv_init( NULL )、初始化MAC层ZMacInit( )、分配64位地址zmain_ext_addr( )、初始化操作系统osal_init_system( )等。
硬件初始化需要根据HAL文件夹中的hal_board_cfg.h文件配置寄存器8051的寄存器。TI官方发布Z-stack的配置针对的是TI官方的开发板CC2430DB、CC2430EMK等,如采用其他开发板,则需根据原理图设计改变hal_board_cfg.h文件配置,例如本方案制作的实验板与TI官方的I/O口配置略有不同,其中状态指示LED2的需要重新设置LED2控制引脚口、通用I/O口方向和控制函数定义等。
当顺利完成上述初始化时,执行osal_start_system( )函数开始运行OSAL系统。该任务调度函数按照优先级检测各个任务是否就绪。如果存在就绪的任务则调用tasksArr[ ]中相对应的任务处理函数去处理该事件,直到执行完所有就绪的任务。如果任务列表中没有就绪的
第 18 页 共 107 页
任务,则可以使处理器进入睡眠状态实现低功耗。程序流程如图3-13所示。osal_start_system( )一旦执行,则不再返回Main( )函数。
OSAL任务调度流程图
Figure . The Flow Chart of OSAL Scheduler
n OSAL任务
OSAL是协议栈的核心,Z-stack的任何一个子系统都作为OSAL的一个任务,因此在开发应用层的时候,必须通过创建OSAL任务来运行应用程序。通过osalInitTasks( )函数创建OSAL任务,其中TaskID为每个任务的唯一标识号。任何OSAL任务必须分为两步:一是进行任务初始化;二是处理任务事件。任务初始化主要步骤如下:
(1) 初始化应用服务变量。
const pTaskEventHandlerFn tasksArr[ ]数组定义系统提供的应用服务和用户服务变量,如MAC层服务macEventLoop、用户服务SampleApp_ProcessEvent等
(2) 分配任务ID和分配堆栈内存
void osalInitTasks( void )主要功能是通过调用osal_mem_alloc( )函数给各个任务分配内存空间,和给各个已定义任务指定唯一的标识号。
(3) 在AF层注册应用对象
通过填入endPointDesc_t数据格式的EndPoint变量,调用 afRegister( )在AF层注册EndPoint应用对象。
通过在AF层注册应用对象的信息,告知系统afAddrType_t地址类型数据包的路由端点,例如用于发送周期信息的SampleApp_Periodic_DstAddr和发送LED闪烁指令的SampleApp_Flash_DstAddr。
第 19 页 共 107 页
(4)注册相应的OSAL或则HAL系统服务
在协议栈中,Z-stack提供键盘响应和串口活动响应两种系统服务,但是任何Z-Stask任务均不自行注册系统服务,两者均需要由用户应用程序注册。值得注意的是,有且仅有一个OSAL Task可以注册服务。例如注册键盘活动响应可调用RegisterForKeys( )函数。
(5)处理任务事件
处理任务事件通过创建“ApplicationName”_ProcessEvent( )函数处理。一个OSAL任务除了强制事件(Mandatory Events)之外还可以定义15个事件。
SYS_EVENT_MSG(0x8000)是强制事件。该事件主要用来发送全局的系统信息,包括以下信息:
AF_DATA_CONFIRM_CMD:该信息用来指示通过唤醒AF DataRequest( )函数发送的数据请求信息的情况。ZSuccess确认数据请求成功的发送。如果数据请求是通过AF_ACK_REQUEST置位实现的,那么ZSussess可以确认数据正确的到达目的地。否则,ZSucess仅仅能确认数据成功的传输到了下一个路由。
AF_INCOMING_MSG_CMD:用来指示接收到的AF信息。 KEY_ CHANGE:用来确认按键动作。
ZDO_ NEW_ DSTADDR:用来指示自动匹配请求。 ZDO_STATE_CHANGE:用来指示网络状态的变化。
n 网络层信息
Zigbee设备有两种网络地址:1个是64位的IEEE地址,通常也叫作MAC地址或者扩展地址(Extended address),另一个是16位的网络地址,也叫做逻辑地址(Logical address)或者短地址。64位长地址是全球唯一的地址,并且终身分配给设备。这个地址可由制造商设定或者在安装的时候设置,是由IEEE来提供。当设备加入Zigbee网络被分配一个短地址,在其所在的网络中是唯一的。这个地址主要用来在网络中辨识设备,传递信息等。
协调器(Coordinator)首先在某个频段发起一个网络,网络频段的定义放在DEFAULT_ CHANLIST配置文件里。如果ZDAPP_ CONFIG_ PANID定义的PAN ID是0xFFFF(代表所有的PAN ID),则协调器根据它的IEEE地址随机确定一个PAN ID。否则,根据ZDAPP_ CONFIG_ PANID的定义建立PAN ID。当节点为Router或者End Device时,设备将会试图加入DEFAULT_ CHANLIST所指定的工作频段。如果ZDAPP_ CONFIG_ PANID没有设为0xFFFF,则Router或者End Device会加入ZDAPP_ CONFIG_ PANID所定义的PAN ID。
设备上电之后会自动的形成或加入网络,如果想设备上电之后不马上加入网络或者在加入网络之前先处理其他事件,可以通过定义HOLD_AUTO_START来实现。通过调用ZDApp_StartUpFromApp( )来手动定义多久时间之后开始加入网络。
设备如果成功的加入网络,会将网络信息存储在非易失性存储器(NV Flash)里,掉电后仍然保存,这样当再次上电后,设备会自动读取网络信息,这样设备对网络就有一定的记忆功能。对NV Flash的动作,通过NV_RESTORE( )和NV_ITNT( )函数来执行。
有关网络参数的设置大多保存在协议栈Tools文件夹的f8wConfig.cfg里。
n 路由
Z-Stack采用无线自组网按需平面距离矢量路由协议AODV,建立一个Hoc网络,支持移动节点,链接失败和数据丢失,能够自组织和自修复。当一个Router接受到一个信息包之后,NMK层将会进行以下的工作:首先确认目的地,如果目的地就是这个Router的邻居,信息包将会直接传输给目的设备;否则,Router将会确认和目的地址相应的路由表条目,如
第 20 页 共 107 页