版權(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ì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 第8章 單片機(jī)開(kāi)發(fā)及應(yīng)用技術(shù).PDF
- 第8章 單片機(jī)開(kāi)發(fā)及應(yīng)用技術(shù).PDF
- 第8章中斷技術(shù)-
- 第8章 電子商務(wù)網(wǎng)站開(kāi)發(fā)技術(shù)
- 第8章 糧食貯藏技術(shù)
- 血緣之江上冊(cè)第22章下冊(cè)第8章翻譯實(shí)踐報(bào)告
- 第8章
- 第8章 頸椎及胸椎
- 第1章-wsn與zigbee概述
- 血緣之江翻譯實(shí)踐報(bào)告——上冊(cè)第5章至第8章翻譯為例
- 血緣之江上冊(cè)第22章下冊(cè)第8章翻譯實(shí)踐報(bào)告_2954(1)
- 《多媒體技術(shù)》講稿第8章-jian
- 第8章 防火墻技術(shù)1
- 《血緣之江》(上冊(cè)第22章-下冊(cè)第8章)翻譯實(shí)踐報(bào)告_2954.pdf
- 第8章 配送
- 工藝第8章
- 高電壓技術(shù)第8章習(xí)題答案
- 第8章 防火墻技術(shù)復(fù)習(xí)
- 第7、8章
- 第8章廣域網(wǎng)接入技術(shù)-_0
評(píng)論
0/150
提交評(píng)論