版權說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權,請進行舉報或認領
文檔簡介
1、,第8章 Zstack應用開發(fā),8.1 應用設計8.2 體系結(jié)構(gòu)設計8.3 路由器程序編寫8.4 協(xié)調(diào)器程序編寫8.5 實驗現(xiàn)象,了解Zigbee程序的開發(fā)過程?! ≌莆語igbee程序體系結(jié)構(gòu)的設計?! ≌莆諈f(xié)調(diào)器和路由器程序的編寫。,,,?【描述8.D.】 采集溫度和光敏數(shù)據(jù)并進行傳輸。,,,,,Zigbee技術的低功耗、低成本、低速率的特點,使其在日常生活中的應用越來越廣泛。Zigbee技術作為無
2、線傳感器網(wǎng)絡的典型代表,可以大范圍地布置節(jié)點,大范圍地覆蓋傳輸,因此,大規(guī)模的Zigbee網(wǎng)絡的設計思想變得尤為重要,本章將以Zstack協(xié)議棧為例來講解Zigbee應用程序開發(fā)的思想。,,8.1 應用設計,8.1.1 設計概述 Zstack應用程序設計是本書的核心,并且這一部分是直接面向用戶的。本章內(nèi)容主要分為兩個部分:Zigbee程序體系結(jié)構(gòu)的設計和程序的編寫?! igbee程序體系結(jié)構(gòu)的設計包括應用環(huán)境的分析、協(xié)調(diào)
3、器功能設計、路由器功能設計和終端設備功能設計?! 〕绦虻木帉懖糠职凑展δ茉O計的不同分為協(xié)調(diào)器部分程序編寫、路由器部分程序編寫和終端設備程序編寫。,,8.1.2 Zigbee程序開發(fā) Zigbee程序開發(fā)和其他的嵌入式開發(fā)設計基本上是相同的,都需要以下幾個步驟: (1) 需求分析; (2) 體系結(jié)構(gòu)的設計; (3) 應用程序的編寫; (4) 程序的調(diào)試和測試。,,1. 需求分析 在開發(fā)一個項目之前
4、,首先要對項目進行需求分析,包括所使用的軟硬件平臺、硬件的成本及設計、技術參數(shù)的分析和功能需求分析?! ?. 體系結(jié)構(gòu)的設計 在進行完需求分析后,要對整個系統(tǒng)進行體系結(jié)構(gòu)的設計,包括體系框架、模塊設計以及軟件功能的設計。,,3. 應用程序的編寫 在需求分析和體系結(jié)構(gòu)分析完成之后,開發(fā)者對系統(tǒng)有了一個系統(tǒng)的了解,可以根據(jù)功能設計進行程序的編寫?! ?. 程序的調(diào)試和測試 在應用程序編寫完成之后,要對程序進行調(diào)試和
5、測試。對于Zstack應用開發(fā),由于內(nèi)容的限制,本節(jié)只重點講解體系結(jié)構(gòu)的設計和應用程序的編寫,項目需求分析和程序的調(diào)試不作為重點介紹。,,Zigbee程序設計的過程中,當需求分析完成之后,會根據(jù)需求確定要實現(xiàn)的功能,由于Zigbee網(wǎng)絡中有三種設備,分別為協(xié)調(diào)器、路由器和終端設備,它們的軟件功能是有差異的,所以需要將三種設備的功能分開來設計。,,8.2 體系結(jié)構(gòu)設計,在本節(jié)內(nèi)容中將首先介紹Zigbee的一些應用環(huán)境,然后針對一種特定環(huán)
6、境設計Zigbee體系結(jié)構(gòu)以及協(xié)調(diào)器、路由器和終端設備的功能。,,8.2.1 應用環(huán)境分析 Zigbee技術的應用領域非常寬廣,已經(jīng)滲透到生活中的方方面面,涉及到城市公共安全、公共衛(wèi)生、安全生產(chǎn)、智能化交通、智能家居、環(huán)境監(jiān)測等領域?! ?. 工業(yè)控制 在工業(yè)領域,利用傳感器和Zigbee網(wǎng)絡,使數(shù)據(jù)的自動采集、分析和處理變得更加容易。例如火警檢測和預報、機器的檢測和維護,這些應用不需要很高的數(shù)據(jù)吞吐量和連續(xù)的狀態(tài)更新
7、,重點是低功耗,最大程度地節(jié)省電池的能量。,,2. 汽車管理控制 在汽車上,由于很多傳感器在內(nèi)置轉(zhuǎn)動的車輪或發(fā)動機中布線很困難,比如輪胎壓力監(jiān)測系統(tǒng),因此需要內(nèi)置的無線通信設備,使用Zigbee模塊就是一種比較好的解決方式。同樣,Zigbee技術也應用在了小區(qū)車輛的管理系統(tǒng)中,隨著小區(qū)的智能化,地下停車場用于停放小區(qū)住戶的車輛,停車場管理系統(tǒng)能夠快速準確地管理小區(qū)的車輛,能有效地防止車輛被盜以及解決排隊等候和人工收費透明度不高等種
8、種問題。,,3. 農(nóng)業(yè)應用 在精準農(nóng)業(yè)應用中,需要成千上萬的傳感器構(gòu)成比較復雜的控制網(wǎng)絡。傳統(tǒng)農(nóng)業(yè)主要使用孤立的、沒有通信能力的機械設備,主要依靠人力監(jiān)測農(nóng)作物的生長狀況。采用了傳感器和Zigbee網(wǎng)絡以后,農(nóng)業(yè)可以逐漸地轉(zhuǎn)向以信息和軟件為中心的生產(chǎn)模式,將采用更多的自動化、網(wǎng)絡化、智能化和遠程控制的設備來耕種。其中,傳感器可以收集包括土壤濕度、pH值、溫度、濕度等信息。這些信息的采集和處理經(jīng)由Zigbee網(wǎng)絡傳輸?shù)娇刂浦行模┺r(nóng)
9、民決策和參考。,,4. 智能家居 由于生活質(zhì)量的日益改善,各種家電設備的高度自動化和智能化已經(jīng)成為一種消費需求。Zigbee技術在無線傳感器網(wǎng)絡和各種無線終端控制方面有良好的前景,為傳感器網(wǎng)絡和控制設備提出了新的方案。Zigbee的網(wǎng)絡控制系統(tǒng)可以實現(xiàn)對各種家電設備的控制和調(diào)節(jié),只需要對舊式家電或家居進行改裝,或加入必要的驅(qū)動電路,便可以實現(xiàn)小信號對交流電器的控制。,,除此之外,室內(nèi)溫度、光照等環(huán)境參數(shù)也直接影響生活質(zhì)量,這些環(huán)境
10、參數(shù)可以通過Zigbee控制器對室內(nèi)溫度、光照檢測設備進行較遠距離的實時采集,然后對家電或者家居進行不同程度的調(diào)節(jié)?! ”竟?jié)內(nèi)容將以智能家居的內(nèi)環(huán)境參數(shù)采集系統(tǒng)為例來講解Zigbee程序設計的思想。,,8.2.2 整體設計 針對于智能家居的內(nèi)環(huán)境參數(shù)采集系統(tǒng),需要進行的采集量包括溫度、濕度和光照等參數(shù)(利用與本書配套的“Zigbee開發(fā)套件”的硬件資源來進行開發(fā))。其中,協(xié)調(diào)器上的硬件資源包括按鍵、LED和LCD、RS232
11、和RS485接口、蜂鳴器、傳感器模塊、電位器、時鐘模塊和外擴存儲模塊等;路由器和終端節(jié)點硬件資源包括LED指示燈、按鍵、JTAG接口、光敏電阻、DS18B20溫度傳感器、電位器和蜂鳴器。,,下述內(nèi)容將實現(xiàn)任務描述8.D.1,采集溫度和光敏數(shù)據(jù)并進行傳輸。數(shù)據(jù)采集的整體設計方案分為三部分,即數(shù)據(jù)的采集、數(shù)據(jù)的傳輸和網(wǎng)絡控制,其中涉及到的Zigbee設備類型有協(xié)調(diào)器節(jié)點、路由器節(jié)點和終端設備節(jié)點,其網(wǎng)絡結(jié)構(gòu)采用網(wǎng)狀型網(wǎng)絡,數(shù)據(jù)匯聚到協(xié)調(diào)器節(jié)
12、點之后,由協(xié)調(diào)器傳給PC機或用戶,其結(jié)構(gòu)框架如圖8-1所示。,,,圖8-1 整體設計框架,數(shù)據(jù)采集:數(shù)據(jù)采集部分通過終端節(jié)點來進行,有以下兩種方式。 終端節(jié)點通過接收協(xié)調(diào)器的命令,每隔一段時間采集一次溫度和濕度以及光敏傳感器的數(shù)據(jù)?! 〗K端節(jié)點每隔一段時間后主動向協(xié)調(diào)器發(fā)送采集的數(shù)據(jù)?! ?shù)據(jù)傳輸:終端節(jié)點采集的數(shù)據(jù)通過Zigbee網(wǎng)絡中的路由器傳輸給協(xié)調(diào)器。其中路由器在中間起到中繼傳輸?shù)淖饔茫?,當網(wǎng)絡傳輸距離比較大或
13、者需要穿墻傳輸時,需要在中間加入路由器以防止網(wǎng)絡出現(xiàn)不穩(wěn)定的情況。其中,路由器除了可以中繼傳輸之外還可以充當終端節(jié)點來采集數(shù)據(jù)?! 【W(wǎng)絡控制:終端節(jié)點和路由器采集的數(shù)據(jù)匯聚到協(xié)調(diào)器后,協(xié)調(diào)器將數(shù)據(jù)傳輸給PC機或者用戶,此時PC機或用戶通過對采集來的數(shù)據(jù)進行分析,對終端節(jié)點進行控制。其中控制命令由PC機下達給協(xié)調(diào)器,由協(xié)調(diào)器發(fā)送給相應的節(jié)點,終端節(jié)點或者路由器在收到相應的命令后,將會執(zhí)行控制命令。,,由于路由器節(jié)點既可以采集數(shù)據(jù),又可
14、以對其他節(jié)點的數(shù)據(jù)進行路由轉(zhuǎn)發(fā),為了節(jié)省資源,數(shù)據(jù)采集節(jié)點全部設置為路由器。因此,實際網(wǎng)絡中只用兩種設備類型,即協(xié)調(diào)器設備和路由器設備。,,1 協(xié)調(diào)器功能設計 在智能家居數(shù)據(jù)采集系統(tǒng)中,協(xié)調(diào)器的主要功能包括網(wǎng)絡的建立、數(shù)據(jù)的接收和發(fā)送、按鍵控制和串口控制,其協(xié)調(diào)器的功能框圖如圖8-2所示?! 【W(wǎng)絡建立:協(xié)調(diào)器負責建立一個網(wǎng)絡,為網(wǎng)絡分配PANID以及為其他加入網(wǎng)絡的節(jié)點分配網(wǎng)絡地址。,,數(shù)據(jù)的發(fā)送和接收:通過射頻接收其他節(jié)點傳
15、送的數(shù)據(jù),以及向其他節(jié)點發(fā)送控制命令?! 〈诳刂疲和ㄟ^串口接收PC命令,將其命令發(fā)送至網(wǎng)絡中。此處命令包括數(shù)據(jù)采集命令和執(zhí)行命令,采集命令即采集數(shù)據(jù)的命令,執(zhí)行命令即當PC機或用戶下達的命令,比如報警命令、開/關燈命令、開關其他電器的命令等。 按鍵控制:通過按鍵觸發(fā)數(shù)據(jù)發(fā)送事件,用來向網(wǎng)絡中發(fā)送其他命令。,,,圖8-2 協(xié)調(diào)器的功能框圖,2. 路由器功能設計 路由器的主要功能是網(wǎng)絡加入、數(shù)據(jù)的發(fā)送和接收、中繼路由傳輸
16、其他節(jié)點的數(shù)據(jù):溫度和光敏。其路由器的結(jié)構(gòu)框圖如圖8-3所示。,,,圖8-3 路由器的功能框圖,網(wǎng)絡加入:路由器開機后會自動掃描網(wǎng)絡,然后加入已經(jīng)存在的網(wǎng)絡中。在路由器加入網(wǎng)絡后,協(xié)調(diào)器會自動分配給路由器節(jié)點一個網(wǎng)絡地址。待網(wǎng)絡狀態(tài)改變之后,路由器將網(wǎng)絡地址發(fā)送至協(xié)調(diào)器注冊?! ?shù)據(jù)的發(fā)送和接收:通過射頻接收協(xié)調(diào)器傳送的命令,并執(zhí)行此命令?! ≈欣^路由:路由器接收到其他節(jié)點的數(shù)據(jù),并且當這些數(shù)據(jù)的目的地址并非本身地址時,將路由
17、轉(zhuǎn)發(fā)此數(shù)據(jù)至目的地址。,,數(shù)據(jù)采集:路由器利用硬件資源攜帶的傳感器來采集室內(nèi)的溫度、濕度和光照參數(shù),并發(fā)給協(xié)調(diào)器。 注意:本例中,由于采集量比較小,所以數(shù)據(jù)采集使用的是Zigbee路由器。在大型的應用項目中,由于數(shù)據(jù)量比較大,路由器需要負責路由傳輸功能,如果大量數(shù)據(jù)匯聚到路由器節(jié)點,會導致路由器節(jié)點負荷過大,為了在比較大型的Zigbee網(wǎng)絡中避免這種情況,為了使網(wǎng)絡穩(wěn)定,往往會選用Zigbee終端設備做為數(shù)據(jù)采集節(jié)點,路由器做為
18、網(wǎng)絡路由中繼節(jié)點。,,8.2.3 應用協(xié)議制定 在編寫程序之前需要制定通信協(xié)議,本系統(tǒng)的通信協(xié)議包括兩部分,即協(xié)調(diào)器與路由器的通信協(xié)議以及PC機與協(xié)調(diào)器的通信協(xié)議?! ?. 協(xié)調(diào)器與路由器 根據(jù)應用的需求,協(xié)調(diào)器與路由器的通信分為兩種情況: 一是路由器每經(jīng)過一段時間后,主動向協(xié)調(diào)器發(fā)送數(shù)據(jù),然后協(xié)調(diào)器將數(shù)據(jù)發(fā)送至PC機; 二是協(xié)調(diào)器通過串口接收到PC機的指令后向路由器索要數(shù)據(jù)。,,協(xié)調(diào)器與路由器之間的數(shù)據(jù)收
19、發(fā)需要配置端點描述符的輸入/輸出簇,通過描述符的簇ID來判斷接收數(shù)據(jù)的類型,簇ID的定義如下所述。 ADDRID:路由器向協(xié)調(diào)器注冊網(wǎng)絡地址?! ATAID:發(fā)送和接收采集數(shù)據(jù)信息?! PENID:控制命令—開?! LOSEID:控制命令—關。,,2. ?PC機與協(xié)調(diào)器 PC機與協(xié)調(diào)器通過串口通信,其通信協(xié)議描述如下: PC機向協(xié)調(diào)器節(jié)點發(fā)送DATA命令,通知協(xié)調(diào)器進行數(shù)據(jù)采集(協(xié)調(diào)器接到命令后將發(fā)送
20、數(shù)據(jù)采集命令至所有的數(shù)據(jù)采集節(jié)點),而后協(xié)調(diào)器將采集到的數(shù)據(jù)發(fā)送至PC機。,,PC機向協(xié)調(diào)器發(fā)送控制命令OPEN或CLOSE,通知協(xié)調(diào)器控制某一設備(例如命令協(xié)調(diào)器打開某個路由器所攜帶的蜂鳴器)。,,根據(jù)路由器功能的設計,路由器程序包含以下功能: 在路由器加入網(wǎng)絡之后,路由器節(jié)點將獲取本身的網(wǎng)絡地址信息,發(fā)送給協(xié)調(diào)器。,,8.3 路由器程序編寫,采集溫度和光照數(shù)據(jù)?! ⊥ㄟ^相應的命令傳輸數(shù)據(jù),這一部分可以有以下兩種實現(xiàn)方式。
21、 一是響應按鍵命令,由路由器按鍵觸發(fā)事件,然后路由器每隔一段時間自發(fā)的向協(xié)調(diào)器發(fā)送數(shù)據(jù); 二是響應協(xié)調(diào)器命令,協(xié)調(diào)器索要數(shù)據(jù)時,路由器才發(fā)送采集到的數(shù)據(jù)?! ∮捎诰W(wǎng)絡中路由器和終端設備的網(wǎng)絡地址是由協(xié)調(diào)器隨機分配的,因此為了方便區(qū)分不同的設備,可以為每個設備節(jié)點分配一個固定的MYID。MYID的定義如下: #define MYID 1,,在燒寫程序的時候要修改MYID號,如果有六個節(jié)點,它們的MYID分別為1、
22、2、3、4、5、6?! ≡诼酚善骷尤刖W(wǎng)絡后,路由器節(jié)點將通過Send_shortAddMessage()函數(shù)向協(xié)調(diào)器發(fā)送本身的地址信息,其代碼如下: 【描述8.D.1】 DongheAppRouter.c // 網(wǎng)絡狀態(tài)改變函數(shù) void DhAppRouterManage_ProcessZDOStateChange(devStates_t state),,{ // 發(fā)送本身節(jié)點信息 Se
23、nd_shortAddMessage(); } 在Send_shortAddMessage()函數(shù)中通過NLME_GetShortAddr()函數(shù)獲取節(jié)點自身的網(wǎng)絡地址,因此Send_shortAddMessage()函數(shù)向協(xié)調(diào)器發(fā)送四個字節(jié)的數(shù)據(jù),前兩個字節(jié)是節(jié)點的ID號,后兩個字節(jié)是節(jié)點的網(wǎng)絡短地址。該函數(shù)的代碼實現(xiàn)如下:,,【描述8.D.1】 DongheAppRouter.c void Send_shortAd
24、dMessage(void) { uint16 ShortAdd; // 獲取自身短地址 ShortAdd = NLME_GetShortAddr(); // 節(jié)點賦予ID號 send_ShortAdd[0] = 0;,,// 節(jié)點賦予ID號 send_ShortAdd[1] = MYID; // 短地址高位 send_ShortAdd[2] = (u
25、nsigned char)((ShortAdd >>8) & 0xFF); // 短地址低位 send_ShortAdd[3] = (unsigned char)(ShortAdd & 0xFF); // 發(fā)送短地址至協(xié)調(diào)器,,if(AF_DataRequest( // 目的地址為協(xié)調(diào)器短地址0x0000 &MySendt
26、est_Single_DstAddr, // 端點描述符 &MySendtest_epDesc, // 簇ID ADDRID, // 發(fā)送字節(jié)長度
27、 4,,,// 發(fā)送數(shù)據(jù) send_ShortAdd, // 發(fā)送序列號 & DhAppRouterManage_TransID, // 設置為路由發(fā)現(xiàn) AF_D
28、ISCV_ROUTE,,,// 路由半徑 AF_DEFAULT_RADIUS)==afStatus_SUCCESS) { } else { } },,數(shù)據(jù)采集是通過Send_dataMessage()函數(shù)來實現(xiàn)的,數(shù)據(jù)采集實現(xiàn)溫度和光敏的采集。溫度和光敏的采集使用路由器底板的板載傳感器DS1
29、8B20和光敏電阻(它們的移植詳見實踐篇的第7章),其代碼如下: 【描述8.D.1】 DongheAppRouter.c void Send_dataMessage(void) { uint8 *Light;,,// 發(fā)送數(shù)據(jù)的前兩個字節(jié)為節(jié)點ID send_buf[0] = 0; send_buf[1] = MYID; /*************獲取溫度********
30、****************/ // 18B20啟動 DS18B20_SendConvert(); // 獲取溫度,,DS18B20_GetTem(); // 發(fā)送數(shù)據(jù)的第3個字節(jié) 溫度整數(shù)部分(去除了符號位) send_buf[2] = sensor_data_value[1]; // 發(fā)送數(shù)據(jù)的第4個字節(jié) 溫度小數(shù)部分 send
31、_buf[3] = sensor_data_value[0];,,/*************獲取光照************************/ // 獲取光敏值 Light = getGuangM(); // 發(fā)送數(shù)據(jù)的第5個字節(jié),光敏值高位 send_buf[4] = Light[0]; // 發(fā)送數(shù)據(jù)的第6個字節(jié),光敏值低位 send_buf[5] = Light
32、[1];,,if(AF_DataRequest( // 目的地址為協(xié)調(diào)器短地址0x0000 &MySendtest_Single_DstAddr, // 端點描述符&MySendtest_epDesc, // 簇ID
33、 DATAID, // 發(fā)送字節(jié)長度,,6, // 發(fā)送數(shù)據(jù) send_buf, // 發(fā)送序列號 & DhAp
34、pRouterManage_TransID, // 設置為路由發(fā)現(xiàn) AF_DISCV_ROUTE, // 路由半徑,,AF_DEFAULT_RADIUS)==afStatus_SUCCESS) { } else {
35、 } },,8.3.1 響應按鍵命令 按鍵命令的響應是通過系統(tǒng)消息事件中的按鍵事件來觸發(fā)的,其中系統(tǒng)消息事件包括網(wǎng)絡狀態(tài)改變事件、接收數(shù)據(jù)消息事件、按鍵事件、綁定事件等。按鍵事件是通過以下幾個步驟實現(xiàn)的: (1) 當有按鍵按下時,將會觸發(fā)按鍵事件; (2) 按鍵事件將會調(diào)用按鍵處理函數(shù); (3) 在按鍵處理函數(shù)中實現(xiàn)用戶自定義的定時事件;,,(4) 定時事件調(diào)用數(shù)據(jù)采集發(fā)送函
36、數(shù),將采集的數(shù)據(jù)發(fā)送至協(xié)調(diào)器。 【描述8.D.1】 DongheAppRouter.c if ( events & SYS_EVENT_MSG ) { // 從消息隊列中取出消息 MSGpkt = (afIncomingMSGPacket_t *)osal_msg_receive(DhAppRouterManage_TaskID); // 判斷有消息時,,while ( MSGpk
37、t ) { // 將消息事件提取出來 switch ( MSGpkt->hdr.event ) { // 如果是網(wǎng)絡狀態(tài)改變事件 case ZDO_STATE_CHANGE: DhAppRouterManage_NwkState = (devStates_t)MSGpkt->hd
38、r.status;,,// 判斷啟動的是路由器設備還是終端設備 if(DhAppRouterManage_NwkState == DEV_END_DEVICE || DhAppRouterManage_NwkState == DEV_ROUTER ) { // 調(diào)用網(wǎng)絡狀態(tài)改變處理函數(shù),,DhAppRouterManage_
39、ProcessZDOStateChange((devStates_t)MSGpkt->hdr.status); } break; // 模塊接收到數(shù)據(jù)信息事件 case AF_INCOMING_MSG_CMD: // 調(diào)用接收消息事件處理函數(shù),,DhAppRouterManage_ProcessMSGData( MSGpkt
40、 ); break; // 按鍵事件 case KEY_CHANGE: // 調(diào)用按鍵事件處理函數(shù) DhAppRouterManage_HandleKeys ( ( (keyChange_t *)MSGpkt)->keys ); break;,,default:
41、break; } // 釋放消息所在的消息緩沖區(qū) osal_msg_deallocate( (uint8 *)MSGpkt ); // 等待接收下一個消息,,MSGpkt=(afIncomingMSGPacket_t*)osal_msg_receive(DhAppRouterManage_TaskID); } // 返回還沒有處理完的系統(tǒng)消息事件
42、 return (events ^ SYS_EVENT_MSG); },,1. 按鍵處理事件 按鍵處理事件需要判斷按下的按鍵,如果按鍵按下,將觸發(fā)相應的事件。由于路由器底板上的按鍵為SW1(對應程序中的SW5)和SW2(對應程序中的SW6),本例中設置為,當按下SW5時將調(diào)用用戶的定時事件,其代碼如下: 【描述8.D.1】 DongheAppRouter.c // 處理按鍵 void DhAppR
43、outerManage_HandleKeys (byte keys ),,{ // 如果按鍵SW1按下 if ( keys & HAL_KEY_SW_1 ) { } // 如果按鍵SW2按下 if ( keys & HAL_KEY_SW_2 ) {,,} // 如果按鍵SW3按下 if ( keys &
44、amp; HAL_KEY_SW_3 ) { } // 如果按鍵SW4按下 if ( keys & HAL_KEY_SW_4 ) {,,} // 如果按鍵SW5按下 if ( keys & HAL_KEY_SW_5 ) { } // 如果按鍵SW6按下 if ( keys &
45、; HAL_KEY_SW_6 ) {,,// 啟動用戶定時事件 osal_start_timerEx( DhAppRouterManage_TaskID, MySendtest_SEND_PERIODIC_MSG_EVT, 100); }
46、 },,2. 用戶定時事件 用戶定時事件是指用戶設定一個定時事件,當定時事件到達之后便會處理用戶定義的作業(yè)或控制。在本例程中,設定的定時事件為5秒,所以每隔5秒鐘將會調(diào)用Send_dataMessage()函數(shù)采集數(shù)據(jù)信息發(fā)往協(xié)調(diào)器。,,【描述8.D.1】 DongheAppRouter.c // 用戶定時事件 if ( events & MySendtest_SEND_PERIODIC
47、_MSG_EVT ) { // LED1閃爍 HalLedBlink (HAL_LED_1, 2, 50, 200); // 發(fā)送采集的數(shù)據(jù)信息,,Send_dataMessage(); // 每隔5秒鐘將會發(fā)送一次數(shù)據(jù) osal_start_timerEx(DhAppRouterManage_TaskID,MySendtest_SE
48、ND_PERIODIC_ MSG_EVT, 5000); // 如果事件沒有處理完返回事件 return (events ^ MySendtest_SEND_PERIODIC_MSG_EVT); },,8.3.2 響應協(xié)調(diào)器命令 協(xié)調(diào)器觸發(fā)命令是指由協(xié)調(diào)器發(fā)送一個命令,路由器接收到此命令后觸
49、發(fā)數(shù)據(jù)采集發(fā)送函數(shù)Send_dataMessage()來實現(xiàn)數(shù)據(jù)的采集和發(fā)送?! ÷酚善骰蚪K端設備的數(shù)據(jù)接收是通過數(shù)據(jù)接收處理函數(shù)DhAppRouterManage_ ProcessMSGData(afIncomingMSGPacket_t*msg)來處理的,其中參數(shù)msg是指向接收信息結(jié)構(gòu)體afIncomingMSGPacket_t的指針。,,1. ?afIncomingMSGPacket_t afIncomingMSGPa
50、cket_t結(jié)構(gòu)體成員有OSAL消息事件、組廣播的組ID、消息的簇ID、端點、源地址信息和目的地址信息、鏈路質(zhì)量指示以及發(fā)送的數(shù)據(jù)?! 窘Y(jié)構(gòu)體8-1】 afIncomingMSGPacket_t typedef struct { // OSAL消息事件隊列,,osal_event_hdr_t hdr; // 信息組ID,設置組播的時候使用 uint16 groupId; // 信息的
51、簇ID uint16 clusterId; // 源地址信息 afAddrType_t srcAddr; // 目的地址的短地址信息 uint16 macDestAddr; // 目的地址的端點,,uint8 endPoint; // 是否為廣播地址,(如果值為TURE,則目的地址為廣播地址) uint8 wasBroadcast; // 鏈路質(zhì)量指示
52、 uint8 LinkQuality; // 接收數(shù)據(jù)比例 uint8 correlation; // RF接收功率,,int8 rssi; // 安全信息 uint8 SecurityUse; // MAC時隙 uint32 timestamp; // 接收的數(shù)據(jù) afMSGCommandFormat_t cmd; } afIncomin
53、gMSGPacket_t;,,2. ?afMSGCommandFormat_t; 上述結(jié)構(gòu)體中,代表接收數(shù)據(jù)的cmd成員也是一個結(jié)構(gòu)體,其成員有傳輸序列號、傳輸數(shù)據(jù)長度和傳輸?shù)臄?shù)據(jù),如下所示: 【結(jié)構(gòu)體8-2】 afMSGCommandFormat_t typedef struct { // 傳輸序列號 byte TransSeqNumber; // 傳輸數(shù)據(jù)長度 ui
54、nt16 DataLength;,,// 傳輸數(shù)據(jù) byte *Data; } afMSGCommandFormat_t;,,3. 數(shù)據(jù)接收處理函數(shù) 數(shù)據(jù)接收處理函數(shù)通過判斷數(shù)據(jù)的“輸入簇”來判斷接收的數(shù)據(jù),當協(xié)調(diào)器發(fā)送數(shù)據(jù)的“輸出簇ID”為路由器接收的“輸入簇ID”時,路由器將執(zhí)行響應的命令。本例中,協(xié)調(diào)器的輸出簇為DATAID,即通知路由器發(fā)送采集的數(shù)據(jù)。因此在路由器中將調(diào)用Send_dataMessage(
55、)來采集和發(fā)送數(shù)據(jù),其代碼如下所示:,,【描述8.D.1】 DongheAppRouter.c // 處理接收到的數(shù)據(jù)(數(shù)據(jù)接收處理函數(shù)) void DhAppRouterManage_ProcessMSGData ( afIncomingMSGPacket_t *msg ) { switch ( msg->clusterId ) { case ADDRID :
56、 break;,,// 如果是數(shù)據(jù)命令 case DATAID: Send_dataMessage(); break; case OPENID: break; case CLOSEID: break;,,default: break; } },,由
57、于路由器有兩種工作方式(響應按鍵命令和響應協(xié)調(diào)器命令),所以對應的協(xié)調(diào)器也應該是兩種工作方式:協(xié)調(diào)器直接接收數(shù)據(jù)和協(xié)調(diào)器串口觸發(fā)采集數(shù)據(jù)。,,8.4 協(xié)調(diào)器程序編寫,協(xié)調(diào)器直接接收數(shù)據(jù):當路由器處在響應按鍵命令時,協(xié)調(diào)器直接接收路由器設備發(fā)送來的數(shù)據(jù),然后通過串口輸出至PC機。 協(xié)調(diào)器串口觸發(fā)采集數(shù)據(jù):當路由器工作在響應協(xié)調(diào)器命令時,協(xié)調(diào)器等待PC通過串口發(fā)送的數(shù)據(jù)傳輸命令(DATA)。協(xié)調(diào)器接到命令后將發(fā)送數(shù)據(jù)采集命令至所有的
58、數(shù)據(jù)采集節(jié)點,而后協(xié)調(diào)器將采集到的數(shù)據(jù)發(fā)送至PC機。,,8.4.1 直接接收數(shù)據(jù) 協(xié)調(diào)器向PC機發(fā)送數(shù)據(jù)需要用到串口,因此應該對其串口進行初始化,并將初始化函數(shù)添加至用戶任務初始化中,串口初始化函數(shù)InitUart()的代碼如下: 【描述8.D.1】 DongheAppCooder.c // 初始化串口 static void InitUart(void) { halUARTCfg_t u
59、artConfig; // 串口準備設置,,uartConfig.configured = TRUE; // 串口波特率設置 uartConfig.baudRate = HAL_UART_BR_38400; // 控制流設置 uartConfig.flowControl = FALSE; // 在RX緩
60、存達到maxRxBufSize之前空余的字節(jié)數(shù) uartConfig.flowControlThreshold = 64; // RX緩存,,uartConfig.rx.maxBufSize = 128; // TX緩存 uartConfig.tx.maxBufSize = 128; // 觸發(fā)事件設置 uartConfig.i
61、dleTimeout = 6; // 中斷使能 uartConfig.intEnable = TRUE; // 回調(diào)函數(shù),應用層可以根據(jù)RX、TX觸發(fā)的不同事件進行處理,,uartConfig.callBackFunc = SerialApp_CallBack; // 打開串口 HalUARTOpen (SER
62、IAL_APP_PORT, &uartConfig); } 以上路由器的兩種工作方式中,協(xié)調(diào)器處理接收數(shù)據(jù)都是通過DhAppCoordManage_ ProcessMSGData( afIncomingMSGPacket_t *msg )函數(shù)來進行的。,,需要注意的是,如果使用直接接收數(shù)據(jù)的工作方式,必須定義ANKEY(ANKEY的定義方法請參照本書第5章),才能將數(shù)據(jù)傳送至PC機。 【描述8.D.1】
63、DongheAppCooder.c case DATAID: // 如果接收到路由器設備發(fā)送的數(shù)據(jù)將數(shù)據(jù)保存在Usart_sendbuf中 for(i = 0;i < 6; i++) {,,Usart_sendbuf[i + (msg->cmd.Data[1]-1)*6] = msg->cmd.Data[i]; }
64、// 如果定義了ANKEY #ifdef ANKEY // 通過串口將數(shù)據(jù)發(fā)送至PC機 HalUARTWrite(SERIAL_APP_PORT,Usart_sendbuf,36); #endif break;,,8.4.2 串口觸發(fā) 串口觸發(fā)程序分以下幾步: (1) 首先注冊路由器加入網(wǎng)絡后的網(wǎng)絡短地址; (2) 串口接收到PC機發(fā)送的“DA
65、TA”命令后,調(diào)用用戶定時事件; (3) 在用戶定時事件中調(diào)用發(fā)送函數(shù)向路由器發(fā)送索要數(shù)據(jù)命令。,,當路由器加入網(wǎng)絡后,首先向協(xié)調(diào)器發(fā)送路由器的“MYID”和“網(wǎng)絡短地址”,協(xié)調(diào)器收到后將其注冊在addtable中,其代碼如下: 【描述8.D.1】 DongheAppCooder.c // 處理接收到的數(shù)據(jù) void DhAppCoordManage_ProcessMSGData ( afIncomingMSGP
66、acket_t *msg ) { uint8 i;,,switch ( msg->clusterId ) { case ADDRID: // 將網(wǎng)絡中路由器的網(wǎng)絡地址存放在addtable中,并且相應的myID號對應相應的網(wǎng)絡地址 addtable[msg->cmd.Data[1]] = ((uint16)msg->cmd.Data[
67、2])cmd.Data[1]] |= ((uint16)msg->cmd.Data[3])&0x00FF; HalLedBlink (HAL_LED_2, 4, 50, 500); break;,,串口接收數(shù)據(jù)是通過回調(diào)函數(shù)SerialApp_CallBack()來實現(xiàn)的,在回調(diào)函數(shù)中調(diào)用用戶自定義的定時事件MySendtest_SEND_PERIODIC_MSG_EVT,其代碼如下:
68、 【描述8.D.1】 DongheAppCooder.c // 接收串口數(shù)據(jù)的回調(diào)函數(shù), static void SerialApp_CallBack( uint8 port,uint8 event) { uint8 sBuf[10]={0}; uint16 nLen=0; uint8 Num = 0; uint8 i;,,if(event !=
69、HAL_UART_TX_EMPTY) { nLen=HalUARTRead(SERIAL_APP_PORT,sBuf,10); if(nLen>0) { // *******輸出數(shù)據(jù)長度************ Num =(uint8) nLen; (voi
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經(jīng)權益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 眾賞文庫僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責。
- 6. 下載文件中如有侵權或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 第8章 單片機開發(fā)及應用技術.PDF
- 第8章 單片機開發(fā)及應用技術.PDF
- 第8章中斷技術-
- 第8章 電子商務網(wǎng)站開發(fā)技術
- 第8章 糧食貯藏技術
- 血緣之江上冊第22章下冊第8章翻譯實踐報告
- 第8章
- 第8章 頸椎及胸椎
- 第1章-wsn與zigbee概述
- 血緣之江翻譯實踐報告——上冊第5章至第8章翻譯為例
- 血緣之江上冊第22章下冊第8章翻譯實踐報告_2954(1)
- 《多媒體技術》講稿第8章-jian
- 第8章 防火墻技術1
- 《血緣之江》(上冊第22章-下冊第8章)翻譯實踐報告_2954.pdf
- 第8章 配送
- 工藝第8章
- 高電壓技術第8章習題答案
- 第8章 防火墻技術復習
- 第7、8章
- 第8章廣域網(wǎng)接入技術-_0
評論
0/150
提交評論