ZIGBEE协调器启动
ZigBee技术概述

ZigBee技术概述1ZigBee技术简介 (1)2 ZigBee结构 (2)2.1物理层 (2)2.2 MAC层 (4)2.3 网络层 (6)2.4 应用层 (7)1ZigBee技术简介ZigBee技术是一种近距离、低功耗、低成本、低传输速率的具有统一技术标准的短距离无线通信技术,符合IEEE 802.5.4标准,主要适用于工业、家庭自动控制以及远程控制领域,目的是为了满足小型廉价设备的无线联网和控制。
ZigBee技术并不是完全独有、全新的标准。
它的物理层、MAC层采用了IEEE 802.15.4(无线个人区域网)协议标准,并在此基础上进行了完善和扩展。
其网络层、应用会聚层和高层应用规范由ZigBee联盟进行了制定。
根据IEEE 802.15.4协议标准,ZigBee的工作频段分为3个频段,这3个工作频段相距较大,而且在各频段上的信道数目不同,因而,在该项技术标准中,各频段上的调制方式和传输速率不同。
它们分别为868MHz、915MHz和2.4GHz,其中2.4GHz频段上,分为16个信道,该频段为全球通用的工业、科学、医学(ISM)频段,且该频段为免付款、免申请的无线电频段,在该频段上,数据传输速率为250kbPs,另外两个频段为868/915MHz,其相应的信道数分别为10个信道和1个信道,传输速率分别为40kbPs和20kbPs。
在网络性能上,ZigBee设备可构造星型网络或者点对点网络,在每一个ZigBee组成的无线网络内,连续地址码分为16bit短地址或者64bit长地址,可容纳的最大网络设备个数分别为216个和264个,具有较大的网络容量。
在无线通信技术上,采用免冲突多载波信道接入(CSMA/CA)方式,有效地避免了无线电载波之间的冲突,此外,为保证数据传输的可靠性,建立了完整的应答通信协议。
ZigBee设备为低功耗设备,其发射功率为,通信距离为30-70m,具有能量检测和链路质量指示能力,根据这些检测结果,设备可自动调整发射功率,在保证通信链路质量的条件下,最小地消耗设备能量。
ZigBeeLED设备启动流程

ZigBeeLED设备启动流程ZigBee LED设备启动流程及按键机制一.先对LED引脚进行相关配置,主要在两个文件中修改(hal_board_cfg.h ,Hal_led.h )hal_board_cfg.h定义我们三个LED的引脚配置分别是 P1_0 P1_1 P0_4 , 低电平有效。
/* 1 - Green */#define LED1_BV BV(0)#define LED1_SBI T P1_0#define LED1_DDR P1DIR#define LED1_POLARITY ACTIVE_LOW/* 2 - Red */#define LED2_BV BV(1)#define LED2_SBIT P1_1#define LED2_DDR P1DIR#define LED2_POLARITY ACTI VE_LOW/* 3 - Yellow */#define LED3_BV BV(4)#define LED3_SBIT P0_4#define LED3_DDR P0DIR#define LED3_POLARITY ACTI VE_LOW在HAL_BOARD_INI T将三个LED引脚配置为输出#define HAL_BOARD_INIT(){……………..设置LED1 LED2 LED3 引脚为输出LED1_DDR |= LED1_BV;LED2_DDR |= LED2_BV;LED3_DDR |= LED3_BV;}/* ----------- LED's ---------- */#define HAL_TURN_OFF_LED1() st( LED1_SBI T = LED1_POLARITY (0); ) //关灯#define HAL_TURN_ON_LED1() st( LED1_SBI T = LED1_POLARITY (1); ) //开灯#define HAL_TOGGLE_LED1() st( if (LED1_SBIT) { LED1_SBIT = 0; } else { LED1_SBI T = 1;} ) //取反#define HAL_STATE_LED1() (LED1_POLARITY (LED1_SBI T)) //获取状态Hal_led.h定义了3个LED/* LEDS - The LED number is the same as the bit position */ #define HAL_LED_1 0x01#define HAL_LED_2 0x02#define HAL_LED_3 0x04#define HAL_LED_ALL (HAL_LED_1 | HAL_LED_2 | HAL_LED_3) /* Modes 定义了LED的一些模式*/#define HAL_LED_MODE_OFF 0x00#define HAL_LED_MODE_ON 0x01#define HAL_LED_MODE_BLINK 0x02#define HAL_LED_MODE_FLASH 0x04#define HAL_LED_MODE_TOGGLE 0x08/* Defaults 定义了一些LED的控制模式*/#define HAL_LED_DEFAULT_MAX_LEDS 4#define HAL_LED_DEFAULT_DUTY_CYCLE 5#define HAL_LED_DEFAULT_FLASH_COUNT 50#define HAL_LED_DEFAULT_FLASH_TIME 1000二、初始化LED灯可以看到main()函数进来,后HAL_BOARD_INIT()进行了系统时钟的初始化,还将LED灯配置为输出状态。
ZigBee协议栈初始化网络启动流程

ZigBee协议栈初始化网络启动流程ZigBee的基本流程:由协调器的组网(创建PAN ID),终端设备和路由设备发现网络以及加入网络。
基本流程:main()->osal_init_system()->osalInitTasks()->ZDApp_Init(),进协议栈初始化函数ZDApp_Init()。
1.1 进入程序入口main()。
ZMain.c中C++ Codeint 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 );// Initialze HAL driversHalDriverInit();// Initialize NV Systemosal_nv_init( NULL );// Initialize the MACZMacInit();// Determine the extended addresszmain_ext_addr();// Initialize basic NV itemszgInit();#ifndef NONWK// Since the AF isn't a task, call it's initialization routine afInit();#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();/* Display the device info on the LCD */#ifdef LCD_SUPPORTEDzmain_lcd_init();#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 herereturn 0; // Shouldn't get here.} // main()1.2 给任务添加IDsapi.c中C++ Codevoid osalInitTasks( void ) //为各自进程添加ID 用于任务的查找{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 );}1.3 初始化ZigBee协议栈网络ZDApp.cC++ Codevoid ZDApp_Init( uint8 task_id ){// Save the task ID// Initialize the ZDO global device short address storageZDAppNwkAddr.addrMode = Addr16Bit;ZDAppNwkAddr.addr.shortAddr = INVALID_NODE_ADDR;(void)NLME_GetExtAddr(); // Load the saveExtAddr pointer.// Check for manual "Hold Auto Start"//检测到有手工设置HAL_KEY_SW_1则会设置devState = DEV_HOLD,从而避开网络初始化ZDAppCheckForHoldKey();// Initialize ZDO items and setup the device - type of device to create.ZDO_Init(); //通过判断预编译来开启一些函数功能// Register the endpoint description with the AF// This task doesn't have a Simple description, but we still need// to register the endpoint.afRegister( (endPointDesc_t *)&ZDApp_epDesc );#if defined( ZDO_USERDESC_RESPONSE )ZDApp_InitUserDesc();#endif // ZDO_USERDESC_RESPONSE// Start the device?if ( devState != DEV_HOLD ){ZDOInitDevice( 0 );}else{// Blink LED to indicate HOLD_STARTHalLedBlink ( HAL_LED_4, 0, 50, 500 );}} /* ZDApp_Init() */如果设置devState为DEV_HOLD,则不会执行ZDOInitDevice;反之,系统会调用此函数是设备组网或者入网。
Zigbee工程启动流程解析

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协议架构

ZigBee协议架构ZigBee协议是一种低功耗、近距离无线通信协议,主要应用在无线传感器网络(WSN)中。
它是由ZigBee联盟(ZigBee Alliance)所定义和推广的,旨在为物联网设备之间的通信提供一个标准化的解决方案。
本文将介绍ZigBee协议的架构和其主要组件,以及在物联网应用中的应用场景。
一、ZigBee协议架构概述ZigBee协议采用了分层的架构,以便于各个组件的模块化和扩展性。
ZigBee协议架构一般可分为两个主要层次:应用层和网络层。
下面将详细介绍每个层次的主要组件和功能。
1. 应用层应用层是ZigBee协议栈的顶层,负责实现各种应用的功能。
它可以与不同类型的传感器和执行器进行通信,并执行各种任务,如数据采集、控制和管理等。
应用层使用ZigBee Cluster Library(ZCL)定义了一系列的应用框架和应用集群,以便开发人员可以方便地构建自己的应用。
2. 网络层网络层是ZigBee协议栈的中间层,负责实现节点之间的通信和路由功能。
它使用ZigBee网络堆栈协议(ZigBee Network Stack Protocol)来处理数据包的发送和接收,以及路由选择和网络管理等功能。
网络层的核心组件包括ZigBee协调器(ZigBee Coordinator)、路由器(Router)和终端设备(End Device)。
二、ZigBee协议架构组件1. ZigBee协调器ZigBee协调器是在ZigBee网络中的关键组件,它负责启动和管理整个网络,以及分配网络地址和加密密钥等。
协调器可以与多个路由器和终端设备建立连接,并通过网络层协议进行数据传输和路由选择。
此外,协调器还负责处理网络中的任何故障或冲突,并重新分配资源以保持网络的可靠性和稳定性。
2. 路由器路由器是ZigBee网络中的中间节点,它负责转发数据包并实现网络层的路由选择功能。
路由器可以与其他路由器和终端设备建立连接,并通过网络层协议将数据包从源节点传输到目标节点。
zigbee入门指导

Zigbee入门指导(二)——运行Zigbee例程在Zigbee入门指导(一)中讲解了基于CC2430的Zigbee 开发环境的搭建,安装完Ti的协议栈后,里面有多个例程,帮助用户入门及作为自己工程的基本框架。
在Zigbee入门指导(二)中,我们将通过演示执行相关的例程,了解Zigbee应用的启动流程(不是Zigbee网络的启动流程),了解运行一个自定义Zigbee工程所要作的软件方面的改动和工程选项的配置。
所用的开发套件为无线龙的套件。
一、修改HALHAL及所谓的Hardware Abstration Layer,通俗的了解即为开发板的硬件驱动,由于所用的是无线龙的开发板,与Ti的原装开发板有差异,需要对协议栈自带的HAL进行修改。
HAL文件存放在目录<Components/hal>中,里面有<common>、<include>、<target>三个目录,<common>中定义的与外设无关的硬件操作,<include>存放的是头文件,而<target>存放的是目标文件,里面根据目标板的不同分为<CC2430BB>、<CC2430DB>、<CC2430EB>。
所用的无线龙的开发板和CC2430EB最为相似,故修改<CC2430EB>中的内容。
按键操作几乎在每个例程中都会用到,故此处以按键驱动的修改为例,演示HAL的修改。
先了解下Ti和无线龙扩展板的不同之处。
Ti的CC2430EB 原理图在Ti文档SWRU133.pdf(位于SWRU133.zip中)。
Page29是按键电路的原理图,如图1图1(左上角是元件图)CC2430EB的按键其实是摇杆,上下左右四个方向和电阻网络相连,通过放大电路送到CC2430的P0.6脚,经AD采样后判断摇杆摆向哪个方向,按键编号为SW1~SW4摇杆也可像普通按键一样按下,产生一个直流电平变化,接到P0.5脚,按键编号为SW5。
Zigbee设置

ZigBee模块设置1.ZigBee模块F8913D插入配置基板F8913-EVB(注:基板排针接口与模块插针序号正确对应,不可反插。
否则,模块可能烧坏。
)2.用USB连接线,连接配置基板与电脑。
配置基板通过USB口供电。
电脑端打开ZigBeeConfig.exe3.查看端口号,,,(如何查看端口号,详见备注2)4.参数设置,配置步骤如图。
串口波特率:9600校验:无校验停止位:1个停止位是否启用硬件控制流:不勾选调试等级:0AT命令是否回显:不勾选网络号:自行设置(同一网络内模块和网关的网络号必须相同)节点类型:路由 分节点网络地址:自行设置(同一网络内的设备不能有相同网络地址) 透传地址:0 重新自52A8加入网络:勾选 物理信道:26 应用模式: 透传模块设置关键参数说明:网络号:网络号是ZigBee 判断是否在同一个网络的标志,只有网络号相同的设备才会互相组网,互相通信。
节点类型:同一网络,有且仅有一个协调器。
路由具备转发其他模块数据功能,终端不具有该功能。
1 92 34 5 67 8分节点网络地址:即ZigBee 设备本机在网络内的地址标志,协调器不能修改,默认固定为0,路由或终端可设置为非0 的其它数值,一个ZigBee 设备设置完网络地址后这个地址在本网络内就是唯一的,不可再重复加入这个地址的设备。
透传地址:即本ZigBee 设备串口收到的数据要发送的目标ZigBee 设备的分节点网络地址,在透传模式下,只要指定了透传地址,那么本设备发出的数据都会发送给那个分节点网络地址的zibgee 设备。
例如:ZigBee1(分节点网络地址为10)---ZigBee2(分节点网络地址为13)ZigBee1 要把串口收到的数据发给ZigBee2,ZigBee1 的透传地址就要指定为13,ZigBee2 把串口收到的数据发给ZigBee1,那ZigBee2 的透传地址就要设置为10。
物理信道:要互相通信的设备必须设置为一样的信道,推荐使用15,20,25,26 信道,可减少WIFI的干扰。
zigbee技术介绍

zigbee技术介绍ZigBee作为用于个人网络的短距离无线通信协议,已变得越来越知名。
Zigbee是一种适用于短距离无线通信的低成本,低功耗,低速的新技术,可以嵌入各种电子设备中。
该技术主要设计用于低速通信网络。
它的最大特点是低功耗和联网功能,尤其是具有路由功能的联网功能。
从理论上讲,ZigBee覆盖的通信领域可以无限扩展。
ZigBe包含3种节点类型,即:协调器,路由节点和终端节点。
●协调器——启动网络和维护网络●路由节点——转发数据包●终端节点——发送和接收数据。
在实际的Zigbee网络中,仅支持两种无线设备:全功能设备和简化功能设备。
FFD可以提供所有IEEE802.15.4协议服务,不仅可以发送和接收数据,还可以具有路由功能;最终节点负责收集数据,然后将其发送到协调点或路由节点进行处理。
这三种类型的节点使ZigBee支持三种网络拓扑:星形结构,树形结构和网状结构Zigbee协议无线通信技术的特点:●低速率:数据传输速率在10Kb/s〜250Kb/s之间●低功耗:在低功耗待机模式下,两节普通5号电池可以使用6到24个月●成本低:Zigbee数据传输速率低,协议简单,大大降低了成本●网络容量大:网络可容纳65,000个设备●短延迟:典型的搜索设备延迟为30ms,睡眠激活延迟为15ms,活动设备通道访问延迟为15ms。
数据安全性:Zigbee提供数据完整性检查和声音功能,采用AES-128加密算法,并且每个应用程序都可以灵活确定其安全属性基于ZigBee技术的应用数字家庭ZigBee模块可以安装在电视,门禁系统,空调系统和其他家用电器中。
通过ZigBee终端设备,可以收集各种家庭信息并将其传输到中央控制设备,或者可以使用远程控制来实现远程控制的目的,从而提供家庭生活自动化,联网和智能化。
自动抄表读数通过ZigBee网络直接发送到提供天然气,水和电的公司。
利用ZigBee技术,天然气或水电公司可以直接向用户发送用水、用电、用气等信息,十分方便。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
【转自小峰博客】协调器的启动【自动模式】使用的协议栈版本信息: ZigBee2006\ZStack-1.4.3-1.2.1Zigbee网络设备启动流程—协调器(自启动模式)—以SampleApp的协调器为例.1、协调器预编译信息通过project->options->c/c++compiler->extraOptions可以看到协调器所带的配置文件为:-f $PROJ_DIR$\..\..\..\Tools\CC2430DB\f8wCoord.cfg-f $PROJ_DIR$\..\..\..\Tools\CC2430DB\f8wConfig.cfg即编译了ZDO_COORDINATOR和RTR_NWK.通过project->options->c/c++compiler->Preprocessor->Defined symbols可以看到协调器预编译包含了:CC2430EB; ZTOOL_P1; MT_TASK; LCD_SUPPORTED=DEBUG; MANAGED_SCAN没有编译HOLD_AUTO_START和SOFT_START.2、具体流程main()->osal_init_system()->osalInitTasks()->ZDApp_Init()进入ZDApp_Init()函数:**************************************void ZDApp_Init( byte task_id ){uint8 capabilities;// Save the task IDZDAppTaskID = task_id;// Initialize the ZDO global device short address storageZDAppNwkAddr.addrMode = Addr16Bit;ZDAppNwkAddr.addr.shortAddr = INVALID_NODE_ADDR; //0xFFFE(void)NLME_GetExtAddr(); // Load the saveExtAddr pointer.// Check for manual"Hold Auto Start"//检测到有手工设置SW_1则会设置devState = DEV_HOLD,从而避开网络初始化 ZDAppCheckForHoldKey();// Initialize ZDO items and setup the device - type of device to create.ZDO_Init(); //通过判断预编译来开启一些函数功能// Register the endpoint description with the AF// This task doesn't have a Simple description, but we still need// to register the endpoint.afRegister( (endPointDesc_t *)&ZDApp_epDesc );#if defined( ZDO_USERDESC_RESPONSE )ZDApp_InitUserDesc();#endif // ZDO_USERDESC_RESPONSE// set broadcast address mask to support broadcast filteringNLME_GetRequest(nwkCapabilityInfo, 0, &capabilities);NLME_SetBroadcastFilter( capabilities );// Start the device?if ( devState != DEV_HOLD ){ZDOInitDevice( 0 );}/*如果devState=DEV_HOLD,则不会调用ZDOInitDevice()来初始化网络即不组网也不进网.LED4闪烁等待应用程序来开启设备并初始化网络*/else{// Blink LED to indicate HOLD_STARTHalLedBlink ( HAL_LED_4, 0, 50, 500 );}ZDApp_RegisterCBs();}**************************************协调器没有编译HOLD_AUTO_START,也没有手工设置SW_1,初始化devState = DEV_INIT(参见基本问题说明3).因此直接在ZDApp_Init()中进入ZDOInitDevice( 0 )开启设备.**************************************uint8 ZDOInitDevice( uint16 startDelay ){//初始化设备网络状态为ZDO_INITDEV_NEW_NETWORK_STATE:新的网络状态.//可能意味着ZCD_NV_STARTUP_OPTION不能恢复,或没有任何网络状态恢复uint8 networkStateNV = ZDO_INITDEV_NEW_NETWORK_STATE;uint16 extendedDelay = 0;devState = DEV_INIT; // Remove the Hold state// Initialize leave control logic//函数读取NV项目ZCD_NV_LEAVE_CTRL的值,ZDApp_LeaveCtrl指向这个值ZDApp_LeaveCtrlInit();// Check leave control reset settingsZDApp_LeaveCtrlStartup( &devState, &startDelay );// Leave may make the hold state come back//以上两个函数设置了对设备离开时的控制,如果有延时则延时,没有则//把设备状态设为DEV_HOLDif ( devState == DEV_HOLD )//ZDO_INITDEV_LEAVE_NOT_STARTED:该设备没有在网络中,下次调用才启用.return ( ZDO_INITDEV_LEAVE_NOT_STARTED ); // Don't join - (one time).#if defined ( NV_RESTORE )// Get Keypad directly to see if a reset nv is needed.// Hold down the SW_BYPASS_NV key (defined in OnBoard.h)// while booting(引导) to skip past NV Restore.if ( HalKeyRead() == SW_BYPASS_NV )//SW_BYPASS_NV按键处于按下状态时,则避开网络层的NV存储networkStateNV = ZDO_INITDEV_NEW_NETWORK_STATE; //设备网络状态为新的网络状态else{// Determine if NV should be restored//函数返回的设备网络状态要么是新的网络状态;要么是恢复的网络状态;以此//来确定要不要读取NV里相应条目来恢复网络先前状态networkStateNV = ZDApp_ReadNetworkRestoreState();}//如果设备的网络状态为恢复的网络状态if ( networkStateNV == ZDO_INITDEV_RESTORED_NETWORK_STATE ){//恢复设备先前的网络状态参数并且//设置devStartMode = MODE_RESUME!!!!networkStateNV = ZDApp_RestoreNetworkState();}else //如果设备的网络状态为新的网络状态,在下面进行处理{// Wipe out(清除) the network state in NVNLME_InitNV();NLME_SetDefaultNV(); //设置默认NV条目}#endif//如果设备的网络状态为新的网络状态if ( networkStateNV == ZDO_INITDEV_NEW_NETWORK_STATE ){//根据预编译来设置设备新的网络状态参数ZDAppDetermineDeviceType();/*!!!!*/// Only delay if joining network - not restoring network stateextendedDelay = (uint16)((NWK_START_DELAY + startDelay)+ (osal_rand() & EXTENDED_JOINING_RANDOM_MASK));}// Initialize device securityZDApp_SecInit( networkStateNV );// Trigger the network startZDApp_NetworkInit( extendedDelay );return ( networkStateNV );}**************************************分两种情况:(1)如果协调器预编译了NV_RESTORE,且函数ZDApp_ReadNetworkRestoreState()返回值为ZDO_INITDEV_RESTORED_NETWORK_STATE,则进入ZDApp_RestoreNetworkState()里设置ZDO_Config_Node_Descriptor.LogicalType = NODETYPE_COORDINATOR和devStartMode = MODE_RESUME.****************uint8 ZDApp_RestoreNetworkState( void ){…………// Are we a coordinator//设备的网络状态为恢复的网络状态.则进入这个函数进行恢复//先判断如果短地址为0则设置设备逻辑类型为协调器且devStartMode = MODE_RESUME //否则设置devStartMode = MODE_RESUMEZDAppNwkAddr.addr.shortAddr = NLME_GetShortAddr();if ( ZDAppNwkAddr.addr.shortAddr == 0 ) //如果短地址是0,即协调器{ZDO_Config_Node_Descriptor.LogicalType = NODETYPE_COORDINATOR; //!!!!!}devStartMode = MODE_RESUME; //MODE_RESUME!!!!!!!!…………}****************(2)如果协调器没有预编译NV_RESTORE,networkStateNV==ZDO_INITDEV_NEW_NETWORK_STATE,但由于协调器编译了ZDO_COORDINATOR而没有编译SOFT_START,因此ZDAppDetermineDeviceType()不起作用.因此ZDO_Config_Node_Descriptor.LogicalType和devStartMode这两个关键参数保持初始化时的值:ZDO_Config_Node_Descriptor.LogicalType = NODETYPE_COORDINATOR(见基本问题说明6)devStartMode = MODE_HARD(见基本问题说明4)对于协调器,这两种情况最终都是确定两个关键设备网络状态参数的值.对本例的SampleApp的协调器,没有编译NV_RESTORE,因此属于情况(2).然后调用ZDApp_NetworkInit()启动网络:****************void ZDApp_NetworkInit( uint16 delay ){if ( delay ){// Wait awhile before starting the deviceosal_start_timerEx( ZDAppTaskID, ZDO_NETWORK_INIT, delay );}else{osal_set_event( ZDAppTaskID, ZDO_NETWORK_INIT );}}****************通过触发ZDAppTaskID的ZDO_NETWORK_INIT事件.来看下对ZDO_NETWORK_INIT 事件的处理:****************UINT16 ZDApp_event_loop( byte task_id, UINT16 events ){…………if ( events & ZDO_NETWORK_INIT ){// Initialize apps and start the networkdevState = DEV_INIT;ZDO_StartDevice( (uint8)ZDO_Config_Node_Descriptor.LogicalType, devStartMode, DEFAULT_BEACON_ORDER, DEFAULT_SUPERFRAME_ORDER );// Return unprocessed eventsreturn (events ^ ZDO_NETWORK_INIT);}…………}****************tuzhuke2010-11-08 20:18:11可以看到调用了ZDO_StartDevice( (uint8)ZDO_Config_Node_Descriptor.LogicalType, devStartMode,DEF AULT_BEACON_ORDER, DEFAULT_SUPERFRAME_ORDER );这里设备网络状态参数:ZDO_Config_Node_Descriptor.LogicalType = NODETYPE_COORDINATORdevStartMode = MODE_HARD且协调器编译了ZDO_COORDINATOR****************void ZDO_StartDevice( byte logicalType, devStartModes_t startMode, byte beaconOrder, byte superframeOrder ){ZStatus_t ret;ret = ZUnsupportedMode;#if defined(ZDO_COORDINATOR)if ( logicalType == NODETYPE_COORDINATOR ){if ( startMode == MODE_HARD ) //MODE_HARD{devState = DEV_COORD_STARTING; //Started as Zigbee Coordinator//建网ret = NLME_NetworkFormationRequest( zgConfigPANID, zgDefaultChannelList,zgDefaultStartingScanDuration, beaconOrder,superframeOrder, false );}else if ( startMode == MODE_RESUME ) //MODE_RESUME{// Just start the coordinatordevState = DEV_COORD_STARTING;ret = NLME_StartRouterRequest( beaconOrder, beaconOrder, false );}else //错误,未知启动模式{#if defined( LCD_SUPPORTED )//HalLcdWriteScreen( "StartDevice ERR", "MODE unknown" );ClearScreen();Print8(HAL_LCD_LINE_1,10,"StartDevice ERR",1);Print8(HAL_LCD_LINE_2,10,"MODE unknown",1);#endif}}#endif // !ZDO_COORDINATOR//#if !defined ( ZDO_COORDINATOR ) || defined( SOFT_START )if ( logicalType == NODETYPE_ROUTER || logicalType == NODETYPE_DEVICE ){if ( (startMode == MODE_JOIN) || (startMode == MODE_REJOIN) ){devState = DEV_NWK_DISC; //Discovering PAN's to join#if defined( MANAGED_SCAN )ZDOManagedScan_Next();ret = NLME_NetworkDiscoveryRequest( managedScanChannelMask, BEACON_ORDER_15_MSEC ); #elseret = NLME_NetworkDiscoveryRequest( zgDefaultChannelList, zgDefaultStartingScanDuration ); #endif}else if ( startMode == MODE_RESUME ) //MODE_RESUME 恢复{if ( logicalType == NODETYPE_ROUTER ){ZMacScanCnf_t scanCnf;devState = DEV_NWK_ORPHAN;/* if router and nvram is available, fake successful orphan scan */scanCnf.hdr.Status = ZSUCCESS;scanCnf.ScanType = ZMAC_ORPHAN_SCAN;scanCnf.UnscannedChannels = 0;scanCnf.ResultListSize = 0;nwk_ScanJoiningOrphan(&scanCnf);ret = ZSuccess;}else{devState = DEV_NWK_ORPHAN; //孤儿ret = NLME_OrphanJoinRequest( zgDefaultChannelList,zgDefaultStartingScanDuration );}}else{#if defined( LCD_SUPPORTED )// HalLcdWriteScreen( "StartDevice ERR", "MODE unknown" );Print8(HAL_LCD_LINE_1,10,"StartDevice ERR",1);Print8(HAL_LCD_LINE_2,10,"MODE unknown",1);#endif}}//#endif //!ZDO COORDINATOR || SOFT_STARTif ( ret != ZSuccess )osal_start_timerEx(ZDAppTaskID, ZDO_NETWORK_INIT, NWK_RETRY_DELAY );}****************通过参数可知协调器调用NLME_NetworkFormationRequest( zgConfigPANID, zgDefaultChannelList,zgDefaultStartingScanDuration, beaconOrder,superframeOrder, false )进行网络的组建.而对NLME_NetworkFormationRequest()的调用会产生一个回调函数ZDO_NetworkFormationConfirmCB()(见主要函数说明3),来看下:****************void ZDO_NetworkFormationConfirmCB( ZStatus_t Status ){#if defined(ZDO_COORDINATOR)nwkStatus = (byte)Status;if ( Status == ZSUCCESS ){// LED on shows Coordinator startedHalLedSet ( HAL_LED_3, HAL_LED_MODE_ON );// LED off forgets HOLD_AUTO_STARTHalLedSet (HAL_LED_4, HAL_LED_MODE_OFF);#if defined ( ZBIT )SIM_SetColor(0xd0ffd0);#endifif ( devState == DEV_HOLD ){// Began with HOLD_AUTO_STARTdevState = DEV_COORD_STARTING;}}#if defined(BLINK_LEDS)elseHalLedSet ( HAL_LED_3, HAL_LED_MODE_FLASH ); // Flash LED to show failure#endifosal_set_event( ZDAppTaskID, ZDO_NETWORK_START );#endif //ZDO_COORDINATOR}****************如果Status返回ZSUCCESS,建立网络成功,通过一些灯亮来来指示;不成功则通过闪烁灯来指示.最后触发任务ZDAppTaskID的ZDO_NETWORK_START事件,看下对ZDO_NETWORK_START的处理:****************#if defined (RTR_NWK)if ( events & ZDO_NETWORK_START ){ZDApp_NetworkStartEvt();// Return unprocessed eventsreturn (events ^ ZDO_NETWORK_START);}****************调用了ZDApp_NetworkStartEvt()****************void ZDApp_NetworkStartEvt( void ){if ( nwkStatus == ZSuccess )//网络建立成功{// Successfully started a ZigBee networkif ( devState == DEV_COORD_STARTING ){devState = DEV_ZB_COORD;}osal_pwrmgr_device( PWRMGR_ALWAYS_ON );osal_set_event( ZDAppTaskID, ZDO_STATE_CHANGE_EVT );}else //网络建立不成功,则增加能量阀值重新建网.{// Try again with a higher energy threshold !!if ( ( NLME_GetEnergyThreshold() + ENERGY_SCAN_INCREMENT ) < 0xff ){NLME_SetEnergyThreshold( (uint8)(NLME_GetEnergyThreshold() + ENERGY_SCAN_INCREMENT) );osal_set_event( ZDAppTaskID, ZDO_NETWORK_INIT ); //重新初始化建立网络}else{// Failed to start network. Enter a dormant state (until user intervenes)devState = DEV_INIT;osal_set_event( ZDAppTaskID, ZDO_STATE_CHANGE_EVT );}}}****************如果协调器建立网络成功,则触发ZDAppTaskID的ZDO_STATE_CHANGE_EVT事件.看下对ZDO_STATE_CHANGE_EVT的处理:****************if ( events & ZDO_STATE_CHANGE_EVT ){ZDO_UpdateNwkStatus( devState );// Return unprocessed eventsreturn (events ^ ZDO_STATE_CHANGE_EVT);}****************调用了ZDO_UpdateNwkStatus( devState ),网络状态改变,这个函数会更新和发送信息通知每个注册登记过的应用终端.****************void ZDO_UpdateNwkStatus( devStates_t state ){// Endpoint/Interface descriptor list.epList_t *epDesc = epList;byte bufLen = sizeof(osal_event_hdr_t);osal_event_hdr_t *msgPtr;ZDAppNwkAddr.addr.shortAddr = NLME_GetShortAddr();(void)NLME_GetExtAddr(); // Load the saveExtAddr pointer.while ( epDesc ){if ( epDesc->epDesc->endPoint != ZDO_EP ){msgPtr = (osal_event_hdr_t *)osal_msg_allocate( bufLen );if ( msgPtr ){msgPtr->event = ZDO_STATE_CHANGE; // Command IDmsgPtr->status = (byte)state;osal_msg_send( *(epDesc->epDesc->task_id), (byte *)msgPtr ); //发往应用任务}}epDesc = epDesc->nextDesc;}}****************对SampleApp的协调器来说,这里触发应用任务SampleApp_TaskID的ZDO_STATE_CHANGE事件,看下对ZDO_STATE_CHANGE的处理:****************case 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;****************可以看到当协调器建立网络成功,通过回调函数触发应用任务的ZDO_STATE_CHANGE事件,最终开启定时器发送周期信息.3、协调器(自启动模式)—以SampleApp的协调器为例,并假设初始化成功,网络建立成功.程序大致流程:main()->osal_init_system()->osalInitTasks()->ZDApp_Init()->ZDOInitDevice()->ZDApp_NetworkInit->触发ZDAppTaskID的ZDO_NETWORK_INIT->ZDO_StartDevice()->NLME_NetworkFormationRequest()->网络建立成功ZDO_NetworkFormationConfirmCB->触发ZDAppTaskID的ZDO_NETWORK_START->ZDApp_NetworkStartEvt()->触发ZDAppTaskID的ZDO_STATE_CHANGE_EVT->ZDO_UpdateNwkStatus()->触发SampleApp_TaskID的ZDO_STATE_CHANGE->开户周期信息发送的定时器.4、注:(1)自启动模式下SampleApp的终端和路由器总体流程基本一致.(2)以SampleApp为例,ZDO_StartDevice()函数的两个重要参数比较:终端:ZDO_Config_Node_Descriptor.LogicalType = NODETYPE_DEVICEdevStartMode = MODE_JOIN路由器:ZDO_Config_Node_Descriptor.LogicalType = NODETYPE_ROUTER devStartMode = MODE_JOIN协调器:ZDO_Config_Node_Descriptor.LogicalType = NODETYPE_COORDINATOR devStartMode = MODE_HARD******************************************************************************说明:1、本文为个人学习笔记,纯属个人理解,错误不可避免,仅供参考.随时更新2、细节基本不管,遇到问题再作分析,程序注释为个人原始注释内容,记录有些仓促.3、欢迎交流,转载请注明出处,谢谢!。