第5章 操作系统ppt课件.pptx

上传人:春哥&#****71; 文档编号:17070048 上传时间:2022-05-21 格式:PPTX 页数:157 大小:935.29KB
返回 下载 相关 举报
第5章 操作系统ppt课件.pptx_第1页
第1页 / 共157页
第5章 操作系统ppt课件.pptx_第2页
第2页 / 共157页
点击查看更多>>
资源描述

《第5章 操作系统ppt课件.pptx》由会员分享,可在线阅读,更多相关《第5章 操作系统ppt课件.pptx(157页珍藏版)》请在taowenge.com淘文阁网|工程机械CAD图纸|机械工程制图|CAD装配图下载|SolidWorks_CaTia_CAD_UG_PROE_设计图分享下载上搜索。

1、5.1 Z-Stack协议栈 协议定义的是一系列的通信标准,通信双方需要共同按照这一标准进行正常的数据收发,ZigBee的协议分两部分,IEEE802.15.4定义了物理层和MAC层技术规范,ZigBee联盟定义了网络层、安全层和应用层技术规范;协议栈是协议的具体实现形式,通俗的理解为用代码实现的函数库,以便于开发人员调用。ZigBee协议栈就是将各个层定义的协议都集合在一起,以函数的形式实现,并给用户提供一些应用层API,供用户调用。5.1 Z-Stack协议栈 虽然协议是统一的,但是协议的具体实现形式是变化的,即不同厂商提供的协议栈是有区别的,例如:函数名称和参数列表可能有区别,用户在选择

2、协议栈以后,需要学习具体的例子,查看厂商提供的Demo演示程序、说明文档来学习各个函数的使用方式,进而快速的使用协议栈进行应用程序的开发工作。2007年4月,美国德州仪器公司推出了业界领先的ZigBee协议栈,即Z-Stack。Z-Stack符合ZigBee 2006规范,支持多种平台,在竞争激烈的ZigBee领域占有很重要的地位。Z-Stack就是符合ZigBee协议栈规范的一个硬件和软件平台,是ZigBee协议栈的一个具体实现。5.1 Z-Stack协议栈随着ZigBee领域竞争的越来越激烈,ZigBee协议栈的地位变得更加重要,也出现了不同的版本,其中最常用的是德州仪器(简称为TI)公司

3、的Z-Stack协议栈。德州仪器公司的Z-Stack协议栈是一款免费的、半开源的协议栈,最新版本是3.0,此协议栈与IAR开发环境配合使用,对于ZigBee的初学者比较容易。但是Z-Stack是个半开源的协议栈,有些核心代码是以库的形式提供,我们无法更深层次的了解它的工作原理。5.1.1 Z-Stack概述5.1 Z-Stack协议栈TI公司的Z-Stack装载在一个基于IAR开发环境的工程中。IAR Embedded Workbench是瑞典IAR Systems公司为微处理器开发的一个集成开发环境。IAR Systems是全球领先的嵌入式系统开发工具和服务的供应商,公司成立于1983年,提

4、供的产品和服务涉及到嵌入式系统的设计、开发和测试的每一个阶段,包括:带有C/C+编译器和调试器的集成开发环境(IDE)、实时操作系统和中间件、开发套件、硬件仿真器以及状态机建模工具。目前最新版本为IAR Embedded Workbenchfor ARM version 8.11。强大的IAR Embedded Workbench除了提供编译下载功能外,还可以结合编程器进行单步跟踪调试和监测片上寄存器、Flash数据等。5.1.1 Z-Stack概述5.1 Z-Stack协议栈除了德州仪器公司的Z-Stack协议栈,还有一些其他的协议栈,虽然有各自的优势,但并没有Z-Stack协议栈那样普及。

5、飞思卡尔的BeeStack协议栈为不开源、收费的协议栈,因此不适合初学者使用。FreakZ协议栈、msstatePAN协议栈(由美国密西西比河州立大学出于教学和科研目的开发,相对容易,但整体排版不规范)和OpenWSN协议栈(由加州伯克利分校开发,提供了一整套基于物联网标准的协议栈,同时支持不同软件和平台)都是开源协议栈。开源协议栈的所有代码都是公开的,让我们更加方便的了解协议栈的工作原理,比较适合初学者使用,但是却没有Z-Stack协议栈那样普及。5.1.1 Z-Stack概述5.1 Z-Stack协议栈Z-Stack就是将各个层定义的协议都集合在一起,以函数的形式实现,并给用户提供一些应用

6、层API,供用户调用。5.1.2 Z-Stack的体系结构5.1 Z-Stack协议栈5.1.2 Z-Stack的体系结构5.1 Z-Stack协议栈可以看出IEEE802.15.4定义了物理层和MAC层,而Zigbee联盟定义了网络层、应用层技术规范,每一层为其上层提供特定的服务:即由数据服务实体提供数据传输服务;管理实体提供所有的其他管理服务。每个服务实体通过相应的服务接入点(SAP)为其上层提供一个接口,每个服务接入点通过服务原语来完成所对应的功能。各层的介绍如下:5.1.2 Z-Stack的体系结构5.1 Z-Stack协议栈1.物理层(PHY)物理层定义了物理无线信道和MAC 子层之

7、间的接口,提供物理层数据服务和物理层管理服务。物理层数据服务从无线物理信道上收发数据。物理管理服务维护一个由物理层相关数据组成的数据库。5.1.2 Z-Stack的体系结构5.1 Z-Stack协议栈2.MAC 层MAC 层负责处理所有的物理无线信道访问,并产生网络信号、同步信号;支持PAN 连接和分离,提供两个对等MAC 实体之间可靠的链路。MAC 层数据服务:保证MAC 协议数据单元在物理层数据服务中正确收发。MAC 层管理服务:维护一个存储MAC 子层协议状态相关信息的数据库。5.1.2 Z-Stack的体系结构5.1 Z-Stack协议栈3.网络层(NWK)ZigBee 协议栈的核心部

8、分在网络层。网络层主要实现节点加入或离开网络、接收或抛弃其他节点、路由查找及传送数据等功能,支持多种拓扑结构和路由算法。5.1.2 Z-Stack的体系结构5.1 Z-Stack协议栈4.应用层(APL)ZigBee应用层建立在网络层之上,包括应用支持子层、应用程序框架和ZigBee 设备对象。应用支持子层的主要功能包括绑定及绑定维护;应用程序框架主要为ZigBee设备对象提供工作环境;ZigBee设备对象主要功能为定义网络的节点角色以及网络服务管理等。5.1.2 Z-Stack的体系结构5.1 Z-Stack协议栈4.应用层(APL)ZigBee应用层建立在网络层之上,包括应用支持子层、应用

9、程序框架和ZigBee 设备对象。应用支持子层的主要功能包括绑定及绑定维护;应用程序框架主要为ZigBee设备对象提供工作环境;ZigBee设备对象主要功能为定义网络的节点角色以及网络服务管理等。5.1.2 Z-Stack的体系结构5.1 Z-Stack协议栈Z-stack协议栈的一些基础术语在应用开发中非常重要,但也很容易引起混淆。一般来说,一个节点对应一个设备,一个无线收发器,且只能使用一个无线通信信道。一个设备最多可以支持240个用户自定义的端点(EndPoint)。端点是用来区分应用程序对象的,这意味着在每个设备上最多可以定义240个应用程序对象。特殊端点号0分配给ZigBee设备对象

10、ZDO,以用于设备管理。一个端点可以具有多个簇(Cluster),每个簇具有特定的簇ID。按照数据流向方向,簇分为输入簇和输出簇。多个节点能够通过使用簇ID(Cluster ID)为不同的端点建立一个逻辑上的连接,这称为绑定操作。簇是属性(Atrribute)的集合,它包括一个或多个属性。相同应用程序对象采用的所有簇的集合称为Profile。5.1.3 Z-Stack的基本术语2.1物理层5.1.3 Z-Stack的基本术语5.1 Z-Stack协议栈其他重要术语:1. 原语:ZigBee设备在工作时,各种不同的任务在不同的层次上执行,通过层的服务,完成所要执行的任务。各项服务通过服务原语来实

11、现。可以把原语看作是API函数,是ZigBee中最基本的操作,一般协议都有对原语进行程序实现。在自己开发系统时,只需要调用,设定参数就好了。如果要自己实现底层的细节那就必须在开源的协议栈中,深入到原语的级别。也就是说,对于原语我们只需要了解就行,真正开发程序只知道我们给系统哪些参数就行了。5.1.3 Z-Stack的基本术语5.1 Z-Stack协议栈其他重要术语:2. 描述符:用来描述设备类型和应用方式,描述符包含节点描述符、电源描述符和默认用户描述符等,通过改变这些描述符可以定义自己的设备。描述符的定义和创建配置项在文件 ZDOConfig.h和ZDOConfig.c中完成,描述符信息可能

12、被网络中的其他设备获取。5.1.3 Z-Stack的基本术语5.1 Z-Stack协议栈其他重要术语:3. PANID:其全称是Personal Area Network ID,可针对一个或多个应用的网络,用于区分不同的ZigBee网络,一般是mesh或者cluster tree拓扑结构。所有节点的PANID唯一。一个网络只有一个PANID,且是由pan协调器生成的。PANID是可选配置项,用来控制 ZigBee路由器和终端节点要加入哪个网络。文件f8wConfg.cfg中的 ZDO_CONFIG_PAN_ID 参数可以设置为00 x3FFF 之间的一个值。协调器使用这个值,作为它要启动的网络

13、的PANID。而对于路由器节点和终端节点来说只要加入一个已经用这个参数配置了PANID的网络即可。5.1.3 Z-Stack的基本术语5.1 Z-Stack协议栈其他重要术语:4. 16位短地址:ZigBee 设备有两种类型的地址。一种是 64 位 IEEE 地址,即 MAC 地址,另一种是 16位网络地址。64 位地址是全球唯一的地址,设备将在它的生命周期中一直拥有它。它通常由制造商设置或者在被安装时设置。这些地址由 IEEE 来维护和分配。16 位网络地址是当设备加入网络后分配的。它在网络中是唯一的,用来在网络中鉴别设备和发送数据。当然在不同的网络中,16位短地址是可能相同的。16位短地址

14、与PANID的关系可以用下面这个例子阐述:PANID相当于是一个班的班级名称,而16位地址则是班级中学生的学号。5.1.3 Z-Stack的基本术语5.1 Z-Stack协议栈其他重要术语:5. 绑定:是一种两个(或者多个)应用设备之间信息流的控制机制。绑定分为间接绑定、直接绑定和直接绑定(通过串口)三种绑定方式。5.1.3 Z-Stack的基本术语5.1 Z-Stack协议栈5.1.3 Z-Stack的基本术语5.1 Z-Stack协议栈5. 绑定:(1)间接绑定:间接绑定方法比较简单,它通过按键来发送绑定信息。(2)直接绑定:直接绑定需要用户自己编写相应的绑定程序,ZigBee协议栈中含有

15、绑定API,这就要求用户通过适当的方法调用来实现绑定功能。(3)直接绑定(通过串口):使用上位机通过串口向协调器发送绑定信息。5.1.3 Z-Stack的基本术语5.1 Z-Stack协议栈其他重要术语:ZigBee 2007协议栈ZStack-CC2530-2.3.0-1.4.0可以在TI的官方网站下载,需要安装以后才能使用,默认安装到C盘根目录下。在C:Texas Instruments Z S t a c k - C C 2 5 3 0 - 2 . 3 . 0 - 1 . 4 . 0 ProjectszstackSamplesSampleAppCC2530DB下可以找到SampleApp

16、.eww工程。5.1.4 Z-Stack的目录结构5.1 Z-Stack协议栈5.1.4 Z-Stack的目录结构5.1 Z-Stack协议栈打开SampleApp.eww工程,可以看到其工程文件布局。可以看到共有14个文件夹目录。5.1.4 Z-Stack的目录结构5.1 Z-Stack协议栈5.1.4 Z-Stack的目录结构5.1 Z-Stack协议栈1. APP:应用层目录,这是用于让用户创建各种不同工程的区域,在这个目录中包含了应用层的内容和这个项目的主要内容,在协议栈里面一般是以操作系统的任务实现的。5.1.4 Z-Stack的目录结构5.1 Z-Stack协议栈2. HAL:硬件

17、层目录,包含有与硬件相关的配置和驱动及操作函数。该层实现了Z-Stack协议栈和具体硬件设备的连接,为协议栈提供多种硬件驱动,包含ADC、DMA、按键、LCD、LED、电源模式、定时器、Uart驱动等。通过HAL对硬件设备的透明化处理,Z-Stack可以良好的运行在不同的节点设备上,并直接使用硬件,而不需要关心具体的实现细节。根据不同的硬件环境,用户需要自行对HAL进行移植和裁剪,以保证Z-Stack协议栈的正常运行,同时使设备硬件可发挥出最大的性能。5.1.4 Z-Stack的目录结构5.1 Z-Stack协议栈3. MAC:MAC 层目录,该目录包含了High Level、Low Leve

18、l和Include三个子目录。Low Level子目录实现了PHY层以及MAC层靠近底层的功能。该模块实现了信道扫描、无线数据收发控制等功能;High Level子目录则实现了MAC层的核心算法。很多MAC层的核心代码没有开源,而是以库的形式提供,这些功能的接口在MAC目录下的Include子目录下的mac_api.h文件中,以外部函数声明的形式给出。5.1.4 Z-Stack的目录结构5.1 Z-Stack协议栈4. MT:监控调试层,主要用于调试目的,即实现通过串口调试各层,与各层进行直接交互。5.1.4 Z-Stack的目录结构5.1 Z-Stack协议栈5. NWK:网络层目录,该目录

19、实现了APL应用层中的应用程序支持子层APS、NWK层,包括Z-Stack的全局参数以及相关参数的处理函数等。在该目录中,APS层的相关代码没有开源,仅对外提供APS层的功能接口供其他模块调用。NWK层代码同样没有开源,但为了用户可以方便的配置网络参数,TI公司开放网络配置参数以及参数处理函数的源代码。5.1.4 Z-Stack的目录结构5.1 Z-Stack协议栈6. OSAL:协议栈的操作系统。OSAL层是与协议栈独立的,但整个协议都要基于OSAL才能运行。OSAL提供如下服务和管理:信息管理、任务同步、时间管理、中断管理、任务管理、内存管理、电源管理以及非易失存储管理。5.1.4 Z-S

20、tack的目录结构5.1 Z-Stack协议栈7. Profile:AF 层目录,包含AF 层处理函数文件。8. Security:安全层目录,安全层处理函数接口文件。在Z-Stack中,该模块只是提供了功能的接口,并没有开放源代码。9. Services:地址处理函数目录,包括着地址模式的定义及地址处理函数。5.1.4 Z-Stack的目录结构5.1 Z-Stack协议栈10. Tools:配置文件目录,用于配置协议栈代码运行时的内存布局、ZigBee网络参数(如信道选择、PANID选择等)和设备功能。11. ZDO:指ZigBee设备对象,可认为是一种公共的功能集,文件用户用自定义的对象调

21、用APS子层的服务和NWK层的服务。12. ZMac:MAC 层目录,包括MAC 层参数配置及MAC 层LIB 库函数回调处理函数。5.1.4 Z-Stack的目录结构5.1 Z-Stack协议栈13. ZMain:主函数目录,包括入口函数main()及硬件配置文件。整个Z-Stack协议栈在这里启动,执行软硬件初始化并启动操作系统。14. Output:输出文件目录,这个由编译器在编译时自动生成的。,存放编译好的二进制文件和内存映射图。5.1.4 Z-Stack的目录结构5.1 Z-Stack协议栈ZigBee协议栈包含了ZigBee协议所规定的基本功能,这些功能是以函数的形式实现的,为了便

22、于管理这些函数集,从ZigBee 2006协议栈开始,ZigBee协议栈内加入了实时操作系统,称为OSAL(Operating System Abstraction Layer,操作系统抽象层)5.1.5 Z-Stack的工作过程5.1 Z-Stack协议栈从ZigBee协议栈中可以可以看出应用程序框架中包含了最多240个应用程序对象,每个应用程序对象运行在不同的端点上,因此,端点的作用是区分不同的应用程序对象。可以把一个应用程序对象看成为一个任务,因此,需要一个机制来实现任务的切换、同步和互斥,这就是OSAL产生的根源。所以,OSAL就是一种支持多任务运行的系统资源分配机制,但是OSAL只是

23、实现了类似操作系统的某些功能。5.1.5 Z-Stack的工作过程5.1 Z-Stack协议栈在ZigBee协议栈中,OSAL负责调度各个任务的运行,如果有事件发生了,则会调用相应的事件处理函数进行处理。采用的做法是,建立一个事件表,保存各个任务的对应的事件,建立另一个寒暑表,保存各个任务事件处理函数的地址,然后将这两张表建立某种对应关系,当某一事件发生时则查找函数表找到对应的事件处理函数即可。从某种意义上来说,OSAL是一种基于事件驱动的轮询式操作系统。事件驱动是指发生事件后采取相应的事件处理方法,轮询指的是不断的查看是否有事件发生。5.1.5 Z-Stack的工作过程5.1 Z-Stack

24、协议栈下面以C:Texas InstrumentsZStack-CC2530-2.3.0-1.4.0ProjectszstackSamplesSampleApp CC2530DB下可以找到SampleApp.eww工程为例,说明OSAL的调度过程。5.1.5 Z-Stack的工作过程5.1 Z-Stack协议栈5.1.5 Z-Stack的工作过程5.1 Z-Stack协议栈1.Z-Stack由main()函数开始执行。int main( void ) osal_int_disable( INTS_ALL ); /关中断 HAL_BOARD_INIT(); /初始化开发板板载设备,例如LED灯

25、zmain_vdd_check(); /电源检查 InitBoard( OB_COLD ); /板载 I/O初始化 HalDriverInit(); /HAL层驱动初始化 osal_nv_init( NULL ); /NV初始化 ZMacInit(); /MAC层初始化 zmain_ext_addr(); /确定64位IEEE地址 zgInit(); /初始化NV向量#ifndef NONWK5.1.5 Z-Stack的工作过程5.1 Z-Stack协议栈 /如果没有定义NONWK编译选项,则进行AF初始化 afInit();#endif osal_init_system(); /初始化OSA

26、L操作系统 osal_int_enable( INTS_ALL ); /开中断 InitBoard( OB_READY ); /开发板初始化完毕 zmain_dev_info(); /显示设备信息 #ifdef LCD_SUPPORTED /如果定义了LCD_SUPPORTED编译选项,则在LCD上显示设备调试信息 zmain_lcd_init();#endif#ifdef WDT_IN_PM15.1.5 Z-Stack的工作过程5.1 Z-Stack协议栈/如果定义了WDT_IN_PM1,则使能看门狗 WatchDogEnable( WDTIMX );#endif osal_start_sy

27、stem(); /OSAL操作系统运行,进入轮转查询式的死循环,不再回到主函数 return 0; / main()5.1.5 Z-Stack的工作过程5.1 Z-Stack协议栈2.在函数osal_init_system()上右击Go to definition of osal_init_system进入函数主体。uint8 osal_init_system( void ) osal_mem_init(); /初始化内存分配系统 osal_qHead = NULL; /初始化消息队列 osalTimerInit(); /初始化定时器 osal_pwrmgr_init(); /初始化电源管理系

28、统 osalInitTasks(); /初始化系统任务 osal_mem_kick(); return ( SUCCESS );5.1.5 Z-Stack的工作过程5.1 Z-Stack协议栈3.在函数osalInitTasks()上右击Go to definition of osalInitTasks进入函数主体。void osalInitTasks( void ) uint8 taskID = 0;/为一个长度为tasksCnt的uint16数组tasksEvents分配了内存空间 tasksEvents = (uint16 *)osal_mem_alloc( sizeof( uint16

29、 ) * tasksCnt);/将数组tasksEvents的值初始化为零 osal_memset( tasksEvents, 0, (sizeof( uint16 ) * tasksCnt); macTaskInit( taskID+ ); /MAC层任务初始化 nwk_init( taskID+ ); /网络层任务初始化 Hal_Init( taskID+ ); /硬件抽象层任务初始化5.1.5 Z-Stack的工作过程5.1 Z-Stack协议栈/如果定义了MT_TASK,MT层任务初始化#if defined( MT_TASK ) MT_TaskInit( taskID+ );#end

30、if APS_Init( taskID+ ); /APS层任务初始化#if defined ( ZIGBEE_FRAGMENTATION ) APSF_Init( taskID+ );#endif ZDApp_Init( taskID+ ); /初始化ZDO应用层任务,用户需考虑#if defined ( ZIGBEE_FREQ_AGILITY ) | defined ( ZIGBEE_PANID_CONFLICT ) ZDNwkMgr_Init( taskID+ ); /初始化网络管理任务#endif SampleApp_Init( taskID ); /自定义任务SampleApp初始化

31、5.1.5 Z-Stack的工作过程5.1 Z-Stack协议栈4.在函数osal_start_system()上右击Go to definition of osal_start_system进入函数主体。void osal_start_system( void )#if !defined ( ZBIT ) & !defined ( UBIT ) for(;) / Forever Loop#endif uint8 idx = 0; osalTimeUpdate();/* 触发事件主要有三种情况:外部中断、定时器和对设备轮询。 外部中断、定时器不需要进行干预,所以系统主循环每次循环时会调用函数H

32、al_ProcessPoll()对串口这样的设备进行轮询,如果这些设备需要处理,则在数组tasksEvents中设置相应的事件。*/ Hal_ProcessPoll(); 5.1.5 Z-Stack的工作过程5.1 Z-Stack协议栈1.Z-Stack由main()函数开始执行。int main( void ) osal_int_disable( INTS_ALL ); /关中断 HAL_BOARD_INIT(); /初始化开发板板载设备,例如LED灯 zmain_vdd_check(); /电源检查 InitBoard( OB_COLD ); /板载 I/O初始化 HalDriverIni

33、t(); /HAL层驱动初始化 osal_nv_init( NULL ); /NV初始化 ZMacInit(); /MAC层初始化 zmain_ext_addr(); /确定64位IEEE地址 zgInit(); /初始化NV向量#ifndef NONWK5.1.5 Z-Stack的工作过程5.1 Z-Stack协议栈/*遍历数组tasksEvents,如果某个元素值不为0,则说明相应层有事件发生,如果不同层同时发生了时间,则值小的层优先处理,调用事件处理函数*/ do if (tasksEventsidx) break; while (+idx tasksCnt); if (idx hdr.

34、event ) /消息的事件 5.1.5 Z-Stack的工作过程5.1 Z-Stack协议栈 case KEY_CHANGE: /按键事件 SampleApp_HandleKeys( (keyChange_t *)MSGpkt)-state, (keyChange_t *)MSGpkt)-keys ); break; case AF_INCOMING_MSG_CMD: /接收消息事件,收到新的数据 SampleApp_MessageMSGCB( MSGpkt ); break; case ZDO_STATE_CHANGE: /设备状态改变事件,例如终端加入网络时 SampleApp_NwkS

35、tate = (devStates_t)(MSGpkt-hdr.status);5.1.5 Z-Stack的工作过程5.1 Z-Stack协议栈 if ( (SampleApp_NwkState = DEV_ZB_COORD) | (SampleApp_NwkState = DEV_ROUTER) | (SampleApp_NwkState = DEV_END_DEVICE) ) / Start sending the periodic message in a regular interval. osal_start_timerEx( SampleApp_TaskID, SAMPLEAPP_

36、SEND_PERIODIC_MSG_EVT, SAMPLEAPP_SEND_PERIODIC_MSG_TIMEOUT ); else / Device is no longer in the network 5.1.5 Z-Stack的工作过程5.1 Z-Stack协议栈 break; default: break; osal_msg_deallocate( (uint8 *)MSGpkt ); /释放内存 / 在列表中检索下一条消息 MSGpkt = (afIncomingMSGPacket_t *)osal_msg_receive( SampleApp_TaskID ); return (

37、events SYS_EVENT_MSG); /返回没有处理的事件 5.1.5 Z-Stack的工作过程5.1 Z-Stack协议栈 /周期信息事件 if ( events & SAMPLEAPP_SEND_PERIODIC_MSG_EVT ) SampleApp_SendPeriodicMessage(); /发送周期信息 osal_start_timerEx( SampleApp_TaskID, SAMPLEAPP_SEND_PERIODIC_MSG_EVT, (SAMPLEAPP_SEND_PERIODIC_MSG_TIMEOUT + (osal_rand() & 0 x00FF) );

38、 return (events SAMPLEAPP_SEND_PERIODIC_MSG_EVT); /返回没有处理的事件 return 0;5.1.5 Z-Stack的工作过程5.1 Z-Stack协议栈7.按键处理事件,如果按键按下将触发相应的事件void SampleApp_HandleKeys( uint8 shift, uint8 keys ) (void)shift; if ( keys & HAL_KEY_SW_1 ) SampleApp_SendFlashMessage( SAMPLEAPP_FLASH_DURATION ); if ( keys & HAL_KEY_SW_2 )

39、 aps_Group_t *grp; grp = aps_FindGroup( SAMPLEAPP_ENDPOINT, SAMPLEAPP_FLASH_GROUP );5.1.5 Z-Stack的工作过程5.1 Z-Stack协议栈 if ( grp ) aps_RemoveGroup( SAMPLEAPP_ENDPOINT, SAMPLEAPP_FLASH_GROUP ); else aps_AddGroup( SAMPLEAPP_ENDPOINT, &SampleApp_Group ); 5.1.5 Z-Stack的工作过程5.1 Z-Stack协议栈8.主要实现数据接收功能,根据簇ID进

40、行不同的处理。数据的接收通过判断簇ID来与发送端发送的数据进行匹配。void SampleApp_MessageMSGCB( afIncomingMSGPacket_t *pkt ) uint16 flashTime; switch ( pkt-clusterId ) case SAMPLEAPP_PERIODIC_CLUSTERID: break; case SAMPLEAPP_FLASH_CLUSTERID: flashTime = BUILD_UINT16(pkt-cmd.Data1, pkt-cmd.Data2 ); HalLedBlink( HAL_LED_4, 4, 50, (fl

41、ashTime / 4) ); break; 5.1.5 Z-Stack的工作过程5.1 Z-Stack协议栈9.实现周期性数据的发送,通过调用AF_DataRequest()函数进行数据的发送。void SampleApp_SendPeriodicMessage( void ) if ( AF_DataRequest( &SampleApp_Periodic_DstAddr, &SampleApp_epDesc, SAMPLEAPP_PERIODIC_CLUSTERID, 1, (uint8*)&SampleAppPeriodicCounter, &SampleApp_TransID, AF

42、_DISCV_ROUTE, AF_DEFAULT_RADIUS ) = afStatus_SUCCESS ) else 5.1.5 Z-Stack的工作过程5.1 Z-Stack协议栈10.调用AF_DataRequest()函数发送LED闪烁时间事件命令。void SampleApp_SendFlashMessage( uint16 flashTime ) uint8 buffer3; buffer0 = (uint8)(SampleAppFlashCounter+); buffer1 = LO_UINT16( flashTime ); buffer2 = HI_UINT16( flashT

43、ime ); if ( AF_DataRequest( &SampleApp_Flash_DstAddr, &SampleApp_epDesc, SAMPLEAPP_FLASH_CLUSTERID, 3, buffer,5.1.5 Z-Stack的工作过程5.1 Z-Stack协议栈 &SampleApp_TransID, AF_DISCV_ROUTE, AF_DEFAULT_RADIUS ) = afStatus_SUCCESS ) else 5.1.5 Z-Stack的工作过程5.1 Z-Stack协议栈11. SampleApp.c文件中的全局变量和本地变量定义。/以下(1)-(3)为文

44、件中的全局变量(1)const cId_t SampleApp_ClusterListSAMPLEAPP_MAX_CLUSTERS = SAMPLEAPP_PERIODIC_CLUSTERID, SAMPLEAPP_FLASH_CLUSTERID;5.1.5 Z-Stack的工作过程5.1 Z-Stack协议栈(2)const SimpleDescriptionFormat_t SampleApp_SimpleDesc = SAMPLEAPP_ENDPOINT, SAMPLEAPP_PROFID, SAMPLEAPP_DEVICEID, SAMPLEAPP_DEVICE_VERSION, SA

45、MPLEAPP_FLAGS, SAMPLEAPP_MAX_CLUSTERS, (cId_t *)SampleApp_ClusterList, SAMPLEAPP_MAX_CLUSTERS, (cId_t *)SampleApp_ClusterList ;5.1.5 Z-Stack的工作过程5.1 Z-Stack协议栈(3)endPointDesc_t SampleApp_epDesc; /定义了一个用户应用端点变量SampleApp_epDesc/本地变量uint8 SampleApp_TaskID; devStates_t SampleApp_NwkState;uint8 SampleApp

46、_TransID; afAddrType_t SampleApp_Periodic_DstAddr;afAddrType_t SampleApp_Flash_DstAddr;aps_Group_t SampleApp_Group;uint8 SampleAppPeriodicCounter = 0;uint8 SampleAppFlashCounter = 0;5.1.5 Z-Stack的工作过程5.1 Z-Stack协议栈12.用户自定义任务的初始化,包括任务ID、网络状态、传输序列号、数据发送地址、端点等信息。void SampleApp_Init( uint8 task_id ) Sam

47、pleApp_TaskID = task_id; / 任务ID SampleApp_NwkState = DEV_INIT; SampleApp_TransID = 0;#if defined ( BUILD_ALL_DEVICES )5.1.5 Z-Stack的工作过程5.1 Z-Stack协议栈12.用户自定义任务的初始化,包括任务ID、网络状态、传输序列号、数据发送地址、端点等信息。void SampleApp_Init( uint8 task_id ) SampleApp_TaskID = task_id; / 任务ID SampleApp_NwkState = DEV_INIT; S

48、ampleApp_TransID = 0;#if defined ( BUILD_ALL_DEVICES ) if ( readCoordinatorJumper() ) zgDeviceLogicalType = ZG_DEVICETYPE_COORDINATOR; else zgDeviceLogicalType = ZG_DEVICETYPE_ROUTER;5.1.5 Z-Stack的工作过程5.1 Z-Stack协议栈#endif #if defined ( HOLD_AUTO_START ) ZDOInitDevice(0);#endif /广播地址、端点初始化、短地址为0 xFFF

49、F SampleApp_Periodic_DstAddr.addrMode = (afAddrMode_t)AddrBroadcast; SampleApp_Periodic_DstAddr.endPoint = SAMPLEAPP_ENDPOINT; SampleApp_Periodic_DstAddr.addr.shortAddr = 0 xFFFF;/组播地址、端点初始化、组号0 x0001 SampleApp_Flash_DstAddr.addrMode = (afAddrMode_t)afAddrGroup; SampleApp_Flash_DstAddr.endPoint = SA

50、MPLEAPP_ENDPOINT; SampleApp_Flash_DstAddr.addr.shortAddr = SAMPLEAPP_FLASH_GROUP;5.1.5 Z-Stack的工作过程5.1 Z-Stack协议栈 /完成了端点初始化化后,在应用层注册 SampleApp_epDesc.endPoint = SAMPLEAPP_ENDPOINT; SampleApp_epDesc.task_id = &SampleApp_TaskID; SampleApp_epDesc.simpleDesc = (SimpleDescriptionFormat_t *)&SampleApp_Sim

展开阅读全文
相关资源
相关搜索

当前位置:首页 > 教育专区 > 大学资料

本站为文档C TO C交易模式,本站只提供存储空间、用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。本站仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知淘文阁网,我们立即给予删除!客服QQ:136780468 微信:18945177775 电话:18904686070

工信部备案号:黑ICP备15003705号© 2020-2023 www.taowenge.com 淘文阁