ZigBee協(xié)議棧初始化網(wǎng)絡(luò)啟動流程_第1頁
ZigBee協(xié)議棧初始化網(wǎng)絡(luò)啟動流程_第2頁
ZigBee協(xié)議棧初始化網(wǎng)絡(luò)啟動流程_第3頁
ZigBee協(xié)議棧初始化網(wǎng)絡(luò)啟動流程_第4頁
ZigBee協(xié)議棧初始化網(wǎng)絡(luò)啟動流程_第5頁
已閱讀5頁,還剩9頁未讀, 繼續(xù)免費閱讀

下載本文檔

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

文檔簡介

1、ZigBee協(xié)議棧初始化網(wǎng)絡(luò)啟動流程ZigBee的基本流程:由協(xié)調(diào)器的組網(wǎng)(創(chuàng)建PANID),終端設(shè)備和路由設(shè)備發(fā)現(xiàn)網(wǎng)絡(luò)以及加入網(wǎng)絡(luò)?;玖鞒蹋簃ain()->osal_init_system()->osalInitTasks()->ZDApp_Init(),進(jìn)協(xié)議棧初始化函數(shù)ZDApp_Init()。1.1進(jìn)入程序入口main()。ZMain.c中C+Codeintmain(void)/Turnoffinterruptsosal_int_disable(INTS_ALL);/InitializationforboardrelatedstuffsuchasLEDsHAL_BO

2、ARD_INIT();/Makesuresupplyvoltageishighenoughtorunzmain_vdd_check();/InitializeboardI/OInitBoard(OB_COLD);/InitialzeHALdriversHalDriverInit();/InitializeNVSystemosal_nv_init(NULL);/InitializetheMACZMacInit();/Determinetheextendedaddresszmain_ext_addr();/InitializebasicNVitemszgInit();#ifndefNONWK/Si

3、ncetheAFisn'tatask,callit'sinitializationroutineafInit();#endif/Initializetheoperatingsystemosal_init_system();/Allowinterruptsosal_int_enable(INTS_ALL);/FinalboardinitializationInitBoard(OB_READY);/Displayinformationaboutthisdevicezmain_dev_info();/*DisplaythedeviceinfoontheLCD*/#ifdefLCD_S

4、UPPORTEDzmain_lcd_init();#endif#ifdefWDT_IN_PM1/*IfWDTisused,thisisagoodplacetoenableit.*/WatchDogEnable(WDTIMX);#endifosal_start_system();/NoReturnfromherereturn0;/Shouldn'tgethere./main()1.2給任務(wù)添加IDsapi.c中C+CodevoidosalInitTasks(void)/為各自進(jìn)程添加ID用于任務(wù)的查找uint8taskID=0;tasksEvents=(uint16*)osal_mem_

5、alloc(sizeof(uint16)*tasksCnt);osal_memset(tasksEvents,0,(sizeof(uint16)*tasksCnt);macTaskInit(taskID+);nwk_init(taskID+);Hal_Init(taskID+);/硬件抽象層初始化1.1 defined(MT_TASK)MT_TaskInit(taskID+);#endifAPS_Init(taskID+);ZDApp_Init(taskID+);/判斷如果協(xié)調(diào)器節(jié)點建立網(wǎng)絡(luò)、如果終端節(jié)點加入網(wǎng)絡(luò)SAPI_Init(taskID);1.3 初始化ZigBee協(xié)議棧網(wǎng)絡(luò)ZDApp

6、.cC+CodevoidZDApp_Init(uint8task_id)ZDAppTaskID=task_id;/InitializetheZDOglobaldeviceshortaddressstorageZDAppNwkAddr.addrMode=Addr16Bit;ZDAppNwkAddr.addr.shortAddr=INVALID_NODE_ADDR;(void)NLME_GetExtAddr();/LoadthesaveExtAddrpointer./Checkformanual"HoldAutoStart"/檢測到有手工設(shè)置HAL_KEY_SW_1則會設(shè)置de

7、vState=DEV_HOLD,從而避開網(wǎng)絡(luò)初始化ZDAppCheckForHoldKey();/InitializeZDOitemsandsetupthedevice-typeofdevicetocreate.ZDO_Init();/通過判斷預(yù)編譯來開啟一些函數(shù)功能/RegistertheendpointdescriptionwiththeAF/Thistaskdoesn'thaveaSimpledescription,butwestillneed/toregistertheendpoint.afRegister(endPointDesc_t*)&ZDApp_epDesc);

8、#ifdefined(ZDO_USERDESC_RESPONSE)ZDApp_InitUserDesc();#endif/ZDO_USERDESC_RESPONSE/Startthedevice?if(devState!=DEV_HOLD)ZDOInitDevice(0);else/BlinkLEDtoindicateHOLD_STARTHalLedBlink(HAL_LED_4,0,50,500);ZDApp_RegisterCBs();/*ZDApp_Init()*/如果設(shè)置devState為DEV_HOLD,則不會執(zhí)行ZDOInitDevice;反之,系統(tǒng)會調(diào)用此函數(shù)是設(shè)備組網(wǎng)或者入網(wǎng)。

9、看下這個函數(shù)完成的功能是什么樣子的。ZDOInitDevice是設(shè)備在網(wǎng)絡(luò)中啟動。它會讀取NV中的ZCD_NV_STARTUP_OPTION選項決定是否恢復(fù)網(wǎng)絡(luò)狀態(tài)。如果應(yīng)用層強制進(jìn)行新的join操作,它應(yīng)該在調(diào)用這個函數(shù)之前設(shè)置ZCD_NV_STARTUP_OPTION中的ZCD_STARTOPT_DEFAULT_NETWORK_STAT眩??梢哉{(diào)用zgWrieStartupOptions()函數(shù)完成這些設(shè)置。1.4 初始化設(shè)備(啟動網(wǎng)絡(luò)和設(shè)置網(wǎng)絡(luò)類型)ZDApp.cC+Codeuint8ZDOInitDevice(uint16startDelay)uint8networkStateNV=Z

10、DO_INITDEV_NEW_NETWORK_STATE;uint16extendedDelay=0;if(devState=DEV_HOLD)/InitializetheRAMitemstable,incaseanNVitemhasbeenupdated.zgInitItems(FALSE);ZDConfig_InitDescriptors();devtag.071807.todo-fixthistemporarysolution_NIB.CapabilityInfo=ZDO_Config_Node_Descriptor.CapabilityFlags;devState=DEV_INIT;R

11、emovetheHoldstate/函數(shù)讀取NV項目ZCD_NV_LEAVE_CTRL的值,ZDApp_LeaveCtrl指向這個值ZDApp_LeaveCtrlInit();/Checkleavecontrolresetsettings/設(shè)備的斷開會造成DEV_HOLD狀態(tài)ZDApp_LeaveCtrlStartup(&devState,&startDelay);/Leavemaymaketheholdstatecomebackif(devState=DEV_HOLD)/設(shè)置啟動選項/SettheNVstartupoptiontoforcea"new"jo

12、in.zgWriteStartupOptions(ZG_STARTUP_SET,ZCD_STARTOPT_DEFAULT_NETWORK_STATE);/通知應(yīng)用層觸發(fā)事件/Notifytheapplicationsosal_set_event(ZDAppTaskID,ZDO_STATE_CHANGE_EVT);return(ZDO_INITDEV_LEAVE_NOT_STARTED);Don'tjoin-(onetime).#ifdefined(NV_RESTORE)/GetKeypaddirectlytoseeifaresetnvisneeded./HolddowntheSW_BY

13、PASS_NVkey(definedinOnBoard.h)/whilebootingtoskippastNVRestore.if(HalKeyRead()=SW_BYPASS_NV)networkStateNV=ZDO_INITDEV_NEW_NETWORK_STATE;else/通過讀取zcd_nv_startup_optioN4項決定是否進(jìn)行網(wǎng)絡(luò)恢復(fù)/DetermineifNVshouldberestorednetworkStateNV=ZDApp_ReadNetworkRestoreState();if(networkStateNV=ZDO_INITDEV_RESTORED_NETWO

14、RK_STATE)networkStateNV=ZDApp_RestoreNetworkState();else/WipeoutthenetworkstateinNVNLME_InitNV();NLME_SetDefaultNV();#endifif(networkStateNV=ZDO_INITDEV_NEW_NETWORK_STATE)/如果是要啟動新的網(wǎng)絡(luò)ZDAppDetermineDeviceType();/根據(jù)選項設(shè)置設(shè)備的網(wǎng)絡(luò)類型,默認(rèn)路由類型/Onlydelayifjoiningnetwork-notrestoringnetworkstateextendedDelay=(uint

15、16)(NWK_START_DELAY+startDelay)+(osal_rand()&EXTENDED_JOINING_RANDOM_MASK);/InitializethesecurityfortypeofdeviceZDApp_SecInit(networkStateNV);/觸發(fā)啟動網(wǎng)絡(luò)/TriggerthenetworkstartZDApp_NetworkInit(extendedDelay);/setbroadcastaddressmasktosupportbroadcastfiltering用于處理合法的廣播地址NLME_SetBroadcastFilter(ZDO_C

16、onfig_Node_Descriptor.CapabilityFlags);return(networkStateNV);這個函數(shù)注意功能:初始化設(shè)備配置,ZDAppDetermineDeviceType()設(shè)置網(wǎng)絡(luò)類型(協(xié)調(diào)、路由、終端),ZDApp_NetworkInit(extendedDelay)初始化網(wǎng)絡(luò)并開啟或加入網(wǎng)絡(luò)。1.5 定時開啟網(wǎng)絡(luò)ZDApp.c進(jìn)入ZDApp_NetworkInit()函數(shù),等待一段時間在執(zhí)行ZDO_NETWORK_INIT,跳入事件處理ZDApp層ZDAPP_EVENT_LOOP()Ei數(shù)開啟網(wǎng)絡(luò)。C+CodevoidZDApp_NetworkInit

17、(uint16delay)if(delay)/Waitawhilebeforestartingthedeviceosal_start_timerEx(ZDAppTaskID,ZDO_NETWORK_INIT,delay);/發(fā)送ZDO_NETWORK_INIT(網(wǎng)絡(luò)初始化)消息到ZDApp層,轉(zhuǎn)至UZDApp層,ZDApp_event_loop()函數(shù)。elseosal_set_event(ZDAppTaskID,ZDO_NETWORK_INIT);1.6 啟動設(shè)備ZDApp.cZDApp_event_l00Po函數(shù)是回調(diào)函數(shù),循環(huán)處理主事件。設(shè)備邏輯類型,啟動模式,信標(biāo)時間,超幀長度C+Co

18、deUINT16ZDApp_event_loop(uint8task_id,UINT16events)uint8*msg_ptr;if(events&SYS_EVENT_MSG)while(msg_ptr=osal_msg_receive(ZDAppTaskID)ZDApp_ProcessOSALMsg(osal_event_hdr_t*)msg_ptr);/Releasethememoryosal_msg_deallocate(msg_ptr);/Returnunprocessedeventsreturn(eventsASYS_EVENT_MSG);if(events&ZDO

19、_NETWORK_INIT)/InitializeappsandstartthenetworkdevState=DEV_INIT;/設(shè)備邏輯類型,啟動模式,信標(biāo)時間,超幀長度,接著轉(zhuǎn)到去啟動設(shè)備,轉(zhuǎn)到ZDO_StartDevice()ZDO_StartDevice(uint8)ZDO_Config_Node_Descriptor.LogicalType,devStartMode,DEFAULT_BEACON_ORDER,DEFAULT_SUPERFRAME_ORDER);/Returnunprocessedeventsreturn(eventsaZDO_NETWORK_INIT);if(ZST

20、ACK_ROUTER_BUILD)if(events&ZDO_NETWORK_START)ZDApp_NetworkStartEvt();/Returnunprocessedeventsreturn(eventsAZDO_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/remainasenddevice!osal_set_e

21、vent(ZDAppTaskID,ZDO_STATE_CHANGE_EVT);/Returnunprocessedeventsreturn(eventsaZDO_ROUTER_START);if(events&ZDO_STATE_CHANGE_EVT)ZDO_UpdateNwkStatus(devState);/Atstartup,dooneMTOroutediscoveryifthedeviceisaconcentratorif(zgConcentratorEnable=TRUE)/Startnexteventosal_start_timerEx(NWK_TaskID,NWK_MTO

22、_RTG_REQ_EVT,100);/Returnunprocessedeventsreturn(eventsAZDO_STATE_CHANGE_EVT);if(events&ZDO_COMMAND_CNF)/Userdefinedlogic/Returnunprocessedeventsreturn(eventsaZDO_COMMAND_CNF);if(events&ZDO_NWK_UPDATE_NV)ZDApp_SaveNetworkStateEvt();/Returnunprocessedeventsreturn(eventsaZDO_NWK_UPDATE_NV);if(

23、events&ZDO_DEVICE_RESET)/ThedevicehasbeenintheUNAUTHstate,soreset/Note:therewillbenoreturnfromthiscallSystemReset();if(ZG_SECURE_ENABLED)return(ZDApp_ProcessSecEvent(task_id,events);else/Discardormakemorehandlersreturn0;1.7 開啟網(wǎng)絡(luò)ZDObject.cC+CodevoidZDO_StartDevice(bytelogicalType,devStartModes_ts

24、tartMode,bytebeaconOrder,bytesuperframeOrder)ZStatus_tret;#ifdefined(ZIGBEE_FREQ_AGILITY)staticuint8discRetries=0;#endif#ifdefined(ZIGBEE_COMMISSIONING)staticuint8scanCnt=0;#endifret=ZUnsupportedMode;if(ZG_BUILD_COORDINATOR_TYPE&&logicalType=NODETYPE_COORDINATOR)11當(dāng)設(shè)備作為協(xié)調(diào)器時,執(zhí)行這個條件語句if(startM

25、ode=MODE_HARD)devState=DEV_COORD_STARTING;/向網(wǎng)絡(luò)層發(fā)送網(wǎng)絡(luò)形成請求。當(dāng)網(wǎng)絡(luò)層執(zhí)行NLME_NetworkFormationRequest()建立網(wǎng)絡(luò)后,將給予ZDO層反饋信息。/接著轉(zhuǎn)去執(zhí)行ZDApp層的ZDO_NetworkFormationConfirmCB()函數(shù)ret=NLME_NetworkFormationRequest(zgConfigPANID,zgApsUseExtendedPANID,zgDefaultChannelList,zgDefaultStartingScanDuration,beaconOrder,superframeO

26、rder,false);elseif(startMode=MODE_RESUME)/JuststartthecoordinatordevState=DEV_COORD_STARTING;ret=NLME_StartRouterRequest(beaconOrder,beaconOrder,false);else#ifdefined(LCD_SUPPORTED)HalLcdWriteScreen("StartDeviceERR","MODEunknown");#endifif(ZG_BUILD_JOINING_TYPE&&(logicalT

27、ype=NODETYPE_ROUTER|logicalType=NODETYPE_DEVICE)/當(dāng)設(shè)備作為節(jié)點時,執(zhí)行這個條件語句。if(startMode=MODE_JOIN)|(startMode=MODE_REJOIN)devState=DEV_NWK_DISC;#ifdefined(MANAGED_SCAN)ZDOManagedScan_Next();ret=NLME_NetworkDiscoveryRequest(managedScanChannelMask,BEACON_ORDER_15_MSEC);#elseret=NLME_NetworkDiscoveryRequest(zg

28、DefaultChannelList,zgDefaultStartingScanDuration);#ifdefined(ZIGBEE_FREQ_AGILITY)if(!(ZDO_Config_Node_Descriptor.CapabilityFlags&CAPINFO_RCVR_ON_IDLE)&&(ret=ZSuccess)&&(+discRetries=4)/FordeviceswithRxOnWhenIdleequalstoFALSE,anynetworkchannel/changewillnotberecieved.Onthesedevice

29、sorroutersthathave/lostthenetwork,anactivescanshallbeconductedontheDefault/ChannellistusingtheextendedPANIDtofindthenetwork.Ifthe/extendedPANIDisn'tfoundusingtheDefaultChannellist,anscan/shouldbecompletedusingallchannels.zgDefaultChannelList=MAX_CHANNELS_24GHZ;#endif/ZIGBEE_FREQ_AGILITY#ifdefine

30、d(ZIGBEE_COMMISSIONING)if(startMode=MODE_REJOIN&&scanCnt+>=5)/WhenApsUseExtendedPanlDiscommissionedtoanonzerovaluevia/applicationspecificmeans,thedeviceshallconductanactivescan/ontheDefaultChannellistandjointhePANwiththesame/ExtendedPanlD.IfthePANisnotfound,anscanshouldbecompleted/onallchannels./WhendevicesrejointhenetworkandthePANisnotfoundfromzgDefaultChannelList=MAX_CHANNELS_24GHZ;#endif/ZIGBEE_COMMISSIONING#endifelseif(startMode=MODE_RESUME)if(logicalType=NODETYPE_ROUTER)ZMacScanCnf_tscanCnf;devState=DEV_NWK_O

溫馨提示

  • 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)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論