Zstack协议栈(二)

Zstack 协议栈介绍

3.1 Zstack 协议栈目录

Components 文件夹: 存放协议栈库文件的,里面放了一些我们用到的 ZDO,driver,hal,zcl 等库的代码。
Documents 文件夹: 存放 TI 的开发文档的,里面很多都是讲述协议栈的 API 的。
Proiects 文件夹: 存放的是 TI协议栈的例子程序的,其中 ProiectslzstacklSamples 文件夹是我们常用的 ZStack 应用程序路径。
Tools 文件夹:存放 TI 的例子程序配套的一些上位机程序和调试工具。

3.2 Zstack 工程结构

Z-Stack 协议栈工程文件夹说明如下:

APP (ApplicationProgramming): 应用层目录,这是用户创建各种不同工程的区域,在这个目录中句含了应用层的内容和这个项目的主要内容,在协议栈里面一般是以操作系统的任务实现的

APP:用户应用程序及接口,包括串口数据处理、无线接收数据处理、用户LCD 显示处理、传感器数据读取和发送等。

HAL (Hardware (HW)Abstraction Layer): 硬件层目录,包含有与硬件相关的配置和驱动及操作函数。

MAC: MAC 层目录,包含了 MAC 层的参数配置文件及其 MAC 的 LIB 库的函数接口文件。

MT (Monitor Test): 实现通过串口可控各层,于各层进行直接交互。

NWK(ZigBee Network Layer):网络层目录,含网络层配置参数文件及网络层库的函数接口文件,APS 层库的函数接口

OSAL (Operating System (OS)Abstraction Layer): 协议栈的操作系统

Profile: AF (Application work) 层目录,包含 AF 层处理函数文件

Security: 安全层目录,安全层处理函数,比如加密函数等。

Services:地址处理函数目录,包括着地址模式的定义及地址处理函数

Tools: 工程配置目录,包括空间划分及 ZStack 相关配置信息。

ZDO (ZigBee Device Obiects): ZDO 目录

ZMac: MAC 层目录,包括 MAC 层参数配置及 MAC 层 LIB 库函数调处理函数。

ZMain: 主函数目录,包括入口函数及硬件配置文件

Output: 输出文件目录,这个是 EW8051 IDE 自动生成的。

Zstack 启动流程

4.1 Z-Stack 协议栈启动流程

在这里插入图片描述

​ Z-Stack 协议栈用操作系统的思想来构建,采用事件轮询机制。当各层初始化之后,系统进入低功耗模式,当事件发生时,唤醒系统,开始进入中断处理事件,结束后继续进入低功耗模式。如果同时有几个事件发生,则判断优先级,逐个处理事件。这种软件构架可以极大地降级系统的功耗整个 Z-Stack 的主要工作流程,大致分为系统启动,驱动初始化,OSAL 初始化和启动,进入任务轮循几个阶段。

4.1.1 系统初始化

​ 系统上电后,通过执行 ZMain 文件夹中 ZMain.c 的 ZSEG int main( )函数实现硬件的初始化。硬件初始化需要根据 HAL 文件夹中的 hal board cfg.h 文件配置 8051 的寄存器。TI 官方发布Zstack 的配置针对的是TI官方的开发板 CC2530DB、CC2530EMK 等,如采用其它开发板,则需根据原理图设计改变 hal_board_cfg.h 文件配置。如按键多少及其对应的 O 口,LED 指示灯的多少及其对应的 I/O 口,串口的波特率及中断还是 DMA 操作方式,是否有LCD 等。也可以通过宏定义的方式,将硬件的功能模块的操作放开或屏蔽掉。
​ 当顺利完成上述初始化时,执行 osal_start_system( )函数开始运行 OSAL 系统。该任务调度函数按照优先级检测各个任务是否就绪,如果存在就绪的任条则调用 tasksArr 1中相对应的任务处理函数去处理该事件,直到执行完所有就绪的任务。如果任务列表中没有就绪的任务,则可以使处理器进入睡眠状态实现低功耗。程序流程如下图所示。osal_start_system()一旦执行,则不再返回Main()函数。

系统初始化

4.1.2 OSAL任务

​ OSAL 是协议栈的核心,Z-Stack 的任何一个子系统都作为 OSAL 的一个任务,因此在开发应用层的时候,必须通过创建 OSAL 任务来运行应用程序。通过 osallnitTasks( )函数创建 OSAL 任务,其中 TaskID 为每个任务的唯一标识号。任何 OSAL 任务必须分为两步:一是进行任务初始化;二是处理任务事件。任务初始化主要步骤如下:

4.1.2.1 初始化应用服务变量

​ tasksArr[ ]数组定义系统提供的应用服务和用户服务变量,如const pTaskEventhandlerFnMAC 层服务 macEventLoop、用户服务 controlEpProcess,functionEpProcess,等

4.1.2.2 分配任务ID 和分配堆栈内存

​ void osallnitTasks( void )主要功能是通过调用 osa mem alloc( )函数给各任务分配内存空间,和给各个已定义任务指定唯一的标识号。

4.1.2.3 在 AF 层注册应用对象

​ 通过填入 endPointDesc t 数据格式的 EndPoint 变量,调用 afRegister( )在 AF 层注册EndPoint 应用对象。通过在 AF 层注册应用对象的信息,告知系统 afAddrType t 地址类型数据包的路由端点,例如用于发送周期信息的 SampleApp Periodic DstAddr 和发送 LED 闪烁指令的SampleApp Flash DstAddr.

4.1.2.4 注册相应的 OSAL 或者 HAL 系统服务

​ 在协议栈中,Z-Stack 提供键盘响应和串口活动响应两种系统服务,但是任何 Z-Stask 任务均不自行注册系统服务,两者均需要由用户应用程序注册。值得注意的是,有且仅有一个 OSALTask 可以注册服务,例如注册键盘活动响应可调用 RegisterForKeys()函数。

4.1.2.5 处理任务事件

处理任务事件通过创建“ApplicationName”ProcessEvent( )函数处理。一个 OSAL 任务除了强制事件(Mandatory Events) 之外还可以定义 15 个事件。下面对这些事件进行介绍:

SYS_EVENT_MSG 事件:一个强制任事件 SYS EVENT MSG(0x8000),被保留必须通过OSAL 任务设计。管理者应该处理如下的系统信息子集,下面只列出了部分信息,但是是最常用的几个信息处理,推荐根据例子复制到自己项目中使用。

AF_DATA_CONFIRM_CMD 事件: 调用 AF_DataRequest()函数数据请求成功的指示。Zsuccess 确认数据请求传输成功,如果数据请求设置 AF_ACK_REQUEST 标志位,那么,只有最终目的地址成功接收后,Zsuccess 确认才返回。如果数据请求没有设置AF_ACK_REQUEST 标志位,那么数据请求只要成功,传输到下跳节点就返回 Zsuccess 确认信息。

AF_INCOMING_MSG_CMD 事件: AF (无线电) 信息输入指示

KEY_CHANGE 事件: 键盘动作指示

ZDO_NEW_DSTADDR 事件: 匹配描述符请求 (Match Deor Request) 响应指示。(例如自动匹配)

ZDO_STATE_CHANGE 事件: 网络状态改变指示

4.1.3 网络层信息

​ ZigBee 设备有两种网络地址: 1 个是 64 位的 IEEE 地址,通常也叫作 MAC 地址或者扩展地址 (Extended address),另一个是 16 位的网络地址,也叫做逻辑地址 (Logical address) 或者短地址。64 位长地址是全球唯一的地址,并且终身分配给设备。这个地址可由制造商设定或者在安装的时候设置,是由 EEE 来提供。当设备加入 ZigBee 网络被分配一个短地址,在其所在的网络中是唯一的,这个地址主要用来在网络中辨识设备,传递信息等。
协调器 ( Coordinator ) 首先在某个频段发起一个网络,网络频段的定义放在DEFAULT CHANLIST 配置文件里。如果ZDAPP CONFIG PANID 定义的 PAN ID 是OXFFFF(代表所有的 PAN D),则协调器根据它的EEE 地址随机确定一个 PAN ID。否则,根据ZDAPP CONFIG PANID 的定义建立 PAN D。当节点为 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 里。

4.1.4 路由

​ Z-Stack 采用无线自组网按平面距离矢量路由协议 AODV,建立一个 Hoc 网络,支持移动节点链接失败和数据丢失,能够自组织和自修复。当一个 Router 接收到一个信息包之后,NMK 层将会进行以下的工作:首先确认目的地,如果目的地就是这个 Router 的邻居,信息包将会直接传输给目的设备:否则,Router 将会确认和目的地址相应的路由表条目,如果对于目的地址能找到有效的路由表条目,信息包将会被传递到该条目中所存储的下一个 hop 地址;如果找不到有效的路由表条目,路由探测功能将会被启动,信息包将会被缓存直到发现一个新的路由信息。
​ ZigBee End Device 不会执行任何路由函数,它只是简单的将信息传送给前面的可以执行路由功能的父设备。因此,如果 End Device 想发送信息给另外一个 End Device,在发送信息之间将会启动路由探测功能,找到相应的父路由节点。

  • 24
    点赞
  • 36
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

渺若星辰_

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值