亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 學院 > 操作系統 > 正文

第1章 ZigBee協議棧初始化網絡啟動流程

2024-06-28 13:24:54
字體:
來源:轉載
供稿:網友
第1章 ZigBee協議棧初始化網絡啟動流程

作者:宋老師,華清遠見嵌入式學院講師。

ZigBee的基本流程:由協調器的組網(創建PAN ID),終端設備和路由設備發現網絡以及加入網絡。

基本流程:main()->osal_init_system()->osalInitTasks()->ZDApp_Init(),進協議棧初始化函數ZDApp_Init()。

1.1 進入程序入口main()。

ZMain.c中

C++ Code

int 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 routineafInit();#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給任務添加ID

sapi.c中

C++ Code

void 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.c

C++ Code

void ZDApp_Init( uint8 task_id ){// Save the task IDZDAPPTaskID = 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"http://檢測到有手工設置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_RegisterCBs();} /* ZDApp_Init() */

如果設置devState為DEV_HOLD,則不會執行ZDOInitDevice;反之,系統會調用此函數是設備組網或者入網??聪逻@個函數完成的功能是什么樣子的。ZDOInitDevice是設備在網絡中啟動。它會讀取NV中的ZCD_NV_STARTUP_OPTION選項決定是否恢復網絡狀態。如果應用層強制進行新的join操作,它應該在調用這個函數之前設置ZCD_NV_STARTUP_OPTION中的ZCD_STARTOPT_DEFAULT_NETWORK_STATE位。可以調用zgWrieStartupOptions()函數完成這些設置。

1.4 初始化設備(啟動網絡和設置網絡類型)

ZDApp.c

C++ Code

uint8 ZDOInitDevice( uint16 startDelay ){uint8 networkStateNV = ZDO_INITDEV_NEW_NETWORK_STATE;uint16 extendedDelay = 0;if ( devState == DEV_HOLD ){// 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的值,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.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 ); // 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 )networkStateNV = ZDO_INITDEV_NEW_NETWORK_STATE;else{// 通過讀取ZCD_NV_STARTUP_OPTION選項決定是否進行網絡恢復// Determine if NV should be restorednetworkStateNV = ZDApp_ReadNetworkRestoreState();}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();//根據選項設置設備的網絡類型,默認路由類型// 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( extendedDelay );// 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

進入ZDApp_NetworkInit()函數,等待一段時間在執行ZDO_NETWORK_INIT,跳入事件處理ZDApp層ZDAPP_EVENT_LOOP()函數開啟網絡。

C++ Code

void 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_loop()函數。}else{osal_set_event( ZDAppTaskID, ZDO_NETWORK_INIT );}}

1.6啟動設備

ZDApp.c

ZDApp_event_loop()函數是回調函數,循環處理主事件。設備邏輯類型,啟動模式,信標時間,超幀長度

C++ Code

UINT16 ZDApp_event_loop( uint8 task_id, UINT16 events ){uint8 *msg_ptr;if ( events & SYS_EVENT_MSG ){while ( (msg_ptr = osal_msg_receive( ZDAppTaskID )) ){ZDApp_PRocessOSALMsg( (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_StartDevice( (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 ^ ZDO_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_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 ^ ZDO_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 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.c

C++ Code

void ZDO_StartDevice( byte logicalType, devStartModes_t startMode, 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 ) //當設備作為協調器時,執行這個條件語句。{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}}if ( ZG_BUILD_JOINING_TYPE && (logicalType == NODETYPE_ROUTER || logicalType == NODETYPE_DEVICE) )//當設備作為節點時,執行這個條件語句。{if ( (startMode == MODE_JOIN) || (startMode == MODE_REJOIN) ){devState = DEV_NWK_DISC;#if defined( MANAGED_SCAN )ZDOManagedScan_Next();ret = NLME_NetworkDiscoveryRequest( managedScanChannelMask, BEACON_ORDER_15_MSEC );#elseret = NLME_NetworkDiscoveryRequest( zgDefaultChannelList, zgDefaultStartingScanDuration );#if defined ( ZIGBEE_FREQ_AGILITY )if ( !( ZDO_Config_Node_Descriptor.CapabilityFlags & CAPINFO_RCVR_ON_IDLE ) &&( ret == ZSuccess ) && ( ++discRetries == 4 ) ){// For devices with RxOnWhenIdle equals to FALSE, any network channel// change will not be recieved. On these devices or routers that have// lost the network, an active scan shall be conducted on the Default// Channel list using the extended PANID to find the network. If the// extended PANID isn't found using the Default Channel list, an scan// should be completed using all channels.zgDefaultChannelList = MAX_CHANNELS_24GHZ;}#endif // ZIGBEE_FREQ_AGILITY#if defined ( ZIGBEE_COMMISSIONING )if (startMode == MODE_REJOIN && scanCnt++ >= 5 ){// When ApsUseExtendedPanID is commissioned to a non zero value via// application specific means, the device shall conduct an active scan// on the Default Channel list and join the PAN with the same// ExtendedPanID. If the PAN is not found, an scan should be completed// on all channels.// When devices rejoin the network and the PAN is not found fromzgDefaultChannelList = 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 */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" );#endif}}if ( ret != ZSuccess )osal_start_timerEx(ZDAppTaskID, ZDO_NETWORK_INIT, NWK_RETRY_DELAY );}

1.8開啟網絡事件

ZDApp.c

C++ Code

void ZDO_NetworkFormationConfirmCB( ZStatus_t Status ){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 );}

文章來源:華清遠見嵌入式學院,原文地址:http://www.embedu.org/Column/Column877.htm 更多相關嵌入式免費資料查看華清遠見講師博文》》


發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
亚洲成年网站在线观看| 欧美一区第一页| 亚洲精品在线91| 97精品在线视频| 欧美xxxx18性欧美| 久久97久久97精品免视看| 国产日韩精品视频| 精品亚洲一区二区三区在线播放| 国产成人亚洲综合青青| 国产精品色午夜在线观看| 久久久久久网址| 亚洲理论电影网| 欧美在线一区二区视频| 欧美xxxx做受欧美| 亚洲精品国产免费| 亚洲高清福利视频| 亚洲综合中文字幕68页| 欧美专区在线观看| 亚洲天堂免费观看| 精品国产一区二区三区久久久狼| 日本aⅴ大伊香蕉精品视频| 欧美性理论片在线观看片免费| 日韩h在线观看| 久久免费国产精品1| 国产一区二区在线免费视频| 亚洲一级片在线看| 日韩欧美一区视频| 欧美精品videosex牲欧美| 中文字幕av一区二区| 欧美激情一二三| 欧美一区二区三区四区在线| 久久久久久高潮国产精品视| 国产精品69av| 国产精品午夜视频| 国产精品大陆在线观看| 欧美日本亚洲视频| 日韩精品高清视频| 日韩第一页在线| 欧美极品少妇全裸体| 欧美成年人视频网站| 尤物tv国产一区| 欧美一区三区三区高中清蜜桃| 日日骚久久av| 国产精品夜间视频香蕉| 亚洲欧洲xxxx| 97国产在线观看| 一区二区三区无码高清视频| 最近的2019中文字幕免费一页| 欧美成人精品一区二区三区| www.欧美三级电影.com| 欧美成人免费一级人片100| 欧美国产视频一区二区| 国产亚洲欧美一区| 最好看的2019年中文视频| 日韩美女免费视频| 精品自拍视频在线观看| 日本午夜精品理论片a级appf发布| 国模吧一区二区三区| 久久视频免费观看| 国产欧美最新羞羞视频在线观看| 最近2019中文字幕一页二页| 亚洲片国产一区一级在线观看| 欧美专区在线观看| 91精品国产自产91精品| 91国产在线精品| 国产精品视频色| 精品中文字幕在线2019| 久久精品国产欧美亚洲人人爽| 97在线视频免费| 日韩美女免费线视频| 97色伦亚洲国产| 久久成人一区二区| 日韩久久午夜影院| 奇门遁甲1982国语版免费观看高清| 亚洲精品第一国产综合精品| 久久精彩免费视频| 午夜精品蜜臀一区二区三区免费| 亚洲久久久久久久久久| 精品偷拍各种wc美女嘘嘘| 日韩精品在线第一页| 国产精自产拍久久久久久| 国产亚洲欧美视频| 97视频免费看| 亚洲精品一区二三区不卡| 亚洲片av在线| 欧美激情成人在线视频| 欧美日韩亚洲国产一区| 久久资源免费视频| 国产一区二区三区日韩欧美| 欧美老女人性视频| 欧美黑人巨大xxx极品| 日韩精品免费在线| 亚洲国产精品女人久久久| 久久亚洲精品小早川怜子66| 久久男人资源视频| 亚洲国产精品福利| 久久亚洲一区二区三区四区五区高| 国产精品久久婷婷六月丁香| 91在线精品播放| 国产日本欧美一区二区三区在线| 色综合亚洲精品激情狠狠| 国产91ⅴ在线精品免费观看| 国产在线观看精品| 精品二区三区线观看| 成人午夜小视频| 国产精品高精视频免费| 久久国产天堂福利天堂| 国产精品久久久久久久9999| 在线播放国产一区中文字幕剧情欧美| 久久的精品视频| 国产成人黄色av| 亚洲国产精品久久精品怡红院| 亚洲美女av网站| 亚洲美腿欧美激情另类| 欧美最顶级丰满的aⅴ艳星| 欧美视频在线观看免费| 怡红院精品视频| 欧美视频在线观看免费网址| 亚洲人成电影网站色…| 色噜噜亚洲精品中文字幕| 久久夜色精品亚洲噜噜国产mv| 人人做人人澡人人爽欧美| 欧美日韩亚洲网| 姬川优奈aav一区二区| 久久久国产视频91| 日韩中文字幕久久| 九九精品视频在线观看| xxxx欧美18另类的高清| 欧美综合国产精品久久丁香| 国产偷国产偷亚洲清高网站| 国产精品吴梦梦| 亚洲午夜未删减在线观看| 日韩av手机在线观看| 国产精品久久久久久久久影视| 欧美有码在线观看视频| 日韩免费在线看| 欧美理论电影网| 韩日欧美一区二区| 国产精品成人免费视频| 亚洲精品一区中文字幕乱码| 动漫精品一区二区| 成人精品久久av网站| 777精品视频| 国产精品69久久久久| 97在线视频观看| 热久久视久久精品18亚洲精品| 欧美成人高清视频| 68精品国产免费久久久久久婷婷| 久久九九亚洲综合| 国产丝袜精品第一页| 韩国美女主播一区| 91九色蝌蚪国产| 国产亚洲免费的视频看| 91高清免费视频| 69av视频在线播放| 欧美日韩国产精品一区二区不卡中文| 欧美成人免费全部观看天天性色| 亚洲天堂av在线免费观看| 成人亲热视频网站| 日韩最新av在线| 中文字幕亚洲激情| 亚洲一级黄色av| 国产国语刺激对白av不卡| 欧美日韩国产一区中文午夜|