zigbee协议栈工作流程 From zigbee菜鸟笔记(十 一)

article/2025/10/22 3:19:10

一.ZigBee 协议栈简介

有问题发送邮件至468078841@qq.com
什么是ZigBee 协议栈呢?它和ZigBee 协议有什么关系呢?协议是一系列的通信标准,通信双方需要共同按照这一标准进行正常的数据发射和接收。协议栈是协议的具体实现形式,通俗点来理解就是协议栈是协议和用户之间的一个接口,开发人员通过使用协议栈来使用个协议的,进而实现无线数据收发。

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

							 					Z-Stack协议栈体系结构								

在这里插入图片描述

二.如何使用ZigBee 协议栈

协议栈是协议的实现,可以理解为代码,函数库,供上层应用调用,协议较底下的层与应用是相互独立的。你需要关心的就是你的应用逻辑,数据从哪里到哪里,怎么存储,处理;还有系统里的设备之间的通信顺序什么的.至于初始化等等工作不需要我们考虑。我们只需要调用相关的API函数就可以了。

三.了解zigbee协议栈的应用文件夹

安装好zigbee协议栈,打开目录Texas Instruments

在这里插入图片描述

(一)Components:顾名思义这个是放我们的库的文件夹,里面放了一些我们用到的ZDO,driver,hal,zcl 等库的代码

(二)Documents:这里放的是TI 的开发文档的,里面很多都是讲述协议栈的API

(三)Projects:这个文件夹放的是TI 协议栈的例子程序。

(四)Tools:这个文件夹是放TI 的例子程序的一些上位机之类的程序,作为工具使用。

接下来介绍的东西均需要打开示例工程在这里我们打开\ZStack-CC25302.5.1a\Projects\zstack\Samples\SampleApp\CC2530DB进入zigbee的协议栈中
在这里插入图片描述

为了确保程序没问题我们在这里重新编译一下协议栈。

这是我们协议栈的汇总目录
在这里插入图片描述
这里是我们zigbee的文件夹,里面写好的代码都分为很多的group
(一)APP:应用层目录,这里用户可以创建不同的工程目录,这里包含项目工程主要内容

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

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

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

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

(六)OSAL:协议栈的操作系统。

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

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

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

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

(十一)ZDO: ZDO目录。

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

(十三)Output:输出文件目录,这个EW8051 IDE 自动生成的。

在这里插入图片描述
点击DemoEB可以进行设备类型工作空间选择,必须要选好,不然不可以使用。

CoordinatorEB:为协调器的工作空间。

ROuterEB:为路由器的工作空间。

EndDeviceEB:为无线终端的设备选择。

四.zigbee协议栈的工作流程

在我们这个版本的来说在我们使用者的路径流程是:main()---> osal_init_system()---> osalInitTasks()---> SampleApp_Init()

(一)打开ZMain.c 找到main 函数
学过C语言的都知道,C语言函数是在一直执行main文件里面的内容,首先我们先查看main.c的内容


int main( void )
{// Turn off interruptsosal_int_disable( INTS_ALL ); //关闭协议栈所有中断// Initialization for board related stuff such as LEDsHAL_BOARD_INIT();             //初始化协议栈系统时钟// Make sure supply voltage is high enough to runzmain_vdd_check();            //检查芯片电压是否正常// Initialize board I/OInitBoard( OB_COLD );         //初始化I/O // Initialze HAL driversHalDriverInit();              //初始化芯片硬件// Initialize NV Systemosal_nv_init( NULL );         //初始化Flash 存储器// Initialize the MACZMacInit();                   //初始化MAC 层// Determine the extended addresszmain_ext_addr();             //确定IEEE 64位设备地址// Initialize basic NV itemszgInit();                     //初始化非易失变量#ifndef NONWK// Since the AF isn't a task, call it's initialization routineafInit();
#endif// Initialize the operating systemosal_init_system();           //初始化协议栈操作系统// Allow interruptsosal_int_enable( INTS_ALL );  //使能全部中断// Final board initializationInitBoard( OB_READY );        //最终板载初始化// Display information about this devicezmain_dev_info();             //LCD显示设备信息/* Display the device info on the LCD */
#ifdef LCD_SUPPORTEDzmain_lcd_init();             //初始化LCD
#endif#ifdef WDT_IN_PM1/* If WDT is used, this is a good place to enable it. */WatchDogEnable( WDTIMX );
#endifosal_start_system(); // No Return from here 执行操作系统,这里进入将不会退出,一直执行osal_start_systemreturn 0;  // Shouldn't get here.
} // main()

我们接着看一下osal_start_system在这里我们可以点击选中然后goto到函数里面查看。
在这里插入图片描述

void osal_start_system( void )
{
#if !defined ( ZBIT ) && !defined ( UBIT )for(;;)  // Forever Loop //这是个死循环
#endif{osal_run_system();  //协议栈一直执行这个函数}
}

接着继续goto osal_run_system这个是任务系统轮询的主要函数。他会查找发生的事件然后调用相应的事件执行函数, 如果没有事件登记要发生那就将进入睡眠模式。在协议栈中,所有将要处理的内容定义为事件,这个函数就是查找事件的函数,每个事件都有自己的事件号,根据事件号大小判断优先级,一个一个执行,例如按键按键,就触发按键事件,这个现在知道就可以,在后面我们会介绍。
在这里我们知道了协议栈一直执行事件扫面函数,那我们如何根据需求开发呢,我们要做的就是设置一个自己要监测的事件,然后写交互逻辑。 // 一个任务可以有多个事件

void osal_run_system( void )
{uint8 idx = 0;osalTimeUpdate();//更新事件Hal_ProcessPoll();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];tasksEvents[idx] = 0;  // Clear the Events for this task.HAL_EXIT_CRITICAL_SECTION(intState);activeTaskID = idx;events = (tasksArr[idx])( idx, events );activeTaskID = TASK_NO_TASK;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/* Yield in case cooperative scheduling is being used. */
#if defined (configUSE_PREEMPTION) && (configUSE_PREEMPTION == 0){osal_task_yield();}
#endif
}

我们接下来进行事件的初始设置。在前面main函数中 osalInitTasks(); 为初始化系统任务,我们需要将自己的需求加入其中就可以达到目的。 goto一下进入函数 //osalInitTasks这个是设置任务的函数,然后任务里面也定义了很多事件

void osalInitTasks( void )
{uint8 taskID = 0;// 分配内存,返回指向缓冲区的指针tasksEvents = (uint16 *)osal_mem_alloc( sizeof( uint16 ) * tasksCnt);// 设置所分配的内存空间单元值为0osal_memset( tasksEvents, 0, (sizeof( uint16 ) * tasksCnt));// 任务优先级由高向低依次排列,高优先级对应taskID 的值反而小macTaskInit( taskID++ );  // taskID 0nwk_init( taskID++ );     // taskID 1Hal_Init( taskID++ );     //taskID 2
#if defined( MT_TASK )MT_TaskInit( taskID++ );
#endifAPS_Init( taskID++ );      //taskID 3
#if defined ( ZIGBEE_FRAGMENTATION )APSF_Init( taskID++ );
#endifZDApp_Init( taskID++ );    //taskID 4
#if defined ( ZIGBEE_FREQ_AGILITY ) || defined ( ZIGBEE_PANID_CONFLICT )ZDNwkMgr_Init( taskID++ );  
#endif//SampleApp_Init为用户创建任务,我们需要在这里进行任务的添加 现在进入函数我们查看一下SampleApp_Init( taskID );  // taskID 5 
}

在这里我们看一下用户应用任务的事件处理函数进入SampleApp_ProcessEvent函数在这里我们可以看到在协议栈初始的时候定义的事件,和处理函数,在后面我们再详细介绍如何使用。

uint16 SampleApp_ProcessEvent( uint8 task_id, uint16 events )
{afIncomingMSGPacket_t *MSGpkt;(void)task_id;  // Intentionally unreferenced parameterif ( events & SYS_EVENT_MSG )//如果是SYS_EVENT_MSG 这个事件进入这里{MSGpkt = (afIncomingMSGPacket_t *)osal_msg_receive( SampleApp_TaskID );//类型转换while ( MSGpkt ){switch ( MSGpkt->hdr.event ){// Received when a key is pressedcase KEY_CHANGE:  //如果是按键按下进入下面这个函数SampleApp_HandleKeys( ((keyChange_t *)MSGpkt)->state, ((keyChange_t *)MSGpkt)->keys );break;// Received when a messages is received (OTA) for this endpointcase AF_INCOMING_MSG_CMD://如果是接受到RF消息进入这里SampleApp_MessageMSGCB( MSGpkt );break;// Received whenever the device changes state in the networkcase ZDO_STATE_CHANGE: //如果网络状态改变,这个绝壁进入,SampleApp_NwkState = (devStates_t)(MSGpkt->hdr.status);if ( (SampleApp_NwkState == DEV_ZB_COORD)|| (SampleApp_NwkState == DEV_ROUTER)|| (SampleApp_NwkState == DEV_END_DEVICE) ){// Start sending the periodic message in a regular interval.osal_start_timerEx( SampleApp_TaskID,SAMPLEAPP_SEND_PERIODIC_MSG_EVT,SAMPLEAPP_SEND_PERIODIC_MSG_TIMEOUT );}else{// Device is no longer in the network}break;default:break;}// Release the memory释放消息占用的内存osal_msg_deallocate( (uint8 *)MSGpkt );// Next - if one is available//  返回while ( MSGpkt )重新处理事件,直到缓冲区没有等待处理事件为止MSGpkt = (afIncomingMSGPacket_t *)osal_msg_receive( SampleApp_TaskID );}// return unprocessed events  返回未处理的事件return (events ^ SYS_EVENT_MSG);}// Send a message out - This event is generated by a timer//  (setup in SampleApp_Init()).if ( events & SAMPLEAPP_SEND_PERIODIC_MSG_EVT ) //如果是 SAMPLEAPP_SEND_PERIODIC_MSG_EVT 事件进入这里 这里是网络状态改变之后标志位值1的{// Send the periodic messageSampleApp_SendPeriodicMessage();// Setup to send message again in normal period (+ a little jitter)osal_start_timerEx( SampleApp_TaskID, SAMPLEAPP_SEND_PERIODIC_MSG_EVT,(SAMPLEAPP_SEND_PERIODIC_MSG_TIMEOUT + (osal_rand() & 0x00FF)) );// return unprocessed eventsreturn (events ^ SAMPLEAPP_SEND_PERIODIC_MSG_EVT);}// Discard unknown eventsreturn 0;
}

了解以上的流程我们就可以了解到协议栈的整体运行机制了。并且大概的概念。

下面我们介绍本节涉及zigbee协议栈的函数;

函数名osal_start_timerEx

函数声明uint8 osal_start_timerEx( uint8 taskID, uint16 event_id, uint16 timeout_value )

这是一个定时器的函数,将在timeout_value毫秒之后将任务号为taskID的任务,事件号为event_id的事件标志位置为1.这个时候就可以通过evens&进行判断

有问题请发邮件至468078841@qq.com
zigbee协议栈串口收发 From zigbee菜鸟笔记(十 二)点击进入


http://chatgpt.dhexx.cn/article/shVb7kFw.shtml

相关文章

ZigBee协议

ZigBee协议 简介 这个zigbee教程描述了您想要了解的有关Zigbee协议栈的所有内容。现在&#xff0c;一天的zigbee在低数据速率无线应用中变得非常流行。 Zigbee设备用于智能能源&#xff0c;医疗和家庭自动化。在智能能源应用中&#xff0c;zigbee产品用于监控和控制能源和水…

物联网--Zigbee协议(二):Zigbee协议架构以及数据帧结构

上一篇整理了关于Zigbee协议的一些基础知识&#xff0c;接下来主要讨论Zigbee协议的架构&#xff0c;希望通过这篇文章能够帮助小伙伴们更好地理解Zigbee协议&#xff0c;废话不多说&#xff0c;进入正题吧。 文章目录 一、Zigbee协议架构二、Zigbee协议的数据帧结构总结 一、Z…

Zigbee协议栈中文说明

1.概述 1.1解析ZigBee堆栈架构 ZigBee堆栈是在IEEE 802.15.4标准基础上建立的&#xff0c;定义了协议的MAC和PHY层。ZigBee设备应该包括IEEE802.15.4(该标准定义了RF射频以及与相邻设备之间的通信)的PHY和MAC层&#xff0c;以及ZigBee堆栈层&#xff1a;网络层(NWK)、应用层和…

Zigbee 协议栈

介绍完ZigBee的物理特性&#xff0c;现在该转入逻辑层面&#xff0c;分析下协议栈的软件部分了。先看个协议栈的架构图吧&#xff1a; ZigBee协议栈由一组子层构成&#xff0c;每层为其上层提供一组特定的服务&#xff1a;一个数据实体提供数据传输服务&#xff1b;一个管理实体…

ZigBee协议栈(一)--协议栈介绍

1、Zigbee协议栈简介 协议是一系列的通信标准&#xff0c;通信双方需要按照这一标准进行正常的数据发射和接收。协议栈是协议的具体实现形式&#xff0c;通俗讲协议栈就是协议和用户之间的一个接口&#xff0c;开发人员通过使用协议栈来使用这个协议&#xff0c;进而实现无线数…

zigbee之Zstack协议栈使用

zigbee之Zstack协议栈使用 前言基于zstack协议栈开发的步骤一、OSAL操作系统1、操作系统工作流程2、OSAL初始化函数3、系统启动函数&#xff08;1&#xff09;任务&#xff08;2&#xff09;事件 4.OSAL任务与事件的关系 二、组网通信1、初始化PANID和信道2、端点和簇3、无线数…

Zigbee协议栈应用(一)——Zigbee协议栈介绍及简单例子

1、Zigbee协议栈简介 协议是一系列的通信标准&#xff0c;通信双方需要按照这一标准进行正常的数据发射和接收。协议栈是协议的具体实现形式&#xff0c;通俗讲协议栈就是协议和用户之间的一个接口&#xff0c;开发人员通过使用协议栈来使用这个协议&#xff0c;进而实现无线数…

学习记录 | ZigBee协议栈工作流程

第一次来CSDN记录一下学习过程&#xff0c;其实就是笔记啦 之前用Typora 的 但前几天电脑出问题重装系统后打开笔记文件发现照片都打不开了&#xff0c;索性想换一种记笔记方式 好啦 以下是正文&#xff01;&#xff01;&#xff01; 对了 笔记来源是深圳安联德公司提供的学…

ZigBee协议栈Zstack介绍

文中所讲述的协议栈是基于ZigBee2006\Zstack-1.4.3-1.2.1 1.ZSTACK协议栈的架构 ZigBee协议栈就是将各个层定义的协议都集合在一起&#xff0c;以函数的形式实现&#xff0c;并给用户提供一些API&#xff0c;工用户调用。协议栈体系分层结构与协议栈代码文件夹对应表如下&…

ZigBee Zstack协议栈

一、Zstack协议栈概述 什么是Zstack协议栈 为了使Zigbee的开发更加简单高效&#xff0c;TI公司推出了基于cc2530芯片的协议栈Z-STACK.协议栈的实质就是能实现各个功能的实例框架代码&#xff0c;我们想要实现自己的功能程序&#xff0c;只需要在协议栈的基础上修改或添加即可…

快速了解ZigBee的协议栈

带大家来一起快速的看懂ZigBee的协议栈的运行流程。 1.读任何程序都需要从main函数入手&#xff0c;那我们先来看Zmain.c中的main函数。 问题&#xff1a;在main中我们会看到很多的函数&#xff0c;我们究竟要看哪个函数呢? 回答&#xff1a;这么多的函数中其实我们只需要关注…

Zigbee协议栈————广播组网

目录 1.基础概念 2.Zigbee协议栈工作流程 3。代码讲解 1.基础概念 在Zigbee网络中存在3中逻辑设备&#xff1a;协调器、路由器、终端。 (这个实验当中我们只用到协调器以及终端)。 协调器&#xff1a;协调器负责启动网络&#xff0c;当启动和配置好网络后&#xff0c;协调…

zibgee协议

1.概述 1.1解析ZigBee堆栈架构 ZigBee堆栈是在IEEE 802.15.4标准基础上建立的&#xff0c;定义了协议的MAC和PHY层。ZigBee设备应该包括IEEE802.15.4(该标准定义了RF射频以及与相邻设备之间的通信)的PHY和MAC层&#xff0c;以及ZigBee堆栈层&#xff1a;网络层(NWK)、应用层和安…

[ZigBee] 15、Zigbee协议栈应用(一)——Zigbee协议栈介绍及简单例子(长文,OSAL及Zigbee入门知识)...

1、Zigbee协议栈简介 协议是一系列的通信标准,通信双方需要按照这一标准进行正常的数据发射和接收。协议栈是协议的具体实现形式,通俗讲协议栈就是协议和用户之间的一个接口,开发人员通过使用协议栈来使用这个协议,进而实现无线数据收发。 如图1所示:Zigbee协议分为两部分…

ZigBee协议栈简介

文章目录 Zigbee协议栈简介如何理解Zigbee协议栈如何使用Zigbee协议栈 Zigbee协议栈简介 Zigbee协议分为2部分&#xff1a; IEEE 802.15.4定义了PHY(物理层)和MAC(介质访问层)技术规范。Zigbee联盟定义了NWK(网络层)、APS(应用程序支持层)、APL(应用层)技术规范。 Zigbee协议栈…

[zigbee][z-Stack]协议栈简介及工作流程

文章目录 什么是zigbee协议栈&#xff1f;如何使用zigbee协议栈&#xff1f;z-Stack工作流程 什么是zigbee协议栈&#xff1f; 协议栈是协议的具体实现形式&#xff0c;通俗点来理解就是协议栈是协议和用户之间的一个缺口&#xff0c;开发人员通过使用协议栈来使用这个协议的&…

相机标定和双目相机标定标定原理推导及效果展示

文章目录 前言一、相机标定1.相机的四个坐标系2.相机的畸变 二、张正友标定法1.求解内参矩阵与外参矩阵的积2.求解内参矩阵3.求解外参矩阵4.标定相机的畸变参数5.双目标定6.极线矫正&#xff08;立体校正&#xff09; 三、视差图与深度图 前言 参考了一些大佬的文章&#xff0c…

视觉基础之相机标定

点击上方“小白学视觉”&#xff0c;选择加"星标"或“置顶” 重磅干货&#xff0c;第一时间送达 基于视觉的图像处理&#xff0c;通常要在实验前进行相机的标定&#xff0c;以获取相应的参数。为方便查阅&#xff0c;遂将常用到的三种相机标定总结如下。 相机内参标定…

照相机标定

一.相机标定的原理 1.1 相机如何成像&#xff1a; 相机成像系统中&#xff0c;共包含四个坐标系&#xff1a;世界坐标系、相机坐标系、图像坐标系、像素坐标系。 1.1.1 世界坐标系&#xff1a; 世界坐标系&#xff08;world coordinate&#xff09;&#xff0c;也称为测量坐…

Opencv——相机标定

相机标定的目的&#xff1a;获取摄像机的内参和外参矩阵&#xff08;同时也会得到每一幅标定图像的选择和平移矩阵&#xff09;&#xff0c;内参和外参系数可以对之后相机拍摄的图像就进行矫正&#xff0c;得到畸变相对很小的图像。 相机标定的输入&#xff1a;标定图像上所有…