ZIGBEE协调器启动.doc_第1页
ZIGBEE协调器启动.doc_第2页
ZIGBEE协调器启动.doc_第3页
ZIGBEE协调器启动.doc_第4页
ZIGBEE协调器启动.doc_第5页
已阅读5页,还剩9页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

【转自小峰博客】协调器的启动【自动模式】发布: 2010-11-08 20:17 | 作者: tuzhuke | 来源: “飞比”Zigbee论坛使用的协议栈版本信息: ZigBee2006ZStack-1.4.3-1.2.1Zigbee网络设备启动流程协调器(自启动模式)以SampleApp的协调器为例.1、协调器预编译信息通过project-options-c/c+compiler-extraOptions可以看到协调器所带的配置文件为:-f $PROJ_DIR$.ToolsCC2430DBf8wCoord.cfg-f $PROJ_DIR$.ToolsCC2430DBf8wConfig.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 manualHold 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 doesnt 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_START HalLedBlink ( 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 ); / Dont 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 NV NLME_InitNV(); NLME_SetDefaultNV();/设置默认NV条目#endif/如果设备的网络状态为新的网络状态if ( networkStateNV = ZDO_INITDEV_NEW_NETWORK_STATE ) /根据预编译来设置设备新的网络状态参数 ZDAppDetermineDeviceType();/*!*/ / Only delay if joining network - not restoring network state extendedDelay = (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_RESUME ZDAppNwkAddr.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 device osal_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 network devState = DEV_INIT; ZDO_StartDevice( (uint8)ZDO_Config_Node_Descriptor.LogicalType, devStartMode, DEFAULT_BEACON_ORDER, DEFAULT_SUPERFRAME_ORDER ); / Return unprocessed events return (events ZDO_NETWORK_INIT);*tuzhuke2010-11-08 20:18:11 可以看到调用了ZDO_StartDevice( (uint8)ZDO_Config_Node_Descriptor.LogicalType, devStartMode,DEFAULT_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 coordinator devState = 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 PANs to join#if defined( MANAGED_SCAN ) ZDOManagedScan_Next(); ret = NLME_NetworkDiscoveryRequest( managedScanChannelMask, BEACON_ORDER_15_MSEC );#else ret = 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 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#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 events return (events ZDO_NETWORK_START);*调用了ZDApp_NetworkStartEvt()*void ZDApp_NetworkStartEvt( void )if ( nwkStatus = ZSuccess )/网络建立成功 / Successfully started a ZigBee network if ( 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 ) epDesc-endPoint != ZDO_EP ) msgPtr = (osal_event_hdr_t *)osal_msg_allocate( bufLen ); if ( msgPtr ) msgPtr-event = ZDO_STATE_CHANGE; / Command ID msgPtr-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

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

最新文档

评论

0/150

提交评论