Massive Environmental Monitoring Data Storage and Sharing Platform
李 琦 王光明 朱 林
(內蒙古科技大學信息工程學院,內蒙古 包頭 014010)
?
海量環境監測數據存儲與共享平臺
Massive Environmental Monitoring Data Storage and Sharing Platform
李琦王光明朱林
(內蒙古科技大學信息工程學院,內蒙古 包頭014010)
摘要:以濕地保護、呼倫湖流域生態環境綜合信息采集及共享云計算平臺建設項目為研究背景,針對環境監測數據大流量、大并發量的問題,采用基于物聯網協議建立網絡傳輸架構,提出采用Linux+Nginx+MongoDB+PHP環境集成方法構建數據共享平臺。詳細闡述了數據中心服務器環境部署;重點分析和研究了Go語言創建beego框架的RESTful API,為第三方應用程序提供接口服務,實現了數據庫的安全訪問。數據共享平臺應用消息隊列遙測轉傳輸(MQTT)協議,實現了環境數據的訂閱和推送。
關鍵詞:環境監測物聯網通信協議云計算監測數據采集儲存共享安全網絡拓撲服務器
Abstract:With the wetland protection and the construction project of Hulun lake basin ecological environment integrated information collection and sharing cloud computation platform as the research background,in accordance with the features of large flow and high concurrency for environment monitoring data,the network transmission architecture is established based on Internet of thing protocol,and the data sharing platform is constructed by using Linux+Nginx+MongoDB+PHP environment integrated approach.The environment deployment of data center server is described in detail,the RESTful API with beego framework structured by Go language is analyzed emphatically; this API provides service for the third party applications,to implement secure database access.The message queuing telemetry transport(MQTT) protocol is applied for data sharing platform,to realize subscription and promotion of environment data.
Keywords:Environmental monitoringInternet of thingsCommunication protocolCloud computingMonitoring data
Collection and storageShareSecurityNetwork topologyServer
0引言
呼倫湖(又稱達萊湖),是我國第四大淡水湖,其水系橫跨中、蒙、俄三國,特殊的地理位置決定了它在區域生態環境保護和經濟發展中不可替代的重要地位。在區域氣候暖干化、流域經濟快速發展以及污染治理相對滯后的背景下,呼倫湖濕地系統遭到嚴重的干擾和破壞[1]。如何對呼倫湖資源與生態環境做出有效的、科學的監測和評估,已成為亟待解決的研究課題之一。建立呼倫湖流域生態環境綜合信息采集及共享云計算平臺,實現信息互通,是實現呼倫湖流域生態環境保護及修復的當務之急。生態環境監測數據不僅對日常生活、環境變化研究等具有重要的科學價值,還將為政府決策等提供有力的依據和數據支撐。
物聯網技術的發展為環境監測提供了生態環境數據感知、傳輸的技術手段,但對環境數據的采集與利用,分屬于不同部門的各高校、科研機構各自為政,資源沒有有效整合,重復建設,信息化建設水平參差不齊,缺乏對生態環境研究的長遠考量。現有的傳感數據缺乏規范和標準,不同廠家產品互通性差,實時性差,缺乏面向應用層的業務功能(如環境數據訂閱服務、推送服務)。針對以上問題,本文以濕地保護、呼倫湖流域生態環境綜合信息采集及共享云計算平臺建設項目為研究背景,提出了解決方案。
1數據共享平臺網絡拓撲結構
呼倫湖流域生態環境綜合信息采集及共享云計算平臺建設項目以濕地保護為目標,實現水(水質、水量)、土、氣(氣象)、生(生物)、冰層厚度、大風(預警)等海量環境數據的傳輸、存儲、查詢、推送服務。圖1為數據采集、存儲與共享平臺整體架構。
環境監測系統包括下位機和上位機兩部分,第一部分是下位機,主要負責數據采集。如圖1左半圖所示,將采集環境數據的傳感器接入各節點,根據各種傳感器內部集成的數據通信模式(如單總線、I2C、SPI等總線方式),傳感器與單片機相連,構成傳感器節點采集環境數據(作為從站,用STM32系列單片機完成)。通過ZigBee組網連接到具有Rt-thread操作系統的匯聚節點(作為主站)。最后,通過物聯網受限制的應用協議(contrained application protocol,CoAP)統一數據格式,向上位機發送數據。第二部分是上位機,即數據中心,也是本設計的重點。如圖1右半圖所示,數據中心通過服務器端的CoAP協議接收、解析數據。數據存儲用非關系數據庫。beego API為第三方應用程序提供接口服務,實現數據庫的安全訪問。用PHP開發呼倫湖環境監測系統網站,實現數據的Web呈現。在此基礎上用消息隊列遙測傳輸 (message queuing telemetry transport,MQTT)協議實現雙向推送,對災害性天氣及時預警,方便使用者在任何地點對數據進行訪問。下面將對設計方案所涉及的技術進行一一介紹。

圖1 系統整體設計方案
2數據共享平臺設計
2.1服務器環境部署
對于實現海量環境數據存儲與共享平臺這樣一個大流量、大并發量的網站系統架構,除了硬件上使用高性能的服務器、負載均衡、內容分發網絡(content delivery network,CDN )等之外,在軟件架構上需要重點考慮使用高性能的操作系統(OS)、高性能的網頁服務器(Web Server)、高性能的數據庫(Database)、高效率的編程語言等。海量環境監測數據存儲與共享平臺的搭建解決方案如圖2所示。
服務器基本性能要求安全、長期穩定不間斷持續運行,毋庸置疑Linux操作系統是首選。Nginx作為開源、輕量級、高性能的Web服務器軟件,有簡單的負載均衡和容錯功能,支持熱部署,即在不間斷服務條件下能對軟件版本或配置進行更新升級。它與Linux配合,可以不間斷持續穩定運行數月,內存消耗低,在處理靜態文件上有突出的優勢。基于以上優點,Linux在本設計中做高并發的HTTP服務器。

圖2 數據存儲與共享平臺搭建方案
海量環境數據存儲要求數據庫有較高的讀寫、并發能力,對數據庫的性能要求很高。通常所用的關系型數據庫MySQL由于其內部機制所限,以表結構形式存儲受限于字段與記錄,要求每個字段與記錄都要一一對應,限制了個體的多樣性,在處理高并發問題上顯得很吃力。NoSQL數據庫架構偏向于面向對象,具有分布式、水平可擴展的特點。NoSQL數據庫以Key-value形式存儲數據,可以靈活地對架構進行擴展[2],提高讀寫速度,有效解決了海量環境數據存儲與訪問效率的問題。甄選了三個代表性的非關系型數據庫和關系型數據庫,在裝有Linux系統的虛擬機中進行了數據存儲測試,測試結果如表1所示。由表1可以看出,比較數據存儲時間,非關系型數據庫比關系型數據庫的性能好。

表1 數據庫存儲數據時間對比表
Redis適用于數據量較小的高性能操作和運算,如替代memcached實現緩存。MongoDB存儲使用高效的BSON[3](JSON的二進制存儲格式)作為內部存儲的格式和語法。MongoDB的操作使用JSON風格語法,客戶端提交或接收的數據使用JSON形式來展現。相對于SQL來說,MongoDB非關系型數據庫更加直觀,容易理解和掌握。MongoDB支持豐富的數據表達、索引,支持的查詢語言也非常豐富,是最像關系型數據庫的非關系型數據庫。MongDB與關系型數據庫數據存儲格式對比如表2所示。

表2 數據庫數據存儲格式對比表
MongoDB是一個高性能、易部署、面向集合存儲、開源、模式自由的文檔型數據庫。模式自由體現在集合里沒有行和列的概念,存儲的是鍵值對,可以實現不同傳感器、不同參數、不同數據在同一集合里的存儲。MongoDB存儲形式如下:
{ "highestTEMP ": 18,"lowestTEMP ":13 }
{ "weather": "sunny" }
{ "PH": 5}
菊芋除塊莖兼有食用價值和藥用價值之外,樹葉的藥理活性和應用也不容小覷。在傳統的民間醫學上,菊芋的綠葉被用來治療骨折、皮外傷、腫脹和疼痛[33-34]。菊芋的地上部分中發現了許多可以藥用且有生物活性的化合物,并被證明具有抗真菌活性、抗氧化活性、抗癌活性和其他方面的藥用作用[35-37]。
MongoDB支持動態查詢、完全索引、復制與故障恢復,具有自動處理碎片等特性,能夠滿足海量環境數據的高讀寫、高并發的要求。因此,綜合考量后選擇MongoDB做服務器的數據庫。Web服務后臺用PHP開發,快捷簡單,平臺兼容性好。服務器部署:Linux+Nginx+MongoDB+PHP搭建完成。根據功能要求,編程語言選擇并發編程簡單并具有自動垃圾回收機制的Go語言[4]。
2.2CoAP協議
因特網工程任務組(IETF)的約束RESTful環境工作組(CoRE) 定義基于REST的Web傳輸協議稱為受約束的應用協議(CoAP)[5]。CoAP的目的是為了統一數據格式,讓小設備可以接入互聯網,擴展REST體系結構,以滿足受約束物聯網裝置和網絡(如6LoWPAN[6])的需要。CoAP常用的應用版本是封裝在嵌入式操作系統Contiki中,而目前還沒有在RT-Thread操作系統上實現的版本,所以需要將CoAP協議移植到RT-Thread平臺上。CoAP客戶端實現架構如圖3所示。

圖3 CoAP客戶端實現架構
CoAP協議由一組具有HTTP功能的REST子集組成,運輸層基于UDP,支持多播,降低了網絡開銷。CoAP請求/響應層與事務層的雙層處理方式支持異步消息交換[7]。CoAP基本報頭為4個字節,基本報頭后跟擴展選項。一個典型的請求報頭為10~20個字節。
用Go語言實現CoAP協議無論從代碼量還是編程邏輯上都較C語言簡單。Go語言版本的CoAP協議提供了ListenAndServe函數,這個函數既能實現UDP 5683端口監聽,又能完成讀取端口的請求數據。適用于物聯網的CoAP協議,解決了傳感器節點環境受限問題。CoAP協議消息類型有4種,表3是一組請求要求被確認的C/S消息結構,客戶端將攜帶 “PH 5”的數據包發送給服務器端,服務器接收到數據包后回復“ok”確認收到消息。

表3 C/S消息結構
2.3beego API

圖4 Beego執行邏輯
首先,程序的執行從main開始,監聽8080端口,根據請求路由到控制器,控制器根據請求動詞,執行對應的請求方法,接收用戶的請求,并決定應該調用哪個模型來進行處理。然后,模型用業務邏輯來處理用戶的請求并返回數據;最后控制器用相應的視圖格式化模型返回數據,并通過表示層呈現給用戶。基于beego創建的RESTful API,簡單、安全的訪問機制可為科研機構提供海量數據接口,還可將數據繪制成歷史曲線,形象直觀地展現給公眾用戶,用以指導生產、生活。
基于beego創建對海量環境數據訪問的API。首先,beego API要與數據庫進行連接,代碼如下,bee api DB -conn=root:@tcp(127.0.0.1:33061)/DB,其中DB為自定義的數據庫的名字;然后創建基于swagger的自動化文檔,命令如下,bee run -gendoc=true -downdoc=true;最后執行bee run watch。這就成功創建了一個基于beego的API。
beego API測試需要安裝curl。curl是一個利用URL語法、在命令行方式下工作的開源文件傳輸工具,在命令行下模擬瀏覽器POST一條數據后,beego API會返回一個唯一的ID值。查詢此條數據時,GET這個唯一的ID值即可獲取存儲的數據,命令行中測試結果如下。
wgm@ubuntu:~$ curl -X POST -d '{"PH":5,"addr":"土壤"}'
http://127.0.0.1:8080/object
{
" object Id":"ID1413338440024731267"
} wgm@ubuntu:~$ curl -X GET -d http://127.0.0.1:8080/object
{
"ID1413338440024731267":{
" object Id":"ID1413338440024731267",
"PH":5,
"Addr":"土壤"
}
為保證數據庫的安全訪問,可加入用戶認證。首先在main文件import中加入一個插件“github.com/astaxie/beego/plu- gins/auth”,然后在func main中加入“beego.Insort Filter(“*” ,beego.Before Router,auth.Basic(“username”,“ password” ))”,當訪問數據庫時就會出現對話框,提示填寫用戶名和密碼,實現驗證登錄。
2.4MQTT協議
MQTT是一個輕量級的消息發布/訂閱協議。針對目前環境數據共享技術(短信、GPRS等)實時性差、缺乏面向應用層的業務功能,本文采用消息推送協議MQTT,用以實現環境數據的訂閱、推送服務。選擇MQTT協議的另一個原因是,它是一個專為遠程傳感器和控制設備通信而設計的開源協議,可以實現傳感器節點的遠程參數配置。本文采用Jeff Allen用Go語言編寫的MQTT協議。這個Go語言的MQTT協議導入了github/ huin/ mqtt包,用以減少內核調用,從而減少TCP數據包。一個連接發起到斷開需要19個數據包, Go語言的MQTT協議減少編寫系統調用,14個數據包即可實現[10]。可見,減少內核調用不僅能縮短內核與用戶的切換時間,而且能節省帶寬。
海量環境監測數據共享平臺應用MQTT協議將采集的環境數據,通過預警分析及時有效地推送給訂閱者。尤其針對由外蒙古刮入我國境內的災害性的大風,及時預警可以大大減少當地人民的財產損失。
3結束語
本文針對環境監測數據采集與應用現狀,就研究目的相對單一和片面(從各自學科角度)、重復建設、缺乏整體考量等不足,提出了整合方案,解決了高并發的海量環境數據傳輸受限的問題。海量環境監測數據存儲與共享平臺可完成環境數據訂閱服務、推送服務。通過以上技術實現對冰層厚度的測量,為冬天作業提供安全指導;對水質進行監測分析,為漁業生產提供指導;提供站點氣象,監測草原生態,對提高環境監測水平有重要意義。
參考文獻
[1] 吳亞男.呼倫湖生態系統健康評價及穩定閾值遙感分析[D].北京:中國水利水電科學研究院,2013.
[2] 潘凡.從MySQL到MongoDB——視覺中國的NoSQL之路[J].程序員,2010(6):79-81.
[3] 張堯,甘泉,劉建川.基于MongoDB的地理信息共享數據存儲模型研究[J].測繪,2014(4):147-150.
[4] Google拋棄C語言,采用Go語言重寫Go編譯器[J].電腦編程技巧與維護,2014(3):4.
[5] 湯春明,張熒,吳宇平.無線物聯網中CoAP協議的研究與實現[J].現代電子技術,2013(1):40-44.
[6] 曹振,鄧輝,段曉東.物聯網感知層的IPv6協議標準化動[J].電信網技術,2010(7):17-22.
[7] 常英亮.基于嵌入式Linux的物聯網網關研究與實現[D].北京:北京交通大學,2014.
[8] Astaxie.beego開發文檔[EB/OL].[2013-11-20][2014-05-12].http://beego.me/docs/intro/.
[9] 余洪春.構建高可用Linux服務器[M].2版.北京:機械工業出版社,2012.
[10]Allen J.Reduce write system calls,thus fewer TCP packets [EB/OL].[2013-08-24][2014-09-15].https://github.com/huin/mqtt/commit/.
中圖分類號:TH86;TP393
文獻標志碼:A
DOI:10.16086/j.cnki.issn1000-0380.201602015
包頭市科技計劃基金資助項目(編號:2014N1010-2)。
修改稿收到日期:2015-03-30。
第一作者李琦(1973-),男,2002年畢業于同濟大學系統工程專業,獲碩士學位,副教授;主要從事復雜過程控制以及流程工業綜合自動化技術的研究。