Z-stack 协议栈基础知识

Z-stack协议栈简单知识:

ZigBee 的协议分为两部分,
IEEE 802.15.4 定义了 PHY(物理层)和 MAC(介质访问层)技术规范;ZigBee 联盟定义了 NWK(网络层)、APS(应用程序支持子层)、APL(应用层)技术规范ZigBee  协议栈就是将各个层定义的协 议都集合在一起 ,以函数的形式实现,并供给用户提供 API( 应用层) ,用户可以直接调用。

在开发一个应用时,协议较底下的层与应用是相互独立的,它们可以从第三方来获得,因此我们需要做的就只是在应用层进行相应的改动。

协议栈定义了通信硬件和软件在不同层次如何协调工作。在网络通信领域,在每个协议层的实体通过对信息打包与对等实体通信。在通信的发送方,用户需要传递的数据包按照从高层到低层的顺序依次通过各个协议层,每一层的实体按照最初预定消息格式在数据信息中加入自己的信息,比如每一层的头信息和校验等,最终抵达最低层的物理层,变成数据位流,在物理连接间传递。在通信的接收方数据包依次向上通过协议栈,每一层的实体能够根据预定的格式准确的提取需要在本层处理的数据信息,最终用户应用程序得到最终的数据信息并进行处理。

ZigBee 无线网络的实现,是建立在 ZigBee 协议栈的基础上的,协议栈采用分层的结构。协议分层的目的是为了使各层相对独立,每一层都提供一些服务,服务由协议定义,程序员只需关心与他的工作直接相关的那些层的协议,它们向高层提供服务,并由底层提供服务。在 ZigBee 协议栈中,PHY、MAC 层位于最低层,且与硬件相关;NWK、APS, APL 层以及安全层建立在PHY 和 MAC 层之上,并且完全与硬件无关。

整个 Z-Stack 采用分层的软件结构,硬件抽象层(HAL)提供各种硬件模块的驱动,包括定时器 Timer,通用 I/O 口 GPIO,通用异步收发传输器 UART,模数转换 ADC 的应用程序接口 API,提供各种服务的扩展集。操作系统抽象层 OSAL 实现了一个易用的操作系统平台,通过时间片轮转函数实现任务调度,提供多任务处理机制。用户可以调用 OSAL 提供的相关 API 进行多任务编程,将自己的应用程序作为一个独立的任务来实现。

Z-stack 协议栈基础知识_第1张图片

协议栈软件流程:

整个 Z-stack 的主要工作流程,大致分为系统启动,驱动初始化,OSAL 初始化和启动,进入任务轮循几个阶段。

Z-stack 协议栈基础知识_第2张图片

系统初始化
系统上电后,通过执行 ZMain 文件夹中 ZMain.c 的 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 官方的开发板 CC2530EB 等,如采用其他开发板,则需根据原理图设计改变
hal_board_cfg.h 文件配置,例如本文档配套硬件模块与 TI 官方的 I/O 口配置略有不同,需要参考硬件原
理图进行相应修改。
当顺利完成上述初始化时,执行 osal_start_system()函数开始运行 OSAL 系统。该任务调度函数按照
优先级检测各个任务是否就绪。如果存在就绪的任务则调用 tasksArr[]中相对应的任务处理函数去处理该
事件,直到执行完所有就绪的任务。如果任务列表中没有就绪的任务,则可以使处理器进入睡眠状态实现
低功耗。程序流程如图所示。osal_start_system()一旦执行,则不再返回 Main()函数。

OSAL  任务初始化
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”_ProcessEvent()函数处理。一个 OSAL 任务除了强制事
件(Mandatory Events)之外还可以定义 15 个事件。
SYS_EVENT_MSG(0x8000)是强制事件。该事件主要用来发送全局的系统信息,包括以下信息:
AF_DATA_CONFIRM_CMD:该信息用来指示通过唤醒 AF DataRequest( )函数发送的数据请求信息的情况。
ZSuccess 确认数据请求成功的发送。如果数据请求是通过 AF_ACK_REQUEST 置位实现的,那么 ZSuccess 可
以确认数据正确的到达目的地。否则,ZSuccess 仅仅能确认数据成功的传输到了下一个路由。
AF_INCOMING_MSG_CMD:用来指示接收到的 AF 信息。
KEY_ CHANGE:用来确认按键动作。
ZDO_ NEW_ DSTADDR:用来指示自动匹配请求。
ZDO_STATE_CHANGE:用来指示网络状态的变化。

 

你可能感兴趣的:(ZIgBee)