Zigbee协议栈工作流程
zigbee协议栈
IEEE802.15.4
IEEE 802.15.4网络共定义了四种类型的帧:信标帧,数据 帧,确认帧和MAC命令帧
1)信标帧 信标帧的负载数据单元由四部分组成:超帧描述字段、GTS分配字段、 待转发数据目标地址字段和信标帧负载数据 2)数据帧 数据帧用来传输上层发到MAC子层的数据,它的负载字段包含了上层 需要传送的数据 3)确认帧 如果设备收到请求位被置1,设备需要回应一个确认帧,确认帧的序列 号应该与被确认帧的序列号相同,并且负载长度应该为零 4)命令帧 MAC命令帧用于组建PAN网络,传输同步数据等,主要完成三方面的 功能:把设备关联到PAN网络,与协调器交换数据,分配GTS
NetBEUI:是一种短小精悍、通信效率高的广播型协议,不 需要进行设置,适合于在“网络邻居”传送数据
IPX/SPX协议:联机的游戏都支持IPX/SPX协议,这些游戏 通过IPX/SPX协议更省事,因为根本不需要任何设置(比 TCP/IP省事)
网络协议
网络协议的层次结构如下:{此为ISO(国际标准化组织)制 定的OSI网络协议七层模型}
通过osalInitTasks( )函数创建OSAL任 务,其中TaskID为每个任务的唯一标 识号
任何OSAL任务必须分为两步:
一是进行任务初始化 二是处理任务事件
zigbee
一、任务初始化主要步骤如下:
(1)初始化应用服务变量。 const pTaskEventHandlerFn tasksArr[ ]数组定义系统提供的应用服务和用户 服务变量
物理层 数据链路层 网络层 传输层 会话层
表示层 应用层
物理连接,电缆,网卡,串口并口
以帧为单位传输数据,主要任务是建立数据封装及链接 网络网络之间的通信问题,提供路由,即最佳路径 解决传输数据质量问题,提供可靠的端到端的数据传输 会话连接到传输连接的映射,数据传送,会画连接的恢复和释放,会 画管理,令牌管理和活动管理 数据语法转换,语法表示,数据压缩和数据加密
zigbee协议栈流程
上节刚刚讲了主函数,在那已经提到了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 );这个函数。
第六章 zigbee协议栈详解
ZigBee回顾
ZigBee协议栈建立在IEEE802.15.4的PHY层和MAC子层规范之 上。
它实现了网络层(networklayer,NWK)和应用层( applicationlayer,APL)。
在应用层内提供了应用支持子层(applicationsupportsub-layer, APS)和 ZigBee 设备对象(ZigBee Device Object,ZDO)。
学时:4
ZigBee协议栈详解
目标: 本章在向学员介绍物联网体系中传输层所使用 的相关技术,通过本课的学习,学员应该掌握 如下知识: IP协议栈的应用 WLAN无线网络应用
大纲
协议栈内部结构 IEEE802.15.4 标准和 ZigBee 协议 协议栈软件总体设计 网络层(NWK)设计 应用层 MAC 层设计 物理层(PHY)设计
ZigBee协议栈的实时性要求并不高,因此在设计任务调度程序时 ,OSAL只采用了轮询任务调度队列的方法来进行任务调度管理。
这个轮询就存在于osal_start_system( )函数中 重视优先级的调度方式
do { if (tasksEvents[idx]) // Task is highest priority that is ready. { break; }
目前 TinyOS 系统支持的平台只有 ATMEL 公司的 AVR 系列、TI 公司的 MSP430系列。由于TinyOS操作系统还没有对Chipcon公司提供CC2430开发平 台提供支持,因此,要在 CC2530 开发平台上使用 TinyOS 系统来开发 ZigBee 协议栈软件,就必须首先对 TinyOS 进行移植。
协议栈主要流程
见Zmain.c中的main函数
zigbee协议栈flash操作
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有关的数据的发送和接收
哎呀研究这个数据的发送和收发研究了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协议栈的使用流程
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无线通信协议程序流程
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 发现协议扫描附近设备。
zibgee协议工作过程
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 );}这些任务是协议栈运行的先决条件,为了更好的使用协议栈,建议将这些任务都添加到任务列表中。
Zigbee协议栈工作流程
Zigbee 协议栈工作流程
1、消息处理流程
首先,简介一下消息处理机制,一般都利用回调函数实现的,当某一个事件发生,比如 按键,它就会调用 按键的回调函数(或者叫响应函数),通过回调函数生成一个任务,并通 过任务发送 osal_msg_send 函数,发送消息处理循环,并注册事件,等待处理。应用层的事 件处理函数检测到事件后,调用相应的处理函数。
每次任务处理,都有一个时隙,如果处理不完,则保留该任务,到下一个周期再进行处 理。您可以通过设置断点来观察程序的运行情况,单步跟踪是没有用的,因为,整个协议栈 是消息处理机制,采用定时器控制的,单步运行无法控制定时器。下面以按键处理说明消息 处理机制,其它都是一样的,另外,不要深究无线数据是如何接收和发送的,协议栈有好多 分层,底层是 802.15.4,深究下去没必要,你只管 API 函数就行了。
osal_start_timerEx( Hal_TaskID, HAL_KEY_EVENT, 100); } #endif // HAL_KEY
return events ^ HAL_KEY_EVENT; } …………………
} HalKeyPoll();这函数使用查询功能实现检测按键,并获得了键值,然后调用按键的回调函数 OnBoard_KeyCallback,将按键事件发送出去,送到应用层去处理。
6
希望微控工作室
附:zigbee 试验内容
7
希望微控工作室
8Leabharlann 2希望微控工作室
这个函数里,找到 osal_msg_send( registeredKeysTaskID, (uint8 *)msgPtr ); 这个函数将按键发送到消息处理循环。 再看这个函数里的 //消息队列管理 osal_msg_enqueue( &osal_qHead, msg_ptr ); //设置按键事件 osal_set_event( destination_task, SYS_EVENT_MSG ); 在设置按键这个函数里,我们看到: tasksEvents[task_id] |= event_flag;
第六章 zigbee协议栈详解
ZigBee协议栈详解
目标: 本章在向学员介绍物联网体系中传输层所使用 的相关技术,通过本课的学习,学员应该掌握 如下知识: IP协议栈的应用 WLAN无线网络应用
大纲
协议栈内部结构 IEEE802.15.4 标准和 ZigBee 协议 协议栈软件总体设计 网络层(NWK)设计 应用层 MAC 层设计 物理层(PHY)设计
原语的概念
ZigBee 协议按照开放系统互联的 7 层模型将协议分成了一系列的层结 构,各层之间通过相应的服务访问点来提供服务。这样使得处于协议中 的不同层能够根据各自的功能进行独立的运作,从而使整个协议栈的结 构变得清晰明朗。另一方面,由于 ZigBee 协议栈是一个有机的整体, 任何 ZigBee 设备要能够正确无误的工作,就要求协议栈各层之间共同 协作。因此,层与层之间的信息交互就显得十分重要。ZigBee 协议为 了实现层与层之间的关联,采用了称为服务“原语”的操作。
Zigbee绑定操作
ZigBee协议ห้องสมุดไป่ตู้各层帧结构之间的关系
在 ZigBee 协议栈中,任何通信数据都是利用帧的格式来组织的 。协议栈的每一层都有特定的帧结构。当应用程序需要发送数 据时,它将通过 APS 数据实体发送数据请求到 APS。随后在它 下面的每一层都会为数据附加相应的帧头,组成要发送的帧信 息。
分裂、重新组装和可靠数据传输 地址映射来自于64位IEEE地址和16位网络地址
ZigBee 设备对象(ZDO)
负责定义网络中设备的角色,如:协调器或者终端设备 对绑定请求的初始化或者响应。 在网络设备之间建立安全联系 在网络中发现设备和决定供给哪个应用服务
实现这些功能,ZDO 使用 APS 层的 APSDE-SAP 和网络 层的 NLME-SAP。ZDO 是特殊的应用对象,它在端点 (endpoint)0 上实现。
Zigbee协议栈
MAC地址:MAC address 扩展地址:Extended address
网络地址
16-bit
逻辑地址:Logical Address 短地址:Short Address
ZigBee协议栈已经实现了ZigBee协议,用户可以使 用协议栈提供的API进行应用程序的开发,在开发过 程中完全不必关心ZigBee协议的具体实现细节,要 关心的问题是:应用层的数据是使用哪些函数通过 什么方式把数据发送出去或者把数据接收过来的。 所以最重要的是我们要学会使用ZigBee协议栈
1. ZigBee网络中只能有一个协调器,可以有多个路由器和多个终端设备。 如图所示,黑色节点为协调器,灰色节点路由器,白色节点为终端设备。
(1)协调器的作用 ① 协调器是每个独立的Zigbee网络中的核心设备,负责选择一个信道和 一个网络ID(也称PAN ID),启动整个ZigBee网络。 ② 协调器的主要角色是负责建立和配置网络。由于Zigbee网络本身的分 布特性,一旦Zigbee网络建立完成后,整个网络的操作就不再依赖协调 器是否存在,与普通的路由器没有什么区别。
ZigBee网络中的设备地址 讲述ZigBee网络中的地址类型之前,需要了解一 下ZigBee网络中设备类型,在ZigBee无线网络中, 主要有三种类型的设备,设备类型的选择是在编 译时根据不同的编译选项来确定的。 1.协调器(Coordinator) 2.路由器(Router) 3.终端节点(End-device)
ZigBee网络中的设备地址
在网络中进行通信,需要标识每个设备的地址,在ZigBee 无线网络中,设备地址有以下两种。 1)64-bit的IEEE地址(64-bit IEEE address) 2)16-bit的网络地址(16-bit network address)
ZigBee协议栈Z-Stack开发指南
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协议栈ppt
IEEE802.15.4
IEEE 802.15.4的协议栈架构 的协议栈架构
应用程序通过它和协议层进 行交互来实现MCPS/MLME 的请求和确认,消息的标识 和回应 应用程序通过板卡API和传感 器板或者控制器板访问板卡 上的设备
应用程序通过API和芯片上集 成的外围设备(如AD,DA, Timers...)进行交互 硬件层产生各种中断通过中断 句柄将其转发给各个软件模块 协议层和更底层的硬件 以及寄存器进行交互
MAC子层 子层
MAC层帧结构的设计目标是用最低复杂度实现数据可靠传输 每个 MAC子层的帧都由帧头、负载和帧尾三部分组成 # 帧头由帧控制信息、帧序列号和地址信息组成 # 负载(数据)具有可变长度,具体内容由帧类型决定 # 帧尾是帧头和负载数据的16位CRC校验序列
IEEE802.15.4
IEEE 802.15.4网络共定义了四种类型的帧:信标帧,数据 网络共定义了四种类型的帧: 网络共定义了四种类型的帧 信标帧, 确认帧和MAC命令帧 帧,确认帧和 命令帧
zigbee
Z-stack流程图 流程图
zigbee
主函数
协议栈已经放在了库文件当中,是通用文件 main函数存在于Zmain函数当中,先是从main函数开始运行的,main函数实现 的功能是,初始化硬件、初始化网络(加入/创建网络)、初始化任务列表、进 入任务处理循环 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( )等
zigbee无线通信协议程序流程
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 协议栈及应用实现
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。
zigbee协议栈按键流程
我使用的协议栈版本及例子信息: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()这个函数用于把按键/开关/操纵杆服务配置为轮询或中断驱动。
ZigBee协议栈NV操作
NV操作实验
static void rxCB(unit8 port,uint8 event); { Uint8 value_read;//定义一个变量从用于从NV存储器读 取数据。 uint8 value=18;//要写入的NV条目数据 uint8 uartbuf[2];//定义一个缓冲区用于存放读取数据 uint8 cmd[6];//定义一个命令缓冲区,存放读取的命令 HalUARTRead(0,cmd,6)读取的命令放在cmd数组中
#include "hal_key.h" #include "sensor.h" #ifdef EXSENSOR #include "exsensor.h" #endif #include "hal_adc.h" #include "MT_UART.h #include”OSAL_Nv.h”//添 加代码
uint8 value=20; //添加写入NV条目变量 …………………………………………. case SPI_INCOMING_ZTOOL_PORT: HalUARTRead( MT_UART_DEFAULT_PORT,R_Buffer.data, 16 ); if( osal_nv_item_init(TEST_NV,1,NULL) == ZSUCCESS ) {
NV操作函数
Uint8 osal_nv_write(uint16 id,uint16 ndx,uint16,len,void*buf) 这个是NV写入函数。该函数4个参数含义如下: Uint16 id:NV条目ID号; Uint16 ndx:距离条目开始地址的偏移量; Uint16len:要写入的数据长度; Void*buf:指向存放写入数据缓冲代码:
CC2530zigbee技术-简介协议栈
CC2530zigbee技术-简介协议栈前⾔说实话,我喜欢⾃⼰的原创,虽然我写得可能简单了,但我觉得⾃⼰在写博客的路途上,⼀点⼀点地积累知识,我也借鉴别⼈的东西,特别是在写这篇⽂章时所使⽤的是markdownpad2写的,原来我根本就不知道还有这个玩意,所以相信在园⾥的朋友们都会⽀持的,如果您知道了,或者懂了,就默默地⽆视⼩弟我写的博客,如果没有接触过呢,嘿嘿,我们⼀起研究进步!协议栈TI公司很⽜,这是给我的感觉,它能把那些复杂的东西全部写好,就提供⼀些API来给我们使⽤,让⽤户更加⽅便,这个是我对它崇拜的地⽅,好了,不说废话了,进⼊正题。
下⾯就是协议栈的框图了那么所谓的协议栈指的就是TI公司的Z-STACK,不得不说⼈们的智慧是⽆穷的,这样⼀个基于8051的芯⽚在上⾯写了⼀个操作系统其名为Z-stack采⽤的⽅法是任务轮回的⽅法,⽽且任务ID值越⼩,优先级越⾼!我们使⽤IAR打开TI公司提供的example 路径如下:C:\Texas Instruments\ZStack-CC2530-2.3.0-1.4.0\Projects\zstack\Samples\SampleApp\CC2530DB可以看到⾮常清楚的⼯作⽬录。
协议栈函数解析⾸先我们找到Zmain⽬录下的zmain.c,找到int main();没错,这就是传说中的主函数int main( void ){osal_int_disable( INTS_ALL );//关闭所有的中断HAL_BOARD_INIT();//初始化时钟信号zmain_vdd_check();//检查芯⽚电压InitBoard( OB_COLD );//初始化IO LED TIMERHalDriverInit();//初始化芯⽚各硬件模块osal_nv_init( NULL );//初始化flashZMacInit();//初始化MAC层zmain_ext_addr();//确定16位地址zgInit();//初始化⾮易失变量#ifndef NONWKafInit();#endifosal_init_system();//初始化操作系统osal_int_enable( INTS_ALL );//使能全部中断InitBoard( OB_READY );//初始化按键zmain_dev_info();//显⽰设备信息#ifdef LCD_SUPPORTEDzmain_lcd_init();//在LCD上显⽰设备信息#endif#ifdef WDT_IN_PM1WatchDogEnable( WDTIMX );#endifosal_start_system(); // No Return from here 进⼊操作系统后不再返回return 0;}main()哈哈,我已经做了翻译⼯作,但是不⼀定是对的,因为毕竟是站在我的理解上写的!上述的代码基本上都是⼀些初始化的代码,⼀个硬件的启动必须要有各种各样的设定才⾏!下⾯分两个来讲,主要是讲两个函数:osal_init_system()和osal_start_system(),因为这两个函数可是重中之中啊!osal_init_system()函数分析在IAR中go to defintion就可以了,当然你也可以在OSAL.c这个⽂件中找到:uint8 osal_init_system( void ){// Initialize the Memory Allocation Systemosal_mem_init();//初始化内存分配系统// Initialize the message queueosal_qHead = NULL;//初始化消息队列// Initialize the timersosalTimerInit();//初始化定时器// Initialize the Power Management Systemosal_pwrmgr_init();//初始化店⾥管理系统// Initialize the system tasks.osalInitTasks();//初始化系统任务// Setup efficient search for the first free block of heap.osal_mem_kick();return ( SUCCESS );}osal_start_system()函数分析同样的道理,你也可以找到这个函数的定义void osal_start_system( void ){#if !defined ( ZBIT ) && !defined ( UBIT )for(;;) // Forever Loop永远循环#endif{uint8 idx = 0;osalTimeUpdate();//扫描哪个事件被触发了,然后置相应的标志位Hal_ProcessPoll(); // This replaces MT_SerialPoll() and osal_check_timer().do {if (tasksEvents[idx]) // Task is highest priority that is ready.{break; //得到待处理的优先级最⾼的是任务ID idx}} 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);//退出临界区保护events = (tasksArr[idx])( idx, events );//通过指针调⽤处理函数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}}相信看了上⾯的注释,对于zigbee的z-stack有了⼀定的了解了吧!总结我们可以得出以下的⼤致流程:。
1.协议栈工作流程和无线收发控制LED
橙丁科技
网址:
看源码推荐大家使用 Source Insight,十分强大的工具,从事软件必备软件,除非你想做菜 鸟,具体使用请参考相关资料与软件 \其他学习资料\Zigbee 参考资料\ Source Insight 使 用教程.pdf。下 面列出实验中涉及到比较重要的函数进行详解,由于是带协议栈第一个实 验,我们对源码也 进行注释,方便习惯看源码的同志学习。我建议大家先看看下面的文章, 再阅读一次源码加 深印象,后面的例子结构基本相同,所以学好此实验,再做后面的实验 就得心应手了。用户 自己添加的应用任务程序在 Zstack 中的调用过程: main()---> osal_init_system()---> osalInitTasks()---> SampleApp_Init() 下面我们就先从 main()函数开始吧。
由 IAR IDE 自动生 成。
如果使用 IAR 打开工程停止响应或关闭,说明你路径太长,IAR 丌识别,把路径改短或移上
几层目录即可解决。 带协议栈的工程怎么这么多文件夹和文件,都有什么用啊?现阶段
大家只要带着这个疑问照 着做实验就行了,后面实验接触多了自然就懂了。 1. 编译协议器的程序,在 Workspace 下拉框中选择“CoordinatorEB-Pro”,在工程名上点 右键 选择”Rebuild All”,没错误提示再下载到开发板当中。尽量教大家用一些快捷方 ZigBee 协议栈简介
2. 如何使用 ZigBee 协议栈
3. ZigBee 协议栈的安装、编译不下载
4. 协议栈无线收发控制 LED
5. 协议栈工作流程 实现现象: 协调器、终端上电,组网成功后 D1 灯闪烁
前言
前面讲了理论和实验都是为这章做铺垫的,整个学习中本章的实验是重中之重,也是我
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
/* Initialize Key stuff */ OnboardKeyIntEnable = HAL_KEY_INTERRUPT_DISABLE; HalKeyConfig( OnboardKeyIntEnable, OnBoard_KeyCallback); } } 看一下红色部分函数,找到原型函数(右键,Go to Definiton of …..) void HalKeyConfig (bool interruptEnable, halKeyCBack_t cback) 注 册 了 OnBoard_KeyCallback 作 为 回 调 函 数 , 也 就 是 按 键 处 理 函 数 , OnBoard_KeyCallback 这个函数位于 OnBoard.c 文件里, 再看一下这个函数: 找到这个语句: if ( OnBoard_SendKeys( keys, shift ) != ZSuccess ) 可见,当按键按下以后,会调用 OnBoard_SendKey 函数,生成了任务号
每次任务处理,都有一个时隙,如果处理不完,则保留该任务,到下一个周期再进行处 理。您可以通过设置断点来观察程序的运行情况,单步跟踪是没有用的,因为,整个协议栈 是消息处理机制,采用定时器控制的,单步运行无法控制定时器。下面以按键处理说明消息 处理机制,其它都是一样的,另外,不要深究无线数据是如何接收和发送的,协议栈有好多 分层,底层是 802.15.4,深究下去没必要,你只管 API 函数就行了。
if (events & HAL_KEY_EVENT) {
#if (defined HAL_KEY) && (HAL_KEY == TRUE) /* Check for keys */
5
希望微控工作室
HalKeyPoll();
/* if interrupt disabled, do next polling */ if (!Hal_KeyIntEnable) {
中记录的需要运行的任务,在本次循环中才会被调用到,这就是事件处理函数,整个协议的 核心部分。tasksArr 定义如下:
const pTaskEventHandlerFn tasksArr[] = {
4
希望微控工作室
macEventLoop, nwk_event_loop, Hal_ProcessEvent, #if defined( MT_TASK ) MT_ProcessEvent, #endif APS_event_loop, ZDApp_event_loop,
SAPI_ProcessEvent }; 这个函数列表在 osalInitTask 里严格按顺序初始化,否则就乱套了 这里我们只关心按键任务处理函数 Hal_ProcessEvent 找到这个函数:在文件 hal_drivers.c uint16 Hal_ProcessEvent( uint8 task_id, uint16 events ) { ……………
(2)Hal_ProcessPoll(); 主要用于轮询串口
(3)events = tasksEvents[idx]; //从任务列表里获得要处理的事件,这个数组存放的是从序号 为 0 到 tasksCn,t 每个任务在本次循环中是否要被运行,需要运行的任务其值非 0,否则为 0。
(4)events = (tasksArr[idx])( idx, events ); tasksArr[idx] 是一个函数数组,存放了对应每个任务的入口地址,只有在 tasksEvents
希望微控工作室
Zigbee 协议栈工作流程
1、消息处理流程
首先,简介一下消息处理机制,一般都利用回调函数实现的,当某一个事件发生,比如 按键,它就会调用 按键的回调函数(或者叫响应函数),通过回调函数生成一个任务,并通 过任务发送 osal_msg_send 函数,发送消息处理循环,并注册事件,等待处理。应用层的事 件处理函数检测到事件后,调用相应的处理函数。
1
希望微控工作室
{ // Interrupts off osal_int_disable( INTS_ALL ); // Turn all LEDs off HalLedSet( HAL_LED_ALL, HAL_LED_MODE_OFF ); // Check for Brown-Out reset ChkReset();
3
希望微控工作室
(4)events = (tasksArr[idx])( idx, events );
(5)tasksEvents[idx] |= events; // 任务没有处理完
(1)osalTimeUpdate(); 这个函数用于更新时隙,看一下原代码,可知,嘀嗒周期为 320us
6
希望微控工作室
附:zigbee 试验内容
7希望微控工作室 Nhomakorabea8
由此可见,按键消息被添加进任务列表,等待任务处理
下面回到 void osal_start_system( void ) 函数里,主程序初始化完成后,就是开始了系 统运行,因此,介绍一下这里的函数。去掉一些辅助的代码,就剩下:
(1)osalTimeUpdate(); (2)Hal_ProcessPoll(); (3)events = tasksEvents[idx];
osal_start_timerEx( Hal_TaskID, HAL_KEY_EVENT, 100); } #endif // HAL_KEY
return events ^ HAL_KEY_EVENT; } …………………
} HalKeyPoll();这函数使用查询功能实现检测按键,并获得了键值,然后调用按键的回调函数 OnBoard_KeyCallback,将按键事件发送出去,送到应用层去处理。
2、按键消息处理
注册回调函数。回调函数就是中断服务程序,每次中断发生之后,系统调用该函数,因 此,该函数在程序初始化的时候,就已经完成了注册。
主函数 ZMain.c 里的 InitBoard( OB_COLD ); void InitBoard( uint8 level ) {
if ( level == OB_COLD )
2
希望微控工作室
这个函数里,找到 osal_msg_send( registeredKeysTaskID, (uint8 *)msgPtr ); 这个函数将按键发送到消息处理循环。 再看这个函数里的 //消息队列管理 osal_msg_enqueue( &osal_qHead, msg_ptr ); //设置按键事件 osal_set_event( destination_task, SYS_EVENT_MSG ); 在设置按键这个函数里,我们看到: tasksEvents[task_id] |= event_flag;