李琦 王光明 朱林
(內(nèi)蒙古科技大學信息工程學院,內(nèi)蒙古包頭014010)
摘要:以濕地保護、呼倫湖流域生態(tài)環(huán)境綜合信息采集及共享云計算平臺建設項目為研究背景,針對環(huán)境監(jiān)測數(shù)據(jù)大流量、大并發(fā)量的問題,采用基于物聯(lián)網(wǎng)協(xié)議建立網(wǎng)絡傳輸架構,提出采用Linux+ Nginx+ MongoDB+ PHP環(huán)境集成方法構建數(shù)據(jù)共享平臺。詳細闡述了數(shù)據(jù)中心服務器環(huán)境部署;重點分析和研究了Go語言創(chuàng)建beego框架的RESTful API,為第三方應用程序提供接口服務,實現(xiàn)了數(shù)據(jù)庫的安全訪問。數(shù)據(jù)共享平臺應用消息隊列遙測轉(zhuǎn)傳輸( MQTT)協(xié)議,實現(xiàn)了環(huán)境數(shù)據(jù)的訂閱和推送。
關鍵詞:環(huán)境監(jiān)測物聯(lián)網(wǎng)通信協(xié)議云計算監(jiān)測數(shù)據(jù)采集儲存共享安全網(wǎng)絡拓撲服務器
0 引言
呼倫湖(又稱達萊湖),是我國第四大淡水湖,其水系橫跨中、蒙、俄三國,特殊的地理位置決定了它在區(qū)域生態(tài)環(huán)境保護和經(jīng)濟發(fā)展中不可替代的重要地位。在區(qū)域氣候暖干化、流域經(jīng)濟快速發(fā)展以及污染治理相對滯后的背景下,呼倫湖濕地系統(tǒng)遭到嚴重的干擾和破壞。如何對呼倫湖資源與生態(tài)環(huán)境做出有效的、科學的監(jiān)測和評估,已成為亟待解決的研究課題之一。建立呼倫湖流域生態(tài)環(huán)境綜合信息采集及共享云計算平臺,實現(xiàn)信息互通,是實現(xiàn)呼倫湖流域生態(tài)環(huán)境保護及修復的當務之急。生態(tài)環(huán)境監(jiān)測數(shù)據(jù)不僅對日常生活、環(huán)境變化研究等具有重要的科學價值,還將為政府決策等提供有力的依據(jù)和數(shù)據(jù)支撐。
物聯(lián)網(wǎng)技術的發(fā)展為環(huán)境監(jiān)測提供了生態(tài)環(huán)境數(shù)據(jù)感知、傳輸?shù)募夹g手段,但對環(huán)境數(shù)據(jù)的采集與利用,分屬于不同部門的各高校、科研機構各自為政,資源沒有有效整合,重復建設,信息化建設水平參差不齊,缺乏對生態(tài)環(huán)境研究的長遠考量。現(xiàn)有的傳感數(shù)據(jù)缺乏規(guī)范和標準,不同廠家產(chǎn)品互通性差,實時性差,缺乏面向應用層的業(yè)務功能(如環(huán)境數(shù)據(jù)訂閱服務、推送服務)。針對以上問題,本文以濕地保護、呼倫湖流域生態(tài)環(huán)境綜合信息采集及共享云計算平臺建設項目為研究背景,提出了解決方案。
1數(shù)據(jù)共享平臺網(wǎng)絡拓撲結構
呼倫湖流域生態(tài)環(huán)境綜合信息采集及共享云計算平臺建設項目以濕地保護為目標,實現(xiàn)水(水質(zhì)、水量)、土、氣(氣象)、生(生物)、冰層厚度、大風(預警)等海量環(huán)境數(shù)據(jù)的傳輸、存儲、查詢、推送服務。圖1為數(shù)據(jù)采集、存儲與共享平臺整體架構。
環(huán)境監(jiān)測系統(tǒng)包括下位機和上位機兩部分,第一部分是下位機,主要負責數(shù)據(jù)采集。如圖1左半圖所示.將采集環(huán)境數(shù)據(jù)的傳感器接入各節(jié)點,根據(jù)各種傳感器內(nèi)部集成的數(shù)據(jù)通信模式(如單總線、I2 C、SPI等總線方式),傳感器與單片機相連,構成傳感器節(jié)點采集環(huán)境數(shù)據(jù)(作為從站,用STM32系列單片機完成)。通過ZigBee組網(wǎng)連接到具有Rt - thread操作系統(tǒng)的匯聚節(jié)點(作為主站)。最后,通過物聯(lián)網(wǎng)受限制的應用協(xié)議( contrained application protocol,CoAP)統(tǒng)一數(shù)據(jù)格式,向上位機發(fā)送數(shù)據(jù)。第二部分是上位機,即數(shù)據(jù)中心,也是本設計的重點。如圖1右半圖所示,數(shù)據(jù)中心通過服務器端的CoAP協(xié)議接收、解析數(shù)據(jù)。數(shù)據(jù)存儲用非關系數(shù)據(jù)庫。beego API為第三方應用程序提供接口服務,實現(xiàn)數(shù)據(jù)庫的安全訪問。用PHP開發(fā)呼倫湖環(huán)境監(jiān)測系統(tǒng)網(wǎng)站,實現(xiàn)數(shù)據(jù)的Web呈現(xiàn)。在此基礎上用消息隊列遙測傳輸( messagequeuing telemetry transport,MQTT)協(xié)議實現(xiàn)雙向推送,對災害性天氣及時預警,方便使用者在任何地點對數(shù)據(jù)進行訪問。下面將對設計方案所涉及的技術進行一一介紹。
2數(shù)據(jù)共享平臺設計
2.1服務器環(huán)境部署
對于實現(xiàn)海量環(huán)境數(shù)據(jù)存儲與共享平臺這樣一個大流量、大并發(fā)量的網(wǎng)站系統(tǒng)架構,除了硬件上使用高性能的服務器、負載均衡、內(nèi)容分發(fā)網(wǎng)絡( contentdelivery network,CDN)等之外,在軟件架構上需要重點考慮使用高性能的操作系統(tǒng)( OS)、高性能的網(wǎng)頁服務器( Web Server)、高性能的數(shù)據(jù)庫(Database)、高效率的編程語言等。海量環(huán)境監(jiān)測數(shù)據(jù)存儲與共享平臺的搭建解決方案如圖2所示。
服務器基本性能要求安全、長期穩(wěn)定不間斷持續(xù)運行,毋庸置疑Linux操作系統(tǒng)是首選。Nginx作為開源、輕量級、高性能的Web服務器軟件,有簡單的負載均衡和容錯功能,支持熱部署,即在不間斷服務條件下能對軟件版本或配置進行更新升級。它與Linux配合,可以不間斷持續(xù)穩(wěn)定運行數(shù)月,內(nèi)存消耗低,在處理靜態(tài)文件上有突出的優(yōu)勢;谝陨蟽(yōu)點,Linux在本設計中做高并發(fā)的HTTP服務器。
海量環(huán)境數(shù)據(jù)存儲要求數(shù)據(jù)庫有較高的讀寫、并發(fā)能力,對數(shù)據(jù)庫的性能要求很高。通常所用的關系型數(shù)據(jù)庫MySQL由于其內(nèi)部機制所限,以表結構形式存儲受限于字段與記錄,要求每個字段與記錄都要一一對應,限制了個體的多樣性,在處理高并發(fā)問題上顯得很吃力。NoSQL數(shù)據(jù)庫架構偏向于面向?qū)ο,具有分布式、水平可擴展的特點。NoSQL數(shù)據(jù)庫以Key -value形式存儲數(shù)據(jù),可以靈活地對架構進行擴展,提高讀寫速度,有效解決了海量環(huán)境數(shù)據(jù)存儲與訪問效率的問題。甄選了三個代表性的非關系型數(shù)據(jù)庫和關系型數(shù)據(jù)庫,在裝有Linux系統(tǒng)的虛擬機中進行了數(shù)據(jù)存儲測試,測試結果如表1所示。由表1可以看出,比較數(shù)據(jù)存儲時間,非關系型數(shù)據(jù)庫比關系型數(shù)據(jù)庫的性能好。
Redis適用于數(shù)據(jù)量較小的高性能操作和運算,如替代memcached實現(xiàn)緩存。MongoDB存儲使用高效的BSON(JSON的二進制存儲格式)作為內(nèi)部存儲的格式和語法。MongoDB的操作使用JSON風格語法,客戶端提交或接收的數(shù)據(jù)使用JSON形式來展現(xiàn)。相對于SQL來說,MongoDB非關系型數(shù)據(jù)庫更加直觀,容易理解和掌握。MongoDB支持豐富的數(shù)據(jù)表達、索引,支持的查詢語言也非常豐富,是最像關系型數(shù)據(jù)庫的非關系型數(shù)據(jù)庫。MongDB與關系型數(shù)據(jù)庫數(shù)據(jù)存儲格式對比如表2所示。
MongoDB是一個高性能、易部署、面向集合存儲、開源、模式自由的文檔型數(shù)據(jù)庫。模式自由體現(xiàn)在集合里沒有行和列的概念,存儲的是鍵值對,可以實現(xiàn)不同傳感器、不同參數(shù)、不同數(shù)據(jù)在同一集合里的存儲。MongoDB存儲形式如下:
MongoDB支持動態(tài)查詢、完全索引、復制與故障恢復,具有自動處理碎片等特性,能夠滿足海量環(huán)境數(shù)據(jù)的高讀寫、高并發(fā)的要求。因此,綜合考量后選擇MongoDB做服務器的數(shù)據(jù)庫。Web服務后臺用PHP開發(fā),快捷簡單,平臺兼容性好。服務器部署:Linux+Nginx+ MongoDB+ PHP搭建完成。根據(jù)功能要求,編程語言選擇并發(fā)編程簡單并具有自動垃圾回收機制的Go語言。
2.2 CoAP協(xié)議
因特網(wǎng)工程任務組( IETF)的約束RESTful環(huán)境工作組( CoRE)定義基于REST的Web傳輸協(xié)議稱為受約束的應用協(xié)議(CoAP)。CoAP的目的是為了統(tǒng)一數(shù)據(jù)格式,讓小設備可以接入互聯(lián)網(wǎng),擴展REST體系結構,以滿足受約束物聯(lián)網(wǎng)裝置和網(wǎng)絡(如6LoWPAN)的需要。CoAP常用的應用版本是封裝在嵌入式操作系統(tǒng)Contiki中,而目前還沒有在RT -Thread操作系統(tǒng)上實現(xiàn)的版本,所以需要將CoAP協(xié)議移植到RT - Thread平臺上。CoAP客戶端實現(xiàn)架構如圖3所示。
CoAP協(xié)議由一組具有HTTP功能的REST子集組成,運輸層基于UDP,支持多播,降低了網(wǎng)絡開銷。CoAP請求/響應層與事務層的雙層處理方式支持異步消息交換。CoAP基本報頭為4個字節(jié),基本報頭后跟擴展選項。一個典型的請求報頭為10—20個字節(jié)。
用G0語言實現(xiàn)CoAP協(xié)議無論從代碼量還是編程邏輯上都較C語言簡單。Go語言版本的CoAP協(xié)議提供了ListenAndServe函數(shù),這個函數(shù)既能實現(xiàn)UDP 5683端口監(jiān)聽,又能完成讀取端口的請求數(shù)據(jù)。適用于物聯(lián)網(wǎng)的CoAP協(xié)議,解決了傳感器節(jié)點環(huán)境受限問題。CoAP協(xié)議消息類型有4種,表3是一組請求要求被確認的C/S消息結構,客戶端將攜帶“PH 5”的數(shù)據(jù)包發(fā)送給服務器端,服務器接收到數(shù)據(jù)包后回復“ok”確認收到消息。
2.3 beego API
beego是用Go語言寫的HTTP框架,作者是Astaxie。它的主要設計靈感來源于tornado、sinatra、flask三個框架,其中RESTful方法是借鑒tornado的處理方法,實現(xiàn)數(shù)據(jù)的POST、GET、PUT、DELETE。Astaxie參考sinatra的路由設計方式以及flask的URI規(guī)則,并結合Go語言本身的一些特性( interface、struct嵌入等),設計了beego這樣一個模型一視圖一控制器( model-view-controller,MVC)的框架。beego執(zhí)行邏輯如圖4所示。
首先,程序的執(zhí)行從main開始,監(jiān)聽8080端口,根據(jù)請求路由到控制器,控制器根據(jù)請求動詞,執(zhí)行對應的請求方法,接收用戶的請求,并決定應該調(diào)用哪個模型來進行處理。然后,模型用業(yè)務邏輯來處理用戶的請求并返回數(shù)據(jù);最后控制器用相應的視圖格式化模型返回數(shù)據(jù),并通過表示層呈現(xiàn)給用戶;赽eego創(chuàng)建的RESTful API,簡單、安全的訪問機制可為科研機構提供海量數(shù)據(jù)接口,還可將數(shù)據(jù)繪制成歷史曲線,形象直觀地展現(xiàn)給公眾用戶,用以指導生產(chǎn)、生活。
基于beego創(chuàng)建對海量環(huán)境數(shù)據(jù)訪問的API。首先,beego API要與數(shù)據(jù)庫進行連接,代碼如下,bee apiDB - conn= root:@ tcp\\(127.0.0.1:33061)/DB,其中DB為自定義的數(shù)據(jù)庫的名字;然后創(chuàng)建基于swagger的自動化文檔,命令如下,bee run - gendoc=true - downdoc= true;最后執(zhí)行bee run watch。這就成功創(chuàng)建了一個基于beego的API。
beego API測試需要安裝curl。curl是一個利用URL語法、在命令行方式下工作的開源文件傳輸工具,在命令行下模擬瀏覽器POST -條數(shù)據(jù)后,beegoAPI會返回一個唯一的ID值。查詢此條數(shù)據(jù)時,GET這個唯一的ID值即可獲取存儲的數(shù)據(jù),命令行中測試結果如下。
為保證數(shù)據(jù)庫的安全訪問,可加入用戶認證。首先在mam文件import中加入一個插件“github. com/astaxie/beego/plu - gins/auth”,然后在func main中加入“beego. Insort Filter(“*” , beego. Before Router,auth. Basic(“username”,“password”))”,當訪問數(shù)據(jù)庫時就會出現(xiàn)對話框,提示填寫用戶名和密碼,實現(xiàn)驗證登錄。
2.4 MQTT協(xié)議
MQTT是一個輕量級的消息發(fā)布/訂閱協(xié)議。針對目前環(huán)境數(shù)據(jù)共享技術(短信、GPRS等)實時性差、缺乏面向應用層的業(yè)務功能,本文采用消息推送協(xié)議MQTT,用以實現(xiàn)環(huán)境數(shù)據(jù)的訂閱、推送服務。選擇MQTT協(xié)議的另一個原因是,它是一個專為遠程傳感器和控制設備通信而設計的開源協(xié)議,可以實現(xiàn)傳感器節(jié)點的遠程參數(shù)配置。本文采用Jeff Allen用Go語言編寫的MQTT協(xié)議。這個G0語言的MQTT協(xié)議導入了github/ huin/ mqtt包,用以減少內(nèi)核調(diào)用,從而減少TCP數(shù)據(jù)包。一個連接發(fā)起到斷開需要19個數(shù)據(jù)包,Go語言的MQTT協(xié)議減少編寫系統(tǒng)調(diào)用,14個數(shù)據(jù)包即可實現(xiàn)?梢姡瑴p少內(nèi)核調(diào)用不僅能縮短內(nèi)核與用戶的切換時間,而且能節(jié)省帶寬。
海量環(huán)境監(jiān)測數(shù)據(jù)共享平臺應用MQTT協(xié)議將采集的環(huán)境數(shù)據(jù),通過預警分析及時有效地推送給訂閱者。尤其針對由外蒙古刮人我國境內(nèi)的災害性的大風,及時預警可以大大減少當?shù)厝嗣竦呢敭a(chǎn)損失。
3結束語
本文針對環(huán)境監(jiān)測數(shù)據(jù)采集與應用現(xiàn)狀,就研究目的相對單一和片面(從各自學科角度)、重復建設、缺乏整體考量等不足,提出了整合方案,解決了高并發(fā)的海量環(huán)境數(shù)據(jù)傳輸受限的問題。海量環(huán)境監(jiān)測數(shù)據(jù)存儲與共享平臺可完成環(huán)境數(shù)據(jù)訂閱服務、推送服務。通過以上技術實現(xiàn)對冰層厚度的測量,為冬天作業(yè)提供安全指導;對水質(zhì)進行監(jiān)測分析,為漁業(yè)生產(chǎn)提供指導;提供站點氣象,監(jiān)測草原生態(tài),對提高環(huán)境監(jiān)測水平有重要意義。
上一篇:大面積平面網(wǎng)格尺寸快速檢測方法及系統(tǒng)
下一篇:返回列表