Zstack协议栈PPT学习课件_第1页
Zstack协议栈PPT学习课件_第2页
Zstack协议栈PPT学习课件_第3页
Zstack协议栈PPT学习课件_第4页
Zstack协议栈PPT学习课件_第5页
已阅读5页,还剩166页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

-1-,第6章,Zstack协议栈,-2-,本章目标,理解Zstack软件架构掌握操作系统的运行机制掌握Zstack各层作用,-3-,本章目标,理解Zstack软件架构掌握操作系统的运行机制掌握Zstack各层作用,-4-,Zstack协议栈是德州仪器(英文简称TI)公司为Zigbee提供的一个解决方案,结合CC2530F256芯片可以实现Zigbee完整的解决方案。本章将对Zstack协议栈进行分层剖析,以了解其运作原理,这是进行Zstack应用开发的基础,6.1概述,-5-,Zstack文件结构,6.1概述,双击此文件安装协议栈相关文件,安装完成后生成此文件,协议栈各目录文件,说明文档,工程文档,工具文件,-6-,Zstack协议栈符合Zigbee协议结构,由物理层、MAC层、网络层和应用层组成。物理层和MAC层由IEEE802.15.4定义,网络层和应用层由Zigbee联盟来定义。Zigbee联盟将应用层又详细划分为应用支持子层、应用设备框架以及Zigbee设备对象等。,6.2Zstack软件架构,-7-,Zigbee协议栈结构可参考本书的第2章讲解,包括物理层、MAC层、NWK(网络层)、APL(应用层)、应用支持子层APS、应用程序框架AF、设备对象ZDO层,6.2.1Zigbee协议栈,-8-,Zigbee协议栈结构可参考本书的第2章讲解,包括物理层、MAC层、NWK(网络层)、APL(应用层)、应用支持子层APS、应用程序框架AF、设备对象ZDO层,6.2.1Zigbee协议栈,物理层内容:物理层定义了物理无线信道和MAC子层之间的接口,提供物理层数据服务单元(PD-SAP)和物理层管理服务(MLME-SAP)。MAC(介质接入控制子层):MAC层负责处理所有物理无线信道的访问,并产生网络信号、同步信号;支持PAN连接和分离,提供两个对等的MAC实体之间可靠链路。NWK(网络层):网络层是Zigbee协议栈的核心部分,网络层主要实现节点加入或者离开网络、接收或抛弃其它节点、路由查找及维护等功能。,-9-,Zigbee协议栈结构可参考本书的第2章讲解,包括物理层、MAC层、NWK(网络层)、APL(应用层)、应用支持子层APS、应用程序框架AF、设备对象ZDO层,6.2.1Zigbee协议栈,APL(应用层):Zigbee应用层包括应用支持子层APS、应用程序框架AF、Zigbee设备对象ZDO等。应用支持子层APS:APS层在NWK层和APL层之间,提供APSDE-SAP和APSME-SAP两个接口,两个接口的主要功能如下:APSDE-SAP提供在同一个网络中的两个或者更多的应用实体之间(即端点)的数据通信。APSME-SAP提供多种服务给应用对象ZDO,这些服务包括安全服务和绑定设备服务,并维护管理对象的数据库(即AIB)。,-10-,Zigbee协议栈结构可参考本书的第2章讲解,包括物理层、MAC层、NWK(网络层)、APL(应用层)、应用支持子层APS、应用程序框架AF、设备对象ZDO层,6.2.1Zigbee协议栈,应用程序框架AF:运行在Zigbee协议栈上的应用程序实际是厂商自定义的应用对象,并且遵循规范(Profile)运行在端点1240上。设备对象层ZDO:远程设备通过ZDO请求描述信息,接收到这些请求时,ZDO会调用配置对象获取相应的描述符值。ZDO通过APSME-SAP接口提供绑定服务。,-11-,Zstack协议栈可以从TI的官方网站下载(截止本书出版时,Zstack协议栈的最新版本为Zstack-CC2530-2.5.1a),其下载网址为,下载完成后,双击可执行程序即可安装。使用IAR8.10版本打开Zstack-CC2530-2.5.1a中的SampleApp工程,其协议栈代码文件夹,6.2.2Zstack协议栈,-12-,6.2.2Zstack协议栈,APP:为应用层目录,用户可以根据需求添加自己的任务。这个目录中包含了应用层和这个项目的主要内容,在协议栈里面一般是以操作任务实现的。HAL:硬件驱动层,包括硬件相关的配置、驱动以及操作函数。OSAL:协议栈的操作系统。Profile:AF层目录,包含AF层处理函数。Security#else!definedASSERT_WHILE/当检测到错误时,LED灯闪烁命令函数halAssertHazardLights();#elsewhile(1);#endif,-19-,6.3.1Common文件夹,halAssertHazardLights(),此函数控制LED灯闪烁,但是根据不同的硬件平台定义的LED的个数不同来决定闪烁不同的LED。例如CC2430和CC2530所使用的硬件平台不同决定闪烁的LED不同,/如果硬件平台定义的LED的个数为1#if(HAL_NUM_LEDS=1)/LED1闪烁HAL_TOGGLE_LED1();/如果硬件平台定义的LED的个数为2#if(HAL_NUM_LEDS=2)/LED2闪烁HAL_TOGGLE_LED2();/如果硬件平台定义的LED的个数为3#if(HAL_NUM_LEDS=3)/LED3闪烁HAL_TOGGLE_LED3();/如果硬件平台定义的LED的个数为4#if(HAL_NUM_LEDS=4)/LED4闪烁HAL_TOGGLE_LED4();#endif#endif#endif#endif,-20-,6.3.1Common文件夹,hal_drivers.c:hal_drivers.c文件中包含了与硬件相关初始化和事件处理函数。此文件中有4个比较重要的函数:,硬件初始化函数Hal_Init()硬件驱动初始化函数HalDriverInit()硬件事件处理函数Hal_ProcessEvent()询检函数Hal_ProcessPoll(),-21-,6.3.1Common文件夹,硬件初始化函数Hal_Init(),Hal_Init()函数是硬件初始化函数。其功能是通过“注册任务ID号”以实现在OSAL层注册,从而允许硬件驱动的消息和事件由OSAL处理。,voidHal_Init(uint8task_id)/注册任务IDHal_TaskID=task_id;,Zstack协议栈操作系统任务ID,在后续章节中详细讲解,-22-,6.3.1Common文件夹,硬件驱动初始化函数HalDriverInit(),HalDriverInit()函数被main()函数调用,用于初始化与硬件设备有关的驱动,voidHalDriverInit(void)/如果定义了定时器则初始化定时器#if(definedHAL_TIMER)#endif,-23-,6.3.1Common文件夹,硬件驱动初始化函数HalDriverInit(),HalDriverInit()函数被main()函数调用,用于初始化与硬件设备有关的驱动,/如果定义了LCD,初始化LCD#if(definedHAL_LCD)#endif,-24-,6.3.1Common文件夹,硬件事件处理函数Hal_ProcessEvent(),Hal_ProcessEvent()函数在APP层中的任务事件处理中调用,用于对相应的硬件事件作出处理,具体包括系统消息事件、LED闪烁事件、按键处理事件和睡眠模式等。,uint16Hal_ProcessEvent(uint8task_id,uint16events)uint8*msgPtr;(void)task_id;/系统消息事件if(events,协议栈固有的函数,在使用的时候可以直接调用,不需要大幅度的修改,-25-,6.3.1Common文件夹,硬件事件处理函数Hal_ProcessEvent(),Hal_ProcessEvent()函数在APP层中的任务事件处理中调用,用于对相应的硬件事件作出处理,具体包括系统消息事件、LED闪烁事件、按键处理事件和睡眠模式等。,/按键处理事件if(events,-26-,6.3.1Common文件夹,询检函数Hal_ProcessPoll(),Hal_ProcessPoll()函数在main()函数中被osal_start_system()调用,用来对可能产生的硬件事件进行询检。,voidHal_ProcessPoll()/定时器询检#if(definedHAL_TIMER)#endif,协议栈固有的函数,在使用的时候可以直接调用,不需要大幅度的修改,-27-,6.3.1Common文件夹,询检函数Hal_ProcessPoll(),Hal_ProcessPoll()函数在main()函数中被osal_start_system()调用,用来对可能产生的硬件事件进行询检。,/SPI询检#if(definedHAL_SPI)#endif,-28-,6.3.2Include文件夹,Include目录主要包含各个硬件模块的头文件,主要内容是与硬件相关的常量定义以及函数声明,在移植过程中可能需要修改,需要用户掌握,-29-,6.3.2Include文件夹,Include目录主要包含各个硬件模块的头文件,主要内容是与硬件相关的常量定义以及函数声明,-30-,6.3.3Target文件夹,Target目录下包含了某个设备类型下的硬件驱动文件、硬件开发板上的配置文件,MCU信息和数据类型,本书采用的硬件平台为CC2530,因此本节以硬件设备类型CC2530EB(EB是版本号,表示是评估版)为例进行讲解,-31-,6.3.3Target文件夹,在CC2530EB文件夹下包含三个子文件夹,分别是Config、Drivers、Includes,需要用户重点掌握,-32-,6.3.3Target文件夹,Config文件夹,Config文件夹中包含了hal_board_cfg.h,在hal_board_cfg.h中定义了硬件CC2530硬件资源的配置,比如GPIO、DMA、ADC等。在hal_board_cfg.h文件中可以定义开发板的硬件资源,以LED为例来讲解。TI官方的CC2530EB版本定义了两个LED:LED1和LED2,/有关LED1宏定义#defineLED1_BVBV(0)#defineLED1_SBITP1_0#defineLED1_DDRP1DIR#defineLED1_POLARITYACTIVE_HIGH/如果定义了HAL_BOARD_CC2530EB_REV17,则定义LED2和LED3#ifdefined(HAL_BOARD_CC2530EB_REV17)/有关LED2的宏定义#defineLED2_BVBV(1)#defineLED2_SBITP1_1#defineLED2_DDRP1DIR#defineLED2_POLARITYACTIVE_HIGH/有关LED3的宏定义#defineLED3_BVBV(4)#defineLED3_SBITP1_4#defineLED3_DDRP1DIR#defineLED3_POLARITYACTIVE_HIGH#endif,-33-,6.3.3Target文件夹,Config文件夹,LED宏定义完成之后,设置LED的打开和关闭,其代码在hal_board_cfg.h文件中,/*如果定义了HAL_BOARD_CC2530EB_REV17且没有定义HAL_PA_LNA和HAL_PA_LNA_CC2590,则定义LED的状态*/#ifdefined(HAL_BOARD_CC2530EB_REV17)#defineHAL_TOGGLE_LED4()HAL_TOGGLE_LED1(),-34-,6.3.3Target文件夹,Drivers文件夹,在Drivers文件中定义了硬件资源的驱动文件,-35-,6.3.3Target文件夹,Drivers文件夹,以最常用的LED为例,在hal_led.c文件中提供了2个封装好的函数,在应用层可以直接调用他们来控制LED,具体有以下函数:HalLedSet(uint8leds,uint8mode)。HalLedBlink(uint8leds,uint8numBlinks,uint8percent,uint16period)。,-36-,6.3.3Target文件夹,Drivers文件夹,HalLedSet()函数是用来控制LED的亮灭,该函数的原型如下:,HalLedSet(uint8leds,uint8mode);,参数leds,指LED的名称HAL_LED_1。HAL_LED_2。HAL_LED_3。HAL_LED_4。,参数mode,LED状态打开LED:HAL_LED_MODE_ON。关闭LED:HAL_LED_MODE_OFF。改变LED状态:HAL_LED_MODE_TOGGLE,HalLedSet(HAL_LED_1,HAL_LED_MODE_ON);,-37-,6.3.3Target文件夹,Drivers文件夹,HalLedBlink()函数是用来控制LED闪烁的,函数原型如下,HalLedBlink(uint8leds,uint8numBlinks,uint8percent,uint16period),参数leds,指LED的名称HAL_LED_1。HAL_LED_2。HAL_LED_3。HAL_LED_4。,参数numBlinks,闪烁次数。参数percent,LED亮和灭的所用事件占空比,例如亮和灭所用的事件比例为1:1,则占空比为100/2=50。参数period,LED闪烁一个周期所需要的时间,以毫秒为单位。,HalLedBlink(HAL_LED_1,4,50,500);,LED1在500ms的时间内闪烁4次,其亮灭时间间隔是一样的,-38-,6.4NWK层,Zstack的NWK层负责的功能有:节点地址类型的分配、协议栈模板、网络拓扑结构、网络地址的分配的选择等。,-39-,6.4.1节点地址类型的选择,Zstack中地址类型有两种:64位IEEE地址和16位网络地址(Zstack中也称短地址或网络短地址)。,64位IEEE地址:即MAC地址(也称“长地址”或“扩展地址”),是一个全球唯一的地址,一经分配将跟随设备一生。通常由制造商在设备出厂或被安装时设置。这些地址由IEEE组织来维护和分配。16位网络地址:是设备加入网络后,由网络中的协调器分配给设备的地址(也称“短地址”),它在网络中是唯一的,用来在网络中鉴别设备和发送数据。对于协调器,网络地址固定为0 x0000。,-40-,6.4.1节点地址类型的选择,在Zstack协议栈声明了读取IEEE地址和网络地址的函数,函数的声明可以在NLMEDE.h文件中看到,但是具体的实现函数是非开源的,在使用的时候直接调用即可。,/读取父节点的网络地址uint16NLME_GetCoordShortAddr(void);/读取父节点的物理地址voidNLME_GetCoordExtAddr(byte*);/读取节点本身的网络地址uint16NLME_GetShortAddr(void);/读取自己的物理地址byte*NLME_GetExtAddr(void);,uint16shortaddrShortaddr=MLME_GetShortAddr();,-41-,6.4.2协议栈模板,Zstack协议栈模板由Zigbee联盟定义,在同一个网络中的设备必须符合同一个协议栈模板。Zstack协议栈使用了Zigbee联盟定义的三种模板:,Zigbee协议栈模板ZigbeePRO协议栈模板特定网络模板。,-42-,6.4.2协议栈模板,另外,开发者为了开发具有特殊性的产品,可以向Zigbee联盟申请自定义的模板,在Zstack协议栈中,开发者申请了两种自定义模板。协议栈模板由一个ID标识符区分,此ID标识符可以通过查询设备发送的信标帧获得。在设备加入网络之前,首先需要确认协议栈模板ID标识符。在Zstack协议栈中,各种模板的ID标识符的定义如下,“特定网络”模板的ID标识符被定义为“NETWORK_SPECIFIC”,且模板ID标识符为0。“Zigbee协议栈”模板的ID标识符被定义为“HOME_SPECIFIC”,且模板ID标识符为1。其中“Zigbee协议栈”模板常用在智能家居的控制。“ZigbeePRO协议栈”模板的ID标识符被定义为“ZIGBEEPRO_SPECIFIC”,且模板ID标识符为2。,-43-,6.4.2协议栈模板,另外,开发者为了开发具有特殊性的产品,可以向Zigbee联盟申请自定义的模板,在Zstack协议栈中,开发者申请了两种自定义模板。协议栈模板由一个ID标识符区分,此ID标识符可以通过查询设备发送的信标帧获得。在设备加入网络之前,首先需要确认协议栈模板ID标识符。在Zstack协议栈中,各种模板的ID标识符的定义如下,自定义模板的ID标识符被定义为“GENERIC_STAR”和“GENERIC_TREE”,且模板ID标识符被分别定义为3和4。从模板ID标识符的定义来看,这两个自定义模板分别是为星型网络和树型网络专门定义的。,-44-,6.4.2协议栈模板,另外,开发者为了开发具有特殊性的产品,可以向Zigbee联盟申请自定义的模板,在Zstack协议栈中,开发者申请了两种自定义模板。协议栈模板由一个ID标识符区分,此ID标识符可以通过查询设备发送的信标帧获得。在设备加入网络之前,首先需要确认协议栈模板ID标识符。在Zstack协议栈中,各种模板的ID标识符的定义如下,自定义模板的ID标识符被定义为“GENERIC_STAR”和“GENERIC_TREE”,且模板ID标识符被分别定义为3和4。从模板ID标识符的定义来看,这两个自定义模板分别是为星型网络和树型网络专门定义的。,-45-,6.4.2协议栈模板,其三种模板的配置在nwk_globals.h文件中,/“特定网络”模板ID#defineNETWORK_SPECIFIC0/Zigbee协议模板ID#defineHOME_CONTROLS1/ZigbeePRO模板ID#defineZIGBEEPRO_PROFILE2/自定义模板ID#defineGENERIC_STAR3/自定义模板ID#defineGENERIC_TREE4/如果定义了ZIGBEEPRO,那么协议栈为ZIGBEEPRO模板#ifdefined(ZIGBEEPRO)#defineSTACK_PROFILE_IDZIGBEEPRO_PROFILE#else/如果没有定义ZIGBEEPRO,那么协议栈为ZIGBEE模板#defineSTACK_PROFILE_IDHOME_CONTROLS#endif,ZStack-CC2530-2.5.1a,ZStack-CC2530-2.2.0-1.3.0,-46-,6.4.3网络参数配置,网络类型参数和网络深度的设置,在Zstack协议栈中星型网络、树型网络和网状型网络三种网络类型的定义在nwk_globals.h文件中,/*定义网络类型*/星型网#defineNWK_MODE_STAR0/树型网#defineNWK_MODE_TREE1/网状网#defineNWK_MODE_MESH2,-47-,6.4.3网络参数配置,网络类型参数和网络深度的设置,在Zstack协议栈中定义的三种网络拓扑结构分别在不同的模板下定义。且每一种模板下都定义了该网络的网络深度。具体定义在nwk_globals.h文件中,/如果协议栈模板为ZigbeePRO模板#if(STACK_PROFILE_ID=ZIGBEEPRO_PROFILE)/网络的最大深度为20#defineMAX_NODE_DEPTH20/定义网络类型为网状网络#defineNWK_MODENWK_MODE_MESH#defineSECURITY_MODESECURITY_COMMERCIAL#if(SECURE!=0)#defineUSE_NWK_SECURITY1/trueorfalse#defineSECURITY_LEVEL5#else#defineUSE_NWK_SECURITY0/trueorfalse#defineSECURITY_LEVEL0#endif,-48-,6.4.3网络参数配置,网络类型参数和网络深度的设置,在Zstack协议栈中定义的三种网络拓扑结构分别在不同的模板下定义。且每一种模板下都定义了该网络的网络深度。具体定义在nwk_globals.h文件中,/如果协议栈模板定义为Zigbee协议栈模板#elif(STACK_PROFILE_ID=HOME_CONTROLS)/网络的最大深度为5#defineMAX_NODE_DEPTH5/定义网络类型为网络网络#defineNWK_MODENWK_MODE_MESH#defineSECURITY_MODESECURITY_COMMERCIAL#if(SECURE!=0)#defineUSE_NWK_SECURITY1/trueorfalse#defineSECURITY_LEVEL5#else#defineUSE_NWK_SECURITY0/trueorfalse#defineSECURITY_LEVEL0#endif,-49-,6.4.3网络参数配置,网络类型参数和网络深度的设置,在Zstack协议栈中定义的三种网络拓扑结构分别在不同的模板下定义。且每一种模板下都定义了该网络的网络深度。具体定义在nwk_globals.h文件中,/如果模板为星型网络的自定义模板#elif(STACK_PROFILE_ID=GENERIC_STAR)/网络的最大深度为5#defineMAX_NODE_DEPTH5/定义网络类型为星型网络#defineNWK_MODENWK_MODE_STAR#defineSECURITY_MODESECURITY_RESIDENTIAL#if(SECURE!=0)#defineUSE_NWK_SECURITY1/trueorfalse#defineSECURITY_LEVEL5#else#defineUSE_NWK_SECURITY0/trueorfalse#defineSECURITY_LEVEL0#endif,-50-,6.4.3网络参数配置,网络类型参数和网络深度的设置,在Zstack协议栈中定义的三种网络拓扑结构分别在不同的模板下定义。且每一种模板下都定义了该网络的网络深度。具体定义在nwk_globals.h文件中,/如果网络模板为特定网络模板#elif(STACK_PROFILE_ID=NETWORK_SPECIFIC)/网络的最大深度为5#defineMAX_NODE_DEPTH5/定义网络类型为网状型网络#defineNWK_MODENWK_MODE_MESH#defineSECURITY_MODESECURITY_RESIDENTIAL#if(SECURE!=0)#defineUSE_NWK_SECURITY1/trueorfalse#defineSECURITY_LEVEL5#else#defineUSE_NWK_SECURITY0/trueorfalse#defineSECURITY_LEVEL0#endif#endif,-51-,6.4.3网络参数配置,每一级可以容纳的节点个数的配置,在Zstack协议栈中,每一级路由可以容纳的节点的个数的配置分为两种情况,一个路由器或者一个协调器可以连接的子节点的最大个数。一个路由器或者一个协调器可以连接的具有路由功能的节点的最大个数。,-52-,6.4.3网络参数配置,每一级可以容纳的节点个数的配置,如果前者用C来表示,后者用R来表示,那么R为C的一个子集。另外这两个参数的设置与协议栈模板有关系,具体配置在nwk_globals.c文件中,其代码如下:,/如果协议规范为ZigbeePRO模板#if(STACK_PROFILE_ID=ZIGBEEPRO_PROFILE)/定义MAX_ROUTERS为默认值byteCskipRtrs1=0;/定义MAX_ROUTERS为默认值byteCskipChldrn1=0;/如果协议规范为Zigbee模板#elif(STACK_PROFILE_ID=HOME_CONTROLS)/定义协调器和每级路由器下携带的路由器节点个数为6byteCskipRtrsMAX_NODE_DEPTH+1=6,6,6,6,6,0;/定义协调器和每级路由器可以携带的节点个数为20个byteCskipChldrnMAX_NODE_DEPTH+1=20,20,20,20,20,0;/如果协议模板为自定义GENERIC_STAR模板#elif(STACK_PROFILE_ID=GENERIC_STAR)/定义协调器和每级路由器下携带的路由器节点个数为5byteCskipRtrsMAX_NODE_DEPTH+1=5,5,5,5,5,0;/定义协调器和每级路由器下携带的节点个数为56byteCskipChldrnMAX_NODE_DEPTH+1=5,5,5,5,5,0;/如果协议规范为自定义GENERIC_STAR规范#elif(STACK_PROFILE_ID=NETWORK_SPECIFIC)/定义协调器和每级路由器下携带的路由器节点个数为5byteCskipRtrsMAX_NODE_DEPTH+1=5,5,5,5,5,0;/定义协调器和每级路由器下携带的路由器节点个数为5byteCskipChldrnMAX_NODE_DEPTH+1=5,5,5,5,5,0;,-53-,6.4.3网络参数配置,每一级可以容纳的节点个数的配置,在ZigbeePRO协议栈模板中定义的CskipChldrn和CskipRtrs数组为默认值,即定义代码如下,/如果协议规范为ZigbeePRO模板#if(STACK_PROFILE_ID=ZIGBEEPRO_PROFILE)/定义MAX_ROUTERS为默认值byteCskipRtrs1=0;/定义MAX_ROUTERS为默认值byteCskipChldrn1=0;,-54-,6.4.3网络参数配置,树型网络中网络地址分配的算法,在Zigbee的树型网络中,网络地址分配算法需要三个参数:,网络的最大深度,在Zstack协议中被定义为MAX_NODE_DEPTH。在此算法中用L表示。路由器或协调器可以连接的子节点的最大个数,在Zstack协议栈中被定义为CskipChldrn数组中元素的值。在此算法中用C表示。路由器或协调器可以连接的具有路由功能的子节点的最大个数,在Zstack协议栈中被定义为CskipRtrs数组中的元素的值。在此算法中用R表示。,-55-,6.4.3网络参数配置,树型网络中网络地址分配的算法,以上3个参数设置完成后,如果需要计算深度为d的网络地址偏移量Cskip(d),则有如下计算公式:,若L=6,C=20,R=6,那么计算深度d=1的网络地址偏移量Cskip(1)为5181(十六进制为143D),协调器网络地址为0 x0000,那么协调器下第一个路由器的网络地址为0 x0001,第二个路由器的网络地址为0 x0001+0 x143D=0 x143E。,-56-,6.5Tool配置及分析,Tools文件为工程设置文件目录,比如信道、PANID、设备类型的设置,-57-,6.5Tool配置及分析,f8wConfig.cfg文件,f8wConfig.cfg文件为Zstack协议栈的配置文件,在此文件中设置Zigbee使用的信道和Zigbee网络PANID,/信道设置/0:868MHz0 x00000001/1-10:915MHz0 x000007FE/11-26:2.4GHz0 x07FFF800/-DMAX_CHANNELS_868MHZ0 x00000001/-DMAX_CHANNELS_915MHZ0 x000007FE/-DMAX_CHANNELS_24GHZ0 x07FFF800/以下为信道11-26的设置/-DDEFAULT_CHANLIST=0 x04000000/26-0 x1A-DDEFAULT_CHANLIST=0 x02000000/25-0 x19/-DDEFAULT_CHANLIST=0 x01000000/24-0 x18/-DDEFAULT_CHANLIST=0 x00800000/23-0 x17/-DDEFAULT_CHANLIST=0 x00400000/22-0 x16/-DDEFAULT_CHANLIST=0 x00200000/21-0 x15/-DDEFAULT_CHANLIST=0 x00100000/20-0 x14/-DDEFAULT_CHANLIST=0 x00080000/19-0 x13/-DDEFAULT_CHANLIST=0 x00040000/18-0 x12/-DDEFAULT_CHANLIST=0 x00020000/17-0 x11/-DDEFAULT_CHANLIST=0 x00010000/16-0 x10/-DDEFAULT_CHANLIST=0 x00008000/15-0 x0F/-DDEFAULT_CHANLIST=0 x00004000/14-0 x0E/-DDEFAULT_CHANLIST=0 x00002000/13-0 x0D/-DDEFAULT_CHANLIST=0 x00001000/12-0 x0C/-DDEFAULT_CHANLIST=0 x00000800/11-0 x0B/网络PANID的设置-DZDAPP_CONFIG_PAN_ID=0 xFFFF,-58-,6.5Tool配置及分析,f8wConfig.cfg文件,当网络PANID设置为0 xFFFF时,即协调器建立网络时将在0 x00000 xFFFF之间随机选择一个数作为网络的PANID。如果网络的PANID为0 x00000 xFFFF之间指定的一个数,则协调器建立网络时将会以选定的PANID作为网络PANID建立网络。,/网络PANID的设置-DZDAPP_CONFIG_PAN_ID=0 x1234,-59-,6.5Tool配置及分析,f8wCoord.cfg文件,f8wCoord.cfg文件是Zstack协议栈协调器设备类型配置文件。其功能是将程序编译成具有协调器和路由器的双重功能(这是因为协调器需要同时具有网络建立和路由器功能)。,/*协调器设置*/协调器功能-DZDO_COORDINATOR/路由器功能-DRTR_NWK,-60-,6.5Tool配置及分析,f8wRouter.cfg文件,f8wRouter.cfg文件为路由器配置文件。此文件将程序编译成具有路由器功能,/路由器功能-DRTR_NWK,-61-,6.5Tool配置及分析,f8wEndev.cfg文件,此文件为终端节点的配置文件,在此文件中既没有编译协调器功能也没有编译路由器功能,因此,此文件一般不需要配置。,-62-,6.6Profile层分析,Profile对应Zigbee软件架构中的应用程序框架AF层。Profile文件夹下面包含两个文件:AF.c和AF.h。,AF层提供应用支持子层APS到应用层的接口,AF层主要提供两种功能:端点的管理和数据的发送和接收。,-63-,6.6.1端点的管理,在Zigbee协议中每个设备都被看作一个节点,每个节点都有物理地址(长地址)和网络地址(短地址),长地址或短地址用来作为其他节点发送数据的目的地址。另外每一个节点都有241个端点,其中端点0预留,端点1-240被应用层分配,每个端点是可寻址的。端点的主要作用可以总结为以下两个方面:,数据的发送和接收:当一个设备发送数据时,必须指定发送目的节点的长地址或短地址以及端点来进行数据的发送和接收,并且发送方和接收方所使用的端点号必须一致。绑定:如果设备之间需要绑定,那么在Zigbee的网络层必须注册一个或者多个端点来进行数据的发送和接收以及绑定表的建立。,-64-,6.6.1端点的管理,端点的实现由端点描述符来完成,每一个端点描述符由一个结构体来实现,在端点描述符中又包含了一个简单描述符,端点描述符简单描述符端点的注册,-65-,6.6.1端点的管理,端点描述符,节点中每一个端点都需要一个端点描述符,此端点描述符结构体定义在AF.h文件中,typedefstructbyteendPoint;byte*task_id;SimpleDescriptionFormat_t*simpleDesc;afNetworkLatencyReq_tlatencyReq;endPointDesc_t;,端点号140,由用户定义,任务ID的指针,指向消息的传递地址,指向端点简单描述符的指针,必须用noLatencyReqs来填充,-66-,6.6.1端点的管理,简单描述符,每一个端点必有一个Zigbee简单描述符,其他设备通过查询这个端点的简单描述符来获得设备的一些信息,端点的简单描述符结构体在AF.h文件中定义。,typedefstructbyteEndPoint;uint16AppProfId;uint16AppDeviceId;byteAppDevVer:4;byteReserved:4;byteAppNumInClusters;cId_t*pAppInClusterList;byteAppNumOutClusters;cId_t*pAppOutClusterList;SimpleDescriptionFormat_t;,端点号140,由用户定义,支持了端点定义的簇ID其值为00 xFFFF,端点支持的设备ID其值为00 xFFFF,端点上设备执行的设备描述版本,端点支持的输入簇个数,端点支持的输出簇个数,-67-,6.6.1端点的管理,端点描述符,在端点配置成功后需要在AF层注册端点,用到的函数是afRegister(),此函数在AF.c文件中定义。应用层将调用此函数注册一个新的端点到AF层。,afStatus_tafRegister(endPointDesc_t*epDesc)。,参数描述:epDesc指向端点描述符的指针。返回值:afStatus_t如果注册成功则返回ZSuccess,否则返回ZcomDef.h中定义的错误。,endPointDesc_tSampleApp_epDesc;afRegister(,-68-,6.6.2数据的发送和接收,Zstack协议栈数据的发送和接收是通过数据发送和接收API来实现的,数据发送和接收的API在AF层定义,-69-,6.6.2数据的发送和接收,数据的发送,数据的发送只要通过调用数据发送函数即可实现,数据发送函数为AF_DataRequest(),此函数在AF.c文件中定义。数据发送函数原型:,afStatus_tAF_DataRequest(afAddrType_t*dstAddr,endPointDesc_t*srcEP,uint16cID,uint16len,uint8*buf,uint8*transID,uint8options,uint8radius);,-70-,6.6.2数据的发送和接收,数据的发送,发送代码示例,voidMySendtest_SendPeriodicMessage(void)/发送的数据chartheMessageData=LED1;if(AF_DataRequest(/发送目的地址ZLongAddr_textAddr;addr;afAddrMode_taddrMode;byteendPoint;uint16panId;afAddrType_t;,发送的目的地址:16为短地址或64位长地址,地址模式:4种,端点,PANID,-72-,6.6.2数据的发送和接收,发送数据目的地址,其中addrMode被定义为枚举类型afAddrMode_t,afAddrMode_t成员定义了发送信息的四种地址模式,afAddrMode_t在AF.h中定义,typedefenum/间接寻址afAddrNotPresent=AddrNotPresent,/单点寻址,指定短地址afAddr16Bit=Addr16Bit,/单点寻址,指定长地址afAddr64Bit=Addr64Bit,/组寻址afAddrGroup=AddrGroup,/广播寻址afAddrBroadcast=AddrBroadcastafAddrMode_t;,-73-,6.6.2数据的发送和接收,发送数据目的地址,间接寻址:间接寻址多用于绑定。当应用程序不知道数据包的目标地址时,将寻址模式设定为AddrNotPresent。Zstack底层将自动从堆栈的绑定表中查找目标设备的具体网络地址,这称为源绑定。如果在绑定表中找到多个设备,则向每个设备都发送一个数据包的拷贝。,-74-,6.6.2数据的发送和接收,发送数据目的地址,单点寻址:单点寻址是标准的寻址模式,是点对点的通信,它将数据包发送给一个已知网络地址的网络设备,单点寻址由两种设置方式:Addr16Bit和Addr64Bit。,当寻址方式设置为Addr16Bit时,afAddrType_t中的目标地址addr应设置为shortAddr。当寻址方式设置为Addr64Bit时,afAddrType_t中的目标地址addr应设置为extAddr。,afAddrType_tMySendtest_Single_DstAddr;/寻址方式为Addr16BitMySendtest_Single_DstAddr.addrMode=afAddr16Bit;/设置端点号MySendtest_Single_DstAddr.endPoint=MySendtest_ENDPOINT;/目标地址addr为协调器的短地址MySendtest_Single_DstAddr.addr.shortAddr=0 x0000;,-75-,6.6.2数据的发送和接收,发送数据目的地址,组寻址:当应用程序需要将数据包发送给网络上的一组设备时,使用该模式。此时地址模式设置为afAddrGroup,并且地址信息结构体afAddrType_t中的目标地址addr应设置为组ID。在使用这个功能之前,必须在网络中定义组。,afAddrType_tMySendtest_Danbo_DstAddr;/寻址方式为组寻址MySendtest_Danbo_DstAddr.addrMode=afAddrGroup;/设置端点号MySendtest_Danbo_DstAddr.endPoint=MySendtest_ENDPOINT;/设置目标地址addr为组ID号MySendtest_Danbo_DstAddr.addr.shortAddr=MySendtest_FLASH_GROUP;,-76-,6.6.2数据的发送和接收,发送数据目的地址,广播寻址:当应用程序需要将数据包发送给网络中的每一个设备时,使用此模式。此时将地址模式设置为AddrBrodcast,地址信息结构体afAddrType_t中的目标地址addr可以设置为以下广播地址中的一种:,0 xFFFF:如果目的地址为0 xFFFF时,数据包将被传送到网络上的所有设备,包括睡眠中的设备。对于睡眠中的设备,数据包将被保留在其父节点,直到它苏醒后主动到父节点查询,或者直到消息超时丢失此数据包。0 xFFFF是广播模式目标地址的默认值。0 xFFFD:如果目的地址为0 xFFFD时数据包将被传送到网络上所有空闲时打开接收的设备,即除了睡眠中的所有设备。,-77-,6.6.2数据的发送和接收,发送数据目的地址,广播寻址:当应用程序需要将数据包发送给网络中的每一个设备时,使用此模式。此时将地址模式设置为AddrBrodcast,地址信息结构体afAddrType_t中的目标地址addr可以设置为以下广播地址中的一种:,0 xFFFC:如果目的地址为0 xFFFC时,数据包发送给所有的路由器,其中也包括协调器。0 xFFFE:如果目的地址为0 xFFFE时,应用层将不指定目标设备,而是通过协议栈读取绑定表获得相应额度目标设备的短地址。,-78-,6.6.2数据的发送和接收,发送数据目的地址,广播寻址地址分配方法,afAddrType_tMySendtest_Periodic_DstAddr;/设置广播地址模式MySendtest_Periodic_DstAddr.addrMode=afAddrBroadcast;/设置端点MySendtest_Periodic_DstAddr.endPoint=MySendtest_ENDPOINT;/设置广播地址目的地址短地址,默认值MySendtest_Periodic_DstAddr.addr.shortAddr=0 xFFFF;,-79-,6.6.2数据的发送和接收,数据的接收,数据包被发送到一个登记注册过的端点,在应用层通过OSAL事件处理函数中的接收信息事件AF_INCOMING_MSG_CMD来处理数据的接收。其中数据的接收是通过在AF层定义的结构体afIncomingMSGPacket_t来进行,此结构体定义在AF.h文件中。,typedefstructosal_event_hdr_thdr;uint16groupId;uint16clusterId;afAddrType_tsrcAddr;uint16macDestAddr;uint8endPoint;uint8wasBroadcast;uint8LinkQuality;uint8correlation;int8rssi;uint8SecurityUse;uint32timestamp;afMSGCommandFormat_tcmd;afIncomingMSGPacket_t;,OSAL消息队列,消息的组ID,如果组ID号为0,即没有设置组寻址,消息的簇ID,源地址信息,目的地址的短地址,端点,接收的数据,-80-,6.6.2数据的发送和接收,数据的接收,在Zstack中,数据的接收过程是通过判断afIncomingMSGPacket_t结构体中的clusterId来进行判断是否为所需要接收的数据,以下示例为示例6-5的接收部分,首先判断接收的输入簇ID是否为发送函数的输出簇ID,然后再判断是否接收到的数据是否为“LED1”,如果是“LED1”,则执行LED1闪烁命令,具体实现如下,voidSampleApp_Messa

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论