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 的主要工作流程,大致分为系统启动,驱动初始化,OSAL 初始化和启动,进入任务轮循几个阶段。

系统初始化
系统上电后,通过执行 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:用来指示网络状态的变化。

Z-stack 协议栈基础知识相关推荐

  1. 【STM32H7】第4章 ThreadX USBX协议栈基础知识

    教程更新中:http://www.armbbs.cn/forum.php?mod=viewthread&tid=108546 第4章   ThreadX USBX协议栈基础知识 本章节为大家讲 ...

  2. 【STM32F429】第4章 ThreadX USBX协议栈基础知识

    教程更新中:http://www.armbbs.cn/forum.php?mod=viewthread&tid=108546 第4章   ThreadX USBX协议栈基础知识 本章节为大家讲 ...

  3. 电子计算机电缆成缆节距,成缆节距电缆基础知识.PPT

    成缆节距电缆基础知识.PPT 电 缆 构 造单芯导线 电 缆 结 构有接地保护芯线的多芯电缆 多芯屏蔽电缆 绝缘材料 聚氯乙烯 (PVC)通用 聚氨酯 (PUR) 耐磨损 聚四氟乙烯 (PTFE) 耐 ...

  4. 【STM32H7】第8章 学习USB协议栈前要了解的基础知识

    论坛原始地址(持续更新):http://www.armbbs.cn/forum.php?mod=viewthread&tid=99710 第8章   学习USB协议栈前要了解的基础知识 本章节 ...

  5. 【STM32F407】第8章 学习USB协议栈前要了解的基础知识

    论坛原始地址(持续更新):http://www.armbbs.cn/forum.php?mod=viewthread&tid=99710 第8章   学习USB协议栈前要了解的基础知识 本章节 ...

  6. 【STM32F429】第8章 学习USB协议栈前要了解的基础知识

    论坛原始地址(持续更新):http://www.armbbs.cn/forum.php?mod=viewthread&tid=99710 第8章   学习USB协议栈前要了解的基础知识 本章节 ...

  7. Windows核心编程 第六章 线程基础知识 (上)

    第6章 线程的基础知识 理解线程是非常关键的,因为每个进程至少需要一个线程.本章将更加详细地介绍线程的知识.尤其是要讲述进程与线程之间存在多大的差别,它们各自具有什么作用.还要介绍系统如何使用线程内核 ...

  8. Java 面试知识点解析(一)——基础知识篇

    前言: 在遨游了一番 Java Web 的世界之后,发现了自己的一些缺失,所以就着一篇深度好文:知名互联网公司校招 Java 开发岗面试知识点解析 ,来好好的对 Java 知识点进行复习和学习一番,大 ...

  9. python猴子吃桃子的问题_Python基础知识初入门

    想成为数据分析.机器学习.人工智能等领域的稀缺人才,就必须学会使用其相对应的编程语言,Python作为其主要的编程语言之一,在人工智能.大数据等领域有很大的需求和应用.以下是编程语言Python的基础 ...

最新文章

  1. Win10 + Python + GPU版MXNet + VS2015 + RTools + R配置
  2. Qt for ios 在 xcode 中编译(便于调试)
  3. GDCM:gdcm::VR的测试程序
  4. 详细解析Raid0、Raid0+1、Raid1、Raid5四者的区别
  5. leetcode684. 冗余连接(并查集)
  6. 前端学习(527):等分布局第二种方案
  7. php 获取所有子目录名,php读取目录及子目录下所有文件名的方法,_PHP教程
  8. java虚拟机的数据_Java虚拟机运行时数据区域
  9. Unicode 编码表下载
  10. 交换机Vlan中 tagged和untagged的区别
  11. 软件测试周刊(第08期):大过节的
  12. 机器学习和人工智能的关系
  13. 墨瞳漫画 升级vue2 踩坑
  14. 项目管理软件售后培训方案
  15. PMP|一文带你正确认识产品经理和项目经理的区别
  16. 联想服务器安装系统蓝屏怎么办,联想电脑装系统出现蓝屏怎么办
  17. 基于stm32的两轮自平衡小车1(模块选型篇)
  18. 简练软考知识点整理-实施整体变更控制过程
  19. 以太坊区块和交易的存储结构分析
  20. android 获取网络视频资源,Android 加载网络视频(url地址)第三方框架简用

热门文章

  1. Android开源项目xUtils HttpUtils模块分析
  2. win7系统如何关闭不需要的服务器,浅析win7系统DNS Client服务器不可关闭的原因
  3. 计算机联锁的英语文献,计算机联锁系统论文(国外英文资料).doc
  4. 开启与配置SMTP服务器
  5. 如何提高客户满意度?为什么客户服务尤其重要?
  6. 【凯子哥带你做高仿】“煎蛋”Android版的高仿及优化(二)——大图显示模式、评论“盖楼”效果实现详解
  7. iSCSI的原理及配置
  8. 想做搏击风浪的海燕,去小公司吧
  9. ① Hbase 基础知识
  10. 冰冰学习笔记:多线程