陳文藝, 閆灑灑, 宋亞紅
(1.西安郵電大學(xué) 物聯(lián)網(wǎng)與兩化融合研究院, 陜西 西安 710061;2.西安郵電大學(xué) 通信與信息工程學(xué)院, 陜西 西安 710121)
基于MongoDB的物聯(lián)網(wǎng)開放平臺數(shù)據(jù)存儲設(shè)計
陳文藝1, 閆灑灑2, 宋亞紅2
(1.西安郵電大學(xué) 物聯(lián)網(wǎng)與兩化融合研究院, 陜西 西安 710061;2.西安郵電大學(xué) 通信與信息工程學(xué)院, 陜西 西安 710121)
摘要:針對物聯(lián)網(wǎng)開放平臺,設(shè)計一個基于MongoDB的實時數(shù)據(jù)存儲方案。選用Node.js作為運(yùn)行平臺,在MongoDB中采用分頁存儲的形式對設(shè)備采集的最新數(shù)據(jù)實現(xiàn)實時存儲;建立設(shè)備數(shù)據(jù)在數(shù)據(jù)庫中的文檔存儲模型,利用單點寫入的方式把數(shù)據(jù)文檔存放到環(huán)形先入先出隊列中;分別采用單點和多點兩種模式進(jìn)行數(shù)據(jù)讀取。將分頁與不分頁兩種存儲方案進(jìn)行查詢效率對比測試,結(jié)果顯示,所設(shè)計的方案可提高查詢速度,其查詢時間明顯低于不分頁的存儲方案。
關(guān)鍵詞:MongoDB;實時數(shù)據(jù);分頁存儲;先入先出隊列
物聯(lián)網(wǎng)應(yīng)用已涉及視頻監(jiān)控、醫(yī)療行業(yè)、智能交通、智能家居等多個領(lǐng)域[1]。由于各行業(yè)根據(jù)自己的應(yīng)用需求,獨(dú)自搭建了自己的系統(tǒng)平臺,每個系統(tǒng)之間的數(shù)據(jù)沒有辦法形成共享,并且對于每一種具體的應(yīng)用而言,都需要開發(fā)與該應(yīng)用相對應(yīng)的管理平臺,因此造成了網(wǎng)絡(luò)建設(shè)的重復(fù)投資和成本增加等問題[2]。Facebook[3]通過開放應(yīng)用程序的編程接口,將平臺上的數(shù)據(jù)資源開放提供給第三方的開發(fā)者,使他們可以利用已有的框架來開發(fā)與原有平臺上的核心功能相集成的應(yīng)用程序。開放性平臺在Facebook的成功運(yùn)用,使其成為各個領(lǐng)域的研究熱點。
對物聯(lián)網(wǎng)開放平臺來說,處理大量的傳感器、各種攝像頭等設(shè)備產(chǎn)生的海量數(shù)據(jù)是一個很大的挑戰(zhàn),所以解決好平臺中的設(shè)備數(shù)據(jù)存儲和數(shù)據(jù)管理的問題是至關(guān)重要的。將MongoDB數(shù)據(jù)庫[4]引入到物聯(lián)網(wǎng)中,把數(shù)據(jù)直接按文檔存儲,當(dāng)集合中數(shù)據(jù)量很小的時候,查詢速度很快,但是隨著集合中存儲文檔數(shù)目的增加,在數(shù)據(jù)庫內(nèi)部要掃描的文檔數(shù)也會增多,這樣既浪費(fèi)了網(wǎng)絡(luò)帶寬,也會浪費(fèi)系統(tǒng)資源和用戶的等待查詢返回的時間[5]。另外,最早存放在集合中的數(shù)據(jù)很可能已經(jīng)不需要卻仍然占用系統(tǒng)內(nèi)存,不及時的處理會造成數(shù)據(jù)冗余,定期的手動清除又會加大數(shù)據(jù)庫管理員的工作量。
針對直接存儲模式的缺點,本文基于MongoDB數(shù)據(jù)庫,根據(jù)物聯(lián)網(wǎng)開放平臺總體架構(gòu)需求,對設(shè)備采集的實時數(shù)據(jù)設(shè)計一種分頁存儲方案。
1物聯(lián)網(wǎng)開放平臺總體架構(gòu)
物聯(lián)網(wǎng)開放平臺由網(wǎng)關(guān)、云平臺和用戶瀏覽器3部分組成[6]。云平臺與網(wǎng)關(guān)建立雙向通信連接,將網(wǎng)關(guān)的傳感數(shù)據(jù)傳輸?shù)皆破脚_,云平臺基于云計算中心的存儲和計算能力,采用面向資源架構(gòu)以統(tǒng)一資源描述的方式建立網(wǎng)關(guān)和傳感器的虛擬實體數(shù)據(jù)庫,與網(wǎng)關(guān)和傳感器的物理實體數(shù)據(jù)實時同步,并實現(xiàn)對網(wǎng)關(guān)和設(shè)備資源的注冊、存儲、管理和應(yīng)用服務(wù),授權(quán)用戶通過瀏覽器實現(xiàn)對資源的訪問和操作。由瀏覽器(B)、云平臺(S)和網(wǎng)關(guān)(M)構(gòu)成B/S/M系統(tǒng)[7]的物聯(lián)網(wǎng)開放平臺總體架構(gòu)如圖1所示。
圖1 物聯(lián)網(wǎng)開放平臺總體架構(gòu)
2平臺數(shù)據(jù)庫數(shù)據(jù)模型設(shè)計
在物聯(lián)網(wǎng)開放平臺中,每個網(wǎng)關(guān)通過唯一的設(shè)備標(biāo)識區(qū)分多個設(shè)備[8]。由于每個設(shè)備具備的數(shù)據(jù)能力及操控能力各不相同,規(guī)定每個設(shè)備只有一個設(shè)備數(shù)據(jù)點輸入,將所有輸入數(shù)據(jù)存放在MongoDB中。設(shè)備數(shù)據(jù)點是指對設(shè)備中的傳感器采集的溫度、濕度、光照、圖像等實時數(shù)據(jù)的抽象描述[9]。為方便存取和查詢,在MongoDB數(shù)據(jù)庫中定義了用戶、網(wǎng)關(guān)、設(shè)備和數(shù)據(jù)4類集合[10],本文就設(shè)備采集的數(shù)據(jù)進(jìn)行了存儲方案設(shè)計。
2.1設(shè)備數(shù)據(jù)存儲方案設(shè)計
以一個設(shè)備數(shù)據(jù)點表示設(shè)備采集的一組數(shù)據(jù),用m個數(shù)據(jù)點組成每一頁的數(shù)據(jù),將每一頁的數(shù)據(jù)以一個文檔形式存入數(shù)據(jù)集合中,共存n頁數(shù)據(jù)文檔,所有數(shù)據(jù)頁在數(shù)據(jù)集合中按照頁碼從小到大的順序構(gòu)成一個邏輯上的環(huán)形先入先出隊列(FirstInputFirstOutput,FIFO),如圖2所示。
圖2 環(huán)形FIFO設(shè)計
利用環(huán)形FIFO存儲設(shè)備采集輸入數(shù)據(jù)時,從p0頁開始存放,當(dāng)存夠m個數(shù)據(jù)點后,將從下一頁開始存放,直到pn-1頁存滿,新的數(shù)據(jù)點將重新存入p0頁,如此循環(huán)覆蓋舊的存儲數(shù)據(jù),重新存儲設(shè)備新采集的輸入數(shù)據(jù)。環(huán)形FIFO可存儲的數(shù)據(jù)點個數(shù)為m×n個,如m=1 000,n=1 000,則可存1 000 000個數(shù)據(jù)點。查詢設(shè)備采集輸入數(shù)據(jù)時,通過設(shè)備主鍵、頁號和數(shù)據(jù)點即可查詢指定位置的數(shù)據(jù)。
2.2設(shè)備集合結(jié)構(gòu)描述
在MongoDB數(shù)據(jù)庫中,采用JSON(JavaScriptObjectNotation)格式[11]來建立數(shù)據(jù)文檔模型。設(shè)備集合中的單個文本文檔表達(dá)方式如下(以數(shù)值型設(shè)備文檔為例)。
{
name:'mydevice',//設(shè)備名稱,用于查詢
type:'D123',//數(shù)值型、位置型、自定義
status:'on',//設(shè)備狀態(tài)
time:Date,//設(shè)備注冊時間
numb:Number,//設(shè)備注冊幀序號,用于區(qū)別同時建立的設(shè)備
description:'dev1',//設(shè)備描述,如應(yīng)用說明
datafifo:{unit:'du',//數(shù)據(jù)點單位
interval:1000,//數(shù)據(jù)點上傳間隔,單位為ms;0ms為突發(fā)數(shù)據(jù)點
m: 8,//設(shè)定數(shù)據(jù)頁最大data點數(shù),如256
n: 10,//設(shè)定最大存儲數(shù)據(jù)文檔(頁)數(shù)
pj:0,//FIFO數(shù)據(jù)文檔頁當(dāng)前寫入下標(biāo)
di:0,//當(dāng)前頁data點寫入元素下標(biāo)
fs:0,//固定為0
time:Date//最新數(shù)據(jù)點采樣時間,突發(fā)數(shù)據(jù)不設(shè)置
},
datatype: [dataType0],//數(shù)據(jù)點設(shè)置原型,只需一個數(shù)據(jù)點
location:{//設(shè)備位置
lon:100,//經(jīng)度
lat:10,//緯度
address:'cn563'//地址
}
}。
單個數(shù)據(jù)點文本dataType0表達(dá)方式如下。
{
time:newDate(),//最新數(shù)據(jù)點采樣時間,突發(fā)數(shù)據(jù)必須設(shè)置
v:0//數(shù)據(jù)點v,數(shù)值類,最新數(shù)據(jù)
}。
2.3數(shù)據(jù)集合結(jié)構(gòu)描述
數(shù)據(jù)集合中的單個文本文檔表達(dá)方式如下(以數(shù)值型設(shè)備數(shù)據(jù)文檔為例)。
{
device:Schema.Types.ObjectId,//設(shè)備主鍵_id值,用于查詢
pn:Number,//FIFO數(shù)據(jù)文檔(頁)序號,用于查詢
data:{
v:Number,//數(shù)據(jù)點值
time:Date//最新數(shù)據(jù)點采樣時間,突發(fā)數(shù)據(jù)必須設(shè)置
}
}。
3數(shù)據(jù)讀寫過程
3.1數(shù)據(jù)寫入
采用逐個設(shè)備數(shù)據(jù)點寫入的方式,按需創(chuàng)建數(shù)據(jù)頁文檔,直到最大頁創(chuàng)建完畢,構(gòu)成完整FIFO。在環(huán)形FIFO中,頁碼依次為p0,p1,p2,…,pn-1,每頁中數(shù)據(jù)點的位置依次為d0,d1,d2,…,dm-1。用pj和di分別表示將要存儲數(shù)據(jù)點所在頁碼和在該頁的位置,則環(huán)形FIFO中當(dāng)前存儲的最后一個數(shù)據(jù)點所在的頁碼為pj,在該頁的位置為di-1。當(dāng)數(shù)據(jù)點存儲于MongoDB中時,先判斷di是否小于dm-1,若di 圖3 數(shù)據(jù)點存儲位置判斷流程 3.2數(shù)據(jù)讀取 3.2.1單點讀數(shù)據(jù) 單點讀數(shù)據(jù)是指一次讀取一個數(shù)據(jù)。單點讀數(shù)據(jù)時,只需給出讀數(shù)據(jù)的起始位置s即可。設(shè)l=m×n,則0≤s 3.2.2多點讀數(shù)據(jù) 多點讀數(shù)據(jù)就是一次讀取多個數(shù)據(jù)。MongoDB中讀取數(shù)據(jù)時采用find方法[12]可以返回符合條件的全部數(shù)據(jù)。多點讀數(shù)據(jù)時,以讀數(shù)據(jù)的起始位置s和讀數(shù)據(jù)的結(jié)束位置e為依據(jù),e為結(jié)束位置與環(huán)形FIFO中當(dāng)前存儲的最后一個數(shù)據(jù)點所在位置之間的距離,且s 4讀寫測試及分析 4.1數(shù)據(jù)寫入測試 將物聯(lián)網(wǎng)開放平臺中設(shè)備采集的10個數(shù)據(jù)點v存入MongoDB數(shù)據(jù)庫中,v分別取值1,2,3,4,5,6,7,8,9,10,設(shè)定環(huán)形FIFO的頁數(shù)n為3,每頁的設(shè)備數(shù)據(jù)點m為3。依據(jù)環(huán)形FIFO的設(shè)計,數(shù)據(jù)庫中存儲結(jié)果如圖4所示。 圖4 數(shù)據(jù)庫分頁顯示結(jié)果 從圖4可以看出10個數(shù)據(jù)點分了3頁存儲,頁碼分別為0,1,2,最后一個數(shù)據(jù)點取代了第一個數(shù)據(jù)點的位置,所以v的值分別為10,2,3的數(shù)據(jù)點是第一頁的數(shù)據(jù);v的值分別為4,5,6的數(shù)據(jù)點是第二頁的數(shù)據(jù);v的值分別為7,8,9的數(shù)據(jù)點是第三頁的數(shù)據(jù),與預(yù)期存儲期望是相同的。 4.2數(shù)據(jù)讀出測試 4.2.1單點讀出測試 數(shù)據(jù)點v分別取值1,2,3,4,5,6,7,8,9,10,設(shè)定環(huán)形FIFO的頁數(shù)n為3,每頁的設(shè)備數(shù)據(jù)點m為3。若s為2,則s位置上讀到的數(shù)據(jù)點v的值為8。多次調(diào)用讀函數(shù),把s的值分別設(shè)置為0,1,2,3,4,5,6,7,8,存入數(shù)據(jù)依次讀取結(jié)果如圖5所示。 圖5 單點讀取數(shù)據(jù) 由圖5可以看出,數(shù)據(jù)讀取的順序和調(diào)用讀函數(shù)中設(shè)定的s值相對應(yīng)??梢噪S意設(shè)置s的值,讀出FIFO中任意位置的數(shù)據(jù)點文檔。 4.2.2多點讀出測試 將物聯(lián)網(wǎng)開放平臺中設(shè)備采集的83個數(shù)據(jù)點存入MongoDB數(shù)據(jù)庫中,數(shù)據(jù)點v的值分別為1,2,3...81,82,83,設(shè)定環(huán)形FIFO的頁數(shù)n為10,每頁的設(shè)備數(shù)據(jù)點數(shù)m為8,設(shè)起始位置s=20,結(jié)束位置e=48,每頁存儲的數(shù)據(jù)如圖6所示。 圖6 FIFO中每頁存儲數(shù)據(jù) 起始位置數(shù)據(jù)點所在的頁碼和在該頁的位置分別為7和6,結(jié)束位置的數(shù)據(jù)點所在的頁碼和在該頁中的位置分別為4和2,那么讀到的數(shù)據(jù)就是35~63這29個數(shù)據(jù),分別讀取p7頁中d0到s之間的數(shù)據(jù)、p5和p6頁的數(shù)據(jù)和p4頁中從e到dm-1之間的數(shù)據(jù),把3次讀取的數(shù)據(jù)倒序放在一個數(shù)組中返回給用戶,讀取結(jié)果如圖7所示。 圖7 多點讀取數(shù)據(jù) 圖7中讀取結(jié)果即為根據(jù)設(shè)定的s和e的值得出的所需要的數(shù)據(jù),且是從s依次到e為序在一個數(shù)組中輸出的。 5性能測試 為了更明顯地顯示分頁存儲的優(yōu)點,對分頁存儲和不分頁存儲兩種方案進(jìn)行測試,運(yùn)行平臺為Node.js,分頁時每頁為200個數(shù)據(jù)點,查詢記錄數(shù)分別為50個、500個、1 000個、2 000個、3 500個、5 000個、10 000個數(shù)據(jù)點,每個查詢測10次,取平均值,記錄運(yùn)行時間,時間對比如表1所示。 表1 查詢時間對比表 由表1可以看出,當(dāng)記錄數(shù)為50個時,兩種存儲方案的運(yùn)行時間差別很小,因為分頁要進(jìn)行相關(guān)計算,所以查詢時間還要長一點。但是,記錄數(shù)為500條以上時,分頁存儲方案的查詢時間明顯低于不分頁的存儲方案。另外,在讀取數(shù)據(jù)庫時,可能會有新的數(shù)據(jù)加入或修改,如果一次性提交查詢數(shù)據(jù)給前端用戶,新加入的數(shù)據(jù)就無法返回給用戶,而分頁存儲方案可將新數(shù)據(jù)覆蓋舊數(shù)據(jù),及時提交給用戶,有更好的數(shù)據(jù)實時性。 6結(jié)語 設(shè)計并實現(xiàn)了基于MongoDB的物聯(lián)網(wǎng)開放平臺實時數(shù)據(jù)存儲方案,該方案中數(shù)據(jù)庫服務(wù)端直接對設(shè)備采集輸入的實時數(shù)據(jù)進(jìn)行分頁存儲,使得客戶端需要查詢數(shù)據(jù)時只要傳遞少量參數(shù)即可在服務(wù)器端獲取其所需的數(shù)據(jù),節(jié)約了用戶的等待時間。對比測試結(jié)果表明,該方案比不分頁存儲方案用時短,能有效地提高數(shù)據(jù)的查詢速度。 參考文獻(xiàn) [1]姜超.基于物聯(lián)網(wǎng)的智能家居系統(tǒng)的設(shè)計與實現(xiàn)[D].長春:吉林大學(xué),2014:10-18. [2]胡朝建.一種物聯(lián)網(wǎng)開放平臺認(rèn)證授權(quán)機(jī)制的設(shè)計與實現(xiàn)[D].廣州:華南理工大學(xué),2014:7-13. [3]陳毓亮.基于接口集成的云開放平臺[D].武漢:華中科技大學(xué),2013:8-20. [4]郭匡宇.基于MongoDB的傳感器數(shù)據(jù)分布式存儲的研究與應(yīng)用[D].南京:南京郵電大學(xué),2013:9-15. [5]楊帆,王菲菲,汪蓓.利用SQLServer存儲過程實現(xiàn)數(shù)據(jù)分頁[J/OL].電腦編程技巧與維護(hù),2011:58[2015-11-02].http://www.docin.com/p-1362555624.html.DOI:10.16184/j.cnki.comprg.2011.06.031. [6]陳敏敏.基于MongoDB云存儲平臺的論壇信息抽取與存儲研究[D].上海:上海交通大學(xué),2012:5-10. [7]董紀(jì)國.基于B/S架構(gòu)的物聯(lián)網(wǎng)應(yīng)用組態(tài)平臺研發(fā)[D].南京:南京大學(xué),2015:9-21. [8]陳文藝,王知明.基于MATLAB的物聯(lián)網(wǎng)網(wǎng)關(guān)Web發(fā)布系統(tǒng)設(shè)計[J/OL].西安郵電學(xué)院學(xué)報,2013,18(2):57-58[2015-11-06].http://www.cqvip.com/QK/97111X/201302/45448591.html.DOI:10.3969/j.issn.1007-3264.2013.02.011. [9]張為,李亮.多傳感器數(shù)據(jù)采集技術(shù)在物聯(lián)網(wǎng)的應(yīng)用研究[J/OL].廣州大學(xué)學(xué)報:自然科學(xué)版,2012,11(3):75-80[2015-11-06].http://www.cnki.com.cn/Article/CJFDTotal-GUDZ201203015.htm.DOI:10.3969/j.issn.1671-4229.2012.03.016. [10] 紅丸.MongoDB管理與開發(fā)精要[M].北京:機(jī)械工業(yè)出版社,2011:46. [11] 劉亞,段麗娟,亢曉琛.基于MongoDB的地名信息管理[J/OL].測繪通報,2014(10):117-120[2015-11-02].http://www.cqvip.com/QK/93318X/201410/664288883.html.DOI:10.13474/j.cnki.11-2246.2014.0346. [12] 劉一夢.基于MongoDB的云數(shù)據(jù)管理技術(shù)的研究與應(yīng)用[D].北京:北京交通大學(xué),2012:12-20. [責(zé)任編輯:祝劍] DatastoragedesignoftheInternetofThingsopenplatformbasedonMongoDB CHENWenyi1,YANSasa2,SONGYahong2 (1.InstituteofInternetofThingsandIT-basedIndustrialization,Xi’anUniversityofPostsandTelecommunications,Xi’an710061,China;2.SchoolofCommunicationandInformationEngineering,Xi’anUniversityofPostsandTelecommunications,Xi’an710121,China) Abstract:A MongoDB-based real-time data storage scheme is designed for the Internet of Things open platform. By choosing Node.js as the operation platform, paging storage is used for MongoDB to achieve real time storage of the latest data from equipment acquisition. Documents storage model of device data in a database is set up, and data documents are stored by using the single point writing method to a ring first in first out queue. The data is read out in single point modes or multi-point modes. Test results show that, the designed scheme works with a higher speed, its query time is obviously lower than than by scheme without paging storage. Keywords:MongoDB, real time data, paging storage, first input first output doi:10.13682/j.issn.2095-6533.2016.02.015 收稿日期:2015-12-07 作者簡介:陳文藝(1964-),男,博士,教授,從事數(shù)字圖像處理及傳輸研究。E-mail:chenwy@xupt.edu.cn 閆灑灑(1989-),女,碩士研究生,研究方向為物聯(lián)網(wǎng)技術(shù)及應(yīng)用。E-mail: 401206525@qq.com 中圖分類號:TP311.133.1 文獻(xiàn)標(biāo)識碼:A 文章編號:2095-6533(2016)02-0078-05