收藏 分销(赏)

ZigBee协议栈初始化网络启动作业流程.doc

上传人:w****g 文档编号:2971057 上传时间:2024-06-12 格式:DOC 页数:23 大小:50.54KB
下载 相关 举报
ZigBee协议栈初始化网络启动作业流程.doc_第1页
第1页 / 共23页
ZigBee协议栈初始化网络启动作业流程.doc_第2页
第2页 / 共23页
ZigBee协议栈初始化网络启动作业流程.doc_第3页
第3页 / 共23页
ZigBee协议栈初始化网络启动作业流程.doc_第4页
第4页 / 共23页
ZigBee协议栈初始化网络启动作业流程.doc_第5页
第5页 / 共23页
点击查看更多>>
资源描述

1、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 LEDsH

2、AL_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

3、basic NV itemszgInit();#ifndef NONWK/ Since the AF isnt a task,call its initialization routineafInit();#endif/ Initialize the operating systemosal_init_system();/ Allow interruptsosal_int_enable( INTS_ALL );/ Final board initializationInitBoard( OB_READY );/ Display information about this devicezmai

4、n_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;/ Shouldnt get here. / main()1.2 给任务添加IDsapi.c中C+ C

5、odevoid 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( tas

6、kID+ );#endifAPS_Init( taskID+ );ZDApp_Init( taskID+ );/判断如果协调器节点建立网络、如果终端节点加入网络SAPI_Init( taskID );1.3 初始化ZigBee合同栈网络ZDApp.cC+ Codevoid ZDApp_Init( uint8 task_id )/ Save the task IDZDAppTaskID = task_id;/ Initialize the ZDO global device short address storageZDAppNwkAddr.addrMode = Addr16Bit;ZDAppN

7、wkAddr.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();/通过判断预编译来启

8、动某些函数功能/ 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/ Start the device?if (

9、devState != DEV_HOLD )ZDOInitDevice( 0 );else/ Blink LED to indicate HOLD_STARTHalLedBlink ( HAL_LED_4,0,50,500 );ZDApp_RegisterCBs(); /* ZDApp_Init() */如果设立devState为DEV_HOLD,则不会执行ZDOInitDevice;反之,系统会调用此函数是设备组网或者入网。看下这个函数完毕功能是什么样子。ZDOInitDevice是设备在网络中启动。它会读取NV中ZCD_NV_STARTUP_OPTION选项决定与否恢复网络状态。如果应用层

10、强制进行新join操作,它应当在调用这个函数之前设立ZCD_NV_STARTUP_OPTION中ZCD_STARTOPT_DEFAULT_NETWORK_STATE位。可以调用zgWrieStartupOptions()函数完毕这些设立。1.4 初始化设备(启动网络和设立网络类型)ZDApp.cC+ Codeuint8 ZDOInitDevice( uint16 startDelay )uint8 networkStateNV = ZDO_INITDEV_NEW_NETWORK_STATE;uint16 extendedDelay = 0;if ( devState = DEV_HOLD )/

11、 Initialize the RAM items table,in case an NV item has been updated.zgInitItems( FALSE );ZDConfig_InitDescriptors();/devtag.071807.todo - fix this temporary solution_NIB.CapabilityInfo = ZDO_Config_Node_Descriptor.CapabilityFlags;devState = DEV_INIT;/ Remove the Hold state/ 函数读取NV项目ZCD_NV_LEAVE_CTRL

12、值,ZDApp_LeaveCtrl指向这个值/ Initialize leave control logicZDApp_LeaveCtrlInit();/ Check leave control reset settings/设备断开会导致DEV_HOLD状态ZDApp_LeaveCtrlStartup( &devState,&startDelay );/ Leave may make the hold state come backif ( devState = DEV_HOLD )/设立启动选项/ Set the NV startup option to force a new join.

13、zgWriteStartupOptions( ZG_STARTUP_SET,ZCD_STARTOPT_DEFAULT_NETWORK_STATE );/告知应用层触发事件/ Notify the applicationsosal_set_event( ZDAppTaskID,ZDO_STATE_CHANGE_EVT );return ( ZDO_INITDEV_LEAVE_NOT_STARTED );/ Dont join - (one time).#if defined ( NV_RESTORE )/ Get Keypad directly to see if a reset nv is n

14、eeded./ Hold down the SW_BYPASS_NV key (defined in OnBoard.h)/ while booting to skip past NV Restore.if ( HalKeyRead() = SW_BYPASS_NV )networkStateNV = ZDO_INITDEV_NEW_NETWORK_STATE;else/ 通过读取ZCD_NV_STARTUP_OPTION选项决定与否进行网络恢复/ Determine if NV should be restorednetworkStateNV = ZDApp_ReadNetworkResto

15、reState();if ( networkStateNV = ZDO_INITDEV_RESTORED_NETWORK_STATE )networkStateNV = ZDApp_RestoreNetworkState();else/ Wipe out the network state in NVNLME_InitNV();NLME_SetDefaultNV();#endifif ( networkStateNV = ZDO_INITDEV_NEW_NETWORK_STATE )/如果是要启动新网络ZDAppDetermineDeviceType();/依照选项设立设备网络类型,默认路由类

16、型/ Only delay if joining network - not restoring network stateextendedDelay = (uint16)(NWK_START_DELAY + startDelay)+ (osal_rand() & EXTENDED_JOINING_RANDOM_MASK);/ Initialize the security for type of deviceZDApp_SecInit( networkStateNV );/ 触发启动网络/ Trigger the network startZDApp_NetworkInit( extende

17、dDelay );/ set broadcast address mask to support broadcast filtering 用于解决合法广播地址NLME_SetBroadcastFilter( ZDO_Config_Node_Descriptor.CapabilityFlags );return ( networkStateNV );这个函数注意功能:初始化设备配备,ZDAppDetermineDeviceType()设立网络类型(协调、路由、终端),ZDApp_NetworkInit( extendedDelay )初始化网络并启动或加入网络。1.5 定期启动网络ZDApp.c

18、进入ZDApp_NetworkInit()函数,等待一段时间在执行ZDO_NETWORK_INIT,跳入事件解决ZDApp层ZDAPP_EVENT_LOOP()函数启动网络。C+ Codevoid ZDApp_NetworkInit( uint16 delay )if ( delay )/ Wait awhile before starting the deviceosal_start_timerEx( ZDAppTaskID,ZDO_NETWORK_INIT,delay );/发送ZDO_NETWORK_INIT(网络初始化)消息到 ZDApp层,转到ZDApp层,ZDApp_event_l

19、oop()函数。elseosal_set_event( ZDAppTaskID,ZDO_NETWORK_INIT );1.6 启动设备ZDApp.cZDApp_event_loop()函数是回调函数,循环解决主事件。设备逻辑类型,启动模式,信标时间,超帧长度C+ CodeUINT16 ZDApp_event_loop( uint8 task_id,UINT16 events )uint8 *msg_ptr;if ( events & SYS_EVENT_MSG )while ( (msg_ptr = osal_msg_receive( ZDAppTaskID ) )ZDApp_ProcessO

20、SALMsg( (osal_event_hdr_t *)msg_ptr );/ Release the memoryosal_msg_deallocate( msg_ptr );/ Return unprocessed eventsreturn (events SYS_EVENT_MSG);if ( events & ZDO_NETWORK_INIT )/ Initialize apps and start the networkdevState = DEV_INIT;/设备逻辑类型,启动模式,信标时间,超帧长度,接着转到去启动设备,转到ZDO_StartDevice()ZDO_StartDe

21、vice( (uint8)ZDO_Config_Node_Descriptor.LogicalType,devStartMode,DEFAULT_BEACON_ORDER,DEFAULT_SUPERFRAME_ORDER );/ Return unprocessed eventsreturn (events ZDO_NETWORK_INIT);if ( ZSTACK_ROUTER_BUILD )if ( events & ZDO_NETWORK_START )ZDApp_NetworkStartEvt();/ Return unprocessed eventsreturn (events ZD

22、O_NETWORK_START);if ( events & ZDO_ROUTER_START )if ( nwkStatus = ZSuccess )if ( devState = DEV_END_DEVICE )devState = DEV_ROUTER;osal_pwrmgr_device( PWRMGR_ALWAYS_ON );else/ remain as end device!osal_set_event( ZDAppTaskID,ZDO_STATE_CHANGE_EVT );/ Return unprocessed eventsreturn (events ZDO_ROUTER_

23、START);if ( events & ZDO_STATE_CHANGE_EVT )ZDO_UpdateNwkStatus( devState );/ At start up,do one MTO route discovery if the device is a concentratorif ( zgConcentratorEnable = TRUE )/ Start next eventosal_start_timerEx( NWK_TaskID,NWK_MTO_RTG_REQ_EVT,100 );/ Return unprocessed eventsreturn (events ZD

24、O_STATE_CHANGE_EVT);if ( events & ZDO_COMMAND_CNF )/ User defined logic/ Return unprocessed eventsreturn (events ZDO_COMMAND_CNF);if ( events & ZDO_NWK_UPDATE_NV )ZDApp_SaveNetworkStateEvt();/ Return unprocessed eventsreturn (events ZDO_NWK_UPDATE_NV);if ( events & ZDO_DEVICE_RESET )/ The device has

25、 been in the UNAUTH state,so reset/ Note:there will be no return from this callSystemReset();if ( ZG_SECURE_ENABLED )return ( ZDApp_ProcessSecEvent( task_id,events ) );else/ Discard or make more handlersreturn 0;1.7 启动网络ZDObject.cC+ Codevoid ZDO_StartDevice( byte logicalType,devStartModes_t startMod

26、e,byte beaconOrder,byte superframeOrder )ZStatus_t ret;#if defined ( ZIGBEE_FREQ_AGILITY )static uint8 discRetries = 0;#endif#if defined ( ZIGBEE_COMMISSIONING )static uint8 scanCnt = 0;#endifret = ZUnsupportedMode;if ( ZG_BUILD_COORDINATOR_TYPE & logicalType = NODETYPE_COORDINATOR ) /当设备作为协调器时,执行这个

27、条件语句。if ( startMode = MODE_HARD )devState = DEV_COORD_STARTING;/向网络层发送网络形成祈求。当网络层执行 NLME_NetworkFormationRequest()建立网络后,将予以ZDO层反馈信息。/ 接着转去执行ZDApp层 ZDO_NetworkFormationConfirmCB()函数ret = NLME_NetworkFormationRequest( zgConfigPANID,zgApsUseExtendedPANID,zgDefaultChannelList,zgDefaultStartingScanDuration,beaconOrder,superframeOrder,false );else if ( startMode = 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 );#endif

展开阅读全文
相似文档                                   自信AI助手自信AI助手
猜你喜欢                                   自信AI导航自信AI导航
搜索标签

当前位置:首页 > 通信科技 > 网络/通信

移动网页_全站_页脚广告1

关于我们      便捷服务       自信AI       AI导航        获赠5币

©2010-2024 宁波自信网络信息技术有限公司  版权所有

客服电话:4008-655-100  投诉/维权电话:4009-655-100

gongan.png浙公网安备33021202000488号   

icp.png浙ICP备2021020529号-1  |  浙B2-20240490  

关注我们 :gzh.png    weibo.png    LOFTER.png 

客服