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
第六章 zigbee协议栈详解
ZigBee协议栈详解
目标: 本章在向学员介绍物联网体系中传输层所使用 的相关技术,通过本课的学习,学员应该掌握 如下知识: IP协议栈的应用 WLAN无线网络应用
大纲
协议栈内部结构 IEEE802.15.4 标准和 ZigBee 协议 协议栈软件总体设计 网络层(NWK)设计 应用层 MAC 层设计 物理层(PHY)设计
原语的概念
ZigBee 协议按照开放系统互联的 7 层模型将协议分成了一系列的层结 构,各层之间通过相应的服务访问点来提供服务。这样使得处于协议中 的不同层能够根据各自的功能进行独立的运作,从而使整个协议栈的结 构变得清晰明朗。另一方面,由于 ZigBee 协议栈是一个有机的整体, 任何 ZigBee 设备要能够正确无误的工作,就要求协议栈各层之间共同 协作。因此,层与层之间的信息交互就显得十分重要。ZigBee 协议为 了实现层与层之间的关联,采用了称为服务“原语”的操作。
Zigbee绑定操作
ZigBee协议ห้องสมุดไป่ตู้各层帧结构之间的关系
在 ZigBee 协议栈中,任何通信数据都是利用帧的格式来组织的 。协议栈的每一层都有特定的帧结构。当应用程序需要发送数 据时,它将通过 APS 数据实体发送数据请求到 APS。随后在它 下面的每一层都会为数据附加相应的帧头,组成要发送的帧信 息。
分裂、重新组装和可靠数据传输 地址映射来自于64位IEEE地址和16位网络地址
ZigBee 设备对象(ZDO)
负责定义网络中设备的角色,如:协调器或者终端设备 对绑定请求的初始化或者响应。 在网络设备之间建立安全联系 在网络中发现设备和决定供给哪个应用服务
实现这些功能,ZDO 使用 APS 层的 APSDE-SAP 和网络 层的 NLME-SAP。ZDO 是特殊的应用对象,它在端点 (endpoint)0 上实现。
ZigBee协议栈OSAL介绍
讨论ZigBee协议栈的构成以及内部OSAL的工作机理。
ZigBee协议栈OSAL介绍操作系统抽象层OSAL常用术语:1.资源(Resource):任何任务所占用的实体都叫资源,如变量、数组、结构体2.共享资源(Shared Resource):两个或两个以上任务使用的资源,为防止破坏资源,任务在操作共享资源时是独占状态。
3.任务(Task):即线程,简单的程序的执行过程。
任务设计时将问题尽可能分成多个任务,每个任务独立完成某项功能,同时赋予优先级、CPU寄存器和堆栈空间。
一般一个任务设计为一个无限循环。
4.多任务运行(Muti-task Running):其实同一时刻只有一个任务运行。
5.内核(Kernel):内核负责管理各个任务。
包括:分配CPU时间;任务调度;任务间的通信。
6.互斥(Mutual Exclusion):多任务通信最常用方法是共享数据结构。
保护共享资源常用的方法:关中断;使用测试并置位指令(T&S指令);禁止任务切换;使用信号量;7.消息队列(Message Queue):用于任务间传递消息。
OSAL提供如下功能:任务注册、初始化和启动;任务间的同步、互斥;中断处理;储存器分配和管理;OSAL运行机理:OSAL就是一种支持多任务运行的系统资源分配机制。
OSAL是一种基于事件驱动的轮询式操作系统。
、void osal_start_system(void)是ZigBee协议栈的灵魂,不断的查看事件列表,如果有事件发生就调用相应的事件处理函数。
SYS_EVENT_MSG是一个事件集合,是由协议栈定义的事件,即系统强制事件(Mandatory Events),它的定义为:#define SYS_EVENT_MSG 0x8000;它包含如下事件:AF_INCOMING_MSG_CMD 收到一个新的无线数据ZDO_STATE_CHANGE 网络状态发生变化事件,利用它判断终端加入网络后何时向协调器发送数据包。
Zigbee协议栈原理基础
编号:_______________本资料为word版本,可以直接编辑和打印,感谢您的下载Zigbee协议栈原理基础甲方:___________________乙方:___________________日期:___________________IZigbee协议栈相关概念i.i近距离通信技术比较:近距离无线通信技术有wifi、蓝牙、红外、zigbee,在无线传感网络中需求的网络通信恰是近距离需求的,故,四者均可用做无线传感网络的通信技术。
而,其中(1)红外(infrared ):能够包含的信息过少;频率低波衍射性不好只能视距通信;要求位置固定;点对点传输无法组网。
(2)蓝牙(bluetooth ):可移动,手机支持;通信距离10m;芯片价格贵;高功耗(3) wifi :高带宽;覆盖半径100m ;高功耗;不能自组网;(4) zigbee:价格便宜;低功耗;自组网规模大。
WSN中zigbee通信技术是最佳方案,但它连接公网需要有专门的网关转换进一步学习stm32。
1.2协议栈协议栈是网络中各层协议的总和,其形象的反映了一个网络中文件传输的过程:由上层协议到底层协议,再由底层协议到上层协议。
1.2.1Zigbee协议规范与zigbee协议栈Zigbee各层协议中物理层(phy)、介质控制层(mac)规范由IEEE802.15.4规定,网络层(NWK)、应用层(apl)规范由zigbee 联盟推出。
Zigbee 联盟推出的整套zigbee 规范:2005 年第一版ZigBeeSpecificationV1.0 , zigbee2006, zigbee2007、zigbeepro zigbee协议栈:很多公司都有自主研发的协议栈,如TI公司的:RemoTI, Z-Stack, SimpliciTI、freakz、msstatePAN 等。
1.2.2z-stack协议栈与zigbee协议栈z-stack协议栈与zigbee协议栈的关系:z-stack是zigbee协议栈的一种具体实现,或者说是TI公司读懂了zigbee 协议栈,自己用C语言编写了一个软件一---z-stack,是由全球几千名工程师共同开发的。
zigbee协议栈按键流程
我使用的协议栈版本及例子信息:ZigBee2006\Texas Instruments\ZStack-1.4.3-1.2.1\Projects\zstack\Samples\SampleApp记录下个人对按键流程的理解在hal_key.c中有一段说明:/*********************************************************************NOTE: If polling is used, the hal_driver task schedules the KeyRead() to occur every 100ms. This should be long enough to naturallydebounce(去抖动) the keys. The KeyRead() function remembers the keystate of the previous poll and will only return a non-zerovalue if the key state changes.NOTE: If interrupts are used, the KeyRead() function is scheduled25ms after the interrupt occurs by the ISR. This delay is usedfor key debouncing. The ISR disables any further Key interruptuntil KeyRead() is executed. KeyRead() will re-enable Keyinterrupts after executing. Unlike polling, when interruptsare enabled, the previous key state is not remembered. Thismeans that KeyRead() will return the current state of the keys(not a change in state of the keys).NOTE: If interrupts are used, the KeyRead() fucntion is scheduled by the ISR. Therefore, the joystick movements will only be detectedduring a pushbutton interrupt caused by S1 or the center joystickpushbutton.NOTE: When a switch like S1 is pushed, the S1 signal goes from a normally high state to a low state. This transition is typically clean. Theduration of the low state is around 200ms. When the signal returnsto the high state, there is a high likelihood of signal bounce, whichcauses a unwanted interrupts. Normally, we would set the interruptedge to falling edge to generate an interrupt when S1 is pushed, butbecause of the signal bounce, it is better to set the edge to risingedge to generate an interrupt when S1 is released. The debounce logiccan then filter out the signal bounce. The result is that we typicallyget only 1 interrupt per button push. This mechanism is not totallyfoolproof because occasionally, signal bound occurs during the fallingedge as well. A similar mechanism is used to handle the joystickpushbutton on the DB. For the EB, we do not have independent controlof the interrupt edge for the S1 and center joystick pushbutton. Asa result, only one or the other pushbuttons work reasonably well withinterrupts. The default is the make the S1 switch on the EB work morereliably.*********************************************************************/对本协议中,对按键有两种处理方式:1、中断法:有按键按下,则进入中断,开启一软定时器25ms后,读取键值进行相应处理2、查询法:开启一软定时器,系统每隔100ms进行轮询,如有按键按下读取键值进行相应处理(软定时器即软件定时器,参见“系统时钟定时器”说明)首先看下协议栈对KEY的初始化,在InitBoard()函数中:/* Initialize Key stuff */OnboardKeyIntEnable = HAL_KEY_INTERRUPT_DISABLE;HalKeyConfig( OnboardKeyIntEnable, OnBoard_KeyCallback);从而知道协议栈默认的按键处理机制是查询法.就先来看下查询法的流程:1、查询法(或者轮询法)首先看下HalKeyConfig()这个函数用于把按键/开关/操纵杆服务配置为轮询或中断驱动。
zigbee协议栈流程
上节刚刚讲了主函数,在那已经提到了osal_init_system和osal_start_system函数。
而协议栈是通过操作系统来维持运行的,所以就从这开始。
先说明:默认地,ZDApp_Init()[ZDApp.c]开始了设备在ZB网络中的启动,但是应用程序可以覆盖这个默认的行为。
应用程序要想掌控设备网络的开启,它必须将HOLD_AUTO_START包括为一个编译选项,并且推荐NV_RESTORE也为编译选项(用来在NV中保存ZB网络状态)本文的一些说法可能不严谨,敬请大家注意!1、采集节点启动并建立网络本文是针对ZStack-1.4.3-1.2.1\Projects\zstack\Samples\下的SimpleApp例程。
这个例子就是应用程序掌控设备网络的开启。
在主函数初始化OSAL调用osal_init_system函数的以后,函数见下:void osalInitTasks( void ){uint8 taskID = 0;tasksEvents = (uint16 *)osal_mem_alloc( sizeof( uint16 ) * tasksCnt);osal_memset( tasksEvents, 0, (sizeof( uint16 ) * tasksCnt));macTaskInit( taskID++ );nwk_init( taskID++ );Hal_Init( taskID++ );#if defined( MT_TASK )MT_TaskInit( taskID++ );#endifAPS_Init( taskID++ );ZDApp_Init( taskID++ );SAPI_Init( taskID );}这个函数是给每一层分配任务ID,优先级越高的ID越低,在此假设系统已经做好了所有的准备,并且想用应用程序掌控网络的建立,现在即将建立网络。
那我们就可以直接跳到SAPI_Init( taskID );这个函数。
zigbee,协议栈,按键事件
zigbee,协议栈,按键事件篇一:从Zigbee协议栈底层添加自己的按键配置本实验是基于ZStack-CC2530-2.5.1a版本的协议栈来进行实验的,整个实验需要改动hal_board_cfg.h、hal_board_cfg.h、hal_key.c、hal_key.h和自己定义的Coordinator.c这5个文件。
注意:添加自己的按键时尽量不要修改协议栈里面的按键程序,自己另行添加即可。
1、hal_key.h在/* Switches (keys) */下面添加自己的按键定义#define HAL_KEY_SW_8 0x80图1:----------------------------------------------------------------------------------------2、hal_board_cfg.h(转载于: 小龙文档网:zigbee,协议栈,按键事件) 在/* S6 */#define PUSH1_BV BV(1)#define PUSH1_SBIT P0_1#if defined (HAL_BOARD_CC2530EB_REV17)#define PUSH1_POLARITY ACTIVE_LOW#elif defined (HAL_BOARD_CC2530EB_REV13)#define PUSH1_POLARITY ACTIVE_LOW#else#error Unknown Board Indentifier#endif下面模仿/* S6 */下的程序定义自己的按键值:/* S8 */#define PUSH8_BVBV(4)//修改#define PUSH8_SBIT P0_4//修改#if defined (HAL_BOARD_CC2530EB_REV17)#define PUSH8_POLARITY ACTIVE_HIGH#elif defined (HAL_BOARD_CC2530EB_REV13)#define PUSH8_POLARITY ACTIVE_LOW#else#error Unknown Board Indentifier#endif图2:------------------------------------------------------------------------------------------------------------- 在/* ----------- Push Buttons ---------- */#define HAL_PUSH_BUTTON1() (PUSH1_POLARITY (PUSH1_SBIT)) #define HAL_PUSH_BUTTON2() (PUSH2_POLARITY (PUSH2_SBIT)) #define HAL_PUSH_BUTTON3() (0)#define HAL_PUSH_BUTTON4() (0)#define HAL_PUSH_BUTTON5() (0)#define HAL_PUSH_BUTTON6() (0)下定义自己的按键函数#define HAL_PUSH_BUTTON8() (PUSH8_POLARITY (PUSH8_SBIT)) 图3:---------------------------------------------------------------------------------------------------------------- hal_key.c在/* SW_6 is at P0.1 */#define HAL_KEY_SW_6_PORTP0#define HAL_KEY_SW_6_BIT BV(1)#define HAL_KEY_SW_6_SEL P0SEL#define HAL_KEY_SW_6_DIR P0DIR/* edge interrupt */#define HAL_KEY_SW_6_EDGEBIT BV(0)#define HAL_KEY_SW_6_EDGEHAL_KEY_FALLING_EDGE/* SW_6 interrupts */#define HAL_KEY_SW_6_IENIEN1 /* CPU interrupt mask register */#define HAL_KEY_SW_6_IENBITBV(5) /* Mask bit for all of Port_0 */#define HAL_KEY_SW_6_ICTL P0IEN /* Port Interrupt Control register */ #define HAL_KEY_SW_6_ICTLBIT BV(1) /* P0IEN - P0.1 enable/disable bit */ #define HAL_KEY_SW_6_PXIFG P0IFG /* Interrupt flag at source */下模仿/* SW_6 is at P0.1 */建立自己的按键函数#define HAL_KEY_SW_8_PORTP0#define HAL_KEY_SW_8_BIT BV(4) //修改#define HAL_KEY_SW_8_SEL P0SEL#define HAL_KEY_SW_8_DIR P0DIR/* edge interrupt */#define HAL_KEY_SW_8_EDGEBIT BV(0)#define HAL_KEY_SW_8_EDGE HAL_KEY_FALLING_EDGE/* SW_8 interrupts */#define HAL_KEY_SW_8_IENIEN1 /* CPU interruptmask register */#define HAL_KEY_SW_8_IENBITBV(5) /* Mask bit for all of Port_0 */#define HAL_KEY_SW_8_ICTL P0IEN /* Port Interrupt Control register */ #define HAL_KEY_SW_8_ICTLBIT BV(4)//修改#define HAL_KEY_SW_8_PXIFG P0IFG /* Interrupt flag at source */图4:------------------------------------------------------------------------------------------------------------- 注意:将void HalKeyPoll (void)中的// if ((HAL_KEY_JOY_MOVE_PORT & HAL_KEY_JOY_MOVE_BIT)) /* Key is active HIGH */ // {// keys = halGetJoyKeyInput();// }/* If interrupts are not enabled, previous key status and current key status* are compared to find out if a key has changed status.*/// if (!Hal_KeyIntEnable)// {// if (keys == halKeySavedKeys)// {/* Exit - since no keys have changed *///return;// }/* Store the current keys for comparation next time */// halKeySavedKeys = keys;// }// else// {/* Key interrupt handled here */// }图5:全部注释掉,因为它会对我们设定的按键产生干扰,具体情况我也不知道... 然后再在内模仿:if (HAL_PUSH_BUTTON1()){keys |= HAL_KEY_SW_6;}篇二:ZigBee系统事件ZIGBEE事件ZIGBEE事件有两类,系统定义事件和用户定义事件。
Zigbee协议栈消息事件处理分析
Zigbee协议栈消息事件处理分析
陈亚琳
【期刊名称】《南京工业职业技术学院学报》
【年(卷),期】2014(000)004
【摘要】Zigbee2007协议是目前服务于Zigbee领域较先进的通信技术,在该协议中任务的设置、任务消息传递和执行是系统的关键技术问题。
阐述了在无线节点组网系统中,利用Zigbee2007协议栈编程实现对网络任务事件的设置、响应和执行,并给出具体编程的方法;对在实际运用中遇到的任务事件冲突问题提出合理建议。
可在开发工程项目中碰到相应问题时提供一些帮助。
【总页数】5页(P44-48)
【作者】陈亚琳
【作者单位】南京工业职业技术学院能源与电气工程学院,江苏南京 210023【正文语种】中文
【中图分类】TN915.04
【相关文献】
1.2.4GHz ZigBee无线网络处理器(内置ZigBee协议栈) [J],
2.基于ZigBee协议栈的船舶机舱监测系统的设计 [J], 毛攀峰
3.面向协议栈的ZigBee实验系统设计 [J], 惠鹏飞;袁琪;邹立颖;巩永顺
4.具有嵌入式ZigBee PRO协议栈的最新ZigBee网络处理器 [J],
5.TI具有嵌入式ZigBee PRO协议栈的最新ZigBee网络处理器 [J],
因版权原因,仅展示原文概要,查看原文内容请购买。
Zigbee协议栈系统事件
Zigbee协议栈系统事件系统常用事件处理函数:-按键事件-接收消息事件-网络状态改变事件-绑定确认事件-匹配响应事件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 )来处理绑定确认事件。
Zigbee协议栈工作流程
Zigbee 协议栈工作流程
1、消息处理流程
首先,简介一下消息处理机制,一般都利用回调函数实现的,当某一个事件发生,比如 按键,它就会调用 按键的回调函数(或者叫响应函数),通过回调函数生成一个任务,并通 过任务发送 osal_msg_send 函数,发送消息处理循环,并注册事件,等待处理。应用层的事 件处理函数检测到事件后,调用相应的处理函数。
每次任务处理,都有一个时隙,如果处理不完,则保留该任务,到下一个周期再进行处 理。您可以通过设置断点来观察程序的运行情况,单步跟踪是没有用的,因为,整个协议栈 是消息处理机制,采用定时器控制的,单步运行无法控制定时器。下面以按键处理说明消息 处理机制,其它都是一样的,另外,不要深究无线数据是如何接收和发送的,协议栈有好多 分层,底层是 802.15.4,深究下去没必要,你只管 API 函数就行了。
osal_start_timerEx( Hal_TaskID, HAL_KEY_EVENT, 100); } #endif // HAL_KEY
return events ^ HAL_KEY_EVENT; } …………………
} HalKeyPoll();这函数使用查询功能实现检测按键,并获得了键值,然后调用按键的回调函数 OnBoard_KeyCallback,将按键事件发送出去,送到应用层去处理。
6
希望微控工作室
附:zigbee 试验内容
7
希望微控工作室
8Leabharlann 2希望微控工作室
这个函数里,找到 osal_msg_send( registeredKeysTaskID, (uint8 *)msgPtr ); 这个函数将按键发送到消息处理循环。 再看这个函数里的 //消息队列管理 osal_msg_enqueue( &osal_qHead, msg_ptr ); //设置按键事件 osal_set_event( destination_task, SYS_EVENT_MSG ); 在设置按键这个函数里,我们看到: tasksEvents[task_id] |= event_flag;
- 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。