




版權(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)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 郵政面試筆試題及答案
- 專題5 功和簡單機械 2021年和2022年江蘇省南通市中考物理模擬試題匯編
- 2019-2025年消防設(shè)施操作員之消防設(shè)備基礎(chǔ)知識自我檢測試卷A卷附答案
- 2019-2025年軍隊文職人員招聘之軍隊文職管理學(xué)真題練習(xí)試卷A卷附答案
- 酒店合同范本(2篇)
- 2023年黑龍江公務(wù)員《行政職業(yè)能力測驗》試題真題及答案
- 環(huán)境保護與可持續(xù)發(fā)展知識點測試
- 語文課本里的經(jīng)典詩文賞析
- 混凝土銷售代理合同
- 企業(yè)稅務(wù)籌劃指南
- 《澳大利亞》導(dǎo)學(xué)案
- 2025四川省安全員A證考試題庫附答案
- 2025年高考語文備考訓(xùn)練之社會現(xiàn)象:“數(shù)字囤積癥”
- 2025年湖南高速鐵路職業(yè)技術(shù)學(xué)院單招職業(yè)技能測試題庫帶答案
- 蘇教版三年級科學(xué)下冊第一單元第3課《植物開花了》課件
- 休閑海島開發(fā)策劃方案
- DB36-T 2097-2024 固定資產(chǎn)投資項目節(jié)能報告編制規(guī)范
- 健康與保健課件
- 《運營管理 第7版》課件全套 馬風(fēng)才 第01-15章 運營管理概論- 互聯(lián)網(wǎng)運營
- 課件-DeepSeek從入門到精通
- 2025年度典型火災(zāi)案例及消防安全知識專題培訓(xùn)
評論
0/150
提交評論