Massive Environmental Monitoring Data Storage and Sharing Platform
李 琦 王光明 朱 林
(內(nèi)蒙古科技大學(xué)信息工程學(xué)院,內(nèi)蒙古 包頭 014010)
?
海量環(huán)境監(jiān)測數(shù)據(jù)存儲與共享平臺
Massive Environmental Monitoring Data Storage and Sharing Platform
李琦王光明朱林
(內(nèi)蒙古科技大學(xué)信息工程學(xué)院,內(nèi)蒙古 包頭014010)
摘要:以濕地保護(hù)、呼倫湖流域生態(tài)環(huán)境綜合信息采集及共享云計(jì)算平臺建設(shè)項(xiàng)目為研究背景,針對環(huán)境監(jiān)測數(shù)據(jù)大流量、大并發(fā)量的問題,采用基于物聯(lián)網(wǎng)協(xié)議建立網(wǎng)絡(luò)傳輸架構(gòu),提出采用Linux+Nginx+MongoDB+PHP環(huán)境集成方法構(gòu)建數(shù)據(jù)共享平臺。詳細(xì)闡述了數(shù)據(jù)中心服務(wù)器環(huán)境部署;重點(diǎn)分析和研究了Go語言創(chuàng)建beego框架的RESTful API,為第三方應(yīng)用程序提供接口服務(wù),實(shí)現(xiàn)了數(shù)據(jù)庫的安全訪問。數(shù)據(jù)共享平臺應(yīng)用消息隊(duì)列遙測轉(zhuǎn)傳輸(MQTT)協(xié)議,實(shí)現(xiàn)了環(huán)境數(shù)據(jù)的訂閱和推送。
關(guān)鍵詞:環(huán)境監(jiān)測物聯(lián)網(wǎng)通信協(xié)議云計(jì)算監(jiān)測數(shù)據(jù)采集儲存共享安全網(wǎng)絡(luò)拓?fù)浞?wù)器
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引言
呼倫湖(又稱達(dá)萊湖),是我國第四大淡水湖,其水系橫跨中、蒙、俄三國,特殊的地理位置決定了它在區(qū)域生態(tài)環(huán)境保護(hù)和經(jīng)濟(jì)發(fā)展中不可替代的重要地位。在區(qū)域氣候暖干化、流域經(jīng)濟(jì)快速發(fā)展以及污染治理相對滯后的背景下,呼倫湖濕地系統(tǒng)遭到嚴(yán)重的干擾和破壞[1]。如何對呼倫湖資源與生態(tài)環(huán)境做出有效的、科學(xué)的監(jiān)測和評估,已成為亟待解決的研究課題之一。建立呼倫湖流域生態(tài)環(huán)境綜合信息采集及共享云計(jì)算平臺,實(shí)現(xiàn)信息互通,是實(shí)現(xiàn)呼倫湖流域生態(tài)環(huán)境保護(hù)及修復(fù)的當(dāng)務(wù)之急。生態(tài)環(huán)境監(jiān)測數(shù)據(jù)不僅對日常生活、環(huán)境變化研究等具有重要的科學(xué)價(jià)值,還將為政府決策等提供有力的依據(jù)和數(shù)據(jù)支撐。
物聯(lián)網(wǎng)技術(shù)的發(fā)展為環(huán)境監(jiān)測提供了生態(tài)環(huán)境數(shù)據(jù)感知、傳輸?shù)募夹g(shù)手段,但對環(huán)境數(shù)據(jù)的采集與利用,分屬于不同部門的各高校、科研機(jī)構(gòu)各自為政,資源沒有有效整合,重復(fù)建設(shè),信息化建設(shè)水平參差不齊,缺乏對生態(tài)環(huán)境研究的長遠(yuǎn)考量。現(xiàn)有的傳感數(shù)據(jù)缺乏規(guī)范和標(biāo)準(zhǔn),不同廠家產(chǎn)品互通性差,實(shí)時(shí)性差,缺乏面向應(yīng)用層的業(yè)務(wù)功能(如環(huán)境數(shù)據(jù)訂閱服務(wù)、推送服務(wù))。針對以上問題,本文以濕地保護(hù)、呼倫湖流域生態(tài)環(huán)境綜合信息采集及共享云計(jì)算平臺建設(shè)項(xiàng)目為研究背景,提出了解決方案。
1數(shù)據(jù)共享平臺網(wǎng)絡(luò)拓?fù)浣Y(jié)構(gòu)
呼倫湖流域生態(tài)環(huán)境綜合信息采集及共享云計(jì)算平臺建設(shè)項(xiàng)目以濕地保護(hù)為目標(biāo),實(shí)現(xiàn)水(水質(zhì)、水量)、土、氣(氣象)、生(生物)、冰層厚度、大風(fēng)(預(yù)警)等海量環(huán)境數(shù)據(jù)的傳輸、存儲、查詢、推送服務(wù)。圖1為數(shù)據(jù)采集、存儲與共享平臺整體架構(gòu)。
環(huán)境監(jiān)測系統(tǒng)包括下位機(jī)和上位機(jī)兩部分,第一部分是下位機(jī),主要負(fù)責(zé)數(shù)據(jù)采集。如圖1左半圖所示,將采集環(huán)境數(shù)據(jù)的傳感器接入各節(jié)點(diǎn),根據(jù)各種傳感器內(nèi)部集成的數(shù)據(jù)通信模式(如單總線、I2C、SPI等總線方式),傳感器與單片機(jī)相連,構(gòu)成傳感器節(jié)點(diǎn)采集環(huán)境數(shù)據(jù)(作為從站,用STM32系列單片機(jī)完成)。通過ZigBee組網(wǎng)連接到具有Rt-thread操作系統(tǒng)的匯聚節(jié)點(diǎn)(作為主站)。最后,通過物聯(lián)網(wǎng)受限制的應(yīng)用協(xié)議(contrained application protocol,CoAP)統(tǒng)一數(shù)據(jù)格式,向上位機(jī)發(fā)送數(shù)據(jù)。第二部分是上位機(jī),即數(shù)據(jù)中心,也是本設(shè)計(jì)的重點(diǎn)。如圖1右半圖所示,數(shù)據(jù)中心通過服務(wù)器端的CoAP協(xié)議接收、解析數(shù)據(jù)。數(shù)據(jù)存儲用非關(guān)系數(shù)據(jù)庫。beego API為第三方應(yīng)用程序提供接口服務(wù),實(shí)現(xiàn)數(shù)據(jù)庫的安全訪問。用PHP開發(fā)呼倫湖環(huán)境監(jiān)測系統(tǒng)網(wǎng)站,實(shí)現(xiàn)數(shù)據(jù)的Web呈現(xiàn)。在此基礎(chǔ)上用消息隊(duì)列遙測傳輸 (message queuing telemetry transport,MQTT)協(xié)議實(shí)現(xiàn)雙向推送,對災(zāi)害性天氣及時(shí)預(yù)警,方便使用者在任何地點(diǎn)對數(shù)據(jù)進(jìn)行訪問。下面將對設(shè)計(jì)方案所涉及的技術(shù)進(jìn)行一一介紹。
圖1 系統(tǒng)整體設(shè)計(jì)方案
2數(shù)據(jù)共享平臺設(shè)計(jì)
2.1服務(wù)器環(huán)境部署
對于實(shí)現(xiàn)海量環(huán)境數(shù)據(jù)存儲與共享平臺這樣一個(gè)大流量、大并發(fā)量的網(wǎng)站系統(tǒng)架構(gòu),除了硬件上使用高性能的服務(wù)器、負(fù)載均衡、內(nèi)容分發(fā)網(wǎng)絡(luò)(content delivery network,CDN )等之外,在軟件架構(gòu)上需要重點(diǎn)考慮使用高性能的操作系統(tǒng)(OS)、高性能的網(wǎng)頁服務(wù)器(Web Server)、高性能的數(shù)據(jù)庫(Database)、高效率的編程語言等。海量環(huán)境監(jiān)測數(shù)據(jù)存儲與共享平臺的搭建解決方案如圖2所示。
服務(wù)器基本性能要求安全、長期穩(wěn)定不間斷持續(xù)運(yùn)行,毋庸置疑Linux操作系統(tǒng)是首選。Nginx作為開源、輕量級、高性能的Web服務(wù)器軟件,有簡單的負(fù)載均衡和容錯(cuò)功能,支持熱部署,即在不間斷服務(wù)條件下能對軟件版本或配置進(jìn)行更新升級。它與Linux配合,可以不間斷持續(xù)穩(wěn)定運(yùn)行數(shù)月,內(nèi)存消耗低,在處理靜態(tài)文件上有突出的優(yōu)勢?;谝陨蟽?yōu)點(diǎn),Linux在本設(shè)計(jì)中做高并發(fā)的HTTP服務(wù)器。
圖2 數(shù)據(jù)存儲與共享平臺搭建方案
海量環(huán)境數(shù)據(jù)存儲要求數(shù)據(jù)庫有較高的讀寫、并發(fā)能力,對數(shù)據(jù)庫的性能要求很高。通常所用的關(guān)系型數(shù)據(jù)庫MySQL由于其內(nèi)部機(jī)制所限,以表結(jié)構(gòu)形式存儲受限于字段與記錄,要求每個(gè)字段與記錄都要一一對應(yīng),限制了個(gè)體的多樣性,在處理高并發(fā)問題上顯得很吃力。NoSQL數(shù)據(jù)庫架構(gòu)偏向于面向?qū)ο?,具有分布式、水平可擴(kuò)展的特點(diǎn)。NoSQL數(shù)據(jù)庫以Key-value形式存儲數(shù)據(jù),可以靈活地對架構(gòu)進(jìn)行擴(kuò)展[2],提高讀寫速度,有效解決了海量環(huán)境數(shù)據(jù)存儲與訪問效率的問題。甄選了三個(gè)代表性的非關(guān)系型數(shù)據(jù)庫和關(guān)系型數(shù)據(jù)庫,在裝有Linux系統(tǒng)的虛擬機(jī)中進(jìn)行了數(shù)據(jù)存儲測試,測試結(jié)果如表1所示。由表1可以看出,比較數(shù)據(jù)存儲時(shí)間,非關(guān)系型數(shù)據(jù)庫比關(guān)系型數(shù)據(jù)庫的性能好。
表1 數(shù)據(jù)庫存儲數(shù)據(jù)時(shí)間對比表
Redis適用于數(shù)據(jù)量較小的高性能操作和運(yùn)算,如替代memcached實(shí)現(xiàn)緩存。MongoDB存儲使用高效的BSON[3](JSON的二進(jìn)制存儲格式)作為內(nèi)部存儲的格式和語法。MongoDB的操作使用JSON風(fēng)格語法,客戶端提交或接收的數(shù)據(jù)使用JSON形式來展現(xiàn)。相對于SQL來說,MongoDB非關(guān)系型數(shù)據(jù)庫更加直觀,容易理解和掌握。MongoDB支持豐富的數(shù)據(jù)表達(dá)、索引,支持的查詢語言也非常豐富,是最像關(guān)系型數(shù)據(jù)庫的非關(guān)系型數(shù)據(jù)庫。MongDB與關(guān)系型數(shù)據(jù)庫數(shù)據(jù)存儲格式對比如表2所示。
表2 數(shù)據(jù)庫數(shù)據(jù)存儲格式對比表
MongoDB是一個(gè)高性能、易部署、面向集合存儲、開源、模式自由的文檔型數(shù)據(jù)庫。模式自由體現(xiàn)在集合里沒有行和列的概念,存儲的是鍵值對,可以實(shí)現(xiàn)不同傳感器、不同參數(shù)、不同數(shù)據(jù)在同一集合里的存儲。MongoDB存儲形式如下:
{ "highestTEMP ": 18,"lowestTEMP ":13 }
{ "weather": "sunny" }
{ "PH": 5}
菊芋除塊莖兼有食用價(jià)值和藥用價(jià)值之外,樹葉的藥理活性和應(yīng)用也不容小覷。在傳統(tǒng)的民間醫(yī)學(xué)上,菊芋的綠葉被用來治療骨折、皮外傷、腫脹和疼痛[33-34]。菊芋的地上部分中發(fā)現(xiàn)了許多可以藥用且有生物活性的化合物,并被證明具有抗真菌活性、抗氧化活性、抗癌活性和其他方面的藥用作用[35-37]。
MongoDB支持動態(tài)查詢、完全索引、復(fù)制與故障恢復(fù),具有自動處理碎片等特性,能夠滿足海量環(huán)境數(shù)據(jù)的高讀寫、高并發(fā)的要求。因此,綜合考量后選擇MongoDB做服務(wù)器的數(shù)據(jù)庫。Web服務(wù)后臺用PHP開發(fā),快捷簡單,平臺兼容性好。服務(wù)器部署:Linux+Nginx+MongoDB+PHP搭建完成。根據(jù)功能要求,編程語言選擇并發(fā)編程簡單并具有自動垃圾回收機(jī)制的Go語言[4]。
2.2CoAP協(xié)議
因特網(wǎng)工程任務(wù)組(IETF)的約束RESTful環(huán)境工作組(CoRE) 定義基于REST的Web傳輸協(xié)議稱為受約束的應(yīng)用協(xié)議(CoAP)[5]。CoAP的目的是為了統(tǒng)一數(shù)據(jù)格式,讓小設(shè)備可以接入互聯(lián)網(wǎng),擴(kuò)展REST體系結(jié)構(gòu),以滿足受約束物聯(lián)網(wǎng)裝置和網(wǎng)絡(luò)(如6LoWPAN[6])的需要。CoAP常用的應(yīng)用版本是封裝在嵌入式操作系統(tǒng)Contiki中,而目前還沒有在RT-Thread操作系統(tǒng)上實(shí)現(xiàn)的版本,所以需要將CoAP協(xié)議移植到RT-Thread平臺上。CoAP客戶端實(shí)現(xiàn)架構(gòu)如圖3所示。
圖3 CoAP客戶端實(shí)現(xiàn)架構(gòu)
CoAP協(xié)議由一組具有HTTP功能的REST子集組成,運(yùn)輸層基于UDP,支持多播,降低了網(wǎng)絡(luò)開銷。CoAP請求/響應(yīng)層與事務(wù)層的雙層處理方式支持異步消息交換[7]。CoAP基本報(bào)頭為4個(gè)字節(jié),基本報(bào)頭后跟擴(kuò)展選項(xiàng)。一個(gè)典型的請求報(bào)頭為10~20個(gè)字節(jié)。
用Go語言實(shí)現(xiàn)CoAP協(xié)議無論從代碼量還是編程邏輯上都較C語言簡單。Go語言版本的CoAP協(xié)議提供了ListenAndServe函數(shù),這個(gè)函數(shù)既能實(shí)現(xiàn)UDP 5683端口監(jiān)聽,又能完成讀取端口的請求數(shù)據(jù)。適用于物聯(lián)網(wǎng)的CoAP協(xié)議,解決了傳感器節(jié)點(diǎn)環(huán)境受限問題。CoAP協(xié)議消息類型有4種,表3是一組請求要求被確認(rèn)的C/S消息結(jié)構(gòu),客戶端將攜帶 “PH 5”的數(shù)據(jù)包發(fā)送給服務(wù)器端,服務(wù)器接收到數(shù)據(jù)包后回復(fù)“ok”確認(rèn)收到消息。
表3 C/S消息結(jié)構(gòu)
2.3beego API
圖4 Beego執(zhí)行邏輯
首先,程序的執(zhí)行從main開始,監(jiān)聽8080端口,根據(jù)請求路由到控制器,控制器根據(jù)請求動詞,執(zhí)行對應(yīng)的請求方法,接收用戶的請求,并決定應(yīng)該調(diào)用哪個(gè)模型來進(jìn)行處理。然后,模型用業(yè)務(wù)邏輯來處理用戶的請求并返回?cái)?shù)據(jù);最后控制器用相應(yīng)的視圖格式化模型返回?cái)?shù)據(jù),并通過表示層呈現(xiàn)給用戶?;赽eego創(chuàng)建的RESTful API,簡單、安全的訪問機(jī)制可為科研機(jī)構(gòu)提供海量數(shù)據(jù)接口,還可將數(shù)據(jù)繪制成歷史曲線,形象直觀地展現(xiàn)給公眾用戶,用以指導(dǎo)生產(chǎn)、生活。
基于beego創(chuàng)建對海量環(huán)境數(shù)據(jù)訪問的API。首先,beego API要與數(shù)據(jù)庫進(jìn)行連接,代碼如下,bee api DB -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)建了一個(gè)基于beego的API。
beego API測試需要安裝curl。curl是一個(gè)利用URL語法、在命令行方式下工作的開源文件傳輸工具,在命令行下模擬瀏覽器POST一條數(shù)據(jù)后,beego API會返回一個(gè)唯一的ID值。查詢此條數(shù)據(jù)時(shí),GET這個(gè)唯一的ID值即可獲取存儲的數(shù)據(jù),命令行中測試結(jié)果如下。
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":"土壤"
}
為保證數(shù)據(jù)庫的安全訪問,可加入用戶認(rèn)證。首先在main文件import中加入一個(gè)插件“github.com/astaxie/beego/plu- gins/auth”,然后在func main中加入“beego.Insort Filter(“*” ,beego.Before Router,auth.Basic(“username”,“ password” ))”,當(dāng)訪問數(shù)據(jù)庫時(shí)就會出現(xiàn)對話框,提示填寫用戶名和密碼,實(shí)現(xiàn)驗(yàn)證登錄。
2.4MQTT協(xié)議
MQTT是一個(gè)輕量級的消息發(fā)布/訂閱協(xié)議。針對目前環(huán)境數(shù)據(jù)共享技術(shù)(短信、GPRS等)實(shí)時(shí)性差、缺乏面向應(yīng)用層的業(yè)務(wù)功能,本文采用消息推送協(xié)議MQTT,用以實(shí)現(xiàn)環(huán)境數(shù)據(jù)的訂閱、推送服務(wù)。選擇MQTT協(xié)議的另一個(gè)原因是,它是一個(gè)專為遠(yuǎn)程傳感器和控制設(shè)備通信而設(shè)計(jì)的開源協(xié)議,可以實(shí)現(xiàn)傳感器節(jié)點(diǎn)的遠(yuǎn)程參數(shù)配置。本文采用Jeff Allen用Go語言編寫的MQTT協(xié)議。這個(gè)Go語言的MQTT協(xié)議導(dǎo)入了github/ huin/ mqtt包,用以減少內(nèi)核調(diào)用,從而減少TCP數(shù)據(jù)包。一個(gè)連接發(fā)起到斷開需要19個(gè)數(shù)據(jù)包, Go語言的MQTT協(xié)議減少編寫系統(tǒng)調(diào)用,14個(gè)數(shù)據(jù)包即可實(shí)現(xiàn)[10]??梢姡瑴p少內(nèi)核調(diào)用不僅能縮短內(nèi)核與用戶的切換時(shí)間,而且能節(jié)省帶寬。
海量環(huán)境監(jiān)測數(shù)據(jù)共享平臺應(yīng)用MQTT協(xié)議將采集的環(huán)境數(shù)據(jù),通過預(yù)警分析及時(shí)有效地推送給訂閱者。尤其針對由外蒙古刮入我國境內(nèi)的災(zāi)害性的大風(fēng),及時(shí)預(yù)警可以大大減少當(dāng)?shù)厝嗣竦呢?cái)產(chǎn)損失。
3結(jié)束語
本文針對環(huán)境監(jiān)測數(shù)據(jù)采集與應(yīng)用現(xiàn)狀,就研究目的相對單一和片面(從各自學(xué)科角度)、重復(fù)建設(shè)、缺乏整體考量等不足,提出了整合方案,解決了高并發(fā)的海量環(huán)境數(shù)據(jù)傳輸受限的問題。海量環(huán)境監(jiān)測數(shù)據(jù)存儲與共享平臺可完成環(huán)境數(shù)據(jù)訂閱服務(wù)、推送服務(wù)。通過以上技術(shù)實(shí)現(xiàn)對冰層厚度的測量,為冬天作業(yè)提供安全指導(dǎo);對水質(zhì)進(jìn)行監(jiān)測分析,為漁業(yè)生產(chǎn)提供指導(dǎo);提供站點(diǎn)氣象,監(jiān)測草原生態(tài),對提高環(huán)境監(jiān)測水平有重要意義。
參考文獻(xiàn)
[1] 吳亞男.呼倫湖生態(tài)系統(tǒng)健康評價(jià)及穩(wěn)定閾值遙感分析[D].北京:中國水利水電科學(xué)研究院,2013.
[2] 潘凡.從MySQL到MongoDB——視覺中國的NoSQL之路[J].程序員,2010(6):79-81.
[3] 張堯,甘泉,劉建川.基于MongoDB的地理信息共享數(shù)據(jù)存儲模型研究[J].測繪,2014(4):147-150.
[4] Google拋棄C語言,采用Go語言重寫Go編譯器[J].電腦編程技巧與維護(hù),2014(3):4.
[5] 湯春明,張熒,吳宇平.無線物聯(lián)網(wǎng)中CoAP協(xié)議的研究與實(shí)現(xiàn)[J].現(xiàn)代電子技術(shù),2013(1):40-44.
[6] 曹振,鄧輝,段曉東.物聯(lián)網(wǎng)感知層的IPv6協(xié)議標(biāo)準(zhǔn)化動[J].電信網(wǎng)技術(shù),2010(7):17-22.
[7] 常英亮.基于嵌入式Linux的物聯(lián)網(wǎng)網(wǎng)關(guān)研究與實(shí)現(xiàn)[D].北京:北京交通大學(xué),2014.
[8] Astaxie.beego開發(fā)文檔[EB/OL].[2013-11-20][2014-05-12].http://beego.me/docs/intro/.
[9] 余洪春.構(gòu)建高可用Linux服務(wù)器[M].2版.北京:機(jī)械工業(yè)出版社,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
文獻(xiàn)標(biāo)志碼:A
DOI:10.16086/j.cnki.issn1000-0380.201602015
包頭市科技計(jì)劃基金資助項(xiàng)目(編號:2014N1010-2)。
修改稿收到日期:2015-03-30。
第一作者李琦(1973-),男,2002年畢業(yè)于同濟(jì)大學(xué)系統(tǒng)工程專業(yè),獲碩士學(xué)位,副教授;主要從事復(fù)雜過程控制以及流程工業(yè)綜合自動化技術(shù)的研究。