06-第6章-Zstack协议栈优质PPT.ppt
- 文档编号:1055262
- 上传时间:2023-04-30
- 格式:PPT
- 页数:171
- 大小:4.33MB
06-第6章-Zstack协议栈优质PPT.ppt
《06-第6章-Zstack协议栈优质PPT.ppt》由会员分享,可在线阅读,更多相关《06-第6章-Zstack协议栈优质PPT.ppt(171页珍藏版)》请在冰点文库上搜索。
应用支持子层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&
Services:
安全服务层目录,安全层和服务层处理函数,比如加密。
Tools:
工程配置目录,包括空间划分及ZStack相关配置信息。
-13-,6.2.2Zstack协议栈,ZDO:
ZDO设备对象目录。
ZMac:
MAC层目录,包括MAC层参数及MAC层的LIB库函数回调处理函数。
Zmain:
主函数目录,包括入口函数及硬件配置文件。
Output:
输出文件目录,由IAR自动生成。
-14-,6.2.3Zigbee协议栈与Zstack对比,Zstack协议栈是一个半开源的协议栈,其中MAC层和ZMAC层的源码没有全部开源,关于他们的具体内容,在实际的工程开发中也不需要详细了解。
-15-,6.3HAL层分析,Zigbee的HAL层提供了开发板所有硬件设备(例如LED、LCD、KEY、UART等)的驱动函数及接口。
HAL文件夹为硬件平台的抽象层,包含common、include和target三个文件夹,-16-,6.3.1Common文件夹,Common目录下包含有hal_assert.c和hal_dirvers.c两个文件。
其中hal_assert.c是声明文件,用于调试。
hal_dirvers.c是驱动文件,一般不需要修改,了解即可,一些底层驱动文件,需要用户掌握的,-17-,6.3.1Common文件夹,hal_assert.c,halAssertHandler()halAssertHazardLights(),-18-,6.3.1Common文件夹,halAssertHandler(),这个函数为硬件系统检测函数,如果定义了ASSERT_RESET宏定义,系统将调用HAL_SYSTEM_RESET复位,否则将调用halAaaertHazardLights()执行闪烁LED命令,voidhalAssertHandler(void)/如果定义了ASSERT_RESET宏定义#ifdefASSERT_RESET/系统复位HAL_SYSTEM_RESET();
#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。
参数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位网络地址:
是设备加入网络后,由网络中的协调器分配给设备的地址(也称“短地址”),它在网络中是唯一的,用来在网络中鉴别设备和发送数据。
对于协调器,网络地址固定为0x0000。
-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协议栈中,开发者申请了两种自定义模板。
在Zstack协议栈中,各种模板的ID标识符的定义如下,自定义模板的ID标识符被定义为“GENERIC_STAR”和“GENERIC_TREE”,且模板ID标识符被分别定义为3和4。
从模板ID标识符的定义来看,这两个自定义模板分别是为星型网络和树型网络专门定义的。
-44-,6.4.2协议栈模板,另外,开发者为了开发具有特殊性的产品,可以向Zigbee联盟申请自定义的模板,在Zstack协议栈中,开发者申请了两种自定义模板。
-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
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 06 Zstack 协议
![提示](https://static.bingdoc.com/images/bang_tan.gif)