




版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
1、 ZigBee實(shí)驗(yàn)十節(jié)點(diǎn)的建網(wǎng)與入網(wǎng)分析10.1 實(shí)驗(yàn)簡(jiǎn)介在前面實(shí)驗(yàn)中,我們都是直接的去使用了一個(gè)網(wǎng)絡(luò),如果不是想對(duì)內(nèi)核進(jìn)行深入研究,完全可以不用去考慮TI協(xié)議棧的工作細(xì)節(jié),只要懂得關(guān)鍵使用部分也一樣可以對(duì)ZIGBEE進(jìn)行開發(fā)。為了對(duì)協(xié)議棧有更深入的了解認(rèn)識(shí),本實(shí)驗(yàn)對(duì)“協(xié)調(diào)器”的建網(wǎng)以及“路由器”“終端”的入網(wǎng),做個(gè)簡(jiǎn)單的邏輯性介紹。實(shí)驗(yàn)?zāi)康?0.2 訓(xùn)練目的 10.2.1 通過(guò)本實(shí)驗(yàn)了解Z-STACK啟動(dòng)的過(guò)程中建網(wǎng)與入網(wǎng)的一個(gè)流程。10.3實(shí)驗(yàn)設(shè)備10.3.1 硬件:(1) ZIGBEE 調(diào)試底板2個(gè):可調(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個(gè):UART轉(zhuǎn)接線轉(zhuǎn)接串口輸入,連接到ZIGBEE調(diào)試底板轉(zhuǎn)接串口輸出,連接到電腦串口圖10-2 UART轉(zhuǎn)接板與轉(zhuǎn)接線(3) ZIGBEE仿真器1個(gè);10PIN下載接口電源(上)和狀態(tài)指示燈USB接口圖10-3 ZIGBEE仿真器(4) ZIGBEE模塊2個(gè);圖10-4 ZIGBEE模塊(5) 電源2個(gè)圖10-5 電源(6) 串口延長(zhǎng)線1根圖10-6 串口延長(zhǎng)線(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ū)動(dòng);(4) 串口調(diào)試助手。實(shí)驗(yàn)知識(shí)10.4 10.4.1 網(wǎng)絡(luò)形成每個(gè)設(shè)備都有一組能被配置的參數(shù)(如被PC工具或者外部處理器配置),整個(gè)配置參數(shù)在代碼中已經(jīng)定義了默認(rèn)值(在f8wconfig.cfg中)。在同一個(gè)網(wǎng)絡(luò)中,所有設(shè)備的“網(wǎng)絡(luò)細(xì)節(jié)”配置參數(shù)(如PANID,Channel等)應(yīng)該被配置成一樣的值。每個(gè)設(shè)備的“設(shè)備細(xì)節(jié)”配置參數(shù)(Coordinator,Router,Enddevice等
4、)可以配置為不同的值。但是,ZCD_NV_LOGICAL_TYPE必須被設(shè)置,確保:1、 有正確的一個(gè)設(shè)備作為協(xié)調(diào)器被配置;2、 所有電池供電的設(shè)備作為終端設(shè)備被配置。一旦這些工作都完成,這個(gè)設(shè)備就可以以任意方式啟動(dòng)。協(xié)調(diào)器設(shè)備將建立網(wǎng)絡(luò),其他設(shè)備將發(fā)現(xiàn)和加入到這個(gè)網(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這個(gè)參數(shù)在配置文件f8wConfig.cfg)。如果協(xié)調(diào)器的ZDAP
5、P_CONFIG_PAN_ID設(shè)置為OxFFFF,則協(xié)調(diào)器將產(chǎn)生一個(gè)隨機(jī)的PANID,如果協(xié)調(diào)器的ZDAPP_CONFIG_PAN_ID設(shè)置為非0xFFFF值,則協(xié)調(diào)器根據(jù)自身的網(wǎng)絡(luò)長(zhǎng)地址(IEEE地址)或ZDAPP_CONFIG_PAN_ID值隨機(jī)產(chǎn)生一個(gè)PANID,如果協(xié)調(diào)器的PANID的設(shè)置值為小于等于0x3FFF的有效值,協(xié)調(diào)器就會(huì)以這個(gè)特定的PANID值建立網(wǎng)絡(luò),但是,如果在默認(rèn)的信道上已經(jīng)有了該P(yáng)ANID值的網(wǎng)絡(luò)存在,則協(xié)調(diào)器會(huì)繼續(xù)搜尋其他的PANID,直到找到網(wǎng)絡(luò)不沖突為止。當(dāng)所有參數(shù)配置好后,可以調(diào)用下面函數(shù)來(lái)格式化網(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ù)來(lái)啟動(dòng)一個(gè)設(shè)備10.4.3 路由器和終端設(shè)備加入網(wǎng)絡(luò)路由器和終端設(shè)備啟動(dòng)后,將掃描DEFAULT_CHANLIST指定的頻道,如果ZDAPP_CONFIG_PAN_ID沒(méi)有被定義為0xFFFF,
7、則路由器將強(qiáng)制加入ZDAPP_CONFIG_PAN_ID定義的網(wǎng)絡(luò)。發(fā)現(xiàn)一個(gè)網(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)備掃描的信道號(hào)(信道號(hào)的范圍1126,即僅對(duì)2.4GHz頻段有效)。scanDuration-規(guī)定了在新的網(wǎng)絡(luò)開始建立
8、之前,其他網(wǎng)絡(luò)可以掃描每個(gè)信道的時(shí)間長(zhǎng)度。發(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è)備都沒(méi)定義ZDAPP_CONFIG_PAN_ID為0xFFFF,則兩者之間不一樣的定義可能會(huì)出現(xiàn)一些意外的結(jié)果;如果ZDAPP_CONFIG_PAN_ID被定義為一個(gè)正確的值(小于或等于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)一說(shuō)明”,先按照本說(shuō)明去配置好串口,波特率38400,以便往下實(shí)驗(yàn)?zāi)苷J褂么?。圖10-8 節(jié)點(diǎn)板串口使用的統(tǒng)一說(shuō)明10.5.2 啟動(dòng)IAR Embedded Workbench,打開對(duì)應(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軟件會(huì)先編譯再下載代碼到目標(biāo)板上去仿真,但對(duì)于編譯檢查錯(cuò)誤,這一步也很有必要。如果正確編譯后文件右側(cè)的紅星
10、會(huì)消失。在Make之前,最好Clean一下,如下圖所示:圖10-11 編譯鏈接代碼文件紅色星星編譯后變沒(méi)有了編譯后生成圖10-12 編譯前后對(duì)比如果正確建立工程并正確配置了工程,則此時(shí)編譯是無(wú)錯(cuò)誤的,編譯無(wú)錯(cuò)誤如圖 圖10-13 編譯鏈接無(wú)錯(cuò)誤圖10-14 編譯連接有錯(cuò)誤10.5.4 按照前面“實(shí)驗(yàn)設(shè)備”小節(jié)中的“硬件連接圖”連接好硬件并打開電源,點(diǎn)擊DEBUG按鈕或者”Project->Debug”或者快捷鍵“Ctrl + D”進(jìn)行程序下載并Debug。如有出錯(cuò),請(qǐng)檢查硬件連接或拔掉仿真器USB再重接圖10-15 Debug 調(diào)試圖10-16 程序正在下載到目標(biāo)板10.5.5 正確進(jìn)入
11、DeBug界面,如下圖:圖10-17 仿真調(diào)試界面10.5.6 通過(guò)以上步驟已將協(xié)調(diào)器程序下載到節(jié)點(diǎn),此時(shí)的節(jié)點(diǎn)叫“協(xié)調(diào)器”。10.5.7 在配套資料“提高實(shí)驗(yàn)”文件夾下找到“超級(jí)單片機(jī)工具軟件.exe”,如果是WIN7系統(tǒng),右鍵“以管理員身份運(yùn)行”,選擇電腦對(duì)應(yīng)的端口,設(shè)置和程序?qū)?yīng)的波特率“38400”,數(shù)據(jù)位“8”,停止位“1”,校驗(yàn)位“NONE”,然后點(diǎn)擊“打開串口”圖10-18 超級(jí)單片機(jī)工具軟件圖10-19 超級(jí)單片機(jī)工具軟件界面10.5.8 按下“全速運(yùn)行”按鈕進(jìn)行試驗(yàn)驗(yàn)證,串口打印出協(xié)調(diào)器啟動(dòng)過(guò)程中的第幾步。具體參看“實(shí)驗(yàn)驗(yàn)證”。步出函數(shù)步入函數(shù)單步運(yùn)行復(fù)位全速運(yùn)行按鈕圖10-
12、20 調(diào)試功能按鈕10.5.9 此時(shí)一個(gè)“協(xié)調(diào)器”的啟動(dòng)過(guò)程已經(jīng)驗(yàn)證完。將仿真器從“協(xié)調(diào)器”中拆下,讓“協(xié)調(diào)器”成為一個(gè)單獨(dú)個(gè)體,重啟運(yùn)行,讓協(xié)調(diào)器處于一直運(yùn)行狀態(tài)。再將另一個(gè)節(jié)點(diǎn)按照“硬件連接圖”連接好,再按“實(shí)驗(yàn)步驟”將“路由器”的程序下載到節(jié)點(diǎn)中,然后全速運(yùn)行驗(yàn)證串口打印出來(lái)的結(jié)果。10.5.10 實(shí)驗(yàn)完畢。實(shí)驗(yàn)驗(yàn)證10.6 10.6.1 查看串口調(diào)試助手打印出來(lái)的設(shè)備啟動(dòng)步驟:圖10-21 協(xié)調(diào)器啟動(dòng)過(guò)程圖10-22 路由器啟動(dòng)過(guò)程實(shí)驗(yàn)部分參考程序解析(完整程序見(jiàn)源程序文件)10.7代碼解釋:10.7.1 協(xié)調(diào)器建網(wǎng)過(guò)程: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ù)不開源無(wú)法查看源碼。 nwk_init( ta
14、skID+ ); / nwk初始化,nwk任務(wù)ID為1,此函數(shù)不開源無(wú)法查看源碼。 Hal_Init( taskID+ ); / Hal初始化,hal(硬件抽象層)任務(wù)ID為2,僅賦值ID號(hào)。#if defined( MT_TASK ) MT_TaskInit( taskID+ ); / MT(monitortest監(jiān)視器)初始化,如果有使用,則此任務(wù)ID為3,如果要使用UART串口,必須要初始化此任務(wù).本程序沒(méi)使用。#endif APS_Init( taskID+ );/ APS(應(yīng)用支持子層)初始化,APS任務(wù)ID為3,此函數(shù)不開源無(wú)法查看源碼。#if defined ( ZIGBEE_F
15、RAGMENTATION ) APSF_Init( taskID+ ); / 應(yīng)用支持子層消息分割層,此處沒(méi)編譯使用#endif ZDApp_Init( taskID+ ); / zigbee設(shè)備應(yīng)用層初始化,ZDApp任務(wù)ID為4,開始器件的啟動(dòng).#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地址和對(duì)按鍵啟動(dòng)的檢測(cè)等,其中重要的是ZDOInitDevice()函數(shù),可以說(shuō)此函數(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所以語(yǔ)句 if ( devState != DEV_HOLD )不成立,故ZDOInitDevice()函數(shù)留用戶調(diào)用去啟動(dòng)。STEP 2:用戶任務(wù)初始化SampleApp_Init()【SampleApp.c】:用戶任務(wù)初始化函數(shù)SampleApp_Init()中重要的地方就是調(diào)用了ZDOInitDevice()函數(shù),而在調(diào)用ZDOInitDevice()前,要對(duì)設(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ù),先對(duì)網(wǎng)絡(luò)的各種動(dòng)作以及參數(shù)做個(gè)配置,配置完成后調(diào)用ZDApp_NetworkInit()對(duì)網(wǎng)絡(luò)進(jìn)行初始化。STEP 4:網(wǎng)絡(luò)初始化ZDApp_NetworkInit()【ZDApp.c】:在ZDApp_NetworkInit()函數(shù)里,實(shí)際上并沒(méi)有做其他的一些初始化,而是將ZDO_NETWORK_INIT事件加入到定時(shí)器列表中去等待系統(tǒng)調(diào)度執(zhí)行。STEP 5:ZIGBEE設(shè)備應(yīng)用事件處理ZDApp_event_loop()【ZDApp.c
19、】:上一步將ZDO_NETWORK_INIT事件加入到定時(shí)器列表中,現(xiàn)在ZDApp_event_loop()事件處理函數(shù)執(zhí)行ZDO_NETWORK_INIT事件,其中調(diào)用了ZDO_StartDevice()函數(shù)對(duì)特定類型的設(shè)備進(jìn)行啟動(dòng)初始化。STEP 6:設(shè)備啟動(dòng)ZDO_StartDevice()【ZDObject.c】:?jiǎn)?dòng)設(shè)備就是對(duì)特定的設(shè)備類型進(jìn)行啟動(dòng),協(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ù)就會(huì)在預(yù)設(shè)定的信道內(nèi)檢測(cè)是否有相同的PAN ID的網(wǎng)絡(luò)存在,沒(méi)有的話則開始創(chuàng)建一個(gè)新的網(wǎng)絡(luò),創(chuàng)建了網(wǎng)絡(luò)后,由回調(diào)函數(shù)ZDO_NetworkFormationConfirmCB()去返回一個(gè)結(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(),這個(gè)函數(shù)就是處理網(wǎng)絡(luò)啟動(dòng)的一個(gè)函數(shù)。STEP 10:網(wǎng)絡(luò)啟動(dòng)處理ZDApp_NetworkStartEvt()【ZDApp.c】:判斷網(wǎng)絡(luò)狀態(tài)nwkStatus,這里分成兩種狀態(tài):nwkStatus為ZSuccess時(shí),也就是說(shuō)網(wǎng)絡(luò)創(chuàng)建成功了,將設(shè)備狀態(tài)
22、devState設(shè)置為對(duì)應(yīng)的DEV_ZB_COORD,然后設(shè)置事件ZDO_STATE_CHANGE_EVT,也即網(wǎng)絡(luò)狀態(tài)發(fā)送改變的事件,轉(zhuǎn)到SETP 11.nwkStatus為非ZSuccess時(shí),也就是網(wǎng)絡(luò)創(chuàng)建不成功,然后增大功率再次回到 STEP 5去進(jìn)行對(duì)網(wǎng)絡(luò)格式化。如果發(fā)射功率已經(jīng)是最大了,那么設(shè)置devState為DEV_INIT狀態(tài)(此狀態(tài)可以說(shuō)是創(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、一個(gè)網(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),然后對(duì)在系統(tǒng)里注冊(cè)的端口(每個(gè)端口對(duì)應(yīng)于一個(gè)任務(wù))發(fā)送一個(gè)狀態(tài)改變的消息事件ZDO_STATE_CHANGE。STEP 13:消息事件處理SampleApp_ProcessEvent()àSYS_EVENT_MSGà ZDO_STATE_CHANGE【SampleApp.c】這個(gè)是用戶的消息事件處理,當(dāng)協(xié)調(diào)器創(chuàng)建一個(gè)網(wǎng)絡(luò),最終不管是成功還是失敗,
24、都會(huì)產(chǎn)生一個(gè)消息事件去通知每一個(gè)任務(wù),各個(gè)任務(wù)就根據(jù)狀態(tài)結(jié)果去做相應(yīng)的動(dòng)作。至此,一個(gè)協(xié)調(diào)器的啟動(dòng)過(guò)程已經(jīng)完成。10.7.2 路由器(終端設(shè)備)入網(wǎng)過(guò)程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ù)不開源無(wú)法查看源碼。 nwk_init( taskID+ ); / nwk初始化,nwk任務(wù)ID為1,此函數(shù)不開源無(wú)法查看源碼。 Hal_Init( taskID+ ); / Hal初始化,hal(硬件抽象層)任務(wù)ID為2,僅賦值ID號(hào)。#if defined( MT_TASK ) MT_TaskInit( taskID+ ); / MT(monitortest監(jiān)視器)初始化,如果有使用,則此任務(wù)ID為3,如果要使用UART串
26、口,必須要初始化此任務(wù).本程序沒(méi)使用。#endif APS_Init( taskID+ );/ APS(應(yīng)用支持子層)初始化,APS任務(wù)ID為3,此函數(shù)不開源無(wú)法查看源碼。#if defined ( ZIGBEE_FRAGMENTATION ) APSF_Init( taskID+ ); / 應(yīng)用支持子層消息分割層,此處沒(méi)編譯使用#endif ZDApp_Init( taskID+ ); / zigbee設(shè)備應(yīng)用層初始化,ZDApp任務(wù)ID為4,開始器件的啟動(dòng).#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地址和對(duì)按鍵啟動(dòng)的檢測(cè)等,其中重要的是ZDOInitDevice()函數(shù),可以說(shuō)此函數(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所以語(yǔ)句 if ( devState != DEV_HOLD )不成立,故ZDOInitDevice()函數(shù)留用戶調(diào)用去啟動(dòng)。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()前,要對(duì)設(shè)備類型進(jìn)行定義,可以在用戶任務(wù)初始化調(diào)用ZDOInitDevice()前或是在ZDOInitDevice()函數(shù)的開始地方定義,此設(shè)備為“路由器”,所以定義為zgDeviceLogicalType = ZG_DEVICETYPE_ROUTER。STEP 3:ZIGBEE設(shè)備初始化ZDOInitDevice()【ZDApp.c】:ZDOInitDevice()函數(shù),先對(duì)網(wǎng)絡(luò)的各種動(dòng)作以及參數(shù)做個(gè)配置,配置完成后調(diào)用ZDApp_NetworkInit()
30、對(duì)網(wǎng)絡(luò)進(jìn)行初始化。STEP 4:網(wǎng)絡(luò)初始化ZDApp_NetworkInit()【ZDApp.c】:在ZDApp_NetworkInit()函數(shù)里,實(shí)際上并沒(méi)有做其他的一些初始化,而是將ZDO_NETWORK_INIT事件加入到定時(shí)器列表中去等待系統(tǒng)調(diào)度執(zhí)行。STEP 5:ZIGBEE設(shè)備應(yīng)用事件處理ZDApp_event_loop()【ZDApp.c】:上一步將ZDO_NETWORK_INIT事件加入到定時(shí)器列表中,現(xiàn)在ZDApp_event_loop()事件處理函數(shù)執(zhí)行ZDO_NETWORK_INIT事件,其中調(diào)用了ZDO_StartDevice()函數(shù)對(duì)特定類型的設(shè)備進(jìn)行啟動(dòng)初始化。ST
31、EP 6:設(shè)備啟動(dòng)ZDO_StartDevice()【ZDObject.c】:?jiǎn)?dòng)設(shè)備就是對(duì)特定的設(shè)備類型進(jìn)行啟動(dòng),路由器則是搜索發(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ù)就會(huì)在預(yù)設(shè)定的信道內(nèi)檢測(cè)是否有相同的PAN ID的網(wǎng)絡(luò)存在,當(dāng)找到了相同的PAN ID的網(wǎng)絡(luò)則加入網(wǎng)絡(luò),由回調(diào)函數(shù)ZDO_NetworkDiscoveryConfirmCB ()去返回一個(gè)結(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)行逐個(gè)比較,然后通過(guò)消息將反饋信息比較后發(fā)送到ZDA層。ZDApp_SendMsg(ZDAppTaskID,ZDO_NWK_DISC_CNF, sizeof(ZDO_NetworkDiscoveryCfm_t), (uint8 *)&msg );STEP 9:網(wǎng)絡(luò)請(qǐng)求加入事件ZDApp_event_loop()àSYS_EVENT_MSG【ZDApp.c】上一步發(fā)送了消息給ZDAppTaskID,而在ZDApp_event_loop里對(duì)消息進(jìn)行處理又是調(diào)用了ZDApp_ProcessOSALMsg()函數(shù),在消息處
溫馨提示
- 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 村民就業(yè)問(wèn)題的現(xiàn)狀與挑戰(zhàn)分析
- 廣東省湛江雷州市2024年化學(xué)九上期末復(fù)習(xí)檢測(cè)模擬試題含解析
- 江蘇省無(wú)錫市錫山區(qū)錫東片2025屆化學(xué)九上期末質(zhì)量檢測(cè)模擬試題含解析
- 河北滄州泊頭市蘇屯初級(jí)中學(xué)2024年七上數(shù)學(xué)期末教學(xué)質(zhì)量檢測(cè)模擬試題含解析
- 江蘇省常州市溧陽(yáng)市2025屆八上數(shù)學(xué)期末達(dá)標(biāo)測(cè)試試題含解析
- 智能物流產(chǎn)業(yè)發(fā)展及技術(shù)創(chuàng)新研究報(bào)告
- 2025至2030靜脈留置針行業(yè)項(xiàng)目調(diào)研及市場(chǎng)前景預(yù)測(cè)評(píng)估報(bào)告
- 寫字樓消防通道保潔要求
- 2025至2030數(shù)字金融行業(yè)發(fā)展趨勢(shì)分析與未來(lái)投資戰(zhàn)略咨詢研究報(bào)告
- 2025至2030中國(guó)自動(dòng)滴咖啡機(jī)行業(yè)市場(chǎng)占有率及投資前景評(píng)估規(guī)劃報(bào)告
- 實(shí)驗(yàn)室培育鉆石行業(yè)技術(shù)發(fā)展趨勢(shì)報(bào)告
- 2025年領(lǐng)英大制造行業(yè)人才全球化報(bào)告-馬來(lái)西亞篇
- 專題:閱讀理解 30篇 中考英語(yǔ)高分提升之新題速遞第二輯【含答案+解析】
- 企業(yè)面試題目和答案大全
- 抖音房產(chǎn)直播課件
- 2025至2030中國(guó)近視眼治療儀市場(chǎng)競(jìng)爭(zhēng)力剖析及企業(yè)經(jīng)營(yíng)形勢(shì)分析報(bào)告
- 日本所有番號(hào)分類
- 國(guó)際壓力性損傷-潰瘍預(yù)防和治療臨床指南(2025年版)解讀課件
- 降低手術(shù)患者術(shù)中低體溫發(fā)生率
- 患者跌倒墜床風(fēng)險(xiǎn)評(píng)估流程防范措施
- 病理生理學(xué)試題及答案
評(píng)論
0/150
提交評(píng)論