Zigbee协议栈的研究 联系客服

发布时间 : 星期六 文章Zigbee协议栈的研究更新完毕开始阅读

在Zigbee技术发展的过程中,诞生了非常多的Zigbee协议栈以及专门为嵌入式无线传感器网络设计的操作系统,比如Z-Stack协议栈,BeeStack协议栈,freakz协议栈,msstatePAN协议栈以及OSAL操作系统,TinyOS操作系统,contiki操作系统等,由于TI公司最早将其Zigbee协议栈开源,并配套了相应的SOC芯片,开发成本低等特点,所以国内主要应用的协议栈为Z-Stack协议栈,本文也将采用Z-Stack+OSAL方案,配合CC2530芯片,使用IAR EW8051软件进行开发,简述Zigbee的主要开发过程。

Z-Stack(Z-协议栈)主要有三个规范:2004年的ZigBee 1.0或ZigBee 2004;2006年的ZigBee 2006规范;2007年的ZigBee 2007规范。其中ZigBee 2007规范规定了两套高级的功能指令集(feature set):分别是ZigBee功能命令集和 ZigBee Pro功能命令集。ZigBee 2007规范具有多播通信、多对一路由通信和 SKKE(Symmetric-key key establishment)高安全等优势,在组网技术应用中得到越来越广泛的应用。

下文将围绕ZigBee 2007规范是如何处理任务(消息)事件,分规范系统结构、任务事件如何建立及处理、任务事件在系统中如何传递、相应任务事件过程等环节讨论。

3.1 协议中文件结构

图3-1 协议文件结构

当打开具有Zigbee 2007规范结构的文件如“ApplicationName”App工程后,在 Workspace区域看到针对不同的设备类型实现的源文件:如图3-1。各文件夹说明如表3-1。

Z-Stack协议栈是用操作系统的思想来构建,采用事件轮循机制,当各层初始化之后,系统进入低功耗模式,当事件发生时,唤醒系统,开始进入中断处理事件,结束后继续进入低功耗模式。如果同时有几个事件发生,判断优先级,逐次处理事件。这种软

14

件构架可以极大地降级系统的功耗,为zigbee技术应用在无线节点在能源方面提供了保障。

表3-1 协议文件夹说明

序号 文件夹名 1 2 3 4 5 6 7 8 9 10 11 App HAL MAC MT NWK OSAL Profile Security Services Tools ZDO 说 明 Application Programming Interface应用层,存放应用程序;应用支持层的功能包括:维持绑定表、在绑定的设备之间传送消息。 Hardware Abstract Layer硬件层,与硬件电路有关。 Media Access Control数据链路层。 监控调试层,通过串口调试各层,与各层进行直接交互。 Zigbee Network Layer网络层;ZigBee协议栈的核心部分在网络层。网络层主要实现节点加入或离开网络、接收或抛弃其他节点、路由查找及传送数据等功能。 Operating System Abstract System操作系统抽象层。 协议栈配置文件(AF)。 安全层。 地址处理层。 工程配置。 Zigbee Device Objects设备对象,调用APP子层和NWK层服务;远程设备通过ZDO请求描述符信息,接收到这些请求时,ZDO会调用配置对象获取相应描述符值。另外,ZDO提供绑定服务。 MAC层接口函数;MAC层负责处理所有的物理无线信道访问,并产12 13 14

ZMac ZMain Output 生网络信号、同步信号;支持PAN连接和分离,提供两个对等MAC实体之间可靠的链路。 整个工程的入口。 输出文件。 整个Z-Stack的主要工作流程,大致分为系统启动、驱动初始化、操作系统抽象层OSAL初始化和启动、进入任务轮循几个阶段。对于Zigbee协议栈系统,其入口程序同C语言系统程序一样是在ZMain文件夹中ZMAIN.C的main()函数中,该函数完成系统初始化硬件、初始化网络(加入/创建网络)、初始化任务列表后,开中断,执行osal_start_system()函数,开始运行OSAL系统。osal_start_system()函数是系统任务的无限主循环函数,在循环遍历所有的任务事件,为触发事件的任务调用任务事件处理函数,它是Zigbee运行的起点与终点,即osal_start_system()一旦执行,则不再返回Main()函数,如果没有任务事件,函数将把处理器进入睡眠状态实现低功耗。

15

3.2 任务事件建立和处理程序

在Zigbee协议文件中,OSAL是协议栈的核心,其运行流程如图3-2所示。

图3-2 OSAL流程图

在 OSAL 文件夹的osal.c中: (1)首先任务需要建立:

对所有事件,包含时间、系统消息(SYS_EVENT_MSG,如Application Framework AF信息输入、按键、设备对象ZDO反馈消息)、用户定义的事件等的处理。可以在程序设置。

比如在osal夹中的comdef.h中,设置*Global System Messages,如下: #define SPI_INCOMING_ZTOOL_PORT 0x21 //设置来自ZTool端口数据事件 #define SPI_INCOMING_ZAPP_DATA 0x22 //设置来自ZAPP端口数据事件 //设置指示通过唤醒应用层DataRequest()函数发送的数据请求信息事件 #define AF_DATA_CONFIRM_CMD 0xFD

#define AF_INCOMING_MSG_CMD 0x1A //设置接收到的应用层信息事件 #define KEY_CHANGE 0xC0 //设置按键事件

#define ZDO_ NEW_ DSTADDR 0x1B //设置指示自动匹配请求事件 #define ZDO_STATE_CHANGE 0x1C //设置指示网络状态的变化事件

(2)添加任务事件

在OSAL文件夹下的osal.c中,修改成: uint8 osal_set_event(uint8 task_id,uint16 event_flag)

16

{ }

(3)添加处理任务程序 APP文件夹下,XXApp.c中:

uint16 XXApp_ProcessEvent ( uint8 task_id,uint16 events) {

if(task_id < tasksCnt) { }

else return( INVALID _TASK); //设置失败,返回一个无效任务号 return(SUCCESS); //返回成功标志

halIntState_t intState;

HAL_ENTER_CRITICAL_SECTION(intState); //暂停中断 tasksEvents[task_id] |= event_flag; //设置任务标志 HAL_EXIT_CRITICAL _SECTION ( intState); //打开中断

afIncomingMSGPacket_t *MSGpkt; (void)task_id; //不需引用参数

//若是系统消息是强制事件,该事件主要用来发送全局的系统信息。 if(events & SYS_EVENT_MSG) {

//接收消息号

MSGpkt=(afIncomingMSGPacket_t*)osal_msg_receive(SampleApp_TaskID); while(MSGpkt) {

switch(MSGpkt->hdr.cvcnt) //来自硬件层消息 {

//接收按键消息

case KEY_CHANGE: ?? break; //来自无线通信消息(OTA) case AF_INCOMING_MSG_CMD:

?? //执行SampleApp_MessageMSGCB(MSGpkt)函数 break;

?? //协调器建立、开始执行网络扫描等功能程序 /*osal_start_timerEx的作用体现在:与osal_set_event()配合,

17

case ZDO_STATE_CHANGE: //来自是否在网络中有设备状态变化