實(shí)驗(yàn)10節(jié)點(diǎn)的建網(wǎng)與入網(wǎng)分析_第1頁
實(shí)驗(yàn)10節(jié)點(diǎn)的建網(wǎng)與入網(wǎng)分析_第2頁
實(shí)驗(yàn)10節(jié)點(diǎn)的建網(wǎng)與入網(wǎng)分析_第3頁
實(shí)驗(yàn)10節(jié)點(diǎn)的建網(wǎng)與入網(wǎng)分析_第4頁
實(shí)驗(yàn)10節(jié)點(diǎn)的建網(wǎng)與入網(wǎng)分析_第5頁
已閱讀5頁,還剩18頁未讀 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡介

1、 ZigBee實(shí)驗(yàn)十節(jié)點(diǎn)的建網(wǎng)與入網(wǎng)分析10.1 實(shí)驗(yàn)簡介在前面實(shí)驗(yàn)中,我們都是直接的去使用了一個網(wǎng)絡(luò),如果不是想對內(nèi)核進(jìn)行深入研究,完全可以不用去考慮TI協(xié)議棧的工作細(xì)節(jié),只要懂得關(guān)鍵使用部分也一樣可以對ZIGBEE進(jìn)行開發(fā)。為了對協(xié)議棧有更深入的了解認(rèn)識,本實(shí)驗(yàn)對“協(xié)調(diào)器”的建網(wǎng)以及“路由器”“終端”的入網(wǎng),做個簡單的邏輯性介紹。實(shí)驗(yàn)?zāi)康?0.2 訓(xùn)練目的 10.2.1 通過本實(shí)驗(yàn)了解Z-STACK啟動的過程中建網(wǎng)與入網(wǎng)的一個流程。10.3實(shí)驗(yàn)設(shè)備10.3.1 硬件:(1) ZIGBEE 調(diào)試底板2個:可調(diào)電阻ZigBee_DEBUG指示燈紅外發(fā)射ZigBee復(fù)位ZigBee按鍵撥碼開關(guān)節(jié)

2、點(diǎn)按鍵復(fù)位傳感器接口1J-LINK接口傳感器接口3傳感器接口2電源開關(guān)電源圖10-1 ZIGBEE調(diào)試底板(2) UART轉(zhuǎn)接板與轉(zhuǎn)接線各1個:UART轉(zhuǎn)接線轉(zhuǎn)接串口輸入,連接到ZIGBEE調(diào)試底板轉(zhuǎn)接串口輸出,連接到電腦串口圖10-2 UART轉(zhuǎn)接板與轉(zhuǎn)接線(3) ZIGBEE仿真器1個;10PIN下載接口電源(上)和狀態(tài)指示燈USB接口圖10-3 ZIGBEE仿真器(4) ZIGBEE模塊2個;圖10-4 ZIGBEE模塊(5) 電源2個圖10-5 電源(6) 串口延長線1根圖10-6 串口延長線(7) 硬件連接圖連接電腦串口ZigBee調(diào)試底板與串口轉(zhuǎn)接板連接電源連接電腦USBZIGBE

3、E DeBug連接口圖10-7 硬件連接10.3.2 軟件(1) IAR Embedded Workbench for MCS-51 7.51A集成開發(fā)環(huán)境;(2) TI Z-STACK;(3) 仿真器驅(qū)動;(4) 串口調(diào)試助手。實(shí)驗(yàn)知識10.4 10.4.1 網(wǎng)絡(luò)形成每個設(shè)備都有一組能被配置的參數(shù)(如被PC工具或者外部處理器配置),整個配置參數(shù)在代碼中已經(jīng)定義了默認(rèn)值(在f8wconfig.cfg中)。在同一個網(wǎng)絡(luò)中,所有設(shè)備的“網(wǎng)絡(luò)細(xì)節(jié)”配置參數(shù)(如PANID,Channel等)應(yīng)該被配置成一樣的值。每個設(shè)備的“設(shè)備細(xì)節(jié)”配置參數(shù)(Coordinator,Router,Enddevice等

4、)可以配置為不同的值。但是,ZCD_NV_LOGICAL_TYPE必須被設(shè)置,確保:1、 有正確的一個設(shè)備作為協(xié)調(diào)器被配置;2、 所有電池供電的設(shè)備作為終端設(shè)備被配置。一旦這些工作都完成,這個設(shè)備就可以以任意方式啟動。協(xié)調(diào)器設(shè)備將建立網(wǎng)絡(luò),其他設(shè)備將發(fā)現(xiàn)和加入到這個網(wǎng)絡(luò)中。10.4.2 協(xié)調(diào)器格式化網(wǎng)絡(luò)協(xié)調(diào)器將掃描DEFAULT_CHANLIST(在f8wConfig.cfg里定義)指定的通道,最后在其中之一上形成網(wǎng)絡(luò)。設(shè)備的PANID值與ZDAPP_CONFIG_PAN_ID值設(shè)置有關(guān)(ZDAPP_CONFIG_PAN_ID這個參數(shù)在配置文件f8wConfig.cfg)。如果協(xié)調(diào)器的ZDAP

5、P_CONFIG_PAN_ID設(shè)置為OxFFFF,則協(xié)調(diào)器將產(chǎn)生一個隨機(jī)的PANID,如果協(xié)調(diào)器的ZDAPP_CONFIG_PAN_ID設(shè)置為非0xFFFF值,則協(xié)調(diào)器根據(jù)自身的網(wǎng)絡(luò)長地址(IEEE地址)或ZDAPP_CONFIG_PAN_ID值隨機(jī)產(chǎn)生一個PANID,如果協(xié)調(diào)器的PANID的設(shè)置值為小于等于0x3FFF的有效值,協(xié)調(diào)器就會以這個特定的PANID值建立網(wǎng)絡(luò),但是,如果在默認(rèn)的信道上已經(jīng)有了該P(yáng)ANID值的網(wǎng)絡(luò)存在,則協(xié)調(diào)器會繼續(xù)搜尋其他的PANID,直到找到網(wǎng)絡(luò)不沖突為止。當(dāng)所有參數(shù)配置好后,可以調(diào)用下面函數(shù)來格式化網(wǎng)絡(luò)(以下函數(shù)不開源):ZStatus_t NLME_Netw

6、orkFormationRequest( uint16 PanId,uint8* ExtendedPANID, uint32 ScanChannels,byte ScanDuration, byte BeaconOrder,byte SuperframeOrder, byte BatteryLifeExtension );但一般不直接使用上面的函數(shù)建立網(wǎng)絡(luò),而是使用ZDO_StartDevice()函數(shù)來啟動一個設(shè)備10.4.3 路由器和終端設(shè)備加入網(wǎng)絡(luò)路由器和終端設(shè)備啟動后,將掃描DEFAULT_CHANLIST指定的頻道,如果ZDAPP_CONFIG_PAN_ID沒有被定義為0xFFFF,

7、則路由器將強(qiáng)制加入ZDAPP_CONFIG_PAN_ID定義的網(wǎng)絡(luò)。發(fā)現(xiàn)一個網(wǎng)絡(luò)將調(diào)用下面函數(shù)(以下函數(shù)不開源):ZStatus_t NLME_NetworkDiscoveryRequest( uint32 ScanChannels, byte scanDuration);該函數(shù)要求網(wǎng)絡(luò)層去發(fā)現(xiàn)鄰居路由器節(jié)點(diǎn),并且應(yīng)該在進(jìn)行網(wǎng)絡(luò)掃描之前調(diào)用,掃描的結(jié)果由ZStatus_t ZDO_NetworkDiscoveryConfirmCB()函數(shù)返回,其中:ScanChannels-準(zhǔn)備掃描的信道號(信道號的范圍1126,即僅對2.4GHz頻段有效)。scanDuration-規(guī)定了在新的網(wǎng)絡(luò)開始建立

8、之前,其他網(wǎng)絡(luò)可以掃描每個信道的時間長度。發(fā)現(xiàn)網(wǎng)絡(luò)存在后,就調(diào)用下面的函數(shù)加入網(wǎng)絡(luò)。ZStatus_t NLME_OrphanJoinRequest( uint32 ScanChannels, byte ScanDuration )。該函數(shù)要求網(wǎng)絡(luò)層以孤節(jié)點(diǎn)的形式加入網(wǎng)絡(luò)。函數(shù)調(diào)用的結(jié)果由ZDO_JoinConfirmCB()函數(shù)返回。注意:如果協(xié)調(diào)器和路由器或終端設(shè)備都沒定義ZDAPP_CONFIG_PAN_ID為0xFFFF,則兩者之間不一樣的定義可能會出現(xiàn)一些意外的結(jié)果;如果ZDAPP_CONFIG_PAN_ID被定義為一個正確的值(小于或等于0x3FFFF),那么協(xié)調(diào)器就只在指定的PA

9、N ID上試圖建立網(wǎng)絡(luò)。實(shí)驗(yàn)步驟10.510.5.1 在開始本實(shí)驗(yàn)的仿真前,參看配套源資料中“關(guān)于節(jié)點(diǎn)板串口使用的統(tǒng)一說明”,先按照本說明去配置好串口,波特率38400,以便往下實(shí)驗(yàn)?zāi)苷J褂么凇D10-8 節(jié)點(diǎn)板串口使用的統(tǒng)一說明10.5.2 啟動IAR Embedded Workbench,打開對應(yīng)配套實(shí)驗(yàn)源碼中“協(xié)調(diào)器”的SampleApp.eww工程:圖10-9 工程文件圖10-10 打開工程界面10.5.3 編譯鏈接程序代碼Make,這一步可以省略,因?yàn)檫M(jìn)行DeBug前,IAR軟件會先編譯再下載代碼到目標(biāo)板上去仿真,但對于編譯檢查錯誤,這一步也很有必要。如果正確編譯后文件右側(cè)的紅星

10、會消失。在Make之前,最好Clean一下,如下圖所示:圖10-11 編譯鏈接代碼文件紅色星星編譯后變沒有了編譯后生成圖10-12 編譯前后對比如果正確建立工程并正確配置了工程,則此時編譯是無錯誤的,編譯無錯誤如圖 圖10-13 編譯鏈接無錯誤圖10-14 編譯連接有錯誤10.5.4 按照前面“實(shí)驗(yàn)設(shè)備”小節(jié)中的“硬件連接圖”連接好硬件并打開電源,點(diǎn)擊DEBUG按鈕或者”Project->Debug”或者快捷鍵“Ctrl + D”進(jìn)行程序下載并Debug。如有出錯,請檢查硬件連接或拔掉仿真器USB再重接圖10-15 Debug 調(diào)試圖10-16 程序正在下載到目標(biāo)板10.5.5 正確進(jìn)入

11、DeBug界面,如下圖:圖10-17 仿真調(diào)試界面10.5.6 通過以上步驟已將協(xié)調(diào)器程序下載到節(jié)點(diǎn),此時的節(jié)點(diǎn)叫“協(xié)調(diào)器”。10.5.7 在配套資料“提高實(shí)驗(yàn)”文件夾下找到“超級單片機(jī)工具軟件.exe”,如果是WIN7系統(tǒng),右鍵“以管理員身份運(yùn)行”,選擇電腦對應(yīng)的端口,設(shè)置和程序?qū)?yīng)的波特率“38400”,數(shù)據(jù)位“8”,停止位“1”,校驗(yàn)位“NONE”,然后點(diǎn)擊“打開串口”圖10-18 超級單片機(jī)工具軟件圖10-19 超級單片機(jī)工具軟件界面10.5.8 按下“全速運(yùn)行”按鈕進(jìn)行試驗(yàn)驗(yàn)證,串口打印出協(xié)調(diào)器啟動過程中的第幾步。具體參看“實(shí)驗(yàn)驗(yàn)證”。步出函數(shù)步入函數(shù)單步運(yùn)行復(fù)位全速運(yùn)行按鈕圖10-

12、20 調(diào)試功能按鈕10.5.9 此時一個“協(xié)調(diào)器”的啟動過程已經(jīng)驗(yàn)證完。將仿真器從“協(xié)調(diào)器”中拆下,讓“協(xié)調(diào)器”成為一個單獨(dú)個體,重啟運(yùn)行,讓協(xié)調(diào)器處于一直運(yùn)行狀態(tài)。再將另一個節(jié)點(diǎn)按照“硬件連接圖”連接好,再按“實(shí)驗(yàn)步驟”將“路由器”的程序下載到節(jié)點(diǎn)中,然后全速運(yùn)行驗(yàn)證串口打印出來的結(jié)果。10.5.10 實(shí)驗(yàn)完畢。實(shí)驗(yàn)驗(yàn)證10.6 10.6.1 查看串口調(diào)試助手打印出來的設(shè)備啟動步驟:圖10-21 協(xié)調(diào)器啟動過程圖10-22 路由器啟動過程實(shí)驗(yàn)部分參考程序解析(完整程序見源程序文件)10.7代碼解釋:10.7.1 協(xié)調(diào)器建網(wǎng)過程:STEP 1: zigbee設(shè)備應(yīng)用層初始化ZDApp_Init

13、 ()【ZDApp.c】:在任務(wù)初始化osalInitTasks()中,調(diào)用了ZIGBEE設(shè)備應(yīng)用層初始化函數(shù):void osalInitTasks( void ) uint8 taskID = 0; tasksEvents = (uint16 *)osal_mem_alloc( sizeof( uint16 ) * tasksCnt); osal_memset( tasksEvents, 0, (sizeof( uint16 ) * tasksCnt); macTaskInit( taskID+ ); / MAC初始化,MAC任務(wù)ID為0,此函數(shù)不開源無法查看源碼。 nwk_init( ta

14、skID+ ); / nwk初始化,nwk任務(wù)ID為1,此函數(shù)不開源無法查看源碼。 Hal_Init( taskID+ ); / Hal初始化,hal(硬件抽象層)任務(wù)ID為2,僅賦值ID號。#if defined( MT_TASK ) MT_TaskInit( taskID+ ); / MT(monitortest監(jiān)視器)初始化,如果有使用,則此任務(wù)ID為3,如果要使用UART串口,必須要初始化此任務(wù).本程序沒使用。#endif APS_Init( taskID+ );/ APS(應(yīng)用支持子層)初始化,APS任務(wù)ID為3,此函數(shù)不開源無法查看源碼。#if defined ( ZIGBEE_F

15、RAGMENTATION ) APSF_Init( taskID+ ); / 應(yīng)用支持子層消息分割層,此處沒編譯使用#endif ZDApp_Init( taskID+ ); / zigbee設(shè)備應(yīng)用層初始化,ZDApp任務(wù)ID為4,開始器件的啟動.#if defined ( ZIGBEE_FREQ_AGILITY ) | defined ( ZIGBEE_PANID_CONFLICT ) ZDNwkMgr_Init( taskID+ );/ 網(wǎng)絡(luò)管理層初始化,任務(wù)ID為5.#endif SampleApp_Init( taskID ); / 用戶任務(wù)初始化,任務(wù)ID為6.Main()

16、4;osal_init_system()àosalInitTasks()àZDApp_Init():在ZDApp_Init()當(dāng)中,獲取了設(shè)備的IEEE地址和對按鍵啟動的檢測等,其中重要的是ZDOInitDevice()函數(shù),可以說此函數(shù)是網(wǎng)絡(luò)建立的入口。因?yàn)镮AR預(yù)編譯了HOLD_AUTO_START,所以devState初始化賦值為DEV_HOLD(在ZDApp.C中):#if defined( HOLD_AUTO_START ) devStates_t devState = DEV_HOLD;#else devStates_t devState = DEV_INIT;

17、#endif所以語句 if ( devState != DEV_HOLD )不成立,故ZDOInitDevice()函數(shù)留用戶調(diào)用去啟動。STEP 2:用戶任務(wù)初始化SampleApp_Init()【SampleApp.c】:用戶任務(wù)初始化函數(shù)SampleApp_Init()中重要的地方就是調(diào)用了ZDOInitDevice()函數(shù),而在調(diào)用ZDOInitDevice()前,要對設(shè)備類型進(jìn)行定義,可以在用戶任務(wù)初始化調(diào)用ZDOInitDevice()前或是在ZDOInitDevice()函數(shù)的開始地方定義,此設(shè)備為“協(xié)調(diào)器”,所以定義為zgDeviceLogicalType = ZG_DEVIC

18、ETYPE_COORDINATOR。STEP 3:ZIGBEE設(shè)備初始化ZDOInitDevice()【ZDApp.c】:ZDOInitDevice()函數(shù),先對網(wǎng)絡(luò)的各種動作以及參數(shù)做個配置,配置完成后調(diào)用ZDApp_NetworkInit()對網(wǎng)絡(luò)進(jìn)行初始化。STEP 4:網(wǎng)絡(luò)初始化ZDApp_NetworkInit()【ZDApp.c】:在ZDApp_NetworkInit()函數(shù)里,實(shí)際上并沒有做其他的一些初始化,而是將ZDO_NETWORK_INIT事件加入到定時器列表中去等待系統(tǒng)調(diào)度執(zhí)行。STEP 5:ZIGBEE設(shè)備應(yīng)用事件處理ZDApp_event_loop()【ZDApp.c

19、】:上一步將ZDO_NETWORK_INIT事件加入到定時器列表中,現(xiàn)在ZDApp_event_loop()事件處理函數(shù)執(zhí)行ZDO_NETWORK_INIT事件,其中調(diào)用了ZDO_StartDevice()函數(shù)對特定類型的設(shè)備進(jìn)行啟動初始化。STEP 6:設(shè)備啟動ZDO_StartDevice()【ZDObject.c】:啟動設(shè)備就是對特定的設(shè)備類型進(jìn)行啟動,協(xié)調(diào)器就是創(chuàng)建網(wǎng)絡(luò)(而路由器則是搜索網(wǎng)絡(luò)),具體則是調(diào)用NLME_NetworkFormationRequest()去完成,這函數(shù)不開源。STEP 7:網(wǎng)絡(luò)創(chuàng)建NLME_NetworkFormationRequest()【NLMEDE.h

20、】:網(wǎng)絡(luò)創(chuàng)建函數(shù)就會在預(yù)設(shè)定的信道內(nèi)檢測是否有相同的PAN ID的網(wǎng)絡(luò)存在,沒有的話則開始創(chuàng)建一個新的網(wǎng)絡(luò),創(chuàng)建了網(wǎng)絡(luò)后,由回調(diào)函數(shù)ZDO_NetworkFormationConfirmCB()去返回一個結(jié)果。因?yàn)檫@部分的程序不開源,所以只能看回調(diào)函數(shù)的結(jié)果。STEP 8:創(chuàng)建網(wǎng)絡(luò)結(jié)果狀態(tài)返回ZDO_NetworkFormationConfirmCB()【ZDApp.c】:回調(diào)函數(shù)ZDO_NetworkFormationConfirmCB()就是調(diào)用網(wǎng)絡(luò)格式化函數(shù)后,返回網(wǎng)絡(luò)創(chuàng)建的結(jié)果,如果返回狀態(tài)是成功的,則設(shè)置設(shè)備狀態(tài)devState為DEV_COORD_STARTING,然后設(shè)置事件os

21、al_set_event( ZDAppTaskID, ZDO_NETWORK_START )STEP 9:網(wǎng)絡(luò)開始事件ZDApp_event_loop()àZDO_NETWORK_START【ZDApp.c】上一步觸發(fā)了ZDO_NETWORK_START網(wǎng)絡(luò)開始事件,這事件主要就是調(diào)用了ZDApp_NetworkStartEvt(),這個函數(shù)就是處理網(wǎng)絡(luò)啟動的一個函數(shù)。STEP 10:網(wǎng)絡(luò)啟動處理ZDApp_NetworkStartEvt()【ZDApp.c】:判斷網(wǎng)絡(luò)狀態(tài)nwkStatus,這里分成兩種狀態(tài):nwkStatus為ZSuccess時,也就是說網(wǎng)絡(luò)創(chuàng)建成功了,將設(shè)備狀態(tài)

22、devState設(shè)置為對應(yīng)的DEV_ZB_COORD,然后設(shè)置事件ZDO_STATE_CHANGE_EVT,也即網(wǎng)絡(luò)狀態(tài)發(fā)送改變的事件,轉(zhuǎn)到SETP 11.nwkStatus為非ZSuccess時,也就是網(wǎng)絡(luò)創(chuàng)建不成功,然后增大功率再次回到 STEP 5去進(jìn)行對網(wǎng)絡(luò)格式化。如果發(fā)射功率已經(jīng)是最大了,那么設(shè)置devState為DEV_INIT狀態(tài)(此狀態(tài)可以說是創(chuàng)建網(wǎng)絡(luò)失敗),再設(shè)置事件ZDO_STATE_CHANGE_EVT跳到STEP 11處理。STEP 11:狀態(tài)改變事件ZDApp_event_loop()àZDO_STATE_CHANGE_EVT【ZDApp.c】這一步僅僅調(diào)用

23、一個網(wǎng)絡(luò)更新函數(shù)ZDO_UpdateNwkStatus(),根據(jù)之前的一些事件的結(jié)果更新網(wǎng)絡(luò)狀態(tài)。STEP 12:更新網(wǎng)絡(luò)狀態(tài)ZDO_UpdateNwkStatus()【ZDObject.c】:根據(jù)之前的步驟的返回結(jié)果更新網(wǎng)絡(luò)狀態(tài),然后對在系統(tǒng)里注冊的端口(每個端口對應(yīng)于一個任務(wù))發(fā)送一個狀態(tài)改變的消息事件ZDO_STATE_CHANGE。STEP 13:消息事件處理SampleApp_ProcessEvent()àSYS_EVENT_MSGà ZDO_STATE_CHANGE【SampleApp.c】這個是用戶的消息事件處理,當(dāng)協(xié)調(diào)器創(chuàng)建一個網(wǎng)絡(luò),最終不管是成功還是失敗,

24、都會產(chǎn)生一個消息事件去通知每一個任務(wù),各個任務(wù)就根據(jù)狀態(tài)結(jié)果去做相應(yīng)的動作。至此,一個協(xié)調(diào)器的啟動過程已經(jīng)完成。10.7.2 路由器(終端設(shè)備)入網(wǎng)過程STEP 1: zigbee設(shè)備應(yīng)用層初始化ZDApp_Init ()【ZDApp.c】:在任務(wù)初始化osalInitTasks()中,調(diào)用了ZIGBEE設(shè)備應(yīng)用層初始化函數(shù):void osalInitTasks( void ) uint8 taskID = 0; tasksEvents = (uint16 *)osal_mem_alloc( sizeof( uint16 ) * tasksCnt); osal_memset( tasksEve

25、nts, 0, (sizeof( uint16 ) * tasksCnt); macTaskInit( taskID+ ); / MAC初始化,MAC任務(wù)ID為0,此函數(shù)不開源無法查看源碼。 nwk_init( taskID+ ); / nwk初始化,nwk任務(wù)ID為1,此函數(shù)不開源無法查看源碼。 Hal_Init( taskID+ ); / Hal初始化,hal(硬件抽象層)任務(wù)ID為2,僅賦值ID號。#if defined( MT_TASK ) MT_TaskInit( taskID+ ); / MT(monitortest監(jiān)視器)初始化,如果有使用,則此任務(wù)ID為3,如果要使用UART串

26、口,必須要初始化此任務(wù).本程序沒使用。#endif APS_Init( taskID+ );/ APS(應(yīng)用支持子層)初始化,APS任務(wù)ID為3,此函數(shù)不開源無法查看源碼。#if defined ( ZIGBEE_FRAGMENTATION ) APSF_Init( taskID+ ); / 應(yīng)用支持子層消息分割層,此處沒編譯使用#endif ZDApp_Init( taskID+ ); / zigbee設(shè)備應(yīng)用層初始化,ZDApp任務(wù)ID為4,開始器件的啟動.#if defined ( ZIGBEE_FREQ_AGILITY ) | defined ( ZIGBEE_PANID_CONFLI

27、CT ) ZDNwkMgr_Init( taskID+ );/ 網(wǎng)絡(luò)管理層初始化,任務(wù)ID為5.#endif SampleApp_Init( taskID ); / 用戶任務(wù)初始化,任務(wù)ID為6.Main()àosal_init_system()àosalInitTasks()àZDApp_Init():在ZDApp_Init()當(dāng)中,獲取了設(shè)備的IEEE地址和對按鍵啟動的檢測等,其中重要的是ZDOInitDevice()函數(shù),可以說此函數(shù)是網(wǎng)絡(luò)建立的入口。因?yàn)镮AR預(yù)編譯了HOLD_AUTO_START,所以devState初始化賦值為DEV_HOLD(在ZDA

28、pp.C中):#if defined( HOLD_AUTO_START ) devStates_t devState = DEV_HOLD;#else devStates_t devState = DEV_INIT;#endif所以語句 if ( devState != DEV_HOLD )不成立,故ZDOInitDevice()函數(shù)留用戶調(diào)用去啟動。STEP 2:用戶任務(wù)初始化SampleApp_Init()【SampleApp.c】:Main()àosal_init_system()àosalInitTasks()àSampleApp_Init():用戶任務(wù)初

29、始化函數(shù)SampleApp_Init()中重要的地方就是調(diào)用了ZDOInitDevice()函數(shù),而在調(diào)用ZDOInitDevice()前,要對設(shè)備類型進(jìn)行定義,可以在用戶任務(wù)初始化調(diào)用ZDOInitDevice()前或是在ZDOInitDevice()函數(shù)的開始地方定義,此設(shè)備為“路由器”,所以定義為zgDeviceLogicalType = ZG_DEVICETYPE_ROUTER。STEP 3:ZIGBEE設(shè)備初始化ZDOInitDevice()【ZDApp.c】:ZDOInitDevice()函數(shù),先對網(wǎng)絡(luò)的各種動作以及參數(shù)做個配置,配置完成后調(diào)用ZDApp_NetworkInit()

30、對網(wǎng)絡(luò)進(jìn)行初始化。STEP 4:網(wǎng)絡(luò)初始化ZDApp_NetworkInit()【ZDApp.c】:在ZDApp_NetworkInit()函數(shù)里,實(shí)際上并沒有做其他的一些初始化,而是將ZDO_NETWORK_INIT事件加入到定時器列表中去等待系統(tǒng)調(diào)度執(zhí)行。STEP 5:ZIGBEE設(shè)備應(yīng)用事件處理ZDApp_event_loop()【ZDApp.c】:上一步將ZDO_NETWORK_INIT事件加入到定時器列表中,現(xiàn)在ZDApp_event_loop()事件處理函數(shù)執(zhí)行ZDO_NETWORK_INIT事件,其中調(diào)用了ZDO_StartDevice()函數(shù)對特定類型的設(shè)備進(jìn)行啟動初始化。ST

31、EP 6:設(shè)備啟動ZDO_StartDevice()【ZDObject.c】:啟動設(shè)備就是對特定的設(shè)備類型進(jìn)行啟動,路由器則是搜索發(fā)現(xiàn)網(wǎng)絡(luò),具體則是調(diào)用NLME_NetworkDiscoveryRequest()去完成,這函數(shù)不開源。STEP 7:網(wǎng)絡(luò)創(chuàng)建NLME_NetworkDiscoveryRequest ()【NLMEDE.h】:網(wǎng)絡(luò)搜索發(fā)現(xiàn)函數(shù)就會在預(yù)設(shè)定的信道內(nèi)檢測是否有相同的PAN ID的網(wǎng)絡(luò)存在,當(dāng)找到了相同的PAN ID的網(wǎng)絡(luò)則加入網(wǎng)絡(luò),由回調(diào)函數(shù)ZDO_NetworkDiscoveryConfirmCB ()去返回一個結(jié)果。因?yàn)檫@部分的程序不開源,所以只能看回調(diào)函數(shù)的結(jié)果。

32、STEP 8:搜索網(wǎng)絡(luò)結(jié)果狀態(tài)返回ZDO_NetworkDiscoveryConfirmCB()【ZDApp.c】:回調(diào)函數(shù)ZDO_NetworkDiscoveryConfirmCB()就是調(diào)用網(wǎng)絡(luò)搜索函數(shù)后,返回網(wǎng)絡(luò)搜索的結(jié)果,將搜索到的結(jié)果進(jìn)行逐個比較,然后通過消息將反饋信息比較后發(fā)送到ZDA層。ZDApp_SendMsg(ZDAppTaskID,ZDO_NWK_DISC_CNF, sizeof(ZDO_NetworkDiscoveryCfm_t), (uint8 *)&msg );STEP 9:網(wǎng)絡(luò)請求加入事件ZDApp_event_loop()àSYS_EVENT_MSG【ZDApp.c】上一步發(fā)送了消息給ZDAppTaskID,而在ZDApp_event_loop里對消息進(jìn)行處理又是調(diào)用了ZDApp_ProcessOSALMsg()函數(shù),在消息處

溫馨提示

  • 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

提交評論