




版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領
文檔簡介
1、 ZigBee實驗十節點的建網與入網分析10.1 實驗簡介在前面實驗中,我們都是直接的去使用了一個網絡,如果不是想對內核進行深入研究,完全可以不用去考慮TI協議棧的工作細節,只要懂得關鍵使用部分也一樣可以對ZIGBEE進行開發。為了對協議棧有更深入的了解認識,本實驗對“協調器”的建網以及“路由器”“終端”的入網,做個簡單的邏輯性介紹。實驗目的10.2 訓練目的 10.2.1 通過本實驗了解Z-STACK啟動的過程中建網與入網的一個流程。10.3實驗設備10.3.1 硬件:(1) ZIGBEE 調試底板2個:可調電阻ZigBee_DEBUG指示燈紅外發射ZigBee復位ZigBee按鍵撥碼開關節
2、點按鍵復位傳感器接口1J-LINK接口傳感器接口3傳感器接口2電源開關電源圖10-1 ZIGBEE調試底板(2) UART轉接板與轉接線各1個:UART轉接線轉接串口輸入,連接到ZIGBEE調試底板轉接串口輸出,連接到電腦串口圖10-2 UART轉接板與轉接線(3) ZIGBEE仿真器1個;10PIN下載接口電源(上)和狀態指示燈USB接口圖10-3 ZIGBEE仿真器(4) ZIGBEE模塊2個;圖10-4 ZIGBEE模塊(5) 電源2個圖10-5 電源(6) 串口延長線1根圖10-6 串口延長線(7) 硬件連接圖連接電腦串口ZigBee調試底板與串口轉接板連接電源連接電腦USBZIGBE
3、E DeBug連接口圖10-7 硬件連接10.3.2 軟件(1) IAR Embedded Workbench for MCS-51 7.51A集成開發環境;(2) TI Z-STACK;(3) 仿真器驅動;(4) 串口調試助手。實驗知識10.4 10.4.1 網絡形成每個設備都有一組能被配置的參數(如被PC工具或者外部處理器配置),整個配置參數在代碼中已經定義了默認值(在f8wconfig.cfg中)。在同一個網絡中,所有設備的“網絡細節”配置參數(如PANID,Channel等)應該被配置成一樣的值。每個設備的“設備細節”配置參數(Coordinator,Router,Enddevice等
4、)可以配置為不同的值。但是,ZCD_NV_LOGICAL_TYPE必須被設置,確保:1、 有正確的一個設備作為協調器被配置;2、 所有電池供電的設備作為終端設備被配置。一旦這些工作都完成,這個設備就可以以任意方式啟動。協調器設備將建立網絡,其他設備將發現和加入到這個網絡中。10.4.2 協調器格式化網絡協調器將掃描DEFAULT_CHANLIST(在f8wConfig.cfg里定義)指定的通道,最后在其中之一上形成網絡。設備的PANID值與ZDAPP_CONFIG_PAN_ID值設置有關(ZDAPP_CONFIG_PAN_ID這個參數在配置文件f8wConfig.cfg)。如果協調器的ZDAP
5、P_CONFIG_PAN_ID設置為OxFFFF,則協調器將產生一個隨機的PANID,如果協調器的ZDAPP_CONFIG_PAN_ID設置為非0xFFFF值,則協調器根據自身的網絡長地址(IEEE地址)或ZDAPP_CONFIG_PAN_ID值隨機產生一個PANID,如果協調器的PANID的設置值為小于等于0x3FFF的有效值,協調器就會以這個特定的PANID值建立網絡,但是,如果在默認的信道上已經有了該PANID值的網絡存在,則協調器會繼續搜尋其他的PANID,直到找到網絡不沖突為止。當所有參數配置好后,可以調用下面函數來格式化網絡(以下函數不開源):ZStatus_t NLME_Netw
6、orkFormationRequest( uint16 PanId,uint8* ExtendedPANID, uint32 ScanChannels,byte ScanDuration, byte BeaconOrder,byte SuperframeOrder, byte BatteryLifeExtension );但一般不直接使用上面的函數建立網絡,而是使用ZDO_StartDevice()函數來啟動一個設備10.4.3 路由器和終端設備加入網絡路由器和終端設備啟動后,將掃描DEFAULT_CHANLIST指定的頻道,如果ZDAPP_CONFIG_PAN_ID沒有被定義為0xFFFF,
7、則路由器將強制加入ZDAPP_CONFIG_PAN_ID定義的網絡。發現一個網絡將調用下面函數(以下函數不開源):ZStatus_t NLME_NetworkDiscoveryRequest( uint32 ScanChannels, byte scanDuration);該函數要求網絡層去發現鄰居路由器節點,并且應該在進行網絡掃描之前調用,掃描的結果由ZStatus_t ZDO_NetworkDiscoveryConfirmCB()函數返回,其中:ScanChannels-準備掃描的信道號(信道號的范圍1126,即僅對2.4GHz頻段有效)。scanDuration-規定了在新的網絡開始建立
8、之前,其他網絡可以掃描每個信道的時間長度。發現網絡存在后,就調用下面的函數加入網絡。ZStatus_t NLME_OrphanJoinRequest( uint32 ScanChannels, byte ScanDuration )。該函數要求網絡層以孤節點的形式加入網絡。函數調用的結果由ZDO_JoinConfirmCB()函數返回。注意:如果協調器和路由器或終端設備都沒定義ZDAPP_CONFIG_PAN_ID為0xFFFF,則兩者之間不一樣的定義可能會出現一些意外的結果;如果ZDAPP_CONFIG_PAN_ID被定義為一個正確的值(小于或等于0x3FFFF),那么協調器就只在指定的PA
9、N ID上試圖建立網絡。實驗步驟10.510.5.1 在開始本實驗的仿真前,參看配套源資料中“關于節點板串口使用的統一說明”,先按照本說明去配置好串口,波特率38400,以便往下實驗能正常使用串口。圖10-8 節點板串口使用的統一說明10.5.2 啟動IAR Embedded Workbench,打開對應配套實驗源碼中“協調器”的SampleApp.eww工程:圖10-9 工程文件圖10-10 打開工程界面10.5.3 編譯鏈接程序代碼Make,這一步可以省略,因為進行DeBug前,IAR軟件會先編譯再下載代碼到目標板上去仿真,但對于編譯檢查錯誤,這一步也很有必要。如果正確編譯后文件右側的紅星
10、會消失。在Make之前,最好Clean一下,如下圖所示:圖10-11 編譯鏈接代碼文件紅色星星編譯后變沒有了編譯后生成圖10-12 編譯前后對比如果正確建立工程并正確配置了工程,則此時編譯是無錯誤的,編譯無錯誤如圖 圖10-13 編譯鏈接無錯誤圖10-14 編譯連接有錯誤10.5.4 按照前面“實驗設備”小節中的“硬件連接圖”連接好硬件并打開電源,點擊DEBUG按鈕或者”Project->Debug”或者快捷鍵“Ctrl + D”進行程序下載并Debug。如有出錯,請檢查硬件連接或拔掉仿真器USB再重接圖10-15 Debug 調試圖10-16 程序正在下載到目標板10.5.5 正確進入
11、DeBug界面,如下圖:圖10-17 仿真調試界面10.5.6 通過以上步驟已將協調器程序下載到節點,此時的節點叫“協調器”。10.5.7 在配套資料“提高實驗”文件夾下找到“超級單片機工具軟件.exe”,如果是WIN7系統,右鍵“以管理員身份運行”,選擇電腦對應的端口,設置和程序對應的波特率“38400”,數據位“8”,停止位“1”,校驗位“NONE”,然后點擊“打開串口”圖10-18 超級單片機工具軟件圖10-19 超級單片機工具軟件界面10.5.8 按下“全速運行”按鈕進行試驗驗證,串口打印出協調器啟動過程中的第幾步。具體參看“實驗驗證”。步出函數步入函數單步運行復位全速運行按鈕圖10-
12、20 調試功能按鈕10.5.9 此時一個“協調器”的啟動過程已經驗證完。將仿真器從“協調器”中拆下,讓“協調器”成為一個單獨個體,重啟運行,讓協調器處于一直運行狀態。再將另一個節點按照“硬件連接圖”連接好,再按“實驗步驟”將“路由器”的程序下載到節點中,然后全速運行驗證串口打印出來的結果。10.5.10 實驗完畢。實驗驗證10.6 10.6.1 查看串口調試助手打印出來的設備啟動步驟:圖10-21 協調器啟動過程圖10-22 路由器啟動過程實驗部分參考程序解析(完整程序見源程序文件)10.7代碼解釋:10.7.1 協調器建網過程:STEP 1: zigbee設備應用層初始化ZDApp_Init
13、 ()【ZDApp.c】:在任務初始化osalInitTasks()中,調用了ZIGBEE設備應用層初始化函數: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任務ID為0,此函數不開源無法查看源碼。 nwk_init( ta
14、skID+ ); / nwk初始化,nwk任務ID為1,此函數不開源無法查看源碼。 Hal_Init( taskID+ ); / Hal初始化,hal(硬件抽象層)任務ID為2,僅賦值ID號。#if defined( MT_TASK ) MT_TaskInit( taskID+ ); / MT(monitortest監視器)初始化,如果有使用,則此任務ID為3,如果要使用UART串口,必須要初始化此任務.本程序沒使用。#endif APS_Init( taskID+ );/ APS(應用支持子層)初始化,APS任務ID為3,此函數不開源無法查看源碼。#if defined ( ZIGBEE_F
15、RAGMENTATION ) APSF_Init( taskID+ ); / 應用支持子層消息分割層,此處沒編譯使用#endif ZDApp_Init( taskID+ ); / zigbee設備應用層初始化,ZDApp任務ID為4,開始器件的啟動.#if defined ( ZIGBEE_FREQ_AGILITY ) | defined ( ZIGBEE_PANID_CONFLICT ) ZDNwkMgr_Init( taskID+ );/ 網絡管理層初始化,任務ID為5.#endif SampleApp_Init( taskID ); / 用戶任務初始化,任務ID為6.Main()
16、4;osal_init_system()àosalInitTasks()àZDApp_Init():在ZDApp_Init()當中,獲取了設備的IEEE地址和對按鍵啟動的檢測等,其中重要的是ZDOInitDevice()函數,可以說此函數是網絡建立的入口。因為IAR預編譯了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()函數留用戶調用去啟動。STEP 2:用戶任務初始化SampleApp_Init()【SampleApp.c】:用戶任務初始化函數SampleApp_Init()中重要的地方就是調用了ZDOInitDevice()函數,而在調用ZDOInitDevice()前,要對設備類型進行定義,可以在用戶任務初始化調用ZDOInitDevice()前或是在ZDOInitDevice()函數的開始地方定義,此設備為“協調器”,所以定義為zgDeviceLogicalType = ZG_DEVIC
18、ETYPE_COORDINATOR。STEP 3:ZIGBEE設備初始化ZDOInitDevice()【ZDApp.c】:ZDOInitDevice()函數,先對網絡的各種動作以及參數做個配置,配置完成后調用ZDApp_NetworkInit()對網絡進行初始化。STEP 4:網絡初始化ZDApp_NetworkInit()【ZDApp.c】:在ZDApp_NetworkInit()函數里,實際上并沒有做其他的一些初始化,而是將ZDO_NETWORK_INIT事件加入到定時器列表中去等待系統調度執行。STEP 5:ZIGBEE設備應用事件處理ZDApp_event_loop()【ZDApp.c
19、】:上一步將ZDO_NETWORK_INIT事件加入到定時器列表中,現在ZDApp_event_loop()事件處理函數執行ZDO_NETWORK_INIT事件,其中調用了ZDO_StartDevice()函數對特定類型的設備進行啟動初始化。STEP 6:設備啟動ZDO_StartDevice()【ZDObject.c】:啟動設備就是對特定的設備類型進行啟動,協調器就是創建網絡(而路由器則是搜索網絡),具體則是調用NLME_NetworkFormationRequest()去完成,這函數不開源。STEP 7:網絡創建NLME_NetworkFormationRequest()【NLMEDE.h
20、】:網絡創建函數就會在預設定的信道內檢測是否有相同的PAN ID的網絡存在,沒有的話則開始創建一個新的網絡,創建了網絡后,由回調函數ZDO_NetworkFormationConfirmCB()去返回一個結果。因為這部分的程序不開源,所以只能看回調函數的結果。STEP 8:創建網絡結果狀態返回ZDO_NetworkFormationConfirmCB()【ZDApp.c】:回調函數ZDO_NetworkFormationConfirmCB()就是調用網絡格式化函數后,返回網絡創建的結果,如果返回狀態是成功的,則設置設備狀態devState為DEV_COORD_STARTING,然后設置事件os
21、al_set_event( ZDAppTaskID, ZDO_NETWORK_START )STEP 9:網絡開始事件ZDApp_event_loop()àZDO_NETWORK_START【ZDApp.c】上一步觸發了ZDO_NETWORK_START網絡開始事件,這事件主要就是調用了ZDApp_NetworkStartEvt(),這個函數就是處理網絡啟動的一個函數。STEP 10:網絡啟動處理ZDApp_NetworkStartEvt()【ZDApp.c】:判斷網絡狀態nwkStatus,這里分成兩種狀態:nwkStatus為ZSuccess時,也就是說網絡創建成功了,將設備狀態
22、devState設置為對應的DEV_ZB_COORD,然后設置事件ZDO_STATE_CHANGE_EVT,也即網絡狀態發送改變的事件,轉到SETP 11.nwkStatus為非ZSuccess時,也就是網絡創建不成功,然后增大功率再次回到 STEP 5去進行對網絡格式化。如果發射功率已經是最大了,那么設置devState為DEV_INIT狀態(此狀態可以說是創建網絡失敗),再設置事件ZDO_STATE_CHANGE_EVT跳到STEP 11處理。STEP 11:狀態改變事件ZDApp_event_loop()àZDO_STATE_CHANGE_EVT【ZDApp.c】這一步僅僅調用
23、一個網絡更新函數ZDO_UpdateNwkStatus(),根據之前的一些事件的結果更新網絡狀態。STEP 12:更新網絡狀態ZDO_UpdateNwkStatus()【ZDObject.c】:根據之前的步驟的返回結果更新網絡狀態,然后對在系統里注冊的端口(每個端口對應于一個任務)發送一個狀態改變的消息事件ZDO_STATE_CHANGE。STEP 13:消息事件處理SampleApp_ProcessEvent()àSYS_EVENT_MSGà ZDO_STATE_CHANGE【SampleApp.c】這個是用戶的消息事件處理,當協調器創建一個網絡,最終不管是成功還是失敗,
24、都會產生一個消息事件去通知每一個任務,各個任務就根據狀態結果去做相應的動作。至此,一個協調器的啟動過程已經完成。10.7.2 路由器(終端設備)入網過程STEP 1: zigbee設備應用層初始化ZDApp_Init ()【ZDApp.c】:在任務初始化osalInitTasks()中,調用了ZIGBEE設備應用層初始化函數: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任務ID為0,此函數不開源無法查看源碼。 nwk_init( taskID+ ); / nwk初始化,nwk任務ID為1,此函數不開源無法查看源碼。 Hal_Init( taskID+ ); / Hal初始化,hal(硬件抽象層)任務ID為2,僅賦值ID號。#if defined( MT_TASK ) MT_TaskInit( taskID+ ); / MT(monitortest監視器)初始化,如果有使用,則此任務ID為3,如果要使用UART串
26、口,必須要初始化此任務.本程序沒使用。#endif APS_Init( taskID+ );/ APS(應用支持子層)初始化,APS任務ID為3,此函數不開源無法查看源碼。#if defined ( ZIGBEE_FRAGMENTATION ) APSF_Init( taskID+ ); / 應用支持子層消息分割層,此處沒編譯使用#endif ZDApp_Init( taskID+ ); / zigbee設備應用層初始化,ZDApp任務ID為4,開始器件的啟動.#if defined ( ZIGBEE_FREQ_AGILITY ) | defined ( ZIGBEE_PANID_CONFLI
27、CT ) ZDNwkMgr_Init( taskID+ );/ 網絡管理層初始化,任務ID為5.#endif SampleApp_Init( taskID ); / 用戶任務初始化,任務ID為6.Main()àosal_init_system()àosalInitTasks()àZDApp_Init():在ZDApp_Init()當中,獲取了設備的IEEE地址和對按鍵啟動的檢測等,其中重要的是ZDOInitDevice()函數,可以說此函數是網絡建立的入口。因為IAR預編譯了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()函數留用戶調用去啟動。STEP 2:用戶任務初始化SampleApp_Init()【SampleApp.c】:Main()àosal_init_system()àosalInitTasks()àSampleApp_Init():用戶任務初
29、始化函數SampleApp_Init()中重要的地方就是調用了ZDOInitDevice()函數,而在調用ZDOInitDevice()前,要對設備類型進行定義,可以在用戶任務初始化調用ZDOInitDevice()前或是在ZDOInitDevice()函數的開始地方定義,此設備為“路由器”,所以定義為zgDeviceLogicalType = ZG_DEVICETYPE_ROUTER。STEP 3:ZIGBEE設備初始化ZDOInitDevice()【ZDApp.c】:ZDOInitDevice()函數,先對網絡的各種動作以及參數做個配置,配置完成后調用ZDApp_NetworkInit()
30、對網絡進行初始化。STEP 4:網絡初始化ZDApp_NetworkInit()【ZDApp.c】:在ZDApp_NetworkInit()函數里,實際上并沒有做其他的一些初始化,而是將ZDO_NETWORK_INIT事件加入到定時器列表中去等待系統調度執行。STEP 5:ZIGBEE設備應用事件處理ZDApp_event_loop()【ZDApp.c】:上一步將ZDO_NETWORK_INIT事件加入到定時器列表中,現在ZDApp_event_loop()事件處理函數執行ZDO_NETWORK_INIT事件,其中調用了ZDO_StartDevice()函數對特定類型的設備進行啟動初始化。ST
31、EP 6:設備啟動ZDO_StartDevice()【ZDObject.c】:啟動設備就是對特定的設備類型進行啟動,路由器則是搜索發現網絡,具體則是調用NLME_NetworkDiscoveryRequest()去完成,這函數不開源。STEP 7:網絡創建NLME_NetworkDiscoveryRequest ()【NLMEDE.h】:網絡搜索發現函數就會在預設定的信道內檢測是否有相同的PAN ID的網絡存在,當找到了相同的PAN ID的網絡則加入網絡,由回調函數ZDO_NetworkDiscoveryConfirmCB ()去返回一個結果。因為這部分的程序不開源,所以只能看回調函數的結果。
32、STEP 8:搜索網絡結果狀態返回ZDO_NetworkDiscoveryConfirmCB()【ZDApp.c】:回調函數ZDO_NetworkDiscoveryConfirmCB()就是調用網絡搜索函數后,返回網絡搜索的結果,將搜索到的結果進行逐個比較,然后通過消息將反饋信息比較后發送到ZDA層。ZDApp_SendMsg(ZDAppTaskID,ZDO_NWK_DISC_CNF, sizeof(ZDO_NetworkDiscoveryCfm_t), (uint8 *)&msg );STEP 9:網絡請求加入事件ZDApp_event_loop()àSYS_EVENT_MSG【ZDApp.c】上一步發送了消息給ZDAppTaskID,而在ZDApp_event_loop里對消息進行處理又是調用了ZDApp_ProcessOSALMsg()函數,在消息處
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯系上傳者。文件的所有權益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經權益所有人同意不得將文件中的內容挪作商業或盈利用途。
- 5. 人人文庫網僅提供信息存儲空間,僅對用戶上傳內容的表現方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
- 6. 下載文件中如有侵權或不適當內容,請與我們聯系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 白酒企業的市場定位與市場推廣策略考核試卷
- 智能監測與故障診斷考核試卷
- 二手房墊資借款合同二零二五年
- 影視道具制作的工藝美學研究考核試卷
- 紡織原料的環保認證與標準考核試卷
- 職業健康檢查委托協議書
- 安全生產月競賽刷題考核題和答案
- 地理信息系統GIS題庫及解析
- 海洋油氣開采中的深海資源利用策略考核試卷
- 物流無人機航線軟件行業跨境出海戰略研究報告
- 蘇教版三年級科學下冊單元測試卷及答案(全冊)
- 室內質控-檢驗科課件
- (完整)人力資源六大模塊ppt
- 小學四年級下學期英語閱讀理解
- 彩色手繪卡通兒科小兒護理高熱驚厥健康宣教教案PPT課件講義
- DB43∕T 498-2009 博落回葉-行業標準
- 心力衰竭病人的護理查房pptppt(ppt)課件
- T∕CADERM 2002-2018 胸痛中心(基層版)建設與評估標準
- 二次函數的應用——橋洞問題
- 《天然高分子》PPT課件.ppt
- 護士壓力與情緒管理PPT課件
評論
0/150
提交評論