Zigbee协议栈系统事件
ZIGBEE技术规范与协议栈分析

ZIGBEE技术规范与协议栈分析篇一:ZigBee知识无线龙1.协议栈工作流程和无线收发控制 LED 实验内容:1. ZigBee 协议栈简介2. 如何使用 ZigBee 协议栈3. ZigBee 协议栈的安装、编译与下载4. 协议栈无线收发控制 LED5. 协议栈工作流程实现现象:协调器、终端上电,组网成功后 D1 灯闪烁 1. ZigBee 协议栈简介什么是 ZigBee 协议栈呢?它和 ZigBee 协议有什么关系呢?协议是一系列的通信标准,通信双方需要共同按照这一标准进行正常的数据发射和接收。
协议栈是协议的具体实现形式,通俗点来理解就是协议栈是协议和用户之间的一个接口,开发人员通过使用协议栈来使用这个协议的,进而实现无线数据收发。
图 1 展示了 ZigBee 无线网络协议层的架构图。
ZigBee 的协议分为两部分,IEEE 802.15.4 定义了 PHY(物理层)和 MAC(介质访问层)技术规范;ZigBee联盟定义了NWK(网络层)、APS(应用程序支持子层)、APL(应用层)技术规范。
ZigBee协议栈就是将各个层定义的协议都集合在一直,以函数的形式实现,并给用户提供 API(应用层),用户可以直接调用。
图 1 ZigBee 无线网络协议层 2. 如何使用 ZigBee 协议栈协议栈是协议的实现,可以理解为代码,函数库,供上层应用调用,协议较底下的层与应用是相互独立的。
商业化的协议栈就是给你写好了底层的代码,符合协议标准,提供给你一个功能模块给你调用。
你需要关心的就是你的应用逻辑,数据从哪里到哪里,怎么存储,处理;还有系统里的设备之间的通信顺序什么的,当你的应用需要数据通信时,调用组网函数给你组建你想要的网络;当你想从一个设备发数据到另一个设备时,调用无线数据发送函数;当然,接收端就调用接收函数;当你的设备没事干的时候,你就调用睡眠函数;要干活的时候就调用唤醒函数。
所以当你做具体应用时,不需要关心协议栈是怎么写的,里面的每条代码是什么意思。
针对ZigBee协议范文栈的分析

针对ZigBee协议范文栈的分析通过物理层提供的具体服务,在MAC层中,ZigBee协议实现了两个物理设备之间的稳定数据通信链路,并且采用带冲突避免的载波侦听多路访问的控制方法,实现了ZigBee信道的访问冲突问题。
同时,ZigBee协议还设计了专门的功能从而实现时隙保护、数据发送、检测、跟踪等基本功能,从而有效保障数据链路层通信。
ZigBee协议在MAC层的数据包结构,规定了MAC头、尾和MAC净荷,其中MAC头定义了数据帧的序列号、目标地址和PAN标识符以及源地址和PAN标识符,MAC尾则表示MAC数据包结束,MAC净荷则是MAC层的主要传输部分,是包含了具体的上层数据。
在ZigBee协议中,对网络层的功能进行定义,其主要功能是为上层应用层提供服务,同时保障MAC层工作有效。
针对网络层的具体功能,ZigBee规定了网络层数据的处理规则、路由跳转规则、发送和接受的规则,在网络层数据通信的数据结构中,网络层头规定了目的地址、源地址以及多点传送的控制信息,而网络层净荷则是包含了网络层的具体传输数据,在ZigBee针对网络层数据传输规则下进行数据和控制指令的传送。
针对应用层,ZigBee定义了APS、ZDO和应用对象。
其中APS为应用支持层,主要是为ZigBee物理设备之间的绑定信息传输,同时为物理设备对象和应用对象相关的服务和应用提供接口,从而为物理设备提供服务。
ZDO是ZigBee的设备对象的专门程序,通过ZigBee的服务原语来执行ZigBee网络中的协调器、路由器以及各个终端设备之间的信息数据和控制指令的传输。
应用层的数据传输报文包含了帧头和应用层净荷两部分,枕头数据包括了目的地址、源地址、集团地址以及针对数据帧控制的信息,应用层净荷则包含了应用层的传输数据。
2.2ZigBee协议栈的服务原语在ZigBee协议栈中,由不同的层级构成了整个体系结构,作为一个有机整体,ZigBee设备要求在工作时能够准确无误且有效,这就需要协议栈中层与层之间的协作共性和效率较高,在ZigBee协议栈中,服务原语作为基本的操作单元来实现ZigBee协议栈各层之间的数据传输和信息关联。
ZigBee系统事件

ZIGBEE事件ZIGBEE事件有两类,系统定义事件和用户定义事件。
系统类事件是协议栈已定义好的,用户类事件是我们用户层面来定义的。
事件类号采用一个16bit的常量,使用独热码编码,独热码是只有一个bit为1,其他全为0的一种码制,采用独热码的优点是操作方便,可以使用简单的位操作指令实现,如:提取系统类事件用events & SYS_EVENT_MSG,清除系统类事件用events ^ SYS_EVENT_MSG;由于事件类号是16bit,也就是说zigbee事件类只有16个,系统类事件SYS_EVENT_MSG使用0x8000,故自定义事件类只有15个,可采用0x4000至0x0001。
事件处理函数为:app_ProcessEvent( byte task_id, UINT16 events ),可见调用此函数将传递两个参数,task_id任务号和events 事件类号;事件处理函数首先根据事件类号来判断是何种类型事件,然后根据任务号得到消息指针pMsg,最后根据消息指针结构里的事件号pMsg->event来具体处理事件,event为8bit的常量,系统event 在ZComDef.h里定义。
在ZigBee协议栈中,任何通信数据都是利用帧的格式来组织的,协议栈的每一层都有特定的帧结构;AF定义了两种帧类型,键值对(Key Value Pair,KVP)和报文(Message,MSG);KVP消息主要用于传输一些较为简单的变量格式;但由于Zigbee的很多应用领域中的消息较为复杂并不适用KVP格式,因此Zigbee协议规划定义了MSG类型。
MSG对数据格式不作要求,适合任何格式的数据传输,因此可以用于传送数据量大的消息。
下面对系统event说明(其中AF_代表应用框架,ZDO_代表设备对象):1、AF_DATA_CONFIRM_CMD:Data confirmation数据收到确认;A设备发送数据,B设备收到数据后将返回应答ack给A,A收到此ack将触发AF_DATA_CONFIRM_CMD事件;F_DataRequest函数参数options 如设AF_ACK_REQUEST,则要求对方设备回复ack。
zigbee中OSAL事件传递机制和消息传递机制

zigbee中OSAL事件传递机制和消息传递机制⼀、概述OSAL (Operating System Abstraction Layer),翻译为“操作系统抽象层”。
OSAL 就是⼀种⽀持多任务运⾏的系统资源分配机制。
OSAL与标准的操作系统还是有很⼤的区别的。
简单⽽⾔, OSAL 实现了类似操作系统的某些功能,但并不能称之为真正意义上的操作系统。
⼆、OSAL任务运⾏⽅式我们以TI1.2.1的 BLE 协议栈中的SimpleBLEPeripheral为例,分析⼀下 OSAL 。
其中有⼀个simpleBLEPeripheral.c⽂件,⾥⾯有2个⽐较重要的函数:SimpleBLEPeripheral_Init和SimpleBLEPeripheral_ProcessEvent。
SimpleBLEPeripheral_Init是任务的初始化函数,⽽SimpleBLEPeripheral_ProcessEvent则负责处理传递给此任务的事件。
⼤概浏览⼀下SimpleBLEPeripheral_ProcessEvent这个函数,我们可以发现,此函数的主要功能是判断由参数传递的事件类型,然后执⾏相应的事件处理函数。
由此,可以推断出 BLE 协议栈应⽤程序的运⾏机制如下图所⽰:当有⼀个事件发⽣的时候, OSAL 负责将此事件分配给能够处理此事件的任务,然后此任务判断事件的类型,调⽤相应的事件处理程序进⾏处理。
明⽩了这个问题,新的问题⼜摆在了我们的⾯前: OSAL 是如何传递事件给任务的。
三、OSAL的事件传递机制在试图弄清楚这个问题之前,我们需要弄清楚另外⼀个⼗分基础⽽重要的问题。
那就是如何向我们的应⽤程序中添加⼀个任务。
我们先来看看simpleBLEPeripheral.c是如何添加任务的。
我们打开OSAL_SimpleBLEPeripheral.c⽂件。
这⾥我们可以找到⼀个很重要的数组tasksArr和⼀个同样很重要的函数osalInitTasks。
ZigBee源码程序及解释

协议栈无线透传编程原理:第一个功能:协调器的组网,终端设备和路由设备发现网络以及加入网络//第一步:Z-Stack 由 main()函数开始执行,main()函数共做了 2 件事:一是系统初始化,另外一件是开始执行轮转查询式操作系统int main( void ) { .......// Initialize the operating systemosal_init_system(); //第二步,操作系统初始化......osal_start_system(); //初始化完系统任务事件后,正式开始执行操作系统......}//第二步,进入 osal_init_system()函数,执行操作系统初始化uint8 osal_init_system( void ) //初始化操作系统,其中最重要的是,初始化操作系统的任务{// Initialize the Memory Allocation Systemosal_mem_init();// Initialize the message queueosal_qHead = NULL;// Initialize the timersosalTimerInit();// Initialize the Power Management Systemosal_pwrmgr_init();// Initialize the system tasks.osalInitTasks(); //第三步,执行操作系统任务初始化函数// Setup efficient search for the first free block of heap.osal_mem_kick();return ( SUCCESS );}//第三步,进入osalInitTasks()函数,执行操作系统任务初始化void osalInitTasks( void ) //第三步,初始化操作系统任务{uint8 taskID = 0;tasksEvents = (uint16 *)osal_mem_alloc( sizeof( uint16 ) * tasksCnt);osal_memset( tasksEvents, 0, (sizeof( uint16 ) * tasksCnt));//任务优先级由高向低依次排列,高优先级对应 taskID 的值反而小macTaskInit( taskID++ ); //不需要用户考虑nwk_init( taskID++ ); //不需要用户考虑Hal_Init( taskID++ ); //硬件抽象层初始化,需要我们考虑#if defined( MT_TASK )MT_TaskInit( taskID++ );#endifAPS_Init( taskID++ ); //不需要用户考虑#if defined ( ZIGBEE_FRAGMENTATION )APSF_Init( taskID++ );#endifZDApp_Init( taskID++ ); //第四步,ZDApp层,初始化,执行ZDApp_init函数后,如果是协调器将建立网络,如果是终端设备将加入网络。
ZigBee协议栈任务处理分析笔记

ZigBee协议栈任务处理分析笔记----(转载请注明出处774910**********)Everhu ai写于2011-11-17 弄了这么久Z i g Bee协议栈,今天终于有一点头绪了,基本上知道了整个系统任务怎么被添加,又是怎么被切换的一个过程。
下面就简单讲一讲这部分内容。
首先看的当然是main()函数,不过这个函数不是今天的重点,里面有我添加的注释,先就一笔带过吧。
int main( void ){// Turn off interr uptsosal_int_di sable( INTS_A LL );//关闭全局中断E A=0,初始化过程不响应任何中断// Initial izat i on for board relate d stuff such as LEDsHAL_BOARD_I NIT();//配置了时钟、L ED、串口// Make sure supply voltage is high enough to runzmain_vdd_ch eck();//检查电源电压// Initial ize stackmemoryzmain_ram_i nit();//初始化堆内存// Initial izeb oard I/O /初始化板子用到的IO口InitBo ard( OB_COL D );// Initial ze HAL driver sHalDri verIn i t();//初始化外设// Initial ize NV System//系统初始化osal_n v_init( NULL );// Initial izeb asic NV items//任务初始化zgInit();// Initial izet he MACZMacIn it();// Determi ne the extend ed addres s//确定长地址zmain_ext_a dd r();#ifnde f NONWK// Sincethe AF isn't a task, call it's initia lizat ion routin eafInit();#endif// Initial izet he operat in g systemosal_init_s ystem(); //系统初始化// Allowinterr uptsosal_int_en able( INTS_A L L );//使能中断// Finalb oardinitia l izat ion //后期初始化InitBo ard( OB_REA D Y ); //sd rest// Displa y inform ation about this device//显示设备信息zmain_d ev_i nfo();/* Displa y the device info on the LCD */#ifdef L CD_SU PP ORTEDzmain_lcd_i nit(); //显示信息#endif#ifdef WDT_IN_P M1/* If WDT is used, this is a good placeto enable it. */WatchD o gEnab le( WDTIMX ); //使用看门狗#endifosal_st art_syste m(); // No Return from here//正常情况下不返回// Should n't get herereturn( 0 );} // main()其中含有os al的都是与操作系统相关的。
第六章 zigbee协议栈详解
ZigBee回顾
ZigBee协议栈建立在IEEE802.15.4的PHY层和MAC子层规范之 上。
它实现了网络层(networklayer,NWK)和应用层( applicationlayer,APL)。
在应用层内提供了应用支持子层(applicationsupportsub-layer, APS)和 ZigBee 设备对象(ZigBee Device Object,ZDO)。
学时:4
ZigBee协议栈详解
目标: 本章在向学员介绍物联网体系中传输层所使用 的相关技术,通过本课的学习,学员应该掌握 如下知识: IP协议栈的应用 WLAN无线网络应用
大纲
协议栈内部结构 IEEE802.15.4 标准和 ZigBee 协议 协议栈软件总体设计 网络层(NWK)设计 应用层 MAC 层设计 物理层(PHY)设计
ZigBee协议栈的实时性要求并不高,因此在设计任务调度程序时 ,OSAL只采用了轮询任务调度队列的方法来进行任务调度管理。
这个轮询就存在于osal_start_system( )函数中 重视优先级的调度方式
do { if (tasksEvents[idx]) // Task is highest priority that is ready. { break; }
目前 TinyOS 系统支持的平台只有 ATMEL 公司的 AVR 系列、TI 公司的 MSP430系列。由于TinyOS操作系统还没有对Chipcon公司提供CC2430开发平 台提供支持,因此,要在 CC2530 开发平台上使用 TinyOS 系统来开发 ZigBee 协议栈软件,就必须首先对 TinyOS 进行移植。
协议栈主要流程
见Zmain.c中的main函数
无线传感网络技术 第三章典型的ZIGBEE 协议栈及解决方案
该方案是将协议处理和无线射频处理集成在一个芯片上。 ✓ 早期典型的产品有TI 公司的CC2430,CC2430 使用一个8051 8 位MCU 内核,并具备128KB闪存和8KB
RAM ,可用于构建各种类型的ZIGBEE设备,包括调谐器、路由器和终端设备。CC2430片内资源丰富,包含 模数转换器(ADC) 、若干定时器、AES-128 协同处理器、看门狗定时器、32kHz 晶振的休眠模式定时器、上 电复位电路(Power-On-Reset)、掉电检测电路(Brown-out-detection),以及21 个可编程I/O 引脚。 ✓ Freescale公司单芯片集成SOC主要有MC1321X系列芯片,该系列芯片集成了MC9S08GT MCU 和MC1320x 收发信机,闪存可以在16~60 KB 的范围内选择,符合802.15.4 标准,包括一个集成的发送/接收(T/R)开 关,可以降低对外部组件的需求,进而降低原料成本和系统总成本,支持Freescale的软件栈选项、简单MAC (SMAC)、802.15.4 MAC 和全ZIGBEE 堆栈。此外MC13211 提供16 KB 的闪存和1 KB 的RAM,非常适合 采用SMAC 软件的点到点或星形网络中的经济高效的专属应用。对于更大规模的联网,则可以使用具有32 KB 的内存和2 KB 的RAM 内存的MC13212芯片。MC13213具有60 KB 的内存和4 KB 的RAM,提供可编程 时钟、4 MHz (或更高)频率运行的标准4线SPI、外部低噪声放大器和功率放大器(PA)。 ✓ EMBER公司早期推出EM250芯片,片内含有16 位低功耗微控制器,128KB 闪存,5K RAM,2.4GHz无线射 频模块,同时提供有EmberZNet 2.1 协议栈。最新的EmberZNet 协议版本已经迭代到2.8,芯片EFR32MG13 内核为ARM Cortex-M4,可工作于2.4GHz,闪存容量为512KB,内存容量为64 KB。
ZigBee的OSAL机制
一、OSAL概述首先OSAL是以实现多任务为核心的系统资源管理机制,它和标准的操作系统还是有很大区别的。
简单而言,OSAL实现了类似操作系统的“某些”功能,但并不能称之为真正意义上的操作系统。
Chipcon公司为自己设计的ZStack协议栈中提供了一个名为操作系统抽象层OSAL的协议栈调度程序。
二、OSAL任务运行方式ZigBee协议栈的每一层都设计了一个事件处理函数,用来处理每一层相对应的各种事件,这些处理函数我们可以理解成是与各层相对应的任务函数,它们由OSAL来进行管理。
因为整个程序只有一个main函数,我们就从这个函数入手(在此我以sample这个例程为例来说明):在ZMain.c中有:ZSEG int main( void ){osal_int_disable( INTS_ALL ); // Turn off interrupts 关中断HAL_BOARD_INIT(); // Initialize HAL 初始化硬件抽象层zmain_vdd_check(); // Make sure supply voltage ishigh enough to run检测电源电压保证正常运行zmain_ram_init(); // Initialize stack memory 初始化内存InitBoard( OB_COLD ); // Initialize board I/O 初始化板子上的IO口HalDriverInit(); // Initialze HAL drivers 初始化硬件抽象层驱动osal_nv_init( NULL ); // Initialize NV System 初始化非易失存储系统zmain_ext_addr(); // Determine the extended address 确定扩展地址也就是64位的IEEE地址zgInit(); // Initialize basic NV items 初始化基本的NV条目ZMacInit(); // Initialize the MAC 初始化MAC层#ifndef NONWKafInit(); // Since the AF isn't a task, call it'sinitialization routine#endifosal_init_system(); // Initialize the operating system 初始化操作系统osal_int_enable( INTS_ALL ); // Allow interrupts 打开中断InitBoard( OB_READY ); // Final board initialization 最终板子的初始化zmain_dev_info();// Display information about this device 显示关于设备的信息#ifdef LCD_SUPPORTED /* Display the device info on the LCD */显示设备信息在LCD上zmain_lcd_init();#endifosal_start_system(); // No Return from here 启动操作系统没有返回值} // main()我们可以看出里面都是一些初始化函数,但main是按照一定的顺序对系统进行初始化的。
12Zigbee实验报告《协议栈按键控制led》
添加自己的按键驱动步骤:
第一步:修改hal ey.c
1、修改SW6所在10口,对应自己开发板上的按键
2、修改触发方式
3、修改对应的中断一些相关标志位
4、不需要用到TI的摇杆J-STICK,所以把代码注释掉·
第二步:修改halboardcfg.h文件
5、修改SW-6所在10口
第三步:修改OnBoard.C文件。
实验内容与步骤
按键驱动,主要有两种方法。一种是普通的轮询,不断查询是否按下按键。另一种是通过中断来产生事件中断与轮询的区别按键
中断和轮询的主要区别是轮询需要CPU定期的检查按键状态,当检测到按键按下则发出HAL KEY EVENT消息到HAL层来执行处理,中断则是当有按键按下立刻向HAL KEY EVENT发出消息,不需要CPU的检查。轮询的实时性比中断要差点,推荐用中断方式。
在ZMain.C目录树下:6、是否使能中断
第四部: SampleApp ProcessEvent中
7、添加case KEY CHANGE,修改按键服务程序
第二页
实验内容与步骤
第三页
实验内容与步骤
实验总结
教师评定
签字: 年 月 日
2019——2020学年第二学期
专业
班级
学号
姓名
日期
2019——2020学年第二学期
专业
班级
学号
姓名
日期
第一页
实验题目
实验目的
本实验是基于ZStack-CC2530-2.5.1a版本的协议栈来进行实验的,整个实验需要改动. hal board-cfg.h. hal board-cfg.h, halkey.c. halkey.h和自己定义的Coordinator.c这5
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
系统常用事件处理函数:
-按键事件
-接收消息事件
-网络状态改变事件
-绑定确认事件
-匹配响应事件
1、按键事件
Case KEY_CHANGE:
当有按键事件发生的时,调用按键事件处理函数Sample_HandleKeys()来处理按键事件。
在SampleApp例程中按键处理函数处理了以下2件事情
-如果按键1按下,将向网络中的其他设备发送LED闪烁命令
-如果按键2按下,检测组ID号为SAMPLEAPP_FLASH_GROUP的组是否已经注册。
如果已经注册,调用aps_RemoveGroup()将其删除;如果没注册就在APS层注册
2、接收消息事件
Case:AF_INCOMING_MSG_CMD:
如果有接收消息事件发生,则调用函数SampleApp_MessageMSGCB(MSG)对接收的消息进行处理。
一般的接收消息事件是通过用户自定义的端点输入簇和输出簇来处理的。
在LED闪烁命令的发送函数中的输出簇为SAMPLEAPP_FLASH_CLUSTERID,所以在接收消息事件的输入簇中为SAMPLEAPP_FLASH_CLUSTERID即收到LED闪烁命令
3、网络状态改变事件
Case:ZDO_STATE_CHANGE
当有网络状态改变事件发生后,会调用函数SampleApp_NwkState()来处理网络状态改变事件。
在SampleApp例程中,网络状态改变事件主要处理了以下事件:
-判断设备类型(区分协调器、路由节点、终端节点)
-当协调器网络建立成功后或其他类型节点加入网络后点亮led1
-通过调用osal_start_timerEx()设置一个定时事件,当时间到达后启用用户自定义事件SampleApp_Send_PERIODIC_MSG_EVT
备注:在使用过程中这里的3种设备类型不是全选,写一个就可以了,其他的删除
4、绑定确认事件
caseEnd_Device_Bind_rsp:
当有绑定确认事件发生时,会调用ZDO_ParseBindRsp( inMsg )来处理绑定确认事件。
在GeneericApp例程中绑定事件主要完成以下事件:
-如果绑定成功,则协调器led4常亮,否则如果绑定不成功,协调器led4的闪烁绑定事件分为2个部分,第一个是A设备发送给B设备一个绑定请求信息,第二个是B 设备对绑定请求信息的回应。
5消息确认事件:
数据收到确认:A设备发送数据,B设备收到数据后将返回应答ack给A,A如果收到此ack则触发AF_DATA_CONFIRM_CMD事件,F_DataRequest函数参数options如设AF_ACK_REQUEST则要求对方回复ack。