Zigbee协议栈工作流程
- 格式:pdf
- 大小:143.53 KB
- 文档页数:8
上节刚刚讲了主函数,在那已经提到了osal_init_system和osal_start_system函数。
而协议栈是通过操作系统来维持运行的,所以就从这开始。
先说明:默认地,ZDApp_Init()[ZDApp.c]开始了设备在ZB网络中的启动,但是应用程序可以覆盖这个默认的行为。
应用程序要想掌控设备网络的开启,它必须将HOLD_AUTO_START包括为一个编译选项,并且推荐NV_RESTORE也为编译选项(用来在NV中保存ZB网络状态)本文的一些说法可能不严谨,敬请大家注意!1、采集节点启动并建立网络本文是针对ZStack-1.4.3-1.2.1\Projects\zstack\Samples\下的SimpleApp例程。
这个例子就是应用程序掌控设备网络的开启。
在主函数初始化OSAL调用osal_init_system函数的以后,函数见下:void osalInitTasks( void ){uint8 taskID = 0;tasksEvents = (uint16 *)osal_mem_alloc( sizeof( uint16 ) * tasksCnt);osal_memset( tasksEvents, 0, (sizeof( uint16 ) * tasksCnt));macTaskInit( taskID++ );nwk_init( taskID++ );Hal_Init( taskID++ );#if defined( MT_TASK )MT_TaskInit( taskID++ );#endifAPS_Init( taskID++ );ZDApp_Init( taskID++ );SAPI_Init( taskID );}这个函数是给每一层分配任务ID,优先级越高的ID越低,在此假设系统已经做好了所有的准备,并且想用应用程序掌控网络的建立,现在即将建立网络。
那我们就可以直接跳到SAPI_Init( taskID );这个函数。
z-stack的flash驱动。
在分析flash驱动之前,需要熟读cc2530的datasheet关于flash controller那一章节!我们先从hal_flash.c文件中的HalFlashRead函数开始:void HalFlashRead(uint8 pg, uint16 offset, uint8 *buf, uint16 cnt) {// Calculate the offset into the containing flash bank as it gets mapped into XDATA.uint8 *ptr = (uint8 *)(offset + HAL_FLASH_PAGE_MAP) +((pg % HAL_FLASH_PAGE_PER_BANK) *HAL_FLASH_PAGE_SIZE);uint8 memctr = MEMCTR; // Save to restore.#if !defined HAL_OAD_BOOT_CODEhalIntState_t is;#endifpg /= HAL_FLASH_PAGE_PER_BANK; // Calculate the flash bank from the flash page.#if !defined HAL_OAD_BOOT_CODEHAL_ENTER_CRITICAL_SECTION(is);#endif// Calculate and map the containing flash bank into XDATA. MEMCTR = (MEMCTR & 0xF8) | pg;while (cnt--){*buf++ = *ptr++;}MEMCTR = memctr;#if !defined HAL_OAD_BOOT_CODEHAL_EXIT_CRITICAL_SECTION(is);#endif}在讲解这个函数之前,先说一下z-stack中对flash的布局。
哎呀研究这个数据的发送和收发研究了2天了。
今天终于把困扰我很久的一个问题给解决了。
问题:终端节点启动会为什么会自动的发送数据呢?解决过程:这个过程可是异常的艰辛。
要解决这个问题。
咱们先聊聊这个整个zigbee协议栈的工作流程。
程序肯定都是从main函数开始的,这个肯定也不例外。
大家查看一下main函数主要就是关闭中断,检查电源电压是否够高,还有就是初始化了,什么物理层,mac层等等。
而我们在这里关注2个函数就好了。
第一个是:osal_init_system();第二个:osal_start_system();第一个osal_init_system()函数就是初始化与系统运行相关的一些东西如:初始化内存分配系统,初始化消息队列,初始化定时器,初始化电源管理系统,初始化第一块堆,最后一个就是我们要讲的一个非常重要的函数:osalInitTasks();初始化任务函数void osalInitTasks( void )//系统任务初始化函数{uint8 taskID = 0;//这个指针指向了所有任务空间的首地址tasksEvents = (uint16 *)osal_mem_alloc( sizeof( uint16 ) * tasksCnt);//这个tasksEvents指针总共有多少个数据空间,其实总共有多少任务就有多少个空间。
osal_memset( tasksEvents, 0, (sizeof( uint16 ) * tasksCnt));macTaskInit( taskID++ ); //mac层的任务是0nwk_init( taskID++ ); //网络层的任务是1Hal_Init( taskID++ ); //物理层的任务号是2#if defined( MT_TASK )MT_TaskInit( taskID++ );//串口的任务#endifAPS_Init( taskID++ );#if defined ( ZIGBEE_FRAGMENTATION )APSF_Init( taskID++ );#endifZDApp_Init( taskID++ );#if defined ( ZIGBEE_FREQ_AGILITY ) || defined ( ZIGBEE_PANID_CONFLICT )ZDNwkMgr_Init( taskID++ );#endifGenericApp_Init( taskID );//应用程序的初始化。
Zigbee协议栈的使用流程1. 什么是Zigbee协议栈Zigbee协议栈是一种基于IEEE 802.15.4标准的低功耗、自组织的无线通信协议。
它被广泛应用于物联网设备、智能家居、工业自动化等领域。
Zigbee协议栈提供了一套完整的网络协议和通信机制,方便开发者在无线传感器网络中进行通信和数据交换。
2. Zigbee协议栈的使用流程Zigbee协议栈的使用流程可以分为以下几个步骤:步骤一:选择Zigbee协议栈在开始使用Zigbee协议栈之前,首先需要选择合适的Zigbee协议栈。
目前市面上有许多不同的Zigbee协议栈提供商,可以根据自己的需求选择适合的协议栈。
步骤二:准备开发环境在开始使用Zigbee协议栈之前,需要准备好相应的开发环境。
这包括硬件设备、开发工具以及相应的驱动程序。
一般来说,开发者需要购买Zigbee芯片和开发板,并安装相应的开发工具和驱动程序。
步骤三:编写应用程序一旦准备好开发环境,就可以开始编写Zigbee应用程序了。
首先,需要了解Zigbee协议栈的API和接口,理解Zigbee网络的特点和通信机制。
然后,根据具体需求,设计和实现相应的功能模块,例如网络配置、数据传输和安全性等。
步骤四:测试和调试编写完应用程序后,需要进行测试和调试,以确保程序的正确性和稳定性。
可以通过模拟器或者实际的Zigbee设备进行测试。
测试过程中需要注意检查网络连接、数据传输和异常情况处理等方面的功能。
步骤五:部署和运行在完成测试和调试后,就可以将应用程序部署到真实的Zigbee设备上了。
根据具体的部署场景,可能需要进行设备安装、网络配置和数据监控等工作。
一旦部署完成,就可以正式运行Zigbee协议栈,并进行数据交换和通信了。
3. 使用Zigbee协议栈的注意事项在使用Zigbee协议栈的过程中,需要注意以下几个方面:•理解Zigbee网络的拓扑结构和层次关系,合理设计网络拓扑和路由规划。
•注意设备之间的信号强度和信号干扰的问题,确保通信质量和稳定性。
zigbee无线通信协议程序流程English Answer:1. Device Discovery:Scanning for nearby devices using the Zigbee Discovery Protocol.Identifying compatible devices and establishing communication channels.2. Network Formation:Forming a network with a coordinator, routers, and end devices.Establishing a mesh topology for robust connectivity.3. Data Transmission:Transmitting data packets from end devices to the coordinator or other devices on the network.Using the Zigbee Stack Profile (ZSP) for reliable and efficient data delivery.4. Network Management:Managing the network by adding or removing devices.Optimizing network performance through routing and topology adjustments.5. Security:Applying encryption and authentication mechanisms to protect data and prevent unauthorized access.Using the Zigbee Security Suite (ZSS) for robust security measures.6. Application Layer:Building applications that utilize the Zigbee protocol for communication and control.Developing smart home, industrial automation, and other applications that leverage the flexibility and reliability of Zigbee.中文回答:1. 设备发现:使用 Zigbee 发现协议扫描附近设备。
2.建立自己的项目2.1功能分析项目的功能一共有按键检测、发送数据、接收数据、小灯控制四种,在协议栈中已经将CC2430的底层驱动全部固化在协议栈中,我们直接调用就可以了。
2.2 添加一个任务整个协议栈是以一个OS贯穿的,我们要加入自己的应用,就要添加一个任务,(具体关于操作系统的介绍,请参考OSAL API_F8W-2003-0002_.pdf文档),在任务中执行,与协议栈实现无缝连接。
在协议栈中的OSAL.c文件中,byte osal_init_system( void )函数的功能是初始化OS、添加任务到OS任务表中。
在这个函数中通过调用osalAddTasks()函数来定制项目所需要应用的任务,该函数属于应用层和OS之间的接口函数,一般项目的建立需要根据系统的需要自己编写改函数,并将函数放到应用层。
osalAddTasks()函数是通过osalTaskAdd()函数完成任务添加。
首先,将支持协议栈功能需要的任务加载到该函数中,void osalAddTasks( void ){osalTaskAdd (Hal_Init, Hal_ProcessEvent, OSAL_TASK_PRIORITY_LOW);#if defined( ZMAC_F8W )osalTaskAdd( macTaskInit, macEventLoop,OSAL_TASK_PRIORITY_HIGH );#endif#if defined( MT_TASK )osalTaskAdd( MT_TaskInit, MT_ProcessEvent,OSAL_TASK_PRIORITY_LOW );#endifosalTaskAdd( nwk_init, nwk_event_loop, OSAL_TASK_PRIORITY_MED );osalTaskAdd( APS_Init, APS_event_loop,OSAL_TASK_PRIORITY_LOW );osalTaskAdd( ZDApp_Init, ZDApp_event_loop,OSAL_TASK_PRIORITY_LOW );}这些任务是协议栈运行的先决条件,为了更好的使用协议栈,建议将这些任务都添加到任务列表中。
2.ZigBee2.1设备类型(Device Types)在ZigBee网络中存在三种逻辑设备类型:Coordinator(协调器),Router(路由器)和End-Device(终端设备)。
ZigBee网络由一个Coordinator以及多个Router和多个End_Device组成。
上图是一个简单的ZigBee网络示意图。
其中黑色节点为Coordinator,红色节点为Router,白色节点为End-Device。
2.1.1Coordinator(协调器)协调器负责启动整个网络。
它也是网络的第一个设备。
协调器选择一个信道和一个网络ID(也称之为PAN ID,即Personal Area Network ID),随后启动整个网络。
协调器也可以用来协助建立网络中安全层和应用层的绑定(bindings)。
注意,协调器的角色主要涉及网络的启动和配置。
一旦这些都完成后,协调器的工作就像一个路由器(或者消失go away)。
由于ZigBee网络本身的分布特性,因此接下来整个网络的操作就不在依赖协调器是否存在。
2.1.2Router(路由器)路由器的功能主要是:允许其他设备加入网络,多跳路由和协助它自己的由电池供电的儿子终端设备的通讯。
通常,路由器希望是一直处于活动状态,因此它必须使用主电源供电。
但是当使用树群这种网络模式时,允许路由间隔一定的周期操作一次,这样就可以使用电池给其供电。
2.1.3End-Device(终端设备)终端设备没有特定的维持网络结构的责任,它可以睡眠或者唤醒,因此它可以可以是一个电池供电设备。
通常,终端设备对存储空间(特别是RAM的需要)比较小。
注意:在Z-Stack 1.4.1中一个设备的类型通常在编译的时候通过编译选项(ZDO_COORDINATOR 和RTR_NWK)确定。
所有的应用例子都提供独立的项目文件来编译每一种设备类型。
2.2栈配置(Stack Profil e)栈参数的集合需要被配置为一定的值,连同这些值在一起被称之为栈配置。
zigbee无线通信协议程序流程关键信息项:合同双方信息项目名称及描述协议目的及范围Zigbee协议技术要求项目实施计划及时间表合同金额及支付方式风险管理及保障措施变更及调整条款违约责任及处理措施保密条款知识产权归属争议解决方式合同的有效期及终止条件其他条款签署日期及地点1. 合同双方信息1.1 委托方(购买方)名称:____________________________1.2 委托方法定代表人或授权代表姓名:____________________________1.3 委托方联系地址:____________________________1.4 承包方(服务提供方)名称:____________________________1.5 承包方法定代表人或授权代表姓名:____________________________1.6 承包方联系地址:____________________________2. 项目名称及描述2.1 项目名称:____________________________2.2 项目描述及范围:____________________________2.3 项目实施地点:____________________________3. 协议目的及范围3.1 协议目的:确定Zigbee无线通信协议的应用及实施细节,确保双方对协议的理解和执行一致。
3.2 协议范围:包括Zigbee协议的技术实现、系统集成、测试及维护等方面的内容。
4. Zigbee协议技术要求4.1 Zigbee协议版本:____________________________4.2 技术规格和标准:____________________________4.3 设备兼容性要求:____________________________4.4 数据传输要求及网络安全标准:____________________________5. 项目实施计划及时间表5.1 实施计划:____________________________5.2 关键时间节点及里程碑:____________________________5.3 各阶段完成时间及验收时间:____________________________6. 合同金额及支付方式6.1 合同总金额:____________________________6.2 支付方式(如银行转账、支票等):____________________________6.3 支付时间及安排:____________________________6.4 其他费用及支付安排:____________________________7. 风险管理及保障措施7.1 风险识别与评估:____________________________7.2 风险管理计划及措施:____________________________7.3 履约保证金及其使用条件:____________________________7.4 意外情况处理及紧急预案:____________________________8. 变更及调整条款8.1 项目范围及技术要求变更的条件:____________________________8.2 变更申请及审批程序:____________________________8.3 变更导致的费用调整及时间安排:____________________________9. 违约责任及处理措施9.1 委托方违约责任:若委托方未按合同规定付款或提供必要的支持,承包方有权要求赔偿违约损失。
Zigbee 协议栈及应用实现1、ZigbeeZigbee 是一种新兴的短距离、低功率、低速率无线接入技术.工作在 2.4GHz 波段,传输速率为 10M~250kb/ s ,传输距离为10~75m. Zigbee 是基于 IEEE 802.15.4 的无线通信协议 ,它的协议结构由物理层(PHY)、介质访问层(MAC)、网络层(NWK)、应用层组成.Zigbee 主要应用在距离短、功耗低且传输速率不高的各种电子设备之间 ,典型的传输数据类型有周期性数据、间歇性数据和低反应数据.因而,它的应用目标主要是:工业控制(如自动控制设备、无线传感器网络) ,医护(如监视和传感) ,家庭智能控制(如照明、水电气计量及报警) ,消费类电子设备的遥控装置、PC外设的无线连接等领域.2、Zigbee 协议栈参考模型及实现(1)物理层的参考模型PHY层定义了物理无线信道和MAC子层之间的接口 ,提供物理层数据服务和物理层管理服务.物理层数据服务从无线物理信道上收发数据 ,物理层管理服务维护一个由物理层相关数据组成的数据库.物理层数据服务包括以下五方面的功能:①激活和休眠射频收发器;②信道能量检测(energy detect) ;③检测接收数据包的链路质量指示(link quality indication ,LQI) ;④空闲信道评估(clear channel assessment ,CCA) ;⑤收发数据.信道能量检测为网络层提供信道选择依据.它主要测量目标信道中接收信号的功率强度 ,由于这个检测本身不进行解码操作 ,所以检测结果是有效信号功率和噪声信号功率之和.链路质量指示为网络层或应用层提供接收数据帧时无线信号的强度和质量信息 ,与信道能量检测不同的是 ,它要对信号进行解码 ,生成的是一个信噪比指标.这个信噪比指标和物理层数据单元共同提交给上层处理.空闲信道评估判断信道是否空闲. IEEE 802.15. 4定义了三种空闲信道评估模式:第一种简单判断信道的信号能量 ,当信号能量低于某一门限值就认为信道空闲;第二种是通过判断无线信号的特征,这个特征主要包括两方面 ,即扩频信号特征和载波频率;第三种模式是前两种模式的综合 ,同时检测信号强度和信号特征 ,给出信道空闲判断.Zigbee 物理层帧结构,其中前导码4Byte ,主要用于前导同步;分组定界 1Byte ,标志分组的开始;物理层头1Byte ,表示数据单元的长度;物理层数据服务单元( PSDU)数据单元用于承载向上层即MAC 层传输数据.(2)MAC层参考模型及实现.MAC子层的参考模型如图 4 所示. MAC子层提供两种服务:MAC 层数据服务和MAC层管理服务(MAC sublayer manage2ment entity , MLME) .前者保证MAC协议数据单元在物理层数据服务中的正确收发 ,后者维护一个存储MAC子层协议状态相关信息的数据库.MAC子层主要功能包括下面六个方面:①协调器产生并发送信标帧 ,普通设备根据协调器的信标帧与协议器同步;②支持PAN 网络的关联(ass ociation)和取消关联(disass ociation)操作;③支持无线信道通信安全;④使用 CSMA - CA 机制访问信道;⑤支持时槽保障(guaranteed time slot , GTS)机制;⑥支持不同设备的MAC层间可靠传输.MAC子层定义了信标帧、数据帧、确认帧和命令帧.信标帧和数据帧包含了高层控制命令或者数据 ,确信帧和命令帧用于 Zigbee 设备MAC子层功能实体间控制信息的收发.MAC子层的帧结构由帧头、MAC 层服务数据单元和帧尾三部分组成. 帧头由帧控制信息2Byte、帧序列号1Byte 和地址信息组成420Byte (命令帧无地址信息) .MAC 子层数据服务单元(MSDU)具有可变长度 nByte ,具体内容由帧类型决定(命令帧无MSDU) .帧尾是帧头和负载数据的 16 位 CRC 校验序列(FCS) 2Byte.(3)网络层参考模型及实现.Zigbee 协议栈的核心部分在网络层.网络层负责拓扑结构的建立和维护、命名和绑定服务 ,它们协同完成寻址、路由、传送数据及安全这些不可或缺的任务 ,支持星形(Star)、树形 (Cluster- Tree)、网格 (Mesh) 等多种拓扑结构.MAC子层的参考模型如图 6 所示.为了满足应用层的要求 ,Zigbee 协议的网络层划分为网络层数据实体(NLDE)和网络层管理实体(NlME) ,NLDE提供相关的 SAP的数据传输服务 ,而 NLME则提供经由相关的 SAP的管理服务.网络层的主要功能包括以下八个方面:①通过添加恰当的协议头能够从应用层生成网络层的 PDU ,即NPDU.②确定网络的拓扑结构.③配置一个新的设备 ,可以是网络协调器也可以向存在的网络中加入设备.④建立并启动无线网络.⑤加入或离开网络.⑥Zigbee 的协调器和路由能为加入网络的设备分配地址.⑦发现并记录邻居表、路由表.⑧信息的接收控制 ,同步 MAC 子层或直接接受信息.网络层定义了数据帧和命令帧 ,它的帧结构由网络层头信息和数据负载构成.网络层帧头信息格式是固定的 ,帧控制2Byte ,目的地址 2Byte ,源地址 2Byte ,网络传输的半径1Byte ,但是地址域和序列号域并非在所有的帧结构中都出现.网络层数据域 nByte.其中目的地址、源地址、半径和序列和称为路由域.网络层数据帧和命令帧的区别在于命令的数据域有1Byte 的NWK命令标识符.(4)ZigBee APIZigBee协议栈支持应用程序接口API函数很多,主要有:ZigBee 设备对象ZDO API、应用支持子层APS API、端点数据发送接收AF API和网络层NWK API。
我使用的协议栈版本及例子信息:ZigBee2006\Texas Instruments\ZStack-1.4.3-1.2.1\Projects\zstack\Samples\SampleApp记录下个人对按键流程的理解在hal_key.c中有一段说明:/*********************************************************************NOTE: If polling is used, the hal_driver task schedules the KeyRead() to occur every 100ms. This should be long enough to naturallydebounce(去抖动) the keys. The KeyRead() function remembers the keystate of the previous poll and will only return a non-zerovalue if the key state changes.NOTE: If interrupts are used, the KeyRead() function is scheduled25ms after the interrupt occurs by the ISR. This delay is usedfor key debouncing. The ISR disables any further Key interruptuntil KeyRead() is executed. KeyRead() will re-enable Keyinterrupts after executing. Unlike polling, when interruptsare enabled, the previous key state is not remembered. Thismeans that KeyRead() will return the current state of the keys(not a change in state of the keys).NOTE: If interrupts are used, the KeyRead() fucntion is scheduled by the ISR. Therefore, the joystick movements will only be detectedduring a pushbutton interrupt caused by S1 or the center joystickpushbutton.NOTE: When a switch like S1 is pushed, the S1 signal goes from a normally high state to a low state. This transition is typically clean. Theduration of the low state is around 200ms. When the signal returnsto the high state, there is a high likelihood of signal bounce, whichcauses a unwanted interrupts. Normally, we would set the interruptedge to falling edge to generate an interrupt when S1 is pushed, butbecause of the signal bounce, it is better to set the edge to risingedge to generate an interrupt when S1 is released. The debounce logiccan then filter out the signal bounce. The result is that we typicallyget only 1 interrupt per button push. This mechanism is not totallyfoolproof because occasionally, signal bound occurs during the fallingedge as well. A similar mechanism is used to handle the joystickpushbutton on the DB. For the EB, we do not have independent controlof the interrupt edge for the S1 and center joystick pushbutton. Asa result, only one or the other pushbuttons work reasonably well withinterrupts. The default is the make the S1 switch on the EB work morereliably.*********************************************************************/对本协议中,对按键有两种处理方式:1、中断法:有按键按下,则进入中断,开启一软定时器25ms后,读取键值进行相应处理2、查询法:开启一软定时器,系统每隔100ms进行轮询,如有按键按下读取键值进行相应处理(软定时器即软件定时器,参见“系统时钟定时器”说明)首先看下协议栈对KEY的初始化,在InitBoard()函数中:/* Initialize Key stuff */OnboardKeyIntEnable = HAL_KEY_INTERRUPT_DISABLE;HalKeyConfig( OnboardKeyIntEnable, OnBoard_KeyCallback);从而知道协议栈默认的按键处理机制是查询法.就先来看下查询法的流程:1、查询法(或者轮询法)首先看下HalKeyConfig()这个函数用于把按键/开关/操纵杆服务配置为轮询或中断驱动。