zigbee開(kāi)發(fā)技術(shù)及實(shí)踐丁春強(qiáng)第8章_第1頁(yè)
已閱讀1頁(yè),還剩103頁(yè)未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡(jiǎn)介

1、,第8章 Zstack應(yīng)用開(kāi)發(fā),8.1 應(yīng)用設(shè)計(jì)8.2 體系結(jié)構(gòu)設(shè)計(jì)8.3 路由器程序編寫(xiě)8.4 協(xié)調(diào)器程序編寫(xiě)8.5 實(shí)驗(yàn)現(xiàn)象,了解Zigbee程序的開(kāi)發(fā)過(guò)程?!  ≌莆語(yǔ)igbee程序體系結(jié)構(gòu)的設(shè)計(jì)。   掌握協(xié)調(diào)器和路由器程序的編寫(xiě)。,,,?【描述8.D.】   采集溫度和光敏數(shù)據(jù)并進(jìn)行傳輸。,,,,,Zigbee技術(shù)的低功耗、低成本、低速率的特點(diǎn),使其在日常生活中的應(yīng)用越來(lái)越廣泛。Zigbee技術(shù)作為無(wú)

2、線(xiàn)傳感器網(wǎng)絡(luò)的典型代表,可以大范圍地布置節(jié)點(diǎn),大范圍地覆蓋傳輸,因此,大規(guī)模的Zigbee網(wǎng)絡(luò)的設(shè)計(jì)思想變得尤為重要,本章將以Zstack協(xié)議棧為例來(lái)講解Zigbee應(yīng)用程序開(kāi)發(fā)的思想。,,8.1 應(yīng)用設(shè)計(jì),8.1.1 設(shè)計(jì)概述   Zstack應(yīng)用程序設(shè)計(jì)是本書(shū)的核心,并且這一部分是直接面向用戶(hù)的。本章內(nèi)容主要分為兩個(gè)部分:Zigbee程序體系結(jié)構(gòu)的設(shè)計(jì)和程序的編寫(xiě)?!  igbee程序體系結(jié)構(gòu)的設(shè)計(jì)包括應(yīng)用環(huán)境的分析、協(xié)調(diào)

3、器功能設(shè)計(jì)、路由器功能設(shè)計(jì)和終端設(shè)備功能設(shè)計(jì)。   程序的編寫(xiě)部分按照功能設(shè)計(jì)的不同分為協(xié)調(diào)器部分程序編寫(xiě)、路由器部分程序編寫(xiě)和終端設(shè)備程序編寫(xiě)。,,8.1.2 Zigbee程序開(kāi)發(fā)   Zigbee程序開(kāi)發(fā)和其他的嵌入式開(kāi)發(fā)設(shè)計(jì)基本上是相同的,都需要以下幾個(gè)步驟:   (1) 需求分析;   (2) 體系結(jié)構(gòu)的設(shè)計(jì);   (3) 應(yīng)用程序的編寫(xiě);   (4) 程序的調(diào)試和測(cè)試。,,1. 需求分析   在開(kāi)發(fā)一個(gè)項(xiàng)目之前

4、,首先要對(duì)項(xiàng)目進(jìn)行需求分析,包括所使用的軟硬件平臺(tái)、硬件的成本及設(shè)計(jì)、技術(shù)參數(shù)的分析和功能需求分析。   2. 體系結(jié)構(gòu)的設(shè)計(jì)   在進(jìn)行完需求分析后,要對(duì)整個(gè)系統(tǒng)進(jìn)行體系結(jié)構(gòu)的設(shè)計(jì),包括體系框架、模塊設(shè)計(jì)以及軟件功能的設(shè)計(jì)。,,3. 應(yīng)用程序的編寫(xiě)   在需求分析和體系結(jié)構(gòu)分析完成之后,開(kāi)發(fā)者對(duì)系統(tǒng)有了一個(gè)系統(tǒng)的了解,可以根據(jù)功能設(shè)計(jì)進(jìn)行程序的編寫(xiě)?!  ?. 程序的調(diào)試和測(cè)試   在應(yīng)用程序編寫(xiě)完成之后,要對(duì)程序進(jìn)行調(diào)試和

5、測(cè)試。對(duì)于Zstack應(yīng)用開(kāi)發(fā),由于內(nèi)容的限制,本節(jié)只重點(diǎn)講解體系結(jié)構(gòu)的設(shè)計(jì)和應(yīng)用程序的編寫(xiě),項(xiàng)目需求分析和程序的調(diào)試不作為重點(diǎn)介紹。,,Zigbee程序設(shè)計(jì)的過(guò)程中,當(dāng)需求分析完成之后,會(huì)根據(jù)需求確定要實(shí)現(xiàn)的功能,由于Zigbee網(wǎng)絡(luò)中有三種設(shè)備,分別為協(xié)調(diào)器、路由器和終端設(shè)備,它們的軟件功能是有差異的,所以需要將三種設(shè)備的功能分開(kāi)來(lái)設(shè)計(jì)。,,8.2 體系結(jié)構(gòu)設(shè)計(jì),在本節(jié)內(nèi)容中將首先介紹Zigbee的一些應(yīng)用環(huán)境,然后針對(duì)一種特定環(huán)

6、境設(shè)計(jì)Zigbee體系結(jié)構(gòu)以及協(xié)調(diào)器、路由器和終端設(shè)備的功能。,,8.2.1 應(yīng)用環(huán)境分析   Zigbee技術(shù)的應(yīng)用領(lǐng)域非常寬廣,已經(jīng)滲透到生活中的方方面面,涉及到城市公共安全、公共衛(wèi)生、安全生產(chǎn)、智能化交通、智能家居、環(huán)境監(jiān)測(cè)等領(lǐng)域?!  ?. 工業(yè)控制   在工業(yè)領(lǐng)域,利用傳感器和Zigbee網(wǎng)絡(luò),使數(shù)據(jù)的自動(dòng)采集、分析和處理變得更加容易。例如火警檢測(cè)和預(yù)報(bào)、機(jī)器的檢測(cè)和維護(hù),這些應(yīng)用不需要很高的數(shù)據(jù)吞吐量和連續(xù)的狀態(tài)更新

7、,重點(diǎn)是低功耗,最大程度地節(jié)省電池的能量。,,2. 汽車(chē)管理控制   在汽車(chē)上,由于很多傳感器在內(nèi)置轉(zhuǎn)動(dòng)的車(chē)輪或發(fā)動(dòng)機(jī)中布線(xiàn)很困難,比如輪胎壓力監(jiān)測(cè)系統(tǒng),因此需要內(nèi)置的無(wú)線(xiàn)通信設(shè)備,使用Zigbee模塊就是一種比較好的解決方式。同樣,Zigbee技術(shù)也應(yīng)用在了小區(qū)車(chē)輛的管理系統(tǒng)中,隨著小區(qū)的智能化,地下停車(chē)場(chǎng)用于停放小區(qū)住戶(hù)的車(chē)輛,停車(chē)場(chǎng)管理系統(tǒng)能夠快速準(zhǔn)確地管理小區(qū)的車(chē)輛,能有效地防止車(chē)輛被盜以及解決排隊(duì)等候和人工收費(fèi)透明度不高等種

8、種問(wèn)題。,,3. 農(nóng)業(yè)應(yīng)用   在精準(zhǔn)農(nóng)業(yè)應(yīng)用中,需要成千上萬(wàn)的傳感器構(gòu)成比較復(fù)雜的控制網(wǎng)絡(luò)。傳統(tǒng)農(nóng)業(yè)主要使用孤立的、沒(méi)有通信能力的機(jī)械設(shè)備,主要依靠人力監(jiān)測(cè)農(nóng)作物的生長(zhǎng)狀況。采用了傳感器和Zigbee網(wǎng)絡(luò)以后,農(nóng)業(yè)可以逐漸地轉(zhuǎn)向以信息和軟件為中心的生產(chǎn)模式,將采用更多的自動(dòng)化、網(wǎng)絡(luò)化、智能化和遠(yuǎn)程控制的設(shè)備來(lái)耕種。其中,傳感器可以收集包括土壤濕度、pH值、溫度、濕度等信息。這些信息的采集和處理經(jīng)由Zigbee網(wǎng)絡(luò)傳輸?shù)娇刂浦行模┺r(nóng)

9、民決策和參考。,,4. 智能家居   由于生活質(zhì)量的日益改善,各種家電設(shè)備的高度自動(dòng)化和智能化已經(jīng)成為一種消費(fèi)需求。Zigbee技術(shù)在無(wú)線(xiàn)傳感器網(wǎng)絡(luò)和各種無(wú)線(xiàn)終端控制方面有良好的前景,為傳感器網(wǎng)絡(luò)和控制設(shè)備提出了新的方案。Zigbee的網(wǎng)絡(luò)控制系統(tǒng)可以實(shí)現(xiàn)對(duì)各種家電設(shè)備的控制和調(diào)節(jié),只需要對(duì)舊式家電或家居進(jìn)行改裝,或加入必要的驅(qū)動(dòng)電路,便可以實(shí)現(xiàn)小信號(hào)對(duì)交流電器的控制。,,除此之外,室內(nèi)溫度、光照等環(huán)境參數(shù)也直接影響生活質(zhì)量,這些環(huán)境

10、參數(shù)可以通過(guò)Zigbee控制器對(duì)室內(nèi)溫度、光照檢測(cè)設(shè)備進(jìn)行較遠(yuǎn)距離的實(shí)時(shí)采集,然后對(duì)家電或者家居進(jìn)行不同程度的調(diào)節(jié)?!  ”竟?jié)內(nèi)容將以智能家居的內(nèi)環(huán)境參數(shù)采集系統(tǒng)為例來(lái)講解Zigbee程序設(shè)計(jì)的思想。,,8.2.2 整體設(shè)計(jì)   針對(duì)于智能家居的內(nèi)環(huán)境參數(shù)采集系統(tǒng),需要進(jìn)行的采集量包括溫度、濕度和光照等參數(shù)(利用與本書(shū)配套的“Zigbee開(kāi)發(fā)套件”的硬件資源來(lái)進(jìn)行開(kāi)發(fā))。其中,協(xié)調(diào)器上的硬件資源包括按鍵、LED和LCD、RS232

11、和RS485接口、蜂鳴器、傳感器模塊、電位器、時(shí)鐘模塊和外擴(kuò)存儲(chǔ)模塊等;路由器和終端節(jié)點(diǎn)硬件資源包括LED指示燈、按鍵、JTAG接口、光敏電阻、DS18B20溫度傳感器、電位器和蜂鳴器。,,下述內(nèi)容將實(shí)現(xiàn)任務(wù)描述8.D.1,采集溫度和光敏數(shù)據(jù)并進(jìn)行傳輸。數(shù)據(jù)采集的整體設(shè)計(jì)方案分為三部分,即數(shù)據(jù)的采集、數(shù)據(jù)的傳輸和網(wǎng)絡(luò)控制,其中涉及到的Zigbee設(shè)備類(lèi)型有協(xié)調(diào)器節(jié)點(diǎn)、路由器節(jié)點(diǎn)和終端設(shè)備節(jié)點(diǎn),其網(wǎng)絡(luò)結(jié)構(gòu)采用網(wǎng)狀型網(wǎng)絡(luò),數(shù)據(jù)匯聚到協(xié)調(diào)器節(jié)

12、點(diǎn)之后,由協(xié)調(diào)器傳給PC機(jī)或用戶(hù),其結(jié)構(gòu)框架如圖8-1所示。,,,圖8-1 整體設(shè)計(jì)框架,數(shù)據(jù)采集:數(shù)據(jù)采集部分通過(guò)終端節(jié)點(diǎn)來(lái)進(jìn)行,有以下兩種方式。   終端節(jié)點(diǎn)通過(guò)接收協(xié)調(diào)器的命令,每隔一段時(shí)間采集一次溫度和濕度以及光敏傳感器的數(shù)據(jù)?!  〗K端節(jié)點(diǎn)每隔一段時(shí)間后主動(dòng)向協(xié)調(diào)器發(fā)送采集的數(shù)據(jù)?!  ?shù)據(jù)傳輸:終端節(jié)點(diǎn)采集的數(shù)據(jù)通過(guò)Zigbee網(wǎng)絡(luò)中的路由器傳輸給協(xié)調(diào)器。其中路由器在中間起到中繼傳輸?shù)淖饔茫?,當(dāng)網(wǎng)絡(luò)傳輸距離比較大或

13、者需要穿墻傳輸時(shí),需要在中間加入路由器以防止網(wǎng)絡(luò)出現(xiàn)不穩(wěn)定的情況。其中,路由器除了可以中繼傳輸之外還可以充當(dāng)終端節(jié)點(diǎn)來(lái)采集數(shù)據(jù)?!  【W(wǎng)絡(luò)控制:終端節(jié)點(diǎn)和路由器采集的數(shù)據(jù)匯聚到協(xié)調(diào)器后,協(xié)調(diào)器將數(shù)據(jù)傳輸給PC機(jī)或者用戶(hù),此時(shí)PC機(jī)或用戶(hù)通過(guò)對(duì)采集來(lái)的數(shù)據(jù)進(jìn)行分析,對(duì)終端節(jié)點(diǎn)進(jìn)行控制。其中控制命令由PC機(jī)下達(dá)給協(xié)調(diào)器,由協(xié)調(diào)器發(fā)送給相應(yīng)的節(jié)點(diǎn),終端節(jié)點(diǎn)或者路由器在收到相應(yīng)的命令后,將會(huì)執(zhí)行控制命令。,,由于路由器節(jié)點(diǎn)既可以采集數(shù)據(jù),又可

14、以對(duì)其他節(jié)點(diǎn)的數(shù)據(jù)進(jìn)行路由轉(zhuǎn)發(fā),為了節(jié)省資源,數(shù)據(jù)采集節(jié)點(diǎn)全部設(shè)置為路由器。因此,實(shí)際網(wǎng)絡(luò)中只用兩種設(shè)備類(lèi)型,即協(xié)調(diào)器設(shè)備和路由器設(shè)備。,,1 協(xié)調(diào)器功能設(shè)計(jì)   在智能家居數(shù)據(jù)采集系統(tǒng)中,協(xié)調(diào)器的主要功能包括網(wǎng)絡(luò)的建立、數(shù)據(jù)的接收和發(fā)送、按鍵控制和串口控制,其協(xié)調(diào)器的功能框圖如圖8-2所示。   網(wǎng)絡(luò)建立:協(xié)調(diào)器負(fù)責(zé)建立一個(gè)網(wǎng)絡(luò),為網(wǎng)絡(luò)分配PANID以及為其他加入網(wǎng)絡(luò)的節(jié)點(diǎn)分配網(wǎng)絡(luò)地址。,,數(shù)據(jù)的發(fā)送和接收:通過(guò)射頻接收其他節(jié)點(diǎn)傳

15、送的數(shù)據(jù),以及向其他節(jié)點(diǎn)發(fā)送控制命令。   串口控制:通過(guò)串口接收PC命令,將其命令發(fā)送至網(wǎng)絡(luò)中。此處命令包括數(shù)據(jù)采集命令和執(zhí)行命令,采集命令即采集數(shù)據(jù)的命令,執(zhí)行命令即當(dāng)PC機(jī)或用戶(hù)下達(dá)的命令,比如報(bào)警命令、開(kāi)/關(guān)燈命令、開(kāi)關(guān)其他電器的命令等?!  “存I控制:通過(guò)按鍵觸發(fā)數(shù)據(jù)發(fā)送事件,用來(lái)向網(wǎng)絡(luò)中發(fā)送其他命令。,,,圖8-2 協(xié)調(diào)器的功能框圖,2. 路由器功能設(shè)計(jì)   路由器的主要功能是網(wǎng)絡(luò)加入、數(shù)據(jù)的發(fā)送和接收、中繼路由傳輸

16、其他節(jié)點(diǎn)的數(shù)據(jù):溫度和光敏。其路由器的結(jié)構(gòu)框圖如圖8-3所示。,,,圖8-3 路由器的功能框圖,網(wǎng)絡(luò)加入:路由器開(kāi)機(jī)后會(huì)自動(dòng)掃描網(wǎng)絡(luò),然后加入已經(jīng)存在的網(wǎng)絡(luò)中。在路由器加入網(wǎng)絡(luò)后,協(xié)調(diào)器會(huì)自動(dòng)分配給路由器節(jié)點(diǎn)一個(gè)網(wǎng)絡(luò)地址。待網(wǎng)絡(luò)狀態(tài)改變之后,路由器將網(wǎng)絡(luò)地址發(fā)送至協(xié)調(diào)器注冊(cè)?!  ?shù)據(jù)的發(fā)送和接收:通過(guò)射頻接收協(xié)調(diào)器傳送的命令,并執(zhí)行此命令?!  ≈欣^路由:路由器接收到其他節(jié)點(diǎn)的數(shù)據(jù),并且當(dāng)這些數(shù)據(jù)的目的地址并非本身地址時(shí),將路由

17、轉(zhuǎn)發(fā)此數(shù)據(jù)至目的地址。,,數(shù)據(jù)采集:路由器利用硬件資源攜帶的傳感器來(lái)采集室內(nèi)的溫度、濕度和光照參數(shù),并發(fā)給協(xié)調(diào)器?!  ?注意:本例中,由于采集量比較小,所以數(shù)據(jù)采集使用的是Zigbee路由器。在大型的應(yīng)用項(xiàng)目中,由于數(shù)據(jù)量比較大,路由器需要負(fù)責(zé)路由傳輸功能,如果大量數(shù)據(jù)匯聚到路由器節(jié)點(diǎn),會(huì)導(dǎo)致路由器節(jié)點(diǎn)負(fù)荷過(guò)大,為了在比較大型的Zigbee網(wǎng)絡(luò)中避免這種情況,為了使網(wǎng)絡(luò)穩(wěn)定,往往會(huì)選用Zigbee終端設(shè)備做為數(shù)據(jù)采集節(jié)點(diǎn),路由器做為

18、網(wǎng)絡(luò)路由中繼節(jié)點(diǎn)。,,8.2.3 應(yīng)用協(xié)議制定   在編寫(xiě)程序之前需要制定通信協(xié)議,本系統(tǒng)的通信協(xié)議包括兩部分,即協(xié)調(diào)器與路由器的通信協(xié)議以及PC機(jī)與協(xié)調(diào)器的通信協(xié)議。   1. 協(xié)調(diào)器與路由器   根據(jù)應(yīng)用的需求,協(xié)調(diào)器與路由器的通信分為兩種情況:   一是路由器每經(jīng)過(guò)一段時(shí)間后,主動(dòng)向協(xié)調(diào)器發(fā)送數(shù)據(jù),然后協(xié)調(diào)器將數(shù)據(jù)發(fā)送至PC機(jī);   二是協(xié)調(diào)器通過(guò)串口接收到PC機(jī)的指令后向路由器索要數(shù)據(jù)。,,協(xié)調(diào)器與路由器之間的數(shù)據(jù)收

19、發(fā)需要配置端點(diǎn)描述符的輸入/輸出簇,通過(guò)描述符的簇ID來(lái)判斷接收數(shù)據(jù)的類(lèi)型,簇ID的定義如下所述。   ADDRID:路由器向協(xié)調(diào)器注冊(cè)網(wǎng)絡(luò)地址。   DATAID:發(fā)送和接收采集數(shù)據(jù)信息。   OPENID:控制命令—開(kāi)。   CLOSEID:控制命令—關(guān)。,,2. ?PC機(jī)與協(xié)調(diào)器   PC機(jī)與協(xié)調(diào)器通過(guò)串口通信,其通信協(xié)議描述如下:   PC機(jī)向協(xié)調(diào)器節(jié)點(diǎn)發(fā)送DATA命令,通知協(xié)調(diào)器進(jìn)行數(shù)據(jù)采集(協(xié)調(diào)器接到命令后將發(fā)送

20、數(shù)據(jù)采集命令至所有的數(shù)據(jù)采集節(jié)點(diǎn)),而后協(xié)調(diào)器將采集到的數(shù)據(jù)發(fā)送至PC機(jī)。,,PC機(jī)向協(xié)調(diào)器發(fā)送控制命令OPEN或CLOSE,通知協(xié)調(diào)器控制某一設(shè)備(例如命令協(xié)調(diào)器打開(kāi)某個(gè)路由器所攜帶的蜂鳴器)。,,根據(jù)路由器功能的設(shè)計(jì),路由器程序包含以下功能:   在路由器加入網(wǎng)絡(luò)之后,路由器節(jié)點(diǎn)將獲取本身的網(wǎng)絡(luò)地址信息,發(fā)送給協(xié)調(diào)器。,,8.3 路由器程序編寫(xiě),采集溫度和光照數(shù)據(jù)?!  ⊥ㄟ^(guò)相應(yīng)的命令傳輸數(shù)據(jù),這一部分可以有以下兩種實(shí)現(xiàn)方式。

21、   一是響應(yīng)按鍵命令,由路由器按鍵觸發(fā)事件,然后路由器每隔一段時(shí)間自發(fā)的向協(xié)調(diào)器發(fā)送數(shù)據(jù);   二是響應(yīng)協(xié)調(diào)器命令,協(xié)調(diào)器索要數(shù)據(jù)時(shí),路由器才發(fā)送采集到的數(shù)據(jù)?!  ∮捎诰W(wǎng)絡(luò)中路由器和終端設(shè)備的網(wǎng)絡(luò)地址是由協(xié)調(diào)器隨機(jī)分配的,因此為了方便區(qū)分不同的設(shè)備,可以為每個(gè)設(shè)備節(jié)點(diǎn)分配一個(gè)固定的MYID。MYID的定義如下:   #define MYID 1,,在燒寫(xiě)程序的時(shí)候要修改MYID號(hào),如果有六個(gè)節(jié)點(diǎn),它們的MYID分別為1、

22、2、3、4、5、6。   在路由器加入網(wǎng)絡(luò)后,路由器節(jié)點(diǎn)將通過(guò)Send_shortAddMessage()函數(shù)向協(xié)調(diào)器發(fā)送本身的地址信息,其代碼如下:   【描述8.D.1】 DongheAppRouter.c   // 網(wǎng)絡(luò)狀態(tài)改變函數(shù)   void DhAppRouterManage_ProcessZDOStateChange(devStates_t state),,{     // 發(fā)送本身節(jié)點(diǎn)信息    Se

23、nd_shortAddMessage();   }   在Send_shortAddMessage()函數(shù)中通過(guò)NLME_GetShortAddr()函數(shù)獲取節(jié)點(diǎn)自身的網(wǎng)絡(luò)地址,因此Send_shortAddMessage()函數(shù)向協(xié)調(diào)器發(fā)送四個(gè)字節(jié)的數(shù)據(jù),前兩個(gè)字節(jié)是節(jié)點(diǎn)的ID號(hào),后兩個(gè)字節(jié)是節(jié)點(diǎn)的網(wǎng)絡(luò)短地址。該函數(shù)的代碼實(shí)現(xiàn)如下:,,【描述8.D.1】 DongheAppRouter.c   void Send_shortAd

24、dMessage(void)   {    uint16 ShortAdd;    // 獲取自身短地址    ShortAdd = NLME_GetShortAddr();    // 節(jié)點(diǎn)賦予ID號(hào)    send_ShortAdd[0] = 0;,,// 節(jié)點(diǎn)賦予ID號(hào)    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,    // 端點(diǎn)描述符    &MySendtest_epDesc,    // 簇ID    ADDRID,    // 發(fā)送字節(jié)長(zhǎng)度   

27、 4,,,// 發(fā)送數(shù)據(jù)    send_ShortAdd,    // 發(fā)送序列號(hào)    & DhAppRouterManage_TransID,    // 設(shè)置為路由發(fā)現(xiàn)    AF_D

28、ISCV_ROUTE,,,// 路由半徑    AF_DEFAULT_RADIUS)==afStatus_SUCCESS)    {    }    else    {        }       },,數(shù)據(jù)采集是通過(guò)Send_dataMessage()函數(shù)來(lái)實(shí)現(xiàn)的,數(shù)據(jù)采集實(shí)現(xiàn)溫度和光敏的采集。溫度和光敏的采集使用路由器底板的板載傳感器DS1

29、8B20和光敏電阻(它們的移植詳見(jiàn)實(shí)踐篇的第7章),其代碼如下:   【描述8.D.1】 DongheAppRouter.c   void Send_dataMessage(void)   { uint8 *Light;,,// 發(fā)送數(shù)據(jù)的前兩個(gè)字節(jié)為節(jié)點(diǎn)ID    send_buf[0] = 0;    send_buf[1] = MYID;    /*************獲取溫度********

30、****************/    // 18B20啟動(dòng)    DS18B20_SendConvert();     // 獲取溫度,,DS18B20_GetTem();    // 發(fā)送數(shù)據(jù)的第3個(gè)字節(jié) 溫度整數(shù)部分(去除了符號(hào)位)    send_buf[2] = sensor_data_value[1];    // 發(fā)送數(shù)據(jù)的第4個(gè)字節(jié) 溫度小數(shù)部分    send

31、_buf[3] = sensor_data_value[0];,,/*************獲取光照************************/    // 獲取光敏值   Light = getGuangM();   // 發(fā)送數(shù)據(jù)的第5個(gè)字節(jié),光敏值高位    send_buf[4] = Light[0];   // 發(fā)送數(shù)據(jù)的第6個(gè)字節(jié),光敏值低位    send_buf[5] = Light

32、[1];,,if(AF_DataRequest( // 目的地址為協(xié)調(diào)器短地址0x0000    &MySendtest_Single_DstAddr,    // 端點(diǎn)描述符&MySendtest_epDesc,    // 簇ID   

33、 DATAID,    // 發(fā)送字節(jié)長(zhǎng)度,,6,     // 發(fā)送數(shù)據(jù)    send_buf,    // 發(fā)送序列號(hào)    & DhAp

34、pRouterManage_TransID,    // 設(shè)置為路由發(fā)現(xiàn)    AF_DISCV_ROUTE,    // 路由半徑,,AF_DEFAULT_RADIUS)==afStatus_SUCCESS)    {    }    else    {

35、        }   },,8.3.1 響應(yīng)按鍵命令   按鍵命令的響應(yīng)是通過(guò)系統(tǒng)消息事件中的按鍵事件來(lái)觸發(fā)的,其中系統(tǒng)消息事件包括網(wǎng)絡(luò)狀態(tài)改變事件、接收數(shù)據(jù)消息事件、按鍵事件、綁定事件等。按鍵事件是通過(guò)以下幾個(gè)步驟實(shí)現(xiàn)的:   (1) 當(dāng)有按鍵按下時(shí),將會(huì)觸發(fā)按鍵事件;   (2) 按鍵事件將會(huì)調(diào)用按鍵處理函數(shù);   (3) 在按鍵處理函數(shù)中實(shí)現(xiàn)用戶(hù)自定義的定時(shí)事件;,,(4) 定時(shí)事件調(diào)用數(shù)據(jù)采集發(fā)送函

36、數(shù),將采集的數(shù)據(jù)發(fā)送至協(xié)調(diào)器?!   久枋?.D.1】 DongheAppRouter.c   if ( events & SYS_EVENT_MSG )   {    // 從消息隊(duì)列中取出消息    MSGpkt = (afIncomingMSGPacket_t *)osal_msg_receive(DhAppRouterManage_TaskID);    // 判斷有消息時(shí),,while ( MSGpk

37、t )    {     // 將消息事件提取出來(lái)    switch ( MSGpkt->hdr.event )    {         // 如果是網(wǎng)絡(luò)狀態(tài)改變事件    case ZDO_STATE_CHANGE:    DhAppRouterManage_NwkState = (devStates_t)MSGpkt->hd

38、r.status;,,// 判斷啟動(dòng)的是路由器設(shè)備還是終端設(shè)備    if(DhAppRouterManage_NwkState == DEV_END_DEVICE ||    DhAppRouterManage_NwkState == DEV_ROUTER )    {     // 調(diào)用網(wǎng)絡(luò)狀態(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 );    // 等待接收下一個(gè)消息,,MSGpkt=(afIncomingMSGPacket_t*)osal_msg_receive(DhAppRouterManage_TaskID);    }    // 返回還沒(méi)有處理完的系統(tǒng)消息事件   

42、 return (events ^ SYS_EVENT_MSG);    },,1. 按鍵處理事件   按鍵處理事件需要判斷按下的按鍵,如果按鍵按下,將觸發(fā)相應(yīng)的事件。由于路由器底板上的按鍵為SW1(對(duì)應(yīng)程序中的SW5)和SW2(對(duì)應(yīng)程序中的SW6),本例中設(shè)置為,當(dāng)按下SW5時(shí)將調(diào)用用戶(hù)的定時(shí)事件,其代碼如下:   【描述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 )    {,,// 啟動(dòng)用戶(hù)定時(shí)事件    osal_start_timerEx(    DhAppRouterManage_TaskID,     MySendtest_SEND_PERIODIC_MSG_EVT,    100);        } 

46、      },,2. 用戶(hù)定時(shí)事件   用戶(hù)定時(shí)事件是指用戶(hù)設(shè)定一個(gè)定時(shí)事件,當(dāng)定時(shí)事件到達(dá)之后便會(huì)處理用戶(hù)定義的作業(yè)或控制。在本例程中,設(shè)定的定時(shí)事件為5秒,所以每隔5秒鐘將會(huì)調(diào)用Send_dataMessage()函數(shù)采集數(shù)據(jù)信息發(fā)往協(xié)調(diào)器。,,【描述8.D.1】 DongheAppRouter.c   // 用戶(hù)定時(shí)事件    if ( events & MySendtest_SEND_PERIODIC

47、_MSG_EVT )    {    // LED1閃爍    HalLedBlink (HAL_LED_1, 2, 50, 200);    // 發(fā)送采集的數(shù)據(jù)信息,,Send_dataMessage();    // 每隔5秒鐘將會(huì)發(fā)送一次數(shù)據(jù)    osal_start_timerEx(DhAppRouterManage_TaskID,MySendtest_SE

48、ND_PERIODIC_     MSG_EVT, 5000);    // 如果事件沒(méi)有處理完返回事件    return (events ^ MySendtest_SEND_PERIODIC_MSG_EVT);        },,8.3.2 響應(yīng)協(xié)調(diào)器命令   協(xié)調(diào)器觸發(fā)命令是指由協(xié)調(diào)器發(fā)送一個(gè)命令,路由器接收到此命令后觸

49、發(fā)數(shù)據(jù)采集發(fā)送函數(shù)Send_dataMessage()來(lái)實(shí)現(xiàn)數(shù)據(jù)的采集和發(fā)送?!  ÷酚善骰蚪K端設(shè)備的數(shù)據(jù)接收是通過(guò)數(shù)據(jù)接收處理函數(shù)DhAppRouterManage_ ProcessMSGData(afIncomingMSGPacket_t*msg)來(lái)處理的,其中參數(shù)msg是指向接收信息結(jié)構(gòu)體afIncomingMSGPacket_t的指針。,,1. ?afIncomingMSGPacket_t   afIncomingMSGPa

50、cket_t結(jié)構(gòu)體成員有OSAL消息事件、組廣播的組ID、消息的簇ID、端點(diǎn)、源地址信息和目的地址信息、鏈路質(zhì)量指示以及發(fā)送的數(shù)據(jù)。   【結(jié)構(gòu)體8-1】 afIncomingMSGPacket_t   typedef struct   {    // OSAL消息事件隊(duì)列,,osal_event_hdr_t hdr;    // 信息組ID,設(shè)置組播的時(shí)候使用    uint16 groupId;   // 信息的

51、簇ID    uint16 clusterId;    // 源地址信息    afAddrType_t srcAddr;   // 目的地址的短地址信息    uint16 macDestAddr;   // 目的地址的端點(diǎn),,uint8 endPoint;   // 是否為廣播地址,(如果值為T(mén)URE,則目的地址為廣播地址)    uint8 wasBroadcast;    // 鏈路質(zhì)量指示   

52、 uint8 LinkQuality;   // 接收數(shù)據(jù)比例    uint8 correlation;    // RF接收功率,,int8 rssi;    // 安全信息    uint8 SecurityUse;    // MAC時(shí)隙    uint32 timestamp;    // 接收的數(shù)據(jù)    afMSGCommandFormat_t cmd;    } afIncomin

53、gMSGPacket_t;,,2. ?afMSGCommandFormat_t;   上述結(jié)構(gòu)體中,代表接收數(shù)據(jù)的cmd成員也是一個(gè)結(jié)構(gòu)體,其成員有傳輸序列號(hào)、傳輸數(shù)據(jù)長(zhǎng)度和傳輸?shù)臄?shù)據(jù),如下所示:   【結(jié)構(gòu)體8-2】 afMSGCommandFormat_t   typedef struct   {    // 傳輸序列號(hào)    byte TransSeqNumber;    // 傳輸數(shù)據(jù)長(zhǎng)度    ui

54、nt16 DataLength;,,// 傳輸數(shù)據(jù)    byte *Data;   } afMSGCommandFormat_t;,,3. 數(shù)據(jù)接收處理函數(shù)   數(shù)據(jù)接收處理函數(shù)通過(guò)判斷數(shù)據(jù)的“輸入簇”來(lái)判斷接收的數(shù)據(jù),當(dāng)協(xié)調(diào)器發(fā)送數(shù)據(jù)的“輸出簇ID”為路由器接收的“輸入簇ID”時(shí),路由器將執(zhí)行響應(yīng)的命令。本例中,協(xié)調(diào)器的輸出簇為DATAID,即通知路由器發(fā)送采集的數(shù)據(jù)。因此在路由器中將調(diào)用Send_dataMessage(

55、)來(lái)采集和發(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、于路由器有兩種工作方式(響應(yīng)按鍵命令和響應(yīng)協(xié)調(diào)器命令),所以對(duì)應(yīng)的協(xié)調(diào)器也應(yīng)該是兩種工作方式:協(xié)調(diào)器直接接收數(shù)據(jù)和協(xié)調(diào)器串口觸發(fā)采集數(shù)據(jù)。,,8.4 協(xié)調(diào)器程序編寫(xiě),協(xié)調(diào)器直接接收數(shù)據(jù):當(dāng)路由器處在響應(yīng)按鍵命令時(shí),協(xié)調(diào)器直接接收路由器設(shè)備發(fā)送來(lái)的數(shù)據(jù),然后通過(guò)串口輸出至PC機(jī)?!  f(xié)調(diào)器串口觸發(fā)采集數(shù)據(jù):當(dāng)路由器工作在響應(yīng)協(xié)調(diào)器命令時(shí),協(xié)調(diào)器等待PC通過(guò)串口發(fā)送的數(shù)據(jù)傳輸命令(DATA)。協(xié)調(diào)器接到命令后將發(fā)送數(shù)據(jù)采集命令至所有的

58、數(shù)據(jù)采集節(jié)點(diǎn),而后協(xié)調(diào)器將采集到的數(shù)據(jù)發(fā)送至PC機(jī)。,,8.4.1 直接接收數(shù)據(jù)   協(xié)調(diào)器向PC機(jī)發(fā)送數(shù)據(jù)需要用到串口,因此應(yīng)該對(duì)其串口進(jìn)行初始化,并將初始化函數(shù)添加至用戶(hù)任務(wù)初始化中,串口初始化函數(shù)InitUart()的代碼如下:   【描述8.D.1】 DongheAppCooder.c   // 初始化串口   static void InitUart(void)   {    halUARTCfg_t u

59、artConfig;    // 串口準(zhǔn)備設(shè)置,,uartConfig.configured = TRUE;     // 串口波特率設(shè)置    uartConfig.baudRate = HAL_UART_BR_38400;    // 控制流設(shè)置    uartConfig.flowControl = FALSE;    // 在RX緩

60、存達(dá)到maxRxBufSize之前空余的字節(jié)數(shù)    uartConfig.flowControlThreshold = 64;     // RX緩存,,uartConfig.rx.maxBufSize = 128;     // TX緩存    uartConfig.tx.maxBufSize = 128;     // 觸發(fā)事件設(shè)置    uartConfig.i

61、dleTimeout = 6;     // 中斷使能    uartConfig.intEnable = TRUE;     // 回調(diào)函數(shù),應(yīng)用層可以根據(jù)RX、TX觸發(fā)的不同事件進(jìn)行處理,,uartConfig.callBackFunc = SerialApp_CallBack;     // 打開(kāi)串口    HalUARTOpen (SER

62、IAL_APP_PORT, &uartConfig);    }   以上路由器的兩種工作方式中,協(xié)調(diào)器處理接收數(shù)據(jù)都是通過(guò)DhAppCoordManage_ ProcessMSGData( afIncomingMSGPacket_t *msg )函數(shù)來(lái)進(jìn)行的。,,需要注意的是,如果使用直接接收數(shù)據(jù)的工作方式,必須定義ANKEY(ANKEY的定義方法請(qǐng)參照本書(shū)第5章),才能將數(shù)據(jù)傳送至PC機(jī)。   【描述8.D.1】

63、DongheAppCooder.c   case DATAID:    // 如果接收到路由器設(shè)備發(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     // 通過(guò)串口將數(shù)據(jù)發(fā)送至PC機(jī)    HalUARTWrite(SERIAL_APP_PORT,Usart_sendbuf,36);   #endif       break;,,8.4.2 串口觸發(fā)   串口觸發(fā)程序分以下幾步:   (1) 首先注冊(cè)路由器加入網(wǎng)絡(luò)后的網(wǎng)絡(luò)短地址;   (2) 串口接收到PC機(jī)發(fā)送的“DA

65、TA”命令后,調(diào)用用戶(hù)定時(shí)事件;   (3) 在用戶(hù)定時(shí)事件中調(diào)用發(fā)送函數(shù)向路由器發(fā)送索要數(shù)據(jù)命令。,,當(dāng)路由器加入網(wǎng)絡(luò)后,首先向協(xié)調(diào)器發(fā)送路由器的“MYID”和“網(wǎng)絡(luò)短地址”,協(xié)調(diào)器收到后將其注冊(cè)在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)絡(luò)中路由器的網(wǎng)絡(luò)地址存放在addtable中,并且相應(yīng)的myID號(hào)對(duì)應(yīng)相應(yīng)的網(wǎng)絡(luò)地址    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ù)是通過(guò)回調(diào)函數(shù)SerialApp_CallBack()來(lái)實(shí)現(xiàn)的,在回調(diào)函數(shù)中調(diào)用用戶(hù)自定義的定時(shí)事件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ù)長(zhǎng)度************    Num =(uint8) nLen;    (voi

溫馨提示

  • 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶(hù)所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 眾賞文庫(kù)僅提供信息存儲(chǔ)空間,僅對(duì)用戶(hù)上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶(hù)上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶(hù)因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。

評(píng)論

0/150

提交評(píng)論