ZigBee协议栈初始化网络启动流程
- 格式:doc
- 大小:19.00 KB
- 文档页数:5
星形网络和树型网络可以看成是网状网络的一个特殊子集,所以接下来分析如何组建一个Zigbee网状网络。
组建一个完整的Zigbee网络分为两步:第一步是协调器初始化一个网络;第二步是路由器或终端加入网络。
加入网络又有两种方法,一种是子设备通过使用MAC层的连接进程加入网络,另一种是子设备通过与一个先前指定的父设备直接加入网络。
一、协调器初始化网络协调器建立一个新网络的流程如图1所示。
图1 协调器建立一个新网络1、检测协调器建立一个新的网络是通过原语NLME_NETWORK_FORMATION.request发起的,但发起NLME_NETWORK_FORMATION.request原语的节点必须具备两个条件,一是这个节点具有ZigBee协调器功能,二是这个节点没有加入到其它网络中。
任何不满足这两个条件的节点发起建立一个新网络的进程都会被网络层管理实体终止,网络层管理实体将通过参数值为INVALID_REQUEST的NLME_NETWORK_FORMATION.confirm的原语来通知上层这是一个非法请求。
2、信道扫描协调器发起建立一个新网络的进程后,网络层管理实体将请求MAC子层对信道进行扫描。
信道扫描包括能量扫描和主动扫描两个过程。
首先对用户指定的信道或物理层所有默认的信道进行一个能量扫描,以排除干扰。
网络层管理实体将根据信道能量测量值对信道进行一个递增排序,并且抛弃能量值超过了可允许能量值的信道,保留可允许能量值内的信道等待进一步处理。
接着在可允许能量值内的信道执行主动扫描,网络层管理实体通过审查返回的PAN描述符列表,确定一个用于建立新网络的信道,该信道中现有的网络数目是最少的,网络层管理实体将优先选择没有网络的信道。
如果没有扫描到一个合适的信道,进程将被终止,网络层管理实体通过参数仠为STARTUP_FAILURE的NLME_NETWORK_FORMATION.confirm的原语来通知上层初始化启动网络失败。
上节刚刚讲了主函数,在那已经提到了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工程启动流程解析1、Zigbee工程启动流程解析初始化流程:main() -> osal_init_system() -> osalInitTasks() -> GenericApp_Init()事件流程: main() -> osal_start_system() -> (tasksArr[idx])( idx, events ) -> GenericApp_ProcessEvent()2、GenericApp_ProcessEvent()中if ( events & SYS_EVENT_MSG ):SYS_EVENT_MSG是协议栈已经定义好的系统事件if ( events & GENERICAPP_SEND_MSG_EVT ):GENERICAPP_SEND_MSG_EVT就是用户自定义的事件事件号是一个16bit的常量,使用独热码(one-hot code)编码,方便进行event的提取,这样一个task中最多可以有16个event,SYS_EVENT_MSG已经占用了0x8000,故自定义的事件只能有16个。
事件提取events & GENERICAPP_SEND_MSG_EVT,事件清除events ^ GENERICAPP_SEND_MSG_EVT。
用户可以自定义系统事件的消息范围为0xE0~0xFF3、AF_INCOMING_MSG_CMD:当模块接收到属于自己的无线数据信息时就会触发消息ZDO_STATE_CHANGE:当网络状态改变时就会触发此消息4、osal_start_timerEx( GenericApp_TaskID,GENERICAPP_SEND_ MSG_EVT,GENERICAPP_SEND_MSG_TIMEOUT )osal_start_timerEx()的作用是启动一系统定时器,当其溢出(GENERICAPP_SEND_MSG_TIMEOUT)时,会触发task (GenericApp_TaskID)的事件(GENERICAPP_SEND_MSG_EVT)。
zigbee无线通信模块通信流程下载温馨提示:该文档是我店铺精心编制而成,希望大家下载以后,能够帮助大家解决实际的问题。
文档下载后可定制随意修改,请根据实际需要进行相应的调整和使用,谢谢!并且,本店铺为大家提供各种各样类型的实用资料,如教育随笔、日记赏析、句子摘抄、古诗大全、经典美文、话题作文、工作总结、词语解析、文案摘录、其他资料等等,如想了解不同资料格式和写法,敬请关注!Download tips: This document is carefully compiled by theeditor.I hope that after you download them,they can help yousolve practical problems. The document can be customized andmodified after downloading,please adjust and use it according toactual needs, thank you!In addition, our shop provides you with various types ofpractical materials,such as educational essays, diaryappreciation,sentence excerpts,ancient poems,classic articles,topic composition,work summary,word parsing,copy excerpts,other materials and so on,want to know different data formats andwriting methods,please pay attention!深入理解Zigbee无线通信模块的通信流程Zigbee,一种基于IEEE 802.15.4标准的低功耗、短距离、无线通信技术,广泛应用于物联网、智能家居等领域。
星形网络和树型网络可以看成是网状网络的一个特殊子集,所以接下来分析如何组建一个Zigbee网状网络。
组建一个完整的Zigbee网络分为两步:第一步是协调器初始化一个网络;第二步是路由器或终端加入网络。
加入网络又有两种方法,一种是子设备通过使用MAC层的连接进程加入网络,另一种是子设备通过与一个先前指定的父设备直接加入网络。
一、协调器初始化网络协调器建立一个新网络的流程如图1所示。
图1 协调器建立一个新网络1、检测协调器建立一个新的网络是通过原语发起的,但发起原语的节点必须具备两个条件,一是这个节点具有ZigBee协调器功能,二是这个节点没有加入到其它网络中。
任何不满足这两个条件的节点发起建立一个新网络的进程都会被网络层管理实体终止,网络层管理实体将通过参数值为INVALID_REQUEST的的原语来通知上层这是一个非法请求。
2、信道扫描协调器发起建立一个新网络的进程后,网络层管理实体将请求MAC子层对信道进行扫描。
信道扫描包括能量扫描和主动扫描两个过程。
首先对用户指定的信道或物理层所有默认的信道进行一个能量扫描,以排除干扰。
网络层管理实体将根据信道能量测量值对信道进行一个递增排序,并且抛弃能量值超过了可允许能量值的信道,保留可允许能量值内的信道等待进一步处理。
接着在可允许能量值内的信道执行主动扫描,网络层管理实体通过审查返回的PAN描述符列表,确定一个用于建立新网络的信道,该信道中现有的网络数目是最少的,网络层管理实体将优先选择没有网络的信道。
如果没有扫描到一个合适的信道,进程将被终止,网络层管理实体通过参数仠为STARTUP_FAILURE的的原语来通知上层初始化启动网络失败。
3、配置网络参数如果扫描到一个合适的信道,网络层管理实体将为新网络选择一个PAN描述符,该PAN描述符可以是由设备随机选择的,也可以是在里指定的,但必须满足PAN描述符小于或等于0x3fff,不等于0xffff,并且在所选信道内是唯一的PAN描述符,没有任何其它PAN描述符与之是重复的。
ZigBee设备⼊⽹流程之关联⽅式ZigBee设备⼊⽹流程ZigBee设备⼊⽹有关联⽅式和直接⽅式两种,我所熟悉的是关联⽅式,这也是最常⽤的⽅式。
关联⽅式step1 设备发出Beacon Request设备会在预先设置的⼏个信道⾥⾯按照指定的顺序逐信道发出这个包,看到Dest PAN ID,Dest Address都是0xFFFF,说明这是个⼴播包,在这些信道⾥⾯的⽹络都会收到它。
step2 route节点发出Beacon回复这个回复⾥⾯有五个关键的值Source PAN ID :回复Beacon的这个设备所处⽹络的PAN IDSource Address:回复Beacon的这个设备所处⽹络的短地址Association Permit:关联许可是否开放Router Capacity:可否接⼊Route节点End Device Capacity:可否接⼊End Device能收到⼊⽹设备发出的Beacon Request的⽹络都会回复Beacon,并且同⼀个⽹络⾥⾯能收到⼊⽹设备Beacon Request的FFD设备都会回复Beacon。
这样⼀来,⼀般⼊⽹设备会受到多个Beacon回复。
那么它会按照下列的顺序,并且结合这帧Beacon的Link Quality来进⾏下⼀步动作:1. ⼊⽹设备⾸先判断Association Permit是否开放,这个是需要协调器发出全⽹⼴播,通知所有route节点这个许可开放了。
2. 如果关联许可是开放的,再根据⾃⼰所属的设备类型来判断Router Capacity、End Device Capacity。
3. 如果可以接⼊,再筛选最佳Link Quality的设备发出Association Request,这个时候就需要⽤Beacon⾥⾯的Source PAN ID和SourceAddress发出⼀个MAC层的单播包。
step3 设备发出Association Requeststep4 route发出Association Responsestep5 秘钥传输step5 Device AnnounceDevice Announce的⼴播数据主要是通知全⽹相关节点有⼀个新设备进来了,给⼤家做个⾃我介绍,⼤家刷新下路由表这类的信息。
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协议规范zigbee协议概述1.1.1zigbee堆栈层zigbee堆栈是在ieee802.15.4标准基础上建立的,定义了协议的mac和phy层。
zigbee设备应该包括ieee802.15.4(该标准定义了RF射频以及与相邻设备之间的通信)的phy和mac层,以及zigbee堆栈层:网络层(nwk)、应用层和安全服务提供层。
图1-1给出了这些组件的概况。
图1-1zigbe堆栈框架每个zigbee设备都与一个特定模板有关,可能是公共模板或私有模板。
这些模板定义了设备的应用环境、设备类型以及用于设备间通信的簇。
公共模板可以确保不同供应商的设备在相同应用领域中的互操作性。
设备是由模板定义的,并以应用对象(applicationobjects)的形式实现(见图1-1)。
每个应用对象通过一个端点连接到zigbee堆栈的余下部分,它们都是器件中可寻址的组件从应用角度看,通信的本质就是端点到端点的连接(例如,一个带开关组件的设备与带一个或多个灯组件的远端设备进行通信,目的是将这些灯点亮)。
端点之间的通信是通过称之为簇的数据结构实现的。
这些簇是应用对象之间共享信息所需的全部属性的容器,在特殊应用中使用的簇在模板中有定义。
图1-1-2就是设备及其接口的一个例子:每个接口都能接收(用于输入)或发送(用于输出)簇格式的数据。
一共有二个特殊的端点,即端点0和端点255。
端点0用于整个zigbee设备的配置和管理。
应用程序可以通过端点0与zigbee堆栈的其它层通信,从而实现对这些层的初始化和配置。
附属在端点0的对象被称为zigbee设备对象(zd0)。
端点255用于向所有端点的广播。
端点241到254是保留端点。
所有端点都使用应用支持子层(aps)提供的服务。
aps通过网络层和安全服务提供层与端点相接,并为数据传送、安全和绑定提供服务,因此能够适配不同但兼容的设备,比如带灯的开关。
如何恢复Zigbee出厂设置
工业级Zigbee按照恶劣环境要求设计,具有极强的抗干扰能力、低功耗、组网灵活,性能可靠稳定等优点和特性。
Zigbee是一个将RS232串口设备的串口通信立即转换为Zigbee无线网络通信的双向转换传输设备。
Zigbee根据用户自己的实际需要进行选定。
Zigbee包括三种类型:协调器(Coordinator)、路由器(Router)、终端节点(End Device),这三类设备具备不同的网络功能,协调器时网络的中心节点,负责网络的发起组织、网络维护和管理功能;路由器负责数据的路由中继转发;终端节点只进行本节点数据的发送和接收。
在一个Zigbee 应用网络中,必须有且只有一个协调器和多个路由器或者终端节点组成。
1、打开”配置工具”。
2、在“产品型号选择区域”中,根据要配置的产品型号来选择相应的“zigbee”和“CM5XX(P_EP)”,如下:
3、在”配置工具工作状态切换区域”中选择”配置状态”,如下:
4、在“串品参数设置区域”中,选择“串口号”为Zigbee与电脑相接的串口号;选择“波特率”为38400;选择“数据位”为8;选择“校验位”为NONE;选择“停止位”为1;选择“流控制”为NONE。
然后点击打开串口。
5、在“过程日志显示区域”中会出现给Zigbee上电提示,如下:
这个时候给Zigbee上电。
6、直到“过程日志显示区域”提示“读取配置参数:完成!”就可以对参数进行配置了。
7、在”功能按钮区域”中点击,即可恢复出厂设置。
星形网络和树型网络可以看成是网状网络的一个特殊子集;所以接下来分析如何组建一个Zigbee网状网络..组建一个完整的Zigbee网络分为两步:第一步是协调器初始化一个网络;第二步是路由器或终端加入网络..加入网络又有两种方法;一种是子设备通过使用MAC层的连接进程加入网络;另一种是子设备通过与一个先前指定的父设备直接加入网络..一、协调器初始化网络协调器建立一个新网络的流程如图1所示..图1 协调器建立一个新网络1、检测协调器建立一个新的网络是通过原语NLME_NETWORK_FORMATION.request发起的;但发起NLME_NETWORK_FORMATION.request原语的节点必须具备两个条件;一是这个节点具有ZigBee协调器功能;二是这个节点没有加入到其它网络中..任何不满足这两个条件的节点发起建立一个新网络的进程都会被网络层管理实体终止;网络层管理实体将通过参数值为INVALID_REQUEST的NLME_NETWORK_FORMATION.confirm的原语来通知上层这是一个非法请求..2、信道扫描协调器发起建立一个新网络的进程后;网络层管理实体将请求MAC子层对信道进行扫描..信道扫描包括能量扫描和主动扫描两个过程..首先对用户指定的信道或物理层所有默认的信道进行一个能量扫描;以排除干扰..网络层管理实体将根据信道能量测量值对信道进行一个递增排序;并且抛弃能量值超过了可允许能量值的信道;保留可允许能量值内的信道等待进一步处理..接着在可允许能量值内的信道执行主动扫描;网络层管理实体通过审查返回的PAN描述符列表;确定一个用于建立新网络的信道;该信道中现有的网络数目是最少的;网络层管理实体将优先选择没有网络的信道..如果没有扫描到一个合适的信道;进程将被终止;网络层管理实体通过参数仠为STARTUP_FAILURE的NLME_NETWORK_FORMATION.confirm的原语来通知上层初始化启动网络失败..3、配置网络参数如果扫描到一个合适的信道;网络层管理实体将为新网络选择一个PAN描述符;该PAN描述符可以是由设备随机选择的;也可以是在NLME_NETWORK_FORMATION.request里指定的;但必须满足PAN描述符小于或等于0x3fff;不等于0xffff;并且在所选信道内是唯一的PAN描述符;没有任何其它PAN描述符与之是重复的..如果没有符合条件的PAN描述符可选择;进程将被终止;网络层管理实体通过参数值为STARTUP_FAILURE的NLME_NETWORK_FORMATION.confirm的原语来通知上层初始化启动网络失败..确定好PAN描述符后;网络层管理实体为协调器选择16位网络地址0x0000;MAC子层的macPANID参数将被设置为PAN描述符的值;macShortAddress PIB参数设置为协调器的网络地址..4、运行新网络网络参数配置好后;网络层管理实体通过MLME_START.request原语通知MAC层启动并运行新网络;启动状态通过MLME_START.confirm原语通知网络层;网络层管理实体再通过NLME_NETWORK_FORMATION.confirm原语通知上层协调器初始化的状态..5、允许设备加入网络只有ZigBee协调器或路由器才能通过NLME_PERMIT_JOINING.request原语来设置节点处于允许设备加入网络的状态..当发起这个进程时;如果PermitDuration参数值为0x00;网络层管理实体将通过MLME_SET.request原语把MAC层的macAssociationPermit PIB属性设置为FALSE;禁止节点处于允许设备加入网络的状态;如果PermitDuration参数值介于0x01和0xfe之间;网络层管理实体将通过MLME_SET.request原语把macAssociationPermit PIB属性设置为TRUE;并开启一个定时器;定时时间为PermitDuration;在这段时间内节点处于允许设备加入网络的状态;定时时间结束;网络层管理实体把MAC层的macAssociationPermit PIB属性设置为FALSE;如果PermitDuration参数的值为0xff;网络层管理实体将通过MLME_SET.request原语把macAssociationPermit PIB属性设置为TRUE;表示节点无限期处于允许设备加入网络的状态;除非有另外一个NLME_PERMIT_JOINING.request原语被发出..允许设备加入网络的流程如图2所示..图2 允许设备加入网络通过以上流程协调器就建立了一个网络并处于允许设备加入网络的状态;然后等待其它节点加入网络..二、节点加入网络一个节点加入网络有两种方法;一种是通过使用MAC层关联进程加入网络;另一种是通过与先前指定父节点连接而加入网络..1 通过MAC层关联加入网络子节点请求通过MAC关联加入网络进程如图3所示..父节点响应通过MAC关联加入网络进程如图4所示..1、子节点发起信道扫描子节点通过NLME_NETWORK_DISCOVERY.request原语发起加入网络的进程;网络层接收到这个原语后通过发起MLME_SCAN.request原语请求MAC层执行一个主动扫描或被动扫描以接收包含了PAN标志符的信标帧;扫描的信道以及每个信道的扫描时间分别由NLME_NETWORK_DISCOVERY.request原语的参数ScanChannels和ScanDuration决定..2、子节点存储各PAN信息MAC层通过MLME_BEACONNOTIFY.indication原语将扫描中接收到的信标帧信息发送到网络层管理实体;信标帧信息包括信标设备的地址、是否允许连接以及信标净载荷..如果信标净载荷域里的协议ID 域与自己的协议ID相同;子设备就将每个匹配的信标帧相关信息保存在邻居表中..信道扫描完成后;MAC层通过MLME_SCAN.confirm原语通知网络层管理实体;网络层再通过NLME_NETWORK_DISCOVERY.confirm原语通知上层;该原语包含了每个扫描到的网络的描述符;以便上层选择一个网络加入..3、子节点选择PAN如果上层需要发现更多网络;则可以重新执行网络发现;如果不需要;则通过NLME_JOIN.request原语从被扫描到的网络中选择一个网络加入..参数PANID设置为被选择网络的PAN标识符..4、子节点选择父节点一个合适的父节点需要满足三个条件:匹配的PAN标志符、链路成本最大为3、允许连接;为了寻找合适的父节点;NLME_JOIN.request原语请求网络层搜索它的邻居表;如果邻居表中不存在这样的父节点则通知上层;如果存在多个合适的父节点则选择具有最小深度的父节点;如果存在多个具有最小深度的合适的父节点则随机选择一个父节点..5、子节点请求MAC关联确定好合适的父节点后;网络层管理实体发送一个MLME_ASSOCIATE.request原语到MAC层;地址参数设置为已选择的父节点的地址;尝试通过父节点加入网络..6、父节点响应MAC关联父节点通过MLME_ASSOCIATE.indication原语通知网络层管理实体一个节点正尝试加入网络;网络层管理实体将搜索它的邻居表查看是否有一个与尝试加入节点相匹配的64位扩展地址;以便确定该节点是否已经存在于它的网络中了..如果有匹配的扩展地址;网络层管理实体获取相应的16位网络地址并发送一个连接响应到MAC层..如果没有匹配的扩展地址;在父节点的地址分配空间还没耗尽的条件下网络层管理实体将为尝试加入的节点分配一个16位网络地址..如果父节点地址分配空间耗尽;将拒绝节点加入请求..当同意节点加入网络的请求后;父节点网络层管理实体将使用加入节点的信息在邻居表中产生一个新的项;并通过MLME_ASSOCIATE.response原语通知MAC层连接成功..7、子节点响应连接成功如果子节点接收到父节点发送的连接成功信息;发送一个传输成功响应信息以确认接收;然后子节点MAC层将通过MLME_ASSOCIATE.confirm原语通知网络层;原语包含了父节点为子节点分配的网内唯一的16位网络地址;然后网络层管理实体设置邻居表相应邻居设备为它的父设备;并通过NLME_JOIN.confirm原语通知上层节点成功加入网络..8、父节点响应连接成功父节点接收到子节点的传输成功响应信息后;将通过MLME_COMM_STATUS.indication原语将传输成功的响应状态发送给网络层;网络层管理实体通过NLME_JOIN.indication原语通知上层一个节点已经加入了网络..图3 子节点请求加入网络进程图4 父节点响应加入网络进程2 通过与先前指定父节点连接加入网络子节点通过与指定的父节点直接连接加入网络;这个时候父节点预先配置了子节点的64位扩展地址..父节点处理一个直接加入网络的进程如图5所示..子节点通过孤立方式加入网络进程如图6所示..1、父节点处理子设备直接加入网络父节点通过NLME_DIRECT_JOIN.request原语开始处理一个设备直接加入网络的进程..父节点网络层管理实体将首先搜索它的邻居表查看是否存在一个与子节点相匹配的64位扩展地址;以便确定该节点是否已经存在于它的网络中了..如果存在匹配的扩展地址;网络层管理实体将终止这个进程并告诉上层该设备已经存在于设备列表中了..如果不存在匹配的扩展地址;在父节点的地址分配空间还没耗尽的条件下网络层管理实体将为子节点分配一个16位网络地址;并使用子节点的信息在邻居表中产生一个新的项..然后通过NLME_DIRECT_JOIN.confirm原语上层设备已经加入网络..2、子节点连接父节点确认父子关系子节点通过NLME_JOIN.request原语发起孤立扫描来建立它与父节点之间的关系..这时网络层管理实体将通过MLME_SCAN.request请求MAC层对物理层所默认的所有信道进行孤立扫描;如果扫描到父设备;MAC层通过MLME_SCAN.confirm原语通知网络层;网络层管理实体再通过NLME_JOIN.confirm原语通知上层节点请求加入成功;即与父节点建立了父子关系;可以互相通信..图5 父节点处理一个直接加入网络进程图6 子节点通过孤立方式加入网络进程设备的MAC 层向上层发送MLME-ORPHAN.indication 原语告知一个孤立设备的存在..只有ZigBee 协调器或ZigBee 路由器才可以接受MLME-ORPHAN.indication 原语;其他设备收到MLME-ORPHAN.indication 原语时NLME 将中止该过程..ZigBee 协调器或ZigBee路由器收到MLME-ORPHAN.indication 原语后;首先判断孤立设备是否是它的子设备..这个判断过程是通过比较孤立设备与近邻表中子设备的扩展地址来实现的..如果ZigBee 协调器或ZigBee 路由器发现孤立设备是它的子设备;NLME 将获取该子设备的16 位网络地址并通过孤立响应发送给MAC 子层..孤立响应时通过向MAC 层发送MLME-ORPHAN.response原语来实现的;孤立响应命令向子设备传送的结果状态通过MLME-COMMSTATUS.indication 原语反馈给NLME..如果ZigBee 协调器或ZigBee 路由器发现孤立设备不是它的子设备;NLME 就通过孤立响应原语把这一情况反映给MAC 层..下图是父设备把孤立的子设备加入或重新加入到网络过程的信息流程..图7父设备把孤立的子设备加入或重新加入到网络。
ZigBee协议栈初始化网络启动流程
ZigBee的基本流程:由协调器的组网(创建PAN ID),终端设备和路由设备发现网络以及加入网络。
基本流程:main()->osal_init_system()->osalInitTasks()->ZDApp_Init(),进协议栈初始化函数ZDApp_Init()。
进入程序入口main()。
中
C++ Code
int main( void )
{
*/
WatchDogEnable( WDTIMX );
#endif
osal_start_system(); }
ZDO_Init();
afRegister( (endPointDesc_t
*)&ZDApp_epDesc );
#if defined( ZDO_USERDESC_RESPONSE )
ZDApp_InitUserDesc();
#endif
zgInitItems( FALSE );
}
ZDConfig_InitDescriptors();
zgWriteStartupOptions( ZG_STARTUP_SET,
ZCD_STARTOPT_DEFAULT_NETWORK_STATE );
}
#if defined ( NV_RESTORE )
if ( HalKeyRead() == SW_BYPASS_NV )
networkStateNV =
ZDO_INITDEV_NEW_NETWORK_STATE;
else
{
On these devices or routers that have
If the
zgDefaultChannelList = MAX_CHANNELS_24GHZ;
}
#endif If the PAN is not found, an scan should be completed
// When devices rejoin the network and the PAN is not found from
zgDefaultChannelList = MAX_CHANNELS_24GHZ;
}
#endif // ZIGBEE_COMMISSIONING
#endif
}
else if ( startMode == MODE_RESUME )
{
if
( logicalType == NODETYPE_ROUTER )
{ ZMacScanCnf_t scanCnf;
devState = DEV_NWK_ORPHAN;
/* if router and nvram is available, fake successful orphan scan */ = ZSUCCESS;
= ZMAC_ORPHAN_SCAN;
= 0;
= 0;
nwk_ScanJoiningOrphan(&scanCnf);
ret = ZSuccess;
}
else
{ devState = DEV_NWK_ORPHAN;
ret = NLME_OrphanJoinRequest( zgDefaultChannelList,
zgDefaultStartingScanDuration );
}
}
else
{
#if defined( LCD_SUPPORTED )
HalLcdWrite Screen( "StartDevice ERR", "MODE unknown" );
#endif
}
}
if ( ret != ZSuccess )
osal_start_timerEx(ZDAppTaskID,
ZDO_NETWORK_INIT, NWK_RETRY_DELAY );
}
开启网络事件
C++ Code
void ZDO_NetworkFormationConfirmCB( ZStatus_t Status )
{
nwkStatus = (byte)Status;
if ( Status == ZSUCCESS )
{
// LED on shows Coordinator started
HalLedSet ( HAL_LED_3,
HAL_LED_MODE_ON );
// LED off forgets
HOLD_AUTO_START
HalLedSet (HAL_LED_4,
HAL_LED_MODE_OFF);
#if defined ( ZBIT )
SIM_SetColor(0xd0ffd0);
#endif
if ( devState == DEV_HOLD )
{
// Began with HOLD_AUTO_START
devState = DEV_COORD_STARTING;
}
}
#if defined(BLINK_LEDS)
else
HalLedSet ( HAL_LED_3, HAL_LED_MODE_FLASH ); // Flash LED to show failure
#endif
osal_set_event( ZDAppTaskID,
ZDO_NETWORK_START );
}。