基于ZigBee的無線溫濕度采集系統(tǒng)_第1頁
基于ZigBee的無線溫濕度采集系統(tǒng)_第2頁
基于ZigBee的無線溫濕度采集系統(tǒng)_第3頁
基于ZigBee的無線溫濕度采集系統(tǒng)_第4頁
基于ZigBee的無線溫濕度采集系統(tǒng)_第5頁
已閱讀5頁,還剩8頁未讀 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡(jiǎn)介

基于ZigBee的無線溫濕度采集系統(tǒng)摘要:針對(duì)傳統(tǒng)溫濕度檢測(cè)存在的問題,結(jié)合無線傳感器網(wǎng)絡(luò)技術(shù),本文提出一種基于ZigBee技術(shù)的無線溫濕度采集系統(tǒng)的設(shè)計(jì)方法。設(shè)計(jì)采用CC2530射頻芯片及SHT11數(shù)字溫濕度傳感器,在ZigBee協(xié)議棧的根底上進(jìn)行應(yīng)用開發(fā)。闡述了ZigBee技術(shù),系統(tǒng)組成及工作原理,系統(tǒng)軟硬件設(shè)計(jì)等內(nèi)容,并通過實(shí)驗(yàn)測(cè)試說明,該無線溫濕度采集系統(tǒng)能夠穩(wěn)定可靠的運(yùn)行,并且具有組網(wǎng)簡(jiǎn)單、功耗低,本錢低等優(yōu)點(diǎn),具有十分好的實(shí)用價(jià)值和經(jīng)濟(jì)效益。關(guān)鍵字:ZigBee,溫濕度,CC2530,協(xié)議棧WirelesstemperatureandhumidityacquisitionsystembasedonZigBeetechnologyAbstract:Accordingtotheproblemsexistingintemperatureandhumiditydetectingoftraditionalways,combiningwithwirelesssensornetworktechnology,thispaperputsforwardanewdesignoftemperatureandhumidityacquisitionsystembasedonZigBeetechnology.ThedesignwascarriedoutbasedontheZigBeeprotocol,adoptingCC2530RFchipanddigitalhumidityandtemperaturesensorSHT11.PaperintroducesZigBeetechnology,theoveralldesignofthesystem,hardwareandsoftwaredesignofthenodesandsoforth.Finally,theexperimentaltestshaveprovedthatthewirelesstemperatureandhumidityacquisitionsystemwasstableandcredible,withtheadvantagesofsimplenetworking,lowcostandlowpower,andithasaverygoodpracticalvalueandeconomicbenefits.Keywords:ZigBee,Temperatureandhumidity,CC2530,Protocol1引言在冷鏈物流、農(nóng)業(yè)生產(chǎn)、倉(cāng)庫管理以及食品保存等領(lǐng)域,溫度和濕度控制顯得十分重要,但傳統(tǒng)的方法采用測(cè)試器材來測(cè)量溫度和濕度,通過人工進(jìn)行檢測(cè),這種人工測(cè)試方法費(fèi)時(shí)費(fèi)力、效率低,而且測(cè)試的溫度及濕度的誤差大,隨機(jī)性大。因此,開發(fā)一種全新的溫濕度采集系統(tǒng)就顯得十分迫切和重要了。本文設(shè)計(jì)了一種采用無線傳感器網(wǎng)絡(luò)技術(shù)進(jìn)行溫度和濕度的采集系統(tǒng)。無線傳感器網(wǎng)絡(luò)不需要較高的傳輸帶寬,但需要較低的傳輸時(shí)延和較低的功率消耗。ZigBee是一種新興的短距離、低功耗、低數(shù)據(jù)速率、低本錢、低復(fù)雜度的無線網(wǎng)絡(luò)技術(shù),它的出現(xiàn)正好滿足了這個(gè)要求。2ZigBee技術(shù)ZigBee是一種標(biāo)準(zhǔn),該標(biāo)準(zhǔn)定義了短距離、低數(shù)據(jù)傳輸速率無線通信所需要的一系列通信協(xié)議,它擁有一套完整的協(xié)議層次結(jié)構(gòu),由IEEE802.15.4和ZigBee聯(lián)盟共同制定完成。其工作頻段分別是868MHz(歐洲)、915MHz(北美)、2.4GHz(全球)3個(gè)頻段,可以應(yīng)用于不同的場(chǎng)合,諸如家庭自動(dòng)化網(wǎng)絡(luò)、工業(yè)控制網(wǎng)絡(luò)、交互式玩具、遠(yuǎn)程檢測(cè)等。完整的ZigBee協(xié)議棧包括物理層(PHY)、媒體訪問控制層(MAC)、網(wǎng)絡(luò)層(NWK)和應(yīng)用層(APL)。其中,ZigBee的應(yīng)用層由應(yīng)用支持子層(APS)、ZigBee設(shè)備對(duì)象(ZDO)和制造商定義的應(yīng)用對(duì)象組成。在ZigBee協(xié)議棧中,每一層通過使用下層提供的效勞完成自己的功能,同時(shí)對(duì)上層提供效勞,網(wǎng)絡(luò)中的通信在對(duì)等的層次上進(jìn)行。ZigBee網(wǎng)絡(luò)含三種類型的節(jié)點(diǎn),即協(xié)調(diào)器、路由器和終端設(shè)備,其中協(xié)調(diào)器和路由器均為全功能設(shè)備(FFD),而終端設(shè)備選用精簡(jiǎn)功能設(shè)備(RFD)。一個(gè)ZigBee網(wǎng)絡(luò)有且僅有一個(gè)協(xié)調(diào)器,該設(shè)備負(fù)責(zé)啟動(dòng)網(wǎng)絡(luò),配置網(wǎng)絡(luò)成員地址,維護(hù)網(wǎng)絡(luò),維護(hù)節(jié)點(diǎn)的綁定關(guān)系表等,需要最多的存儲(chǔ)空間和計(jì)算能力,它可以看作是一個(gè)PAN的網(wǎng)關(guān)節(jié)點(diǎn)。路由器主要實(shí)現(xiàn)擴(kuò)展網(wǎng)絡(luò)及路由消息的功能,終端設(shè)備那么負(fù)責(zé)與實(shí)際的監(jiān)控對(duì)象相連,實(shí)現(xiàn)具體功能的單元。無線傳感器網(wǎng)絡(luò)中可以根據(jù)不同的需要組成星型、簇型網(wǎng)和網(wǎng)狀型三種不同的網(wǎng)絡(luò)拓?fù)浣Y(jié)構(gòu)。星狀網(wǎng)絡(luò)由一個(gè)PAN協(xié)調(diào)器和多個(gè)終端設(shè)備組成。只存在PAN協(xié)調(diào)器與終端設(shè)備的通信,終端設(shè)備間的通信都需通過PAN協(xié)調(diào)器的轉(zhuǎn)發(fā);樹狀網(wǎng)絡(luò)由一個(gè)協(xié)調(diào)器和一個(gè)或多個(gè)星狀結(jié)構(gòu)連接而成,設(shè)備除了能與自己的父節(jié)點(diǎn)或子節(jié)點(diǎn)進(jìn)行點(diǎn)對(duì)點(diǎn)直接通訊外,其他只能通過樹狀路由完成消息傳輸;網(wǎng)狀網(wǎng)絡(luò)是樹狀網(wǎng)絡(luò)根底上實(shí)現(xiàn)的,與樹狀網(wǎng)絡(luò)不同的是,它允許網(wǎng)絡(luò)中所有具有路由功能的節(jié)點(diǎn)直接互連,由路由器中的路由表配合實(shí)現(xiàn)消息的網(wǎng)狀路由。一個(gè)ZigBee網(wǎng)絡(luò)最多可含有65000多個(gè)子節(jié)點(diǎn),通過無線網(wǎng)絡(luò)數(shù)據(jù)從一個(gè)節(jié)點(diǎn)傳送到另一個(gè)節(jié)點(diǎn),最終傳送到控制中心。另外,它可以與其他的無線網(wǎng)絡(luò)如GPRS和CDMA等兼容,也可以接入有線網(wǎng)絡(luò)如Internet、Ethernet,實(shí)現(xiàn)遠(yuǎn)程監(jiān)控。3系統(tǒng)結(jié)構(gòu)和原理基于ZigBee的無線溫濕度采集系統(tǒng)采用ZigBee星型拓?fù)浣M網(wǎng)方式,多個(gè)具有簡(jiǎn)單功能的設(shè)備和傳感器構(gòu)成傳感器節(jié)點(diǎn)〔終端設(shè)備〕,一臺(tái)具有完整功能的設(shè)備作為中心節(jié)點(diǎn)〔協(xié)調(diào)器節(jié)點(diǎn)〕,中心節(jié)點(diǎn)與中心控制計(jì)算機(jī)〔PC機(jī)〕相連,中心控制計(jì)算機(jī)通過上位機(jī)軟件可以實(shí)現(xiàn)對(duì)整個(gè)系統(tǒng)節(jié)點(diǎn)的監(jiān)測(cè)和控制。整個(gè)系統(tǒng)工作時(shí),傳感器節(jié)點(diǎn)負(fù)責(zé)現(xiàn)場(chǎng)溫濕度數(shù)據(jù)的采集,將采集到數(shù)據(jù)一定的數(shù)據(jù)格式存儲(chǔ)起來,當(dāng)上位機(jī)需要讀取溫濕度時(shí),就發(fā)送相應(yīng)指令給協(xié)調(diào)器,協(xié)調(diào)器將指令翻譯后發(fā)送給傳感器節(jié)點(diǎn),傳感器節(jié)點(diǎn)接收到指令,就將溫濕度數(shù)據(jù)無線發(fā)送給協(xié)調(diào)器,協(xié)調(diào)器通過串口RS232將數(shù)據(jù)發(fā)送給PC機(jī),PC機(jī)就可以對(duì)溫濕度數(shù)據(jù)進(jìn)行顯示、分析和處理,從而實(shí)現(xiàn)了溫濕度全程的無線采集和監(jiān)測(cè)工作。此外,整個(gè)溫濕度采集系統(tǒng)還可以實(shí)現(xiàn)協(xié)調(diào)器自檢、發(fā)送功率設(shè)置、終端節(jié)點(diǎn)地址設(shè)定、時(shí)間讀取和設(shè)置、低功耗設(shè)置、拍照等其它功能。4系統(tǒng)硬件設(shè)計(jì)4.1傳感器節(jié)點(diǎn)無線傳感器節(jié)點(diǎn)由數(shù)據(jù)采集、數(shù)據(jù)處理、無線通信和能量供給四個(gè)模塊組成。數(shù)據(jù)采集模塊由數(shù)字傳感器或者模擬傳感器加A/D轉(zhuǎn)換器組成,負(fù)責(zé)區(qū)域內(nèi)的溫濕度信息采集和數(shù)據(jù)轉(zhuǎn)換;數(shù)據(jù)處理模塊由微控制器組成,負(fù)責(zé)控制整個(gè)傳感器節(jié)點(diǎn)的操作和數(shù)據(jù)存儲(chǔ);無線通信模塊由無線收發(fā)器組成,負(fù)責(zé)與其他傳感器節(jié)點(diǎn)進(jìn)行通信,能量供給模塊為系統(tǒng)其他的三個(gè)局部提供能量。傳感器節(jié)點(diǎn)由瑞溫濕度傳感器SHT11檢測(cè)得到溫濕度信息,并轉(zhuǎn)化為數(shù)字信號(hào),傳輸至CC2530,由CC2530負(fù)責(zé)對(duì)信號(hào)進(jìn)行處理發(fā)送。節(jié)點(diǎn)電源局部使用兩節(jié)五號(hào)電池為整個(gè)節(jié)點(diǎn)供電。為了使系統(tǒng)工作時(shí)間持續(xù)長(zhǎng),節(jié)點(diǎn)通常在閑置時(shí)快速進(jìn)入休眠模式,其外設(shè)模塊進(jìn)入休眠狀態(tài),或者電源管理局部不對(duì)這些外設(shè)模塊供電。SHT11是瑞士Sensirion公司推出的基于CMOSensTM技術(shù)的新型溫濕度傳感器。SHT11將溫濕度傳感器、信號(hào)放大調(diào)理、A/D轉(zhuǎn)換、I2C總線接口全部集成于一個(gè)芯片上,該芯片包括一個(gè)電容性聚合體濕度敏感元件和一個(gè)用能隙材料制成的溫度敏感元件。這兩個(gè)敏感元件分別將濕度和溫度轉(zhuǎn)換成電信號(hào),該電信號(hào)首先進(jìn)入微弱信號(hào)放大器進(jìn)行放大器;然后進(jìn)入一個(gè)14位的A/D轉(zhuǎn)換器;最后經(jīng)過二線串行數(shù)字接口輸出數(shù)字信號(hào)。SHT11通過DATA數(shù)據(jù)總線輸出的是相對(duì)濕度,需要進(jìn)行線性補(bǔ)償和溫度補(bǔ)償后才能得到較為準(zhǔn)確的濕度值。CC2530芯片是用于2.4-GHz、ZigBee和RF4CE應(yīng)用的一個(gè)真正的片上系統(tǒng)〔SoC〕解決方案。它能夠以非常低的總的材料本錢建立強(qiáng)大的網(wǎng)絡(luò)節(jié)點(diǎn)。CC2530結(jié)合了領(lǐng)先的RF收發(fā)器的優(yōu)良性能,業(yè)界標(biāo)準(zhǔn)的增強(qiáng)型8051CPU,系統(tǒng)內(nèi)可編程閃存,8-KBRAM和許多其它強(qiáng)大的功能。在本無線溫濕度采集系統(tǒng)中,我們采用的是CC2530F256芯片,它結(jié)合了德州儀器的業(yè)界領(lǐng)先的黃金單元ZigBee

協(xié)議棧〔Z-Stack?〕,提供了一個(gè)強(qiáng)大和完整的ZigBee解決方案。溫濕度傳感器SHT11采集到的溫濕度數(shù)據(jù),存儲(chǔ)在CC2530的FLASHROM中,當(dāng)傳感節(jié)點(diǎn)接收到讀取溫濕度指令時(shí),就通過ZigBee協(xié)議棧將溫濕度數(shù)據(jù)發(fā)送出去。4.2協(xié)調(diào)器節(jié)點(diǎn)網(wǎng)絡(luò)協(xié)調(diào)器主要負(fù)責(zé)網(wǎng)絡(luò)的建立,信息的接收、匯總、處理及控制指令的發(fā)送ZigBee網(wǎng)絡(luò)最初由協(xié)調(diào)器發(fā)動(dòng)并建立。協(xié)調(diào)器通過主動(dòng)掃描選擇一個(gè)適宜信道,根據(jù)掃描的結(jié)果選擇自己的PANID及0x0000作為自己的短地址,其網(wǎng)絡(luò)層將通過向MAC層發(fā)送MLME2START.request原語啟動(dòng)一個(gè)新的PAN。協(xié)調(diào)器節(jié)點(diǎn)在建成網(wǎng)絡(luò)后,開始數(shù)據(jù)收發(fā)工作及各種操作指令的執(zhí)行。當(dāng)協(xié)調(diào)器收到數(shù)據(jù)時(shí),根據(jù)數(shù)據(jù)的串ID來判斷傳送的數(shù)據(jù)是地址信息還是傳感器采集的數(shù)據(jù),根據(jù)不同的數(shù)據(jù)類型解析數(shù)據(jù)包提供給PC機(jī)顯示和處理。5系統(tǒng)軟件設(shè)計(jì)本系統(tǒng)的軟件設(shè)計(jì)是基于Ti公司推出的跟CC2530芯片配套的Z2STACK協(xié)議棧和IAR集成開發(fā)環(huán)境進(jìn)行設(shè)計(jì)的。ZSTACK協(xié)議棧運(yùn)行在一個(gè)基于任務(wù)調(diào)度機(jī)制的OSAL操作系統(tǒng)上,OSAL通過觸發(fā)任務(wù)的事件來實(shí)現(xiàn)任務(wù)調(diào)度。OSAL中的任務(wù)可以通過任API將其添加到系統(tǒng)中,實(shí)現(xiàn)多任務(wù)機(jī)制。系統(tǒng)中傳感器節(jié)點(diǎn)由CC2530內(nèi)部的MCU(8051)控制,定時(shí)向溫濕度傳感器SHT11發(fā)送讀溫度和濕度指令,SHT11完成溫度和濕度轉(zhuǎn)換后會(huì)發(fā)出轉(zhuǎn)換完成信號(hào),MCU在接收到轉(zhuǎn)換完成信號(hào)后,讀取溫濕度值,并將這些數(shù)據(jù)信號(hào)傳送給協(xié)調(diào)器。協(xié)調(diào)器通過串口RS232和上位機(jī)(PC)相連,通過人機(jī)交互的方式對(duì)整個(gè)區(qū)域的進(jìn)行檢測(cè)。為了實(shí)現(xiàn)這一功能,必須知道節(jié)點(diǎn)的長(zhǎng)短地址對(duì)應(yīng)表,這就需要節(jié)點(diǎn)在參加網(wǎng)絡(luò)后發(fā)送自己的長(zhǎng)短地址給協(xié)調(diào)器,協(xié)調(diào)器將長(zhǎng)短地址對(duì)應(yīng)列表存儲(chǔ)起來,以便用戶要求采集數(shù)據(jù)時(shí)依據(jù)地址表來采集每個(gè)傳感器的數(shù)據(jù)。傳感節(jié)點(diǎn)與協(xié)調(diào)器節(jié)點(diǎn)的溫濕度采集及通信流程圖如下列圖1所示。圖1傳感器節(jié)點(diǎn)與協(xié)調(diào)器節(jié)點(diǎn)的通信流程圖6系統(tǒng)測(cè)試驗(yàn)證本無線溫濕度采集系統(tǒng)設(shè)計(jì)完成后,進(jìn)行了一系列的測(cè)試工作,包括通信距離,穿墻能力,系統(tǒng)穩(wěn)定性以及數(shù)據(jù)準(zhǔn)確性等。經(jīng)過測(cè)試,系統(tǒng)通信距離200米左右〔與發(fā)送功率有關(guān)〕,可以成功穿越一堵墻通信〔與網(wǎng)絡(luò)拓?fù)湫问接嘘P(guān)〕,并可以穩(wěn)定工作,預(yù)計(jì)傳感器節(jié)點(diǎn)工作壽命可達(dá)1年。7結(jié)束語本文設(shè)計(jì)的基于ZigBee技術(shù)的CC2530無線溫濕度采集系統(tǒng),其外圍設(shè)備簡(jiǎn)單、功耗低、傳輸無線化,而且精度高,可靠性好,提供了良好的人機(jī)交互界面,方便控制使用,在冷鏈物流,農(nóng)業(yè)生產(chǎn)以及食品保存等等領(lǐng)域都有很好的應(yīng)用前景。參考文獻(xiàn):王小強(qiáng),歐陽駿,黃寧淋,ZigBee無線傳感網(wǎng)絡(luò)設(shè)計(jì)與實(shí)現(xiàn),北京:化學(xué)工業(yè)出版社,2023.5.高手瑋,吳燦陽.ZigBee技術(shù)實(shí)踐教程,北京:北京航空航天大學(xué)出版社,2023.6瞿雷,劉盛德,胡咸斌.ZigBee技術(shù)及應(yīng)用,北京:北京航空航天大學(xué)出版社,2007.9.呂強(qiáng),劉玉華,劉志軍,王國(guó)勝.基于ZigBee的無線溫濕度檢測(cè)終端設(shè)計(jì).科學(xué)技術(shù)與工程,2023.12;8(23).ShahinFarahani.ZigBeeWirelessNetworksandTransceivers,ElsevierLtd,2023Sensirion.SHT11/Datasheet2SHT1x2SHT7x.pdfX.Li,W.David.CombiningtheBestofGlobal2as2ViewandLocal2as2ViewforDataIntegration[C].PODS,2004.ACal,DLembo,etal.ExperimentingDataInte2grationwithDIS@DIS[C].CAiSE2004,LectureNotesinComputerScience,2004,3084,9:51~66.附錄:實(shí)物圖及局部代碼1實(shí)物圖傳感器節(jié)點(diǎn)實(shí)物傳感器節(jié)點(diǎn)外包裝手持讀寫器〔協(xié)調(diào)器節(jié)點(diǎn)〕2局部程序代碼2.1終端節(jié)點(diǎn)〔傳感器節(jié)點(diǎn)〕局部代碼staticvoidSerialApp_ProcessZDOMsgs(zdoIncomingMsg_t*inMsg);staticvoidSerialApp_HandleKeys(uint8shift,uint8keys);staticvoidSerialApp_ProcessMSGCmd(afIncomingMSGPacket_t*pkt);staticvoidSerialApp_Send(void);staticvoidSerialApp_Resp(void);staticvoidSerialApp_CallBack(uint8port,uint8event);voidSerialApp_ProcessHym8563(void);//處理時(shí)鐘芯片,得到時(shí)間數(shù)據(jù)voidSerialApp_ProcessSht11(void);//處理溫濕度傳感器,得到溫濕度數(shù)據(jù)uint8SerialApp_GetVoltage(void);//獲取電壓數(shù)據(jù)voidSerialApp_MemoryTime(void);//存儲(chǔ)時(shí)間數(shù)據(jù)〔一組時(shí)間以及第一組溫濕度數(shù)據(jù)〕voidSerialApp_MemoryTemp_Humi(void);//存儲(chǔ)溫濕度數(shù)據(jù)〔第二組到第十七組溫濕度數(shù)據(jù)〕voidSerialApp_LowPower(void);//低功耗處理函數(shù)if(events&SERIALAPP_MEM_TIME_EVT){PktNum++;//存儲(chǔ)時(shí)間事件發(fā)生,溫濕度組數(shù)加1SerialApp_ProcessHym8563();SerialApp_ProcessSht11();SerialApp_GetVoltage();SerialApp_MemoryTime();osal_start_timerEx(SerialApp_TaskID,SERIALAPP_MEM_TEMP_HUMI_EVT,10000);//一組時(shí)間數(shù)據(jù)和第一組溫濕度數(shù)據(jù)存儲(chǔ)好后,等待10秒,觸發(fā)溫濕度存儲(chǔ)事件,存儲(chǔ)第二到第十七組溫濕度//注意:此處時(shí)間最大為65536毫秒,因此為了方便,最多我們可以設(shè)置1分鐘的延時(shí),即60000return(events^SERIALAPP_MEM_TIME_EVT);}if(events&SERIALAPP_MEM_TEMP_HUMI_EVT){if(PktNum>1&&PktNum<=17)//溫濕度數(shù)據(jù)的組數(shù)小于17時(shí),依次每10秒存一組溫濕度數(shù)據(jù){//SerialApp_ProcessHym8563();SerialApp_ProcessSht11();SerialApp_MemoryTemp_Humi();PktNum++;//存一組溫濕度,其組數(shù)加1osal_start_timerEx(SerialApp_TaskID,SERIALAPP_MEM_TEMP_HUMI_EVT,10000);//每10秒存儲(chǔ)一組,同上最長(zhǎng)延時(shí)為65536毫秒,為方便,可最多設(shè)置為一分鐘}if(PktNum==18)//當(dāng)存滿17組溫濕度數(shù)據(jù)時(shí),NV條目自動(dòng)加1,溫濕度數(shù)據(jù)組數(shù)重新歸1,并再次注冊(cè)存儲(chǔ)時(shí)間任務(wù){(diào)PktNum=1;CCLD_NV=CCLD_NV+1;offset=5;osal_start_timerEx(SerialApp_TaskID,SERIALAPP_MEM_TIME_EVT,100);}return(events^SERIALAPP_MEM_TEMP_HUMI_EVT);}voidSerialApp_ProcessMSGCmd(afIncomingMSGPacket_t*pkt){uint8buffer[20];uint8Temp_Humi_Read[70];//存放讀取的溫濕度數(shù)據(jù)uint8Time_Read[5];//存放讀取的時(shí)間數(shù)據(jù)uint8Data_Package[80];//存放要發(fā)給協(xié)調(diào)器的數(shù)據(jù)包uint8delay;uint8i,ReturnValue1,ReturnValue2;switch(pkt->clusterId){//Amessagewithaserialdatablocktobetransmittedontheserialport.caseSERIALAPP_CLUSTERID1://Storetheaddressforsendingandretrying.osal_memcpy(&SerialApp_RxAddr,&(pkt->srcAddr),sizeof(afAddrType_t));if(pkt->cmd.Data[3]==0x00)//讀溫濕度指令{CCLD_NV=0x0400+pkt->cmd.Data[4];//將選擇讀取的數(shù)據(jù)包與NV條目對(duì)應(yīng)起來ReturnValue1=osal_nv_read(CCLD_NV,0,5,Time_Read);//讀時(shí)間數(shù)據(jù)ReturnValue2=osal_nv_read(CCLD_NV,5,68,Temp_Humi_Read);//讀17組溫濕度數(shù)據(jù)if(ReturnValue1==ZSUCCESS&&ReturnValue2==ZSUCCESS&&osal_nv_item_len(CCLD_NV))//讀取成功,返回相應(yīng)數(shù)據(jù){Data_Package[0]=pkt->cmd.Data[0];//前綴Data_Package[1]=pkt->cmd.Data[1];//讀寫器IDData_Package[2]=pkt->cmd.Data[2];//TagIDData_Package[3]=pkt->cmd.Data[3];//功能位,讀溫濕度Data_Package[4]=0xFF;//狀態(tài)位Data_Package[5]=Time_Read[0];//時(shí)間Data_Package[6]=Time_Read[1];Data_Package[7]=Time_Read[2];Data_Package[8]=Time_Read[3];Data_Package[9]=Time_Read[4];for(i=10;i<78;i++)//將17組溫濕度的有效數(shù)據(jù)提取出來{Data_Package[i]=Temp_Humi_Read[i-10];//溫濕度if(Data_Package[i]==0xFF)break;//NV條目初始化后全為FF,故當(dāng)讀到的溫濕度數(shù)據(jù)為FF時(shí),說明實(shí)際溫濕度已經(jīng)讀完,該處沒有存溫濕度}SerialApp_TxAddr.addrMode=(afAddrMode_t)Addr16Bit;//單播發(fā)送SerialApp_TxAddr.addr.shortAddr=0x0000;//協(xié)調(diào)器地址SerialApp_TxAddr.endPoint=SERIALAPP_ENDPOINT;//發(fā)送端口AF_DataRequest(&SerialApp_TxAddr,(endPointDesc_t*)&SerialApp_epDesc,SERIALAPP_CLUSTERID1,i,Data_Package,&SerialApp_MsgID,0,AF_DEFAULT_RADIUS);}else//讀取失敗,那么返回下面數(shù)據(jù){Data_Package[0]=pkt->cmd.Data[0];//前綴Data_Package[1]=pkt->cmd.Data[1];//讀寫器IDData_Package[2]=pkt->cmd.Data[2];//TagIDData_Package[3]=pkt->cmd.Data[3];//功能位,讀溫濕度Data_Package[4]=0xFE;//狀態(tài)位SerialApp_TxAddr.addrMode=(afAddrMode_t)Addr16Bit;SerialApp_TxAddr.addr.shortAddr=0x0000;SerialApp_TxAddr.endPoint=SERIALAPP_ENDPOINT;AF_DataRequest(&SerialApp_TxAddr,(endPointDesc_t*)&SerialApp_epDesc,SERIALAPP_CLUSTERID1,5,Data_Package,&SerialApp_MsgID,0,AF_DEFAULT_RADIUS);}}if(pkt->cmd.Data[3]==0x01)//設(shè)定冷鏈標(biāo)簽時(shí)間,通常設(shè)定為當(dāng)前時(shí)間{externuint8seconds,minute,hour,date,week,month,years;minute=pkt->cmd.Data[8];//設(shè)定時(shí)間,將協(xié)調(diào)器發(fā)送過來的年月時(shí)分秒分別對(duì)應(yīng)賦給年月時(shí)分秒hour=pkt->cmd.Data[7];date=pkt->cmd.Data[6];month=pkt->cmd.Data[5];years=pkt->cmd.Data[4];HYM8653_Init();//時(shí)鐘芯片初始化HYM8563_Write_time();//將設(shè)定的時(shí)間寫入時(shí)鐘buffer[0]=pkt->cmd.Data[0];//前綴buffer[1]=pkt->cmd.Data[1];//讀寫器IDbuffer[2]=pkt->cmd.Data[2];//TagIDbuffer[3]=pkt->cmd.Data[3];//功能位,設(shè)定時(shí)間if(date!=0x00)//通過日期來判定時(shí)間是否設(shè)定成功,日期等于0,設(shè)定失敗,否那么成功{buffer[4]=0xFF;}else{buffer[4]=0xFE;}SerialApp_TxAddr.addrMode=(afAddrMode_t)Addr16Bit;SerialApp_TxAddr.addr.shortAddr=0x0000;SerialApp_TxAddr.endPoint=SERIALAPP_ENDPOINT;AF_DataRequest(&SerialApp_TxAddr,(endPointDesc_t*)&SerialApp_epDesc,SERIALAPP_CLUSTERID1,5,buffer,&SerialApp_MsgID,0,AF_DEFAULT_RADIUS);}if(pkt->cmd.Data[3]==0x02)//讀取冷鏈標(biāo)簽時(shí)間數(shù)據(jù)〔不一定是當(dāng)前時(shí)間〕{uint8Tx_Len;//要發(fā)送的數(shù)據(jù)長(zhǎng)度〔字節(jié)數(shù)〕buffer[0]=pkt->cmd.Data[0];//前綴buffer[1]=pkt->cmd.Data[1];//讀寫器IDbuffer[2]=pkt->cmd.Data[2];//TagIDbuffer[3]=pkt->cmd.Data[3];//功能位,讀取時(shí)間buffer[5]=TimeBuf[0];//時(shí)間數(shù)據(jù)buffer[6]=TimeBuf[1];buffer[7]=TimeBuf[2];buffer[8]=TimeBuf[3];buffer[9]=TimeBuf[4];if(buffer[7]!=0x00)//通過日期來判斷是否讀到時(shí)間,因?yàn)槿掌谑遣豢赡転?的{buffer[4]=0xFF;Tx_Len=10;}else{buffer[4]=0xFE;Tx_Len=5;}SerialApp_TxAddr.addrMode=(afAddrMode_t)Addr16Bit;SerialApp_TxAddr.addr.shortAddr=0x0000;SerialApp_TxAddr.endPoint=SERIALAPP_ENDPOINT;AF_DataRequest(&SerialApp_TxAddr,(endPointDesc_t*)&SerialApp_epDesc,SERIALAPP_CLUSTERID1,Tx_Len,buffer,&SerialApp_MsgID,0,AF_DEFAULT_RADIUS);}if(pkt->cmd.Data[3]==0x03)//復(fù)雜指令{//osal_stop_timerEx(SerialApp_TaskID,SERIALAPP_MEM_TIME_EVT);//收到此指令時(shí),停止存儲(chǔ)數(shù)據(jù)//osal_stop_timerEx(SerialApp_TaskID,SERIALAPP_MEM_TEMP_HUMI_EVT);uint8DataBuf[80];uint8T_H[80];uint8i=0;osal_nv_read(CCLD_NV,0,73,DataBuf);//讀取最后一個(gè)數(shù)據(jù)包的數(shù)據(jù)for(i=0;i<73;i++){T_H[i]=DataBuf[i];if(T_H[i]==0xFF)break;//獲取最后一個(gè)數(shù)據(jù)包的有效數(shù)據(jù)}buffer[0]=pkt->cmd.Data[0];buffer[1]=pkt->cmd.Data[1];buffer[2]=pkt->cmd.Data[2];buffer[3]=pkt->cmd.Data[3];buffer[4]=0xFF;buffer[5]=SerialApp_GetVoltage();//電壓buffer[6]=Total_Pkt_Num;//總的數(shù)據(jù)包數(shù)buffer[7]=(i-5)/4;//最后一個(gè)數(shù)據(jù)包的溫濕度數(shù)據(jù)組數(shù)buffer[8]=pkt->rssi;//RSSI值SerialApp_TxAddr.addrMode=(afAddrMode_t)Addr16Bit;SerialApp_TxAddr.addr.shortAddr=0x0000;SerialApp_TxAddr.endPoint=SERIALAPP_ENDPOINT;AF_DataRequest(&SerialApp_TxAddr,(endPointDesc_t*)&SerialApp_epDesc,SERIALAPP_CLUSTERID1,9,buffer,&SerialApp_MsgID,0,AF_DEFAULT_RADIUS);}break;2.2協(xié)調(diào)器節(jié)點(diǎn)局部代碼voidSerialApp_ProcessMSGCmd(afIncomingMSGPacket_t*pkt){uint8BUF[100];uint8Frame_Buf[100];uint8i;uint8delay;switch(pkt->clusterId){//Amessagewithaserialdatablocktobetransmittedontheserialport.caseSERIALAPP_CLUSTERID1://Storetheaddressforsendingandretrying.osal_memcpy(&SerialApp_RxAddr,&(pkt->srcAddr),sizeof(afAddrType_t));osal_memcpy(BUF,pkt->cmd.Data,pkt->cmd.DataLength);if(BUF[3]==0x00)//讀溫濕度{if(BUF[4]==0xFF)//讀取成功{Frame_Buf[0]=pkt->cmd.DataLength+2;//總的數(shù)據(jù)長(zhǎng)度Frame_Buf[1]=SerialApp_RxAddr.addr.shortAddr>>8;//冷鏈標(biāo)簽的地址高8位Frame_Buf[2]=SerialApp_RxAddr.addr.shortAddr;//冷鏈標(biāo)簽的地址低8位Frame_Buf[3]=BUF[2];//TagIDFrame_Buf[4]=BUF[3];//功能位Frame_Buf[5]=BUF[4];//狀態(tài)位Frame_Buf[6]=SerialApp_TxBuf[4];//數(shù)據(jù)包的序號(hào)for(i=7;i<pkt->cmd.DataLength+2;i++)//溫濕度數(shù)據(jù){Frame_Buf[i]=BUF[i-2];}HalUARTWrite(SERIAL_APP_PORT,Frame_Buf,pkt->cmd.DataLength+2);}if(BUF[4]==0xFE){Frame_Buf[0]=pkt->cmd.DataLength+1;Frame_Buf[1]=SerialApp_RxAddr.addr.shortAddr>>8;Frame_Buf[2]=SerialApp_RxAddr.addr.shortAddr;Frame_Buf[3]=BUF[2];Frame_Buf[4]=BUF[3];Frame_Buf[5]=BUF[4];HalUARTWrite(SERIAL_APP_PORT,Frame_Buf,pkt->cmd.DataLength+1);}}if(BUF[3]==0x01)//設(shè)置冷鏈標(biāo)簽時(shí)間{Frame_Buf[0]=pkt->cmd.DataLength+1;Frame_Buf[1]=SerialApp_RxAddr.addr.shortAddr>>8;Frame_Buf[2]=SerialApp_RxAddr.addr.shortAddr;for(i=3;i<pkt->cmd.DataLength+1;i++){Frame_Buf[i]=BUF[i-1];}HalUARTWrite(SERIAL_APP_PORT,Frame_Buf,pkt->cmd.DataLength+1);}if(BUF[3]==0x02)//讀冷鏈標(biāo)簽的時(shí)間〔不一定是當(dāng)前時(shí)間〕{Frame_Buf[0]=pkt->cmd.DataLength+1;//總的數(shù)據(jù)長(zhǎng)度Frame_Buf[1]=SerialApp_RxAddr.addr.shortAddr>>8;Frame_Buf[2]=SerialApp_RxAddr.addr.shortAddr;for(i=3;i<pkt->cmd.DataLength+1;i++){Frame_Buf[i]=BUF[i-1];}HalUARTWrite(SERIAL_APP_PORT,Frame_Buf,pkt->cmd.DataLength+1);}if(BUF[3]==0x03)//復(fù)雜指令{Frame_Buf[0]=pkt->cmd.DataLength+1;Frame_Buf[1]=SerialApp_RxAddr.addr.shortAddr>>8;Frame_Buf[2]=SerialApp_RxAddr.addr.shortAddr;for(i=3;i<pkt->cmd.DataLength+1;i++){Frame_Buf[i]=BUF[i-1];}HalUARTWrite(SERIAL_APP_PORT,Frame_Buf,pkt->cmd.DataLength+1);}if(BUF[3]==0x04)//檢查協(xié)調(diào)器的工作狀態(tài){Frame_Buf[0]=pkt->cmd.DataLength+2;Frame_Buf[1]=SerialApp_RxAddr.addr.shortAddr>>8;Frame_Buf[2]=SerialApp_RxAddr.addr.shortAddr;Frame_Buf[3]=SerialApp_TxBuf[2];Frame_Buf[4]=SerialApp_TxBuf[3];Frame_Buf[5]=0xFF;HalUARTWrite(SERIAL_APP_PORT,Frame_Buf,pkt->cmd.DataLength+2);}if(BUF[3]==0x05)//設(shè)置發(fā)送功率{//uint8T[3];uint8Return_Value;void*Tx_Value;uint8TransmissionPower;TransmissionPower=SerialApp_TxBuf[4];Tx_Value=&TransmissionPower;Return_Value=MAC_MlmeSetReq(MAC_PHY_TRANSMIT_POWER_SIGNED,Tx_Value);//T[0]=macPhyTxPower;//HalUARTWrite(SERIAL_APP_PORT,T,1);Frame_Buf[0]=pkt->cmd.DataLength+2;Frame_Buf[1]=SerialApp_RxAddr.addr.s

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(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ì)自己和他人造成任何形式的傷害或損失。

最新文檔

評(píng)論

0/150

提交評(píng)論