Z-stack协议栈开发
- 格式:doc
- 大小:132.00 KB
- 文档页数:12
【⽆线通信篇Zstack协议栈】CC2530ZigbeeZstack协议栈组⽹项⽬及详细讲解篇物联⽹⽆线通信技术,ZigBee⽆线传感⽹络CC2530最⼤的特点就是⼀个拥有⽆线收发器(RF)的单⽚机,既能实现单⽚机功能,也能实现⽆线传输Zstack协议栈是ZigBee协议栈⾥的翘楚,是ZigBee组⽹的⾸选协议栈项⽬实现功能:l 总共有三个端点,⼀个协调器和两个终端节点l 终端节点1连接DHT11温湿度传感器,定时上传给协调器l 终端节点2连接LED,可以通过协调器按键控制,定时上报LED开关状态l 协调器连接12864 OLED 屏幕,实时显⽰温湿度和LED状态l 协调器可以通过按键控制终端2的LED开关,控制后将会显⽰控制结果扩展功能(当前未实现,可进⼀步开发实现):l 连接协调器串⼝,将终端节点采集的数据通过串⼝发送,PC写上位机实现数据展⽰l 连接WIFI或者4G模块,WIFI模块如ESP8266,实现数据局域⽹⽆线传输或者上传到OneNET、机智云、阿⾥云、⾃⼰开发云服务器等,实现WEB或⼿机APP显⽰和控制。
⼀、项⽬测试(可想⽽知,⼴州的天⽓有多热,39℃了都)实现功能汇总:l 总共有三个端点,⼀个协调器和两个终端节点l 终端节点1连接DHT11温湿度传感器,定时上传给协调器l 终端节点2连接LED,可以通过协调器按键控制,定时上报LED开关状态l 协调器连接12864 OLED 屏幕,实时显⽰温湿度和LED状态l 协调器可以通过按键控制终端2的LED开关,控制后将会显⽰控制结果(⼀) 环境汇总芯⽚:CC2530F256Zstack协议栈:ZStack-CC2530-2.5.1a编程环境:IAR(⼆) 引脚分配协调器:128*64 OLED 0.96⼨屏幕供电:3.3V通信协议:IIC引脚:SDA P0_6SCL P0_7按键:IO:P0_1下降沿触发中断终端1:DHT11:通信⽅式:单总线协议供电:3.3VIO:P0_6终端2:LEDIO:P1_0说明:⾼电平点亮,低电平熄灭⼆、基础认识(⼀) CC2530单⽚机CC2530最⼤的特点就是⼀个拥有⽆线收发器(RF)的单⽚机,既能实现单⽚机功能,也能实现⽆线传输。
「ZigBee模块」协议栈—Z-Stack协议栈基础和数据传输实验花了好久写的。
..感觉还不错的呢。
如果看,请细看.。
.Mua~Z-Stack协议栈基础和数据传输实验一、实验目的终端节点将数据无线发送到协调器,协调器通过串口将数据发送到PC端,并在屏幕上显示出来。
串口优化把有线串口传输改为无线蓝牙传输.二、实验平台硬件:2个zigbee节点,1个编译器,1根方口转USB数据线,一个蓝牙模块软件:实验基于SampleApp工程进行。
三、实验步骤1.串口初始化代码2.发送部分代码3.接收部分代码四、协议栈基础做实验之前先了解一点关于协议栈的基础知识吧~什么是协议栈?我们知道使用Zigbee一般都要进行组网、传输数据。
可想而知其中的代码数量是非常庞大的,如果我们每次使用zigbee都需要自己写所以代码的话,会非常麻烦。
因此就有了协议栈。
可以说它是一个小型的操作系统,把很多通信、组网之类的代码都封装起来了。
我们要做的只是通过调用函数来实现我们的目的。
来看一下协议栈的工作流程图(图1)。
然后我会对照流程图对协议栈进行简单的分析。
图1我们就从流程图的“开始"开始分析吧~打开工程文件SampleApp,main函数是程序执行的开始,我们要先找到它.Main函数在ZMAin文件夹的ZMain。
c下,打开它,找到main函数。
main();浏览一下main函数可以看到一开始都是各种初始化函数,即对应流程图中的“各种初始化函数”。
初始化中我们需要注意的是“osal_init_system();"初始化操作系统函数。
等一下会对它进行说明。
继续看下去,“osal_start_system();”这是执行操作系统函数,对应流程中的“运行操作系统"。
注意这个函数进去之后是不会再返回的。
总结main函数就是初始化和执行操作系统两个部分。
我们再来分析一下“osal_init_system();”这个函数,它的功能是初始化操作系统。
一、Zigbee协议栈Zstack架构ZigBee的体系结构由称为层的各模块组成。
每一层为其上层提供特定的服务:即由数据服务实体提供数据传输服务;管理实体提供所有的其他管理服务。
每个服务实体通过相应的服务接入点(SAP) 为其上层提供一个接口,每个服务接入点通过服务原语来完成所对应的功能。
Z igBee 协议的体系结构如下图所示:物理层(PHY)物理层定义了物理无线信道和MAC子层之间的接口,提供物理层数据服务和物理层管理服务,物理层内容:1) Zi gBe e 的激活;2)当前信道的能量检测;3)接收链路服务质量信息;4) ZigBee信道接入方式;5) 信道频率选择;6) 数据传输和接收。
介质接入控制子层(MAC)MAC 层负责处理所有的物理无线信道访问,并产生网络信号、同步信号;支持PAN连接和分离,提供两个对等MAC实体之间可靠的链路。
MAC 层功能:1)网络协调器产生信标;2)与信标同步;3)支持PAN (个域网) 链路的建立和断开;4)为设备的安全性提供支持;5)信道接入方式采用免冲突载波检测多址接入(CSMA-CA )机制;6)处理和维护保护时隙( GTS )机制;7)在两个对等的MAC 实体之间提供一个可靠的通信链路。
网络层(NWK)ZigBee 协议栈的核心部分在网络层。
网络层主要实现节点加入或离开网络、接收或抛弃其他节点、路由查找及传送数据等功能。
网络层功能:1) 网络发现;2) 网络形成;3) 允许设备连接;4) 路由器初始化;5) 设备同网络连接;6) 直接将设备同网络连接;7) 断开网络连接;8) 重新复位设备;9) 接收机同步;10) 信息库维护。
应用层(APL)ZigBee 应用层框架包括应用支持层(APS)、ZigBee 设备对象(ZDO) 和制造商所定义的应用对象。
应用支持层的功能包括:维持绑定表、在绑定的设备之间传送消息。
ZigBee 设备对象的功能包括:定义设备在网络中的角色(如ZigBee 协调器和终端设备) ,发起和响应绑定请求,在网络设备之间建立安全机制。
Z-Stack是TI公司针对Zigbee协议推出的一个开源协议栈。
它基于Zigbee协议规范,提供了从物理层到应用层的完整实现,帮助开发者快速构建Zigbee无线应用。
Z-Stack采用模块化设计,方便开发者根据需求进行功能裁剪和扩展。
同时,Z-Stack具有良好的可移植性和可维护性,支持多种平台和开发环境。
Z-Stack主要包括以下几个部分:物理层、MAC层、网络层和应用层。
其中,网络层包括Zigbee协议的核心功能,如拓扑结构、路由机制、安全机制等。
应用层则提供了丰富的API接口,方便开发者进行应用开发。
Z-Stack的发展经历了多个版本,不断优化和完善。
目前,Z-Stack已经成为Zigbee领域广泛应用的协议栈之一,被广泛应用于智能家居、工业自动化、环境监测等领域。
zstack协议栈
首先,我们来看看zstack协议栈的虚拟化管理功能。
zstack协议栈提供了一套
完整的虚拟化管理解决方案,包括虚拟机的创建、启动、停止、迁移等功能。
通过zstack协议栈,用户可以方便地管理大规模的虚拟化环境,提高资源利用率,降低
管理成本。
其次,zstack协议栈还提供了丰富的网络管理功能。
在云计算环境中,网络是
至关重要的一部分,而zstack协议栈通过提供虚拟网络、网络安全、负载均衡等功能,帮助用户轻松构建和管理复杂的网络环境,保障云计算环境的稳定和安全。
此外,zstack协议栈还具备存储管理功能。
在云计算环境中,存储是非常重要
的一部分,而zstack协议栈通过提供虚拟化存储、快照、备份等功能,帮助用户高效管理存储资源,保障数据的安全和可靠性。
总的来说,zstack协议栈是一种功能强大的开源软件,它为用户提供了一套完
整的云计算解决方案,包括虚拟化管理、网络管理、存储管理等功能。
通过使用zstack协议栈,用户可以轻松构建和管理复杂的云计算基础设施,提高资源利用率,降低管理成本,保障云计算环境的稳定和安全。
在未来,随着云计算技术的不断发展,zstack协议栈将继续发挥重要作用,为
用户提供更加优质的云计算解决方案,推动云计算技术的进步和发展。
相信在不久的将来,zstack协议栈将成为云计算领域的重要支撑,为用户带来更加便利和高效
的云计算体验。
zstack协议栈知识点总结1. Z-Stack 协议栈架构Z-Stack 协议栈的架构分为四个层次:应用层、安全层、网络层和 MAC 层。
- 应用层:提供应用程序接口,实现应用层协议的处理和应用功能的实现。
- 安全层:实现对数据的加密和认证,确保通信的安全性。
- 网络层:实现 ZIGBEE 网络节点的加入、路由和寻径功能。
- MAC 层:实现对无线通信介质的访问和管理,包括 CSMA/CA 协议、ACK 确认和重传机制等。
2. Z-Stack 协议栈特点Z-Stack 协议栈具有以下几个特点:- 符合 ZigBee 标准:Z-Stack 协议栈严格遵循 ZigBee 标准,保证了与其他 ZigBee 设备的兼容性。
- 易用性:Z-Stack 提供了丰富的开发工具和示例代码,开发者可以快速上手进行开发。
- 灵活性:Z-Stack 支持不同的硬件平台和操作系统,适用于各种嵌入式系统。
- 安全性:Z-Stack 提供了多种安全机制,包括 AES 加密、认证和密钥管理,保证了通信的安全性。
3. Z-Stack 协议栈功能Z-Stack 协议栈实现了 ZigBee 协议的各种功能,包括网络组建、路由管理、数据传输和安全保障等。
- 网络组建:Z-Stack 支持 ZigBee 网络的组建和维护,包括协调器、路由器和终端设备的加入和退出。
- 路由管理:Z-Stack 负责 ZigBee 网络中的路由选择和寻径功能,保证数据的可靠传输。
- 数据传输:Z-Stack 实现了数据的传输和协议控制,包括数据帧封装、数据确认和重传机制。
- 安全保障:Z-Stack 提供了数据的加密、认证和密钥管理功能,保证通信的安全性。
4. Z-Stack 协议栈应用Z-Stack 协议栈广泛应用于物联网、智能家居、工业控制和传感器网络等领域,实现设备之间的无线通信和数据交换。
- 物联网应用:Z-Stack 协议栈可以用于连接各种传感器、执行器和控制器,构建物联网设备之间的通信网。
TI Z-stack协议栈开发环境和工作流程系统软件设计是在硬件设计的基础上进行的,良好的软件设计是实现系统功能的重要环节,也是提高系统性能的关键所在。
节点设计基于通用性及便于开发的考虑,移植了TI公司的Z-Stack协议栈,其主要特点就是其兼容性,完全支持IEEE 802.15.4/ZigBee的CC2430片上系统解决方案。
Z-Stack还支持丰富的新特性,如无线下载,可通过ZigBee网状网络(Mesh Network)下载节点更新。
图 ZigBee节点开发环境TI的Z-Stack装载在一个基于IAR开发环境的工程里。
强大的IAR Embedded Workbench除了提供编译下载功能外,还可以结合编程器进行单步跟踪调试和监测片上寄存器、Flash数据等。
Z-Stack根据IEEE 802.15.4和ZigBee标准分为以下几层:API(Application Programming Interface),HAL(Hardware Abstract Layer),MAC(Media Access Control),NWK(Zigbee Network Layer),OSAL (Operating System Abstract System),Security,Service,ZDO(Zigbee Device Objects)。
使用IAR打开工程文件SampleApp.eww后,即可查看到整个协议栈从HAL层到APP层的文件夹分布。
该协议栈可以实现复杂的网络链接,在协调器节点中实现对路由表和绑定表的非易失性存储,因此网络具有一定的记忆功能。
Z-Stack采用操作系统的思想来构建,采用事件轮循机制,当各层初始化之后,系统进入低功耗模式,当事件发生时,唤醒系统,开始进入中断处理事件,结束后继续进入低功耗模式。
如果同时有几个事件发生,判断优先级,逐次处理事件。
这种软件构架可以极大地降级系统的功耗。
整个Z-stack的主要工作流程,大致分为系统启动,驱动初始化,OSAL初始化和启动,进入任务轮循几个阶段,下面将逐一详细分析。
图 Z-Stack系统运行流程图Figure . The Flow Chart of Z-Stack系统初始化系统上电后,通过执行ZMain文件夹中ZMain.c的ZSEG int main()函数实现硬件的初始化,其中包括关总中断osal_int_disable(INTS_ALL)、初始化板上硬件设置HAL_BOARD_INIT()、初始化I/O口InitBoard(OB_COLD)、初始化HAL 层驱动HalDriverInit()、初始化非易失性存储器sal_nv_init(NULL)、初始化MAC层ZMacInit()、分配64位地址zmain_ext_addr()、初始化操作系统osal_init_system()等。
硬件初始化需要根据HAL文件夹中的hal_board_cfg.h文件配置寄存器8051的寄存器。
TI官方发布Z-stack的配置针对的是TI官方的开发板CC2430DB、CC2430EMK等,如采用其他开发板,则需根据原理图设计改变hal_board_cfg.h 文件配置,例如本方案制作的实验板与TI官方的I/O口配置略有不同,其中状态指示LED2的需要重新设置LED2控制引脚口、通用I/O口方向和控制函数定义等。
当顺利完成上述初始化时,执行osal_start_system()函数开始运行OSAL 系统。
该任务调度函数按照优先级检测各个任务是否就绪。
如果存在就绪的任务则调用tasksArr[]中相对应的任务处理函数去处理该事件,直到执行完所有就绪的任务。
如果任务列表中没有就绪的任务,则可以使处理器进入睡眠状态实现低功耗。
程序流程如图3-13所示。
osal_start_system()一旦执行,则不再返回Main()函数。
OSAL任务调度流程图Figure . The Flow Chart of OSAL SchedulerOSAL任务OSAL是协议栈的核心,Z-stack的任何一个子系统都作为OSAL的一个任务,因此在开发应用层的时候,必须通过创建OSAL任务来运行应用程序。
通过osalInitTasks()函数创建OSAL任务,其中TaskID为每个任务的唯一标识号。
任何OSAL任务必须分为两步:一是进行任务初始化;二是处理任务事件。
任务初始化主要步骤如下:(1)初始化应用服务变量。
const pTaskEventHandlerFn tasksArr[]数组定义系统提供的应用服务和用户服务变量,如MAC层服务macEventLoop、用户服务SampleApp_ProcessEvent 等(2)分配任务ID和分配堆栈内存void osalInitTasks(void)主要功能是通过调用osal_mem_alloc()函数给各个任务分配内存空间,和给各个已定义任务指定唯一的标识号。
(3)在AF层注册应用对象通过填入endPointDesc_t数据格式的EndPoint变量,调用afRegister( )在AF层注册EndPoint应用对象。
通过在AF层注册应用对象的信息,告知系统afAddrType_t地址类型数据包的路由端点,例如用于发送周期信息的SampleApp_Periodic_DstAddr和发送LED闪烁指令的SampleApp_Flash_DstAddr。
(4)注册相应的OSAL或则HAL系统服务在协议栈中,Z-stack提供键盘响应和串口活动响应两种系统服务,但是任何Z-Stask任务均不自行注册系统服务,两者均需要由用户应用程序注册。
值得注意的是,有且仅有一个OSAL Task可以注册服务。
例如注册键盘活动响应可调用RegisterForKeys()函数。
(5)处理任务事件处理任务事件通过创建“ApplicationName”_ProcessEv ent()函数处理。
一个OSAL任务除了强制事件(Mandatory Events)之外还可以定义15个事件。
SYS_EVENT_MSG(0x8000)是强制事件。
该事件主要用来发送全局的系统信息,包括以下信息:AF_DATA_CONFIRM_CMD:该信息用来指示通过唤醒AF DataRequest()函数发送的数据请求信息的情况。
ZSuccess确认数据请求成功的发送。
如果数据请求是通过AF_ACK_REQUEST置位实现的,那么ZSussess可以确认数据正确的到达目的地。
否则,ZSucess仅仅能确认数据成功的传输到了下一个路由。
AF_INCOMING_MSG_CMD:用来指示接收到的AF信息。
KEY_CHANGE:用来确认按键动作。
ZDO_NEW_DSTADDR:用来指示自动匹配请求。
ZDO_STATE_CHANGE:用来指示网络状态的变化。
网络层信息Zigbee设备有两种网络地址:1个是64位的IEEE地址,通常也叫作MAC 地址或者扩展地址(Extended address),另一个是16位的网络地址,也叫做逻辑地址(Logical address)或者短地址。
64位长地址是全球唯一的地址,并且终身分配给设备。
这个地址可由制造商设定或者在安装的时候设置,是由IEEE 来提供。
当设备加入Zigbee网络被分配一个短地址,在其所在的网络中是唯一的。
这个地址主要用来在网络中辨识设备,传递信息等。
协调器(Coordinator)首先在某个频段发起一个网络,网络频段的定义放在DEFAULT_CHANLIST配置文件里。
如果ZDAPP_CONFIG_PANID定义的PAN ID是0xFFFF(代表所有的PAN ID),则协调器根据它的IEEE地址随机确定一个PAN ID。
否则,根据ZDAPP_CONFIG_PANID的定义建立PAN ID。
当节点为Router或者End Device时,设备将会试图加入DEFAULT_ CHANLIST所指定的工作频段。
如果ZDAPP_CONFIG_PANID没有设为0xFFFF,则Router或者End Device会加入ZDAPP_CONFIG_PANID所定义的PAN ID。
设备上电之后会自动的形成或加入网络,如果想设备上电之后不马上加入网络或者在加入网络之前先处理其他事件,可以通过定义HOLD_AUTO_START来实现。
通过调用ZDApp_StartUpFromApp( )来手动定义多久时间之后开始加入网络。
设备如果成功的加入网络,会将网络信息存储在非易失性存储器(NV Flash)里,掉电后仍然保存,这样当再次上电后,设备会自动读取网络信息,这样设备对网络就有一定的记忆功能。
对NV Flash的动作,通过NV_RESTORE()和NV_ITNT()函数来执行。
有关网络参数的设置大多保存在协议栈Tools文件夹的f8wConfig.cfg里。
路由Z-Stack采用无线自组网按需平面距离矢量路由协议AODV,建立一个Hoc 网络,支持移动节点,链接失败和数据丢失,能够自组织和自修复。
当一个Router 接受到一个信息包之后,NMK层将会进行以下的工作:首先确认目的地,如果目的地就是这个Router的邻居,信息包将会直接传输给目的设备;否则,Router 将会确认和目的地址相应的路由表条目,如果对于目的地址能找到有效的路由表条目,信息包将会被传递到该条目中所存储的下一个hop地址;如果找不到有效的路由表条目,路由探测功能将会被启动,信息包将会被缓存直到发现一个新的路由信息。
ZigBee End Device不会执行任何路由函数,它只是简单的将信息传送给前面的可以执行路由功能的父设备。
因此,如果End Device想发送信息给另外一个End Device,在发送信息之间将会启动路由探测功能,找到相应的父路由节点。
TI Z-stack协议栈学习-添加新任务1.Zstack中如何实现自己的任务在Zstack(TI的Zigbee协议栈)中,对于每个用户自己新建立的任务通常需要两个相关的处理函数,包括:(1).用于初始化的函数,如:SampleApp_Init(),这个函数是在osalInitTasks()这个osal(Zstack中自带的小操作系统)中去调用的,其目的就是把一些用户自己写的任务中的一些变量,网络模式,网络终端类型等进行初始化;(2).用于引起该任务状态变化的事件发生后所需要执行的事件处理函数,如: SampleApp_ProcessEvent(),这个函数是首先在const pTaskEventHandlerFn tasksArr[]中进行设置(绑定),然后在osalInitTasks()中如果发生事件进行调用绑定的事件处理函数.下面分3个部分分析.1.用户自己设计的任务代码在Zstack中的调用过程(1).main()执行(在ZMain.c中)main()---> osal_init_system()(2).osal_init_system()调用osalInitTasks(),(在OSAL.c中)osal_init_system()--->osalInitTasks()(3).osalInitTasks()调用SampleApp_Init(),(在OSAL_SampleApp.c中)osalInitTasks()--->SampleApp_Init()在osalInitTasks()中实现了多个任务初始化的设置,其中macTaskInit(taskID++)到ZDApp_Init( taskID++ )的几行代码表示对于几个系统运行初始化任务的调用,而用户自己实现的SampleApp_Init()在最后,这里taskID随着任务的增加也随之递增.所以用户自己实现的任务的初始化操作应该在osalInitTasks()中增加.void osalInitTasks( void ){uint8 taskID = 0;//这里很重要, 调用osal_mem_alloc()为当前OSAL中的各任务分配存储空间(实际上是一个任//务数组),并用tasksEvents指向该任务数组(任务队列).tasksEvents =(uint16 *)osal_mem_alloc(sizeof(uint16) * tasksCnt);osal_memset(tasksEvents,0,(sizeof(uint16) *tasksCnt));//将taskSEvents 所指向的空间清零macTaskInit(taskID++);nwk_init(taskID++);Hal_Init(taskID++);#if defined(MT_TASK)MT_TaskInit(taskID++);#endifAPS_Init(taskID++);ZDApp_Init(taskID++);SampleApp_Init(taskID); //用户自己需要添加的任务}2.任务处理调用的重要数据结构这里要解释一下,在Zstack里,对于同一个任务可能有多种事件发生,那么需要执行不同的事件处理,为了方便,对于每个任务的事件处理函数都统一在一个事件处理函数中实现,然后根据任务的ID号(task_id)和该任务的具体事件(events)调用某个任务的事件处理函数,进入了该任务的事件处理函数之后,再根据events再来判别是该任务的哪一种事件发生,进而执行相应的事件处理.pTaskEventHandlerFn是一个指向函数(事件处理函数)的指针,这里实现的每一个数组元素各对应于一个任务的事件处理函数,比如SampleApp_ProcessEvent对于用户自行实现的事件处理函数uint16 SampleApp_ProcessEvent( uint8 task_id,uint16 events ),所以这里如果我们实现了一个任务,还需要把实现的该任务的事件处理函数在这里添加.const pTaskEventHandlerFn tasksArr[] = {macEventLoop,nwk_event_loop,Hal_ProcessEvent,#if defined( MT_TASK ) //一个MT任务命令MT_ProcessEvent,#endifAPS_event_loop,ZDApp_event_loop,SampleApp_ProcessEvent};注意, tasksEvents和tasksArr[]里的顺序是一一对应的,tasksArr[]中的第i 个事件处理函数对应于tasksEvents中的第i个任务的事件.//计算出任务的数量const uint8 tasksCnt =sizeof(tasksArr)/sizeof(tasksArr[0]);uint16 *tasksEvents;3. 对于不同事件发生后的任务处理函数的调用osal_start_system()很重要,决定了当某个任务的事件发生后调用对应的事件处理函数void osal_start_system(void){#if!defined(ZBIT)for(;;)//Forever Loop#endif{uint8 idx = 0;Hal_ProcessPoll();//This replaces MT_SerialPoll() and//osal_check_timer().//这里是轮训任务队列,并检查是否有某个任务的事件发生do{if (tasksEvents[idx])//Task is highest priority that is ready.{break;}}while(++idx<tasksCnt);if(idx<tasksCnt){uint16 events;halIntState_t intState;HAL_ENTER_CRITICAL_SECTION(intState);events=tasksEvents[idx];//处理该idx的任务事件,是第idx个任务的事件发生了tasksEvents[idx] = 0; // Clear the Events for this task.HAL_EXIT_CRITICAL_SECTION(intState);//对应调用第idx个任务的事件处理函数,用events说明是什么事件events = (tasksArr[idx])( idx, events );//当没有处理完,把返回的events继续放到tasksEvents[idx]当中HAL_ENTER_CRITICAL_SECTION(intState);tasksEvents[idx] |= events; // Add back unprocessed events to the current task.HAL_EXIT_CRITICAL_SECTION(intState);}#if defined( POWER_SAVING )else // Complete pass through all task events with no activity?{osal_pwrmgr_powerconserve(); // Put the processor/system into sleep}#endif}}2.Z-stack添加一个新的任务在osalInitTasks()和tasksArr[]添加相应的项就可以了。