zigbee設(shè)備啟動分析_第1頁
zigbee設(shè)備啟動分析_第2頁
zigbee設(shè)備啟動分析_第3頁
zigbee設(shè)備啟動分析_第4頁
zigbee設(shè)備啟動分析_第5頁
已閱讀5頁,還剩42頁未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡介

1、設(shè)備啟動準(zhǔn)備一、設(shè)備類型選擇:通過Workspace下拉框選擇設(shè)備的類型:圖1:協(xié)調(diào)器圖2:路由器圖3:終端節(jié)點(diǎn)協(xié)議棧設(shè)備類型:#define ZG_DEVICETYPE_COORDINATOR 0x00#define ZG_DEVICETYPE_ROUTER 0x01#define ZG_DEVICETYPE_ENDDEVICE 0x02#define ZG_DEVICETYPE_SOFT 0x03ZG_DEVICETYPE_SOFT說明:可選設(shè)備類型。可以成為路由器、也可以成為協(xié)調(diào)器,由后面的程序決定。初始化:對于DEVICE_LOGICAL_TYPE的值各邏輯類型設(shè)備初始化如下:/ De

2、vice Logical Type/zgDeviceLogicalType = DEVICE_LOGICAL_TYPE在ZGlobals.h文件中設(shè)備邏輯類型進(jìn)行了初始化:#if defined ( SOFT_START )#define DEVICE_LOGICAL_TYPE ZG_DEVICETYPE_SOFT /可選擇類型#elif defined( ZDO_COORDINATOR )#define DEVICE_LOGICAL_TYPE ZG_DEVICETYPE_COORDINATOR /協(xié)調(diào)器#elif defined (RTR_NWK)#define DEVICE_LOGICAL

3、_TYPE ZG_DEVICETYPE_ROUTER /路由器#else#define DEVICE_LOGICAL_TYPE ZG_DEVICETYPE_ENDDEVICE /終端#endif說明:如果編譯了SOFT_START,則初始化設(shè)備邏輯類型(DEVICE_LOGICAL_TYPE)為可選擇類型(ZG_DEVICETYPE_SOFT)即設(shè)備可以作為協(xié)調(diào)器啟動創(chuàng)建一個網(wǎng)絡(luò)或者作為路由器加入一個已經(jīng)存在的網(wǎng)絡(luò)。如果沒有編譯SOFT_START但編譯了ZDO_COORDINATOR,則初始化設(shè)備邏輯類型(DEVICE_LOGICAL_TYPE)為協(xié)調(diào)器(ZG_DEVICETYPE_COOR

4、DINATOR),即設(shè)備作為路由器啟動并創(chuàng)建一個網(wǎng)絡(luò)。如果沒有編譯SOFT_START和ZDO_COORDINATOR,但編譯了 RTR_NWK,則初始化設(shè)備的邏輯類型為路由器,即設(shè)備作為路由器啟動并加入網(wǎng)絡(luò)。其他情況則初始化為終端節(jié)點(diǎn)并加入網(wǎng)絡(luò)。SOFT-START說明:SOFT_START is a compile option that allows the device to start as a coordinator if one isn't found.設(shè)備啟動模式(devStartMode)、設(shè)備狀態(tài)(devState)啟動模式:表示了設(shè)備是以何種方式啟動typedef

5、 enumMODE_JOIN, /加入MODE_RESUME, /恢復(fù)/MODE_SOFT, /暫不支持MODE_HARD, /創(chuàng)建網(wǎng)絡(luò)MODE_REJOIN /重新加入 devStartModes_t;說明:MODE_JOIN和MODE_REJOIN 是路由器和終端使用的選項(xiàng),用來加入或者重新加入網(wǎng)絡(luò)。而MODE_HARD是協(xié)調(diào)器使用的選項(xiàng)。用來創(chuàng)建一個網(wǎng)絡(luò)。而MODE_RESUME是恢復(fù)設(shè)備原來的狀態(tài)。設(shè)備狀態(tài)標(biāo)識了設(shè)備此時的狀態(tài):typedef enumDEV_HOLD, / Initialized - not started automaticallyDEV_INIT, / Initi

6、alized - not connected to anythingDEV_NWK_DISC, / Discovering PAN's to joinDEV_NWK_JOINING, / Joining a PANDEV_NWK_REJOIN, / ReJoining a PAN, only for end devicesDEV_END_DEVICE_UNAUTH, / Joined but not yet authenticated by trust centerDEV_END_DEVICE, / Started as device after authenticationDEV_R

7、OUTER, / Device joined, authenticated and is a routerDEV_COORD_STARTING, / Started as Zigbee CoordinatorDEV_ZB_COORD, / Started as Zigbee CoordinatorDEV_NWK_ORPHAN / Device has lost information about its parent. devStates_t;初始化(以協(xié)調(diào)器為例)devStartMode和devState的初始化,ZDApp.c中啟動模式(devStartModes_t)#if define

8、d( ZDO_COORDINATOR ) && !defined( SOFT_START )/ Set the default to coodinatordevStartModes_t devStartMode = MODE_HARD;#else/ Assume joiningdevStartModes_t devStartMode = MODE_JOIN;#endif說明:如果編譯了ZDO_COORDINATOR并且沒有編譯SOFT_START,則初始化設(shè)備啟動模式(devStartMode)為MODE_HARD,即協(xié)調(diào)器創(chuàng)建網(wǎng)絡(luò)。其他情況初始化設(shè)備啟動模式(devStart

9、Mode)為MODE_JOIN,即設(shè)備加入網(wǎng)絡(luò)。.以上可以看出,如果編譯了 SOFT_START。首先并不是創(chuàng)建網(wǎng)絡(luò),而是先加入網(wǎng)絡(luò)。如果網(wǎng)絡(luò)加入失敗,則考慮創(chuàng)建一個網(wǎng)絡(luò)。設(shè)備狀態(tài)(devState):#if defined( HOLD_AUTO_START )devStates_t devState = DEV_HOLD;/ Initialized - not started automatically#elsedevStates_t devState = DEV_INIT;/ Initialized - not connected to anything#endif說明:如果編譯了HOLD

10、_AUTO_START,則設(shè)備狀態(tài)(devState)為 DEV_HOLD;否則設(shè)備狀態(tài)(devState)為 DEV_INIT。Hold Auto Start說明:A device will automatically start trying to form or join a network . If the device should wait on a timer or other external event before joining, then HOLD_AUTO_START must be defined. In order to manually start the jo

11、in process at a later time.3、有兩種方式來設(shè)置非自動啟動模式:Hold Auto Start(1)、手工方式:在ZDApp_Init()函數(shù)中有個ZDAppCheckForHoldKey();(/ Check for manual(手工的) "Hold Auto Start").void ZDAppCheckForHoldKey( void )/如果檢測到按鍵 SW_BYPASS_START被按下,則將設(shè)備的狀態(tài)置為 DEV_HOLD#if (defined HAL_KEY) && (HAL_KEY = TRUE)if ( Hal

12、KeyRead () = SW_BYPASS_START) devState = DEV_HOLD;#endif(2)、預(yù)編譯方式:project->options->c/c+compiler->preprocessor->defined symbols下編譯選項(xiàng):HOLD_AUTO_START在ZDApp.c中:#if defined( HOLD_AUTO_START )devStates_t devState = DEV_HOLD;#elsedevStates_t devState = DEV_INIT;#endif把devState初始化為DEV_HOLD.以上兩

13、種方式最終都會設(shè)置devState = DEV_HOLD / Initialized - not started automatically預(yù)編譯選項(xiàng):什么是預(yù)編譯選項(xiàng):Compile options are used to select between features that are provided in the source files. Most compile options act as on/off switches for specific sections within source programs. Some options are used to provide a

14、 user-defined 編譯選項(xiàng)是將源程序里提供的特性選擇應(yīng)用。大多數(shù)編譯選項(xiàng)是充當(dāng)“開關(guān)”作用。直接通過編譯選項(xiàng)來決定是否應(yīng)用某一特性。編譯選項(xiàng)配置的兩種方式:A:TOOL文件夾下的三個配置文件在Tools文件夾下查看f8wCoord.cfg、f8wRouter.cfg、f8wEdev.cfg三個配置文件信息。協(xié)調(diào)器:f8wCoord.cfg配置文件中同時編譯了路由功能RTR_NWK和協(xié)調(diào)器功能ZDO_COORDINATOR/* Coordinator Settings */-DZDO_COORDINATOR / Coordinator Functions-DRTR_NWK / Rout

15、er Functions路由器:f8wRouter.cfg配置文件中編譯了路由功能RTR_NWK/* Router Settings */-DRTR_NWK / Router Functions終端:f8wEdev.cfg配置文件中沒有編譯這兩個功能./* */通過配置文件我們也可以看出協(xié)調(diào)器不僅具有協(xié)調(diào)器的作用還可以充當(dāng)路由器,這就是我們所說的如果當(dāng)協(xié)調(diào)器創(chuàng)建完網(wǎng)絡(luò)后就可以認(rèn)為協(xié)調(diào)器就變成了路由器了。路由器只有路由的功能,而終端設(shè)備沒有路由的功能,更沒有協(xié)調(diào)器的功能。B: 通過Option選項(xiàng)下的配置條目進(jìn)行配置常用配置選項(xiàng):NV_RESTORESOFT_STARTLCD_SUPPORTED

16、=DEBUGPOWER_SAVINGREFLECTORRTR_NWKZDO_COORDINATORHOLD_AUTO_START網(wǎng)絡(luò)狀態(tài)/ ZDOInitDevice return values#define ZDO_INITDEV_RESTORED_NETWORK_STATE 0x00#define ZDO_INITDEV_NEW_NETWORK_STATE0x01#define ZDO_INITDEV_LEAVE_NOT_STARTED 0x02說明:ZDO_INITDEV_RESTORED_NETWORK_STATE 網(wǎng)絡(luò)狀態(tài)為恢復(fù)狀態(tài),即如果編譯了NV-RESTORE,則設(shè)備將恢復(fù)為上

17、次的狀態(tài)。ZDO_INITDEV_RESTORED_NETWORK_STATE 網(wǎng)絡(luò)狀態(tài)為新狀態(tài)或者沒有可以恢復(fù)的狀態(tài),此時設(shè)備將直接創(chuàng)建或者加入一個網(wǎng)絡(luò)。 ZDO_INITDEV_LEAVE_NOT_STARTED為離開下次啟動網(wǎng)絡(luò)恢復(fù) NV_RESTOREDevices that have successfully joined a network can “restore the network” (instead of reforming by OTA messages) even after losing power or battery. This automatic restor

18、ation can be enabled by defining NV_RESTORE and/or NV_INIT. 地址結(jié)構(gòu)體說明:typedef structunionuint16 shortAddr; ZLongAddr_t extAddr; addr;byte addrMode; zAddrType_t;包括有地址模式和地址。地址模式有:typedef enum afAddrNotPresent = AddrNotPresent, afAddr16Bit = Addr16Bit, afAddrGroup = AddrGroup, afAddrBroadcast = AddrBroad

19、cast afAddrMode_t特殊地址:0xFFFF-向所有設(shè)備廣播信息0xFFFE-綁定時使用該地址0xFFFD-向所有非睡眠的節(jié)點(diǎn)廣播0xFFFC-向所有路由器廣播(包括協(xié)調(diào)器)實(shí)例:ZDAppNwkAddr.addrMode = Addr16Bit;ZDAppNwkAddr.addr.shortAddr = INVALID_NODE_ADDR;注冊機(jī)制說明:為什么要注冊?協(xié)議棧三大注冊機(jī)制:端點(diǎn)endpoint的注冊、按鍵KEY的注冊和ZDOMsg消息注冊。這里我們看endpoint的注冊。Endpoint的注冊最終調(diào)用了函數(shù)*afRegisterExtended();epList_

20、t *afRegisterExtended( endPointDesc_t *epDesc, pDescCB descFn )if ( ep )/成功分配空間/ Fill in the new list entryep->epDesc = epDesc;ep->flags = eEP_AllowMatch;ep->pfnDescCB = descFn;ep->nextDesc = NULL;if ( epList = NULL )epList = ep; / Make this the first entryelseepSearch = epList;while( ep

21、Search->nextDesc != NULL )epSearch = epSearch->nextDesc;/循環(huán)到最后,就是依次“下一個”,直到最后一個,在最后把新的加上epSearch->nextDesc = ep;協(xié)調(diào)器創(chuàng)建網(wǎng)絡(luò)規(guī)范說明在一個zigbee網(wǎng)絡(luò)中,只有協(xié)調(diào)器(coordinator)才可以建立網(wǎng)絡(luò),建立網(wǎng)絡(luò)的過程是通過原語實(shí)現(xiàn)的。首先協(xié)調(diào)器的應(yīng)用層調(diào)用NLME_NETWORK_FORMATION.request原語發(fā)出建立網(wǎng)絡(luò)請求,網(wǎng)絡(luò)層(NWK)收到這個原語,向MAC層發(fā)送MLME_SCAN.request原語執(zhí)行信道能量掃描(energy scan

22、)和活動情況掃描(active scan),(在IEEEE802.15.4協(xié)議中規(guī)定,在2.4G頻段,共有16個信道,每個信道的帶寬為5M)。信道能量(energy scan)掃描是為了找到規(guī)定信道中那一個最安靜,并標(biāo)注為可用信道 。每掃描一個信道持續(xù)約半秒,如果配置為16個信道全部掃描共需約八秒。當(dāng)MAC層執(zhí)行完信道能量掃描(energy scan)后,由MAC層向NWK層發(fā)送MLME_SCAN.confirm確認(rèn)原語。當(dāng)信道能量掃描(energy scan)完成后下一步就在可用信道中執(zhí)行活動情況掃描(active scan),活動情況掃描(active scan)是MAC層通過發(fā)送MAC幀

23、,檢測是否有回應(yīng)判斷信道是否有其他網(wǎng)絡(luò)存在,活動情況掃描(active scan)的目的在于防止在同一個信道上建立兩個具有相同PANID的網(wǎng)絡(luò)。當(dāng)MAC層執(zhí)行活動情況掃描(active scan)后,由MAC層向NWK層發(fā)送MLME_SCAN.confirm確認(rèn)原語。并將可用的可用的PANID和信道發(fā)送給上層。當(dāng)執(zhí)行完上述掃描后,如果獲得了可用的信道和PANID,則網(wǎng)絡(luò)層(NWK)向MAC發(fā)送MLME_START.request原語請求啟動創(chuàng)建網(wǎng)絡(luò),當(dāng)網(wǎng)絡(luò)創(chuàng)建成功MAC層向網(wǎng)絡(luò)層(NWK)發(fā)送MLME_START.confirm原語告知結(jié)果。網(wǎng)絡(luò)層(NWK)向應(yīng)用層(APS)發(fā)送NLME_NE

24、TWORK_FORMATION.confirm原語告知結(jié)果。協(xié)調(diào)器啟動協(xié)議棧代碼說明1、協(xié)調(diào)器預(yù)編譯信息在Tools文件夾下查看f8wCoord.cfg編譯ZDO_COORDINATOR和RTR_NWK.在Option選項(xiàng)卡編譯:CC2430EB;ZTOOL_P1;MT_TASK;MANAGED_SCAN2、具體流程首先協(xié)議棧以主函數(shù)為入口點(diǎn)啟動協(xié)議棧。在主函數(shù)中調(diào)用了osal_init_system()進(jìn)行了OS的初始化ZSEG int main( void ) osal_int_disable( INTS_ALL ); HAL_BOARD_INIT(); zmain_vdd_check()

25、; osal_init_system() OS 初始化系統(tǒng),初始化了內(nèi)存、定時器、電源管理以及系統(tǒng)任務(wù)等。byte osal_init_system( void ) osal_mem_init(); osal_qHead = NULL; osalTimerInit(); osal_pwrmgr_init(); / Initialize the system tasks.初始化任務(wù)系統(tǒng) osalInitTasks();在任務(wù)初始化osalInitTasks()函數(shù)中,OS為每一層分配一個任務(wù)ID,使得協(xié)議棧成為一個多任務(wù)的系統(tǒng)void osalInitTasks( void ) uint8 ta

26、skID = 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+ );#endif APS_Init( taskID+ ); ZDApp_Init( taskID+ )

27、; SampleApp_Init( taskID );函數(shù)說明:1、 void *osal_mem_alloc( uint16 size )說明:該函數(shù)在內(nèi)存中開辟了size大小的一塊內(nèi)存參數(shù)說明:size-要開辟內(nèi)存的大小返回值:指針2、void *osal_memset( void *dest, byte value, int len )說明:該函數(shù)將起始地址為dest,長度為len的一塊內(nèi)存的值設(shè)置為value參數(shù)說明:*dest-起始地址 value-要設(shè)置成的值 len-設(shè)置內(nèi)存塊的大小返回值:指針其他說明:由編譯選項(xiàng)可知MT_TASK編譯了,可以知道函數(shù)中#if defined(

28、MT_TASK ) MT_TaskInit( taskID+ );#endif將被執(zhí)行。即最后ZDApp_Init(byte task_id) 傳遞的任務(wù)id的值為5,而SampleApp_Init( taskID )傳遞的任務(wù)id為6.void ZDApp_Init(byte task_id) uint8 capabilities;/保存下了OS分配的任務(wù)id。即ZDAppTaskID=5ZDAppTaskID=task_id;/如果程序運(yùn)行到這里正好SW_1被按下,則會設(shè)置設(shè)備的狀態(tài)(devState)為DEV_HOLD,從而避開網(wǎng)絡(luò)初始化ZDAppCheckForHoldKey();/I

29、nitialize ZDO items and setup the device type of device to create.ZDO_Init(); AfRegister( (endPointDesc_t *)&ZDApp_epDesc );/ Start the deviceif ( devState != DEV_HOLD )     ZDOInitDevice( 0 );else    /

30、0;Blink LED to indicate HOLD_START    HalLedBlink ( HAL_LED_4, 0, 50, 500 );ZDApp_RegisterCBs();函數(shù)說明:1、 void ZDAppCheckForHoldKey( void )說明:如果在設(shè)備啟動的時候手動將SW_1按下,則將設(shè)備狀體置為DEV_HOLD,從而避開網(wǎng)絡(luò)初始化。參數(shù)說明:無返回值:無2、void ZDO_Init( void )說明:該函數(shù)是ZD

31、Object 和 ZDProfile 初始化函數(shù),在該函數(shù)中調(diào)用了ZDODeviceSetup()根據(jù)編譯選項(xiàng)的不同進(jìn)行了相關(guān)的初始化。參數(shù)說明:無返回值:無3、afStatus_t afRegister( endPointDesc_t *epDesc )說明:該函數(shù)為zigbee設(shè)備注冊一個新的端口。應(yīng)用程序的每一個端口都必須使用該函數(shù)進(jìn)行注冊。參數(shù)說明:epDesc -指向端口描述符的指針返回值:afStatus_t-在ZcomDef.h的Zstatus_t結(jié)構(gòu)體中定義的狀態(tài)值4、uint8 ZDOInitDevice(uint16 startDelay)說明:該函數(shù)為ZDO設(shè)備初始化函數(shù)

32、,該函數(shù)會檢查系統(tǒng)是否需要恢復(fù),如果需要恢復(fù)則恢復(fù),否則啟動設(shè)備。參數(shù)說明:startDelay-設(shè)備啟動延時返回值:ZDO_INITDEV_RESTORED_NETWORK_STATE-設(shè)備恢復(fù)成功ZDO_INITDEV_NEW_NETWORK_STATE-設(shè)備為新狀態(tài)ZDO_INITDEV_LEAVE_NOT_STARTED-離開下次啟動uint8 ZDOInitDevice( uint16 startDelay )  /初始化設(shè)備網(wǎng)絡(luò)狀態(tài)為ZDO_INITDEV_NEW_NETWORK_STATE:新的網(wǎng)絡(luò)狀態(tài). &#

33、160;uint8 networkStateNV = ZDO_INITDEV_NEW_NETWORK_STATE;  uint16 extendedDelay = 0;  devState = DEV_INIT;    / Remove the Hold state/設(shè)備的狀態(tài)為:設(shè)備初始化  #if defined ( NV_RESTORE )&

34、#160; if ( HalKeyRead() = SW_BYPASS_NV )  /如果SW_BYPASS_NV按鍵此時被按下則會避開NV-RSTORE,將網(wǎng)絡(luò)狀態(tài)置為新狀態(tài)  networkStateNV = ZDO_INITDEV_NEW_NETWORK_STATE;   else/決定NV是否需要恢復(fù)      /函數(shù)返回的設(shè)備網(wǎng)絡(luò)狀態(tài)是新的網(wǎng)絡(luò)狀態(tài)或者是恢復(fù)的網(wǎng)絡(luò)狀態(tài);以此  /來確定要

35、不要讀取NV里相應(yīng)條目來恢復(fù)網(wǎng)絡(luò)先前狀態(tài)    networkStateNV = ZDApp_ReadNetworkRestoreState(); /通過函數(shù)ZDApp_ReadNetworkRestoreState的返回值決定NV是否需要恢復(fù)。  /函數(shù)ZDApp_ReadNetworkRestoreState()用來檢測是否需要恢復(fù),如果返回值為/ZDO_INITDEV_RESTORED_NETWORK_STATE則恢復(fù)網(wǎng)絡(luò)先前的狀態(tài)if ( networkStateNV =

36、60;ZDO_INITDEV_RESTORED_NETWORK_STATE )/恢復(fù)設(shè)備先前的網(wǎng)絡(luò)狀態(tài)參數(shù)并且  /設(shè)置devStartMode = MODE_RESUME  networkStateNV = ZDApp_RestoreNetworkState(); /通過函數(shù)ZDApp_RestoreNetworkState()恢復(fù)網(wǎng)絡(luò)先前的狀態(tài)    else  /如果沒有可以恢復(fù)的則執(zhí)行下面代碼     

37、60;/ Wipe out the network state in NV    NLME_InitNV();    NLME_SetDefaultNV();  /設(shè)置默認(rèn)NV條目  #endif /以下為沒有定義NV_RESTORE,即不恢復(fù)網(wǎng)路狀態(tài)或者恢復(fù)失敗。如果網(wǎng)絡(luò)狀態(tài)為/ZDO_INITDEV_NEW_NETWORK_STATE則執(zhí)行以下代碼if ( networkS

38、tateNV = ZDO_INITDEV_NEW_NETWORK_STATE )   /根據(jù)編譯選項(xiàng)決定設(shè)備的類型,但僅在編譯了SOFT_START 才起作用    ZDAppDetermineDeviceType();     / Only delay if joining network - not restoring network state

39、0;   extendedDelay = (uint16)(NWK_START_DELAY + startDelay)              + (osal_rand() & EXTENDED_JOINING_RANDOM_MASK);    / Initialize device

40、60;security  ZDApp_SecInit( networkStateNV );  / Trigger the network start  ZDApp_NetworkInit( extendedDelay );  return ( networkStateNV );函數(shù)說明:1 、uint8 ZDApp_ReadNetworkRestoreState( void )說明:通過該函數(shù)讀取NV 中Z

41、CD_NV_STARTUP_OPTION的值決定是否需要恢復(fù)先前的網(wǎng)絡(luò)狀態(tài)。參數(shù)說明:無返回值: ZDO_INITDEV_NEW_NETWORK_STATE-新網(wǎng)絡(luò)狀態(tài),無需恢復(fù) ZDO_INITDEV_RESTORED_NETWORK_STATE-恢復(fù)先前網(wǎng)絡(luò)狀態(tài)2、  uint8 ZDApp_RestoreNetworkState( void )說明:通過該函數(shù)可以恢復(fù)先前的網(wǎng)絡(luò)狀態(tài)參數(shù)說明:無返回值: ZDO_INITDEV_RESTORED_NETWORK_STATE-網(wǎng)絡(luò)狀態(tài)恢復(fù)成功 ZDO_INITDEV_NEW_NETWORK_STATE-網(wǎng)絡(luò)狀態(tài)恢復(fù)失敗3、 void

42、 ZDAppDetermineDeviceType( void )說明:通過該函數(shù)決定啟動時設(shè)備的邏輯類型及啟動模式,但僅在編譯了SOFT_START 才起作用參數(shù)說明:無返回值:無4、 void ZDApp_NetworkInit( uint16 delay )說明:通過該函數(shù)觸發(fā)設(shè)備啟動函數(shù),該函數(shù)觸發(fā)了ZDO_NETWORK_INIT事件。參數(shù)說明:delay- 觸發(fā)ZDO_NETWORK_INIT的延時返回值:無其他說明:在函數(shù)ZDApp_NetworkInit()的參數(shù)值的大小,這里extendedDelay的大小足夠協(xié)議棧初始化其它層。因?yàn)樵搮?shù)在傳遞給函數(shù)后定時觸發(fā)事件ZDO_N

43、ETWORK_INIT,而溢出時間正是extendedDelay。在協(xié)議棧提供的SampleApp實(shí)例中,編譯了SOFT_START,當(dāng)執(zhí)行到這里的時候,設(shè)備類型為可選類型(ZG_DEVICETYPE_SOFT)。延時extendedDelay確保了當(dāng)設(shè)備開始創(chuàng)建網(wǎng)絡(luò)的時候已經(jīng)初始化了SampleApp的應(yīng)用層,在應(yīng)用層通過跳線決定了設(shè)備的類型是協(xié)調(diào)器或是路由器。通過上面函數(shù)的分析我們可以看出設(shè)備在啟動的時候可以利用NV恢復(fù)上次的網(wǎng)絡(luò)狀態(tài),也可以不恢復(fù)直接開始創(chuàng)建或加入網(wǎng)絡(luò),恢復(fù)與否取決于是否編譯了NV_RESTORE。ZDOInitDevice( uint16 start

44、Delay )函數(shù)的最后觸發(fā)了事件ZDO層的ZDO_NETWORK_INIT。ZDO層事件處理函數(shù)為ZDApp_event_loop()。UINT16 ZDApp_event_loop( byte task_id, UINT16 events ) if ( events & ZDO_NETWORK_INIT ) / Initialize apps and start the network devState = DEV_INIT; /此時設(shè)備狀態(tài)為“初始化” ZDO_StartDevice( (uint8)ZDO_Config_Node_Descriptor.LogicalT

45、ype, devStartMode, DEFAULT_BEACON_ORDER, DEFAULT_SUPERFRAME_ORDER ); return (events ZDO_NETWORK_INIT); 函數(shù)說明:1 、void ZDO_StartDevice( byte logicalType, devStartModes_t startMode, byte beaconOrder, byte superframeOrder )說明:通過該函數(shù)根據(jù)設(shè)備類型及設(shè)備啟動方式的不同啟動設(shè)備。參數(shù)說明:logicalType-設(shè)備的邏輯類型 startMode-設(shè)備的啟動模式 beaconOrde

46、r-信標(biāo)時間 superframeOrder-超幀長度返回值:無在ZDApp_event_loop()中處理ZDO_NETWORK_INIT前,即設(shè)備啟動之前設(shè)備的狀態(tài)設(shè)置為設(shè)備初始化(DEV_INIT)。然后調(diào)用了ZDO_StartDevice()啟動設(shè)備。下面仔細(xì)分析設(shè)備的啟動函數(shù)ZDO_StartDevice()void ZDO_StartDevice( byte logicalType, devStartModes_t startMode, byte beaconOrder, byte superframeOrder ) #if defined(ZDO_COORDINATOR) /如果

47、定義了協(xié)調(diào)器 if ( logicalType = NODETYPE_COORDINATOR ) /node type coordinator /協(xié)調(diào)器的兩種啟動方式: if ( startMode = MODE_HARD )/普通的啟動,直接創(chuàng)建網(wǎng)絡(luò) devState = DEV_COORD_STARTING;/設(shè)備狀態(tài)為協(xié)調(diào)器正在啟動 / NLME_NetworkFormationRequest為系統(tǒng)函數(shù),用于協(xié)調(diào)器創(chuàng)建網(wǎng)絡(luò) ret = NLME_NetworkFormationRequest( zgConfigPANID, zgDefaultChannelList, gDefaultSt

48、artingScanDuration,beaconOrder, superframeOrder, false ); else if ( startMode = MODE_RESUME )/網(wǎng)絡(luò)恢復(fù) / Just start the coordinator devState = DEV_COORD_STARTING; /設(shè)備狀態(tài)為協(xié)調(diào)器正在啟動 /如果是協(xié)調(diào)器恢復(fù)則會以路由器啟動 ret = NLME_StartRouterRequest( beaconOrder, beaconOrder, false ); #endif / !ZDO_COORDINATOR/路由器和終端加入網(wǎng)絡(luò)的過程是一樣的

49、,但是兩個設(shè)備在恢復(fù)時是不一樣的#if !defined ( ZDO_COORDINATOR ) | defined( SOFT_START ) if ( logicalType = NODETYPE_ROUTER | logicalType = NODETYPE_DEVICE ) if ( (startMode = MODE_JOIN) | (startMode = MODE_REJOIN) )/要加入網(wǎng)絡(luò) devState = DEV_NWK_DISC; /此時設(shè)備狀態(tài)為“發(fā)現(xiàn)網(wǎng)絡(luò)” #if defined( MANAGED_SCAN ) /如果編譯了MANAGED_SCAN將會會掃描所有

50、信道 ZDOManagedScan_Next(); /進(jìn)行信道掃描 /選擇掃描到的網(wǎng)絡(luò)加入 ret=NLME_NetworkDiscoveryRequest(managedScanChannelMask, BEACON_ORDER_15_MSEC ); #else /加入到默認(rèn)信道上的網(wǎng)絡(luò) ret=NLME_NetworkDiscoveryRequest(zgDefaultChannelList, zgDefaultStartingScanDuration ); #endif else if ( startMode = MODE_RESUME )/下面是設(shè)備恢復(fù)代碼 if ( logicalT

51、ype = NODETYPE_ROUTER )/路由器的恢復(fù) nwk_ScanJoiningOrphan(&scanCnf);/路由器以孤點(diǎn)方式加入網(wǎng)絡(luò) ret = ZSuccess; else/終端節(jié)點(diǎn)的恢復(fù) devState = DEV_NWK_ORPHAN; ret = NLME_OrphanJoinRequest( zgDefaultChannelList, zgDefaultStartingScanDuration ); #endif /!ZDO COORDINATOR | SOFT_START if ( ret != ZSuccess )/如果沒有啟動,則重新再來一次! o

52、sal_start_timerEx(ZDAppTaskID,ZDO_NETWORK_INIT, NWK_RETRY_DELAY );函數(shù)說明:1 、ZStatus_t NLME_NetworkFormationRequest( uint16 PanId, uint32 ScanChannels, byte ScanDuration, byte BeaconOrder, byte SuperframeOrder, byte BatteryLifeExtension )說明:通過該函數(shù)協(xié)調(diào)器可以創(chuàng)建一個網(wǎng)絡(luò)。該函數(shù)會觸發(fā)其對應(yīng)的回調(diào)函數(shù)void ZDO_NetworkFormationConfir

53、mCB( ZStatus_t Status )。2、ZStatus_t NLME_StartRouterRequest( byte BeaconOrder, byte SuperframeOrder, byte BatteryLifeExtension )說明:通過該函數(shù)可以啟動一個路由器或者完成協(xié)調(diào)器的恢復(fù)。該函數(shù)會觸發(fā)其對應(yīng)的回調(diào)函數(shù)void ZDO_StartRouterConfirmCB( ZStatus_t Status )。3、ZStatus_t NLME_NetworkDiscoveryRequest( uint32 ScanChannels, byte scanDuration

54、)說明:通過該函數(shù)請求網(wǎng)絡(luò)層發(fā)現(xiàn)鄰居路由器節(jié)點(diǎn)。該函數(shù)會觸發(fā)其對應(yīng)的回調(diào)函數(shù)ZStatus_t ZDO_NetworkDiscoveryConfirmCB( byte ResultCount, networkDesc_t *NetworkList )4、void nwk_ScanJoiningOrphan( ZMacScanCnf_t *param )說明:通過該函數(shù)路由器會以孤點(diǎn)的方式加入網(wǎng)絡(luò)。該函數(shù)會觸發(fā)其回調(diào)函數(shù)void ZDO_JoinConfirmCB( uint16 PanId, ZStatus_t Status )5、 ZStatus_t NLME_OrphanJoinReque

55、st( uint32 ScanChannels, byte ScanDuration )說明:通過該函數(shù)終端節(jié)點(diǎn)以孤點(diǎn)的方式加入網(wǎng)絡(luò)。該函數(shù)會觸發(fā)其回調(diào)函數(shù)void ZDO_JoinConfirmCB( uint16 PanId, ZStatus_t Status )我們這里是協(xié)調(diào)器的啟動,并且沒有用到網(wǎng)絡(luò)恢復(fù),所以在該函數(shù)中會調(diào)用NLME_NetworkFormationRequest( zgConfigPANID, zgDefaultChannelList,         

56、60;                                zgDefaultStartingScanDuration, beaconOrder, superframeOrder, false )來創(chuàng)建一個新的網(wǎng)絡(luò)。調(diào)用NLME_NetworkFormationRequest()觸發(fā)了其對應(yīng)的回調(diào)函數(shù)ZDO_NetworkFormationConfirmCB()。void ZDO_NetworkFormationConfirmCB( ZStatus_t Status )#if defined(ZDO_COORDINATOR) nwkStatus = (byte)Status; /將狀態(tài)保存到nwkStatus中 if ( Status = Z

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論