陳文藝, 閆灑灑, 宋亞紅
(1.西安郵電大學 物聯網與兩化融合研究院, 陜西 西安 710061;2.西安郵電大學 通信與信息工程學院, 陜西 西安 710121)
基于MongoDB的物聯網開放平臺數據存儲設計
陳文藝1, 閆灑灑2, 宋亞紅2
(1.西安郵電大學 物聯網與兩化融合研究院, 陜西 西安 710061;2.西安郵電大學 通信與信息工程學院, 陜西 西安 710121)
摘要:針對物聯網開放平臺,設計一個基于MongoDB的實時數據存儲方案。選用Node.js作為運行平臺,在MongoDB中采用分頁存儲的形式對設備采集的最新數據實現實時存儲;建立設備數據在數據庫中的文檔存儲模型,利用單點寫入的方式把數據文檔存放到環形先入先出隊列中;分別采用單點和多點兩種模式進行數據讀取。將分頁與不分頁兩種存儲方案進行查詢效率對比測試,結果顯示,所設計的方案可提高查詢速度,其查詢時間明顯低于不分頁的存儲方案。
關鍵詞:MongoDB;實時數據;分頁存儲;先入先出隊列
物聯網應用已涉及視頻監控、醫療行業、智能交通、智能家居等多個領域[1]。由于各行業根據自己的應用需求,獨自搭建了自己的系統平臺,每個系統之間的數據沒有辦法形成共享,并且對于每一種具體的應用而言,都需要開發與該應用相對應的管理平臺,因此造成了網絡建設的重復投資和成本增加等問題[2]。Facebook[3]通過開放應用程序的編程接口,將平臺上的數據資源開放提供給第三方的開發者,使他們可以利用已有的框架來開發與原有平臺上的核心功能相集成的應用程序。開放性平臺在Facebook的成功運用,使其成為各個領域的研究熱點。
對物聯網開放平臺來說,處理大量的傳感器、各種攝像頭等設備產生的海量數據是一個很大的挑戰,所以解決好平臺中的設備數據存儲和數據管理的問題是至關重要的。將MongoDB數據庫[4]引入到物聯網中,把數據直接按文檔存儲,當集合中數據量很小的時候,查詢速度很快,但是隨著集合中存儲文檔數目的增加,在數據庫內部要掃描的文檔數也會增多,這樣既浪費了網絡帶寬,也會浪費系統資源和用戶的等待查詢返回的時間[5]。另外,最早存放在集合中的數據很可能已經不需要卻仍然占用系統內存,不及時的處理會造成數據冗余,定期的手動清除又會加大數據庫管理員的工作量。
針對直接存儲模式的缺點,本文基于MongoDB數據庫,根據物聯網開放平臺總體架構需求,對設備采集的實時數據設計一種分頁存儲方案。
1物聯網開放平臺總體架構
物聯網開放平臺由網關、云平臺和用戶瀏覽器3部分組成[6]。云平臺與網關建立雙向通信連接,將網關的傳感數據傳輸到云平臺,云平臺基于云計算中心的存儲和計算能力,采用面向資源架構以統一資源描述的方式建立網關和傳感器的虛擬實體數據庫,與網關和傳感器的物理實體數據實時同步,并實現對網關和設備資源的注冊、存儲、管理和應用服務,授權用戶通過瀏覽器實現對資源的訪問和操作。由瀏覽器(B)、云平臺(S)和網關(M)構成B/S/M系統[7]的物聯網開放平臺總體架構如圖1所示。

圖1 物聯網開放平臺總體架構
2平臺數據庫數據模型設計
在物聯網開放平臺中,每個網關通過唯一的設備標識區分多個設備[8]。由于每個設備具備的數據能力及操控能力各不相同,規定每個設備只有一個設備數據點輸入,將所有輸入數據存放在MongoDB中。設備數據點是指對設備中的傳感器采集的溫度、濕度、光照、圖像等實時數據的抽象描述[9]。為方便存取和查詢,在MongoDB數據庫中定義了用戶、網關、設備和數據4類集合[10],本文就設備采集的數據進行了存儲方案設計。
2.1設備數據存儲方案設計
以一個設備數據點表示設備采集的一組數據,用m個數據點組成每一頁的數據,將每一頁的數據以一個文檔形式存入數據集合中,共存n頁數據文檔,所有數據頁在數據集合中按照頁碼從小到大的順序構成一個邏輯上的環形先入先出隊列(FirstInputFirstOutput,FIFO),如圖2所示。

圖2 環形FIFO設計
利用環形FIFO存儲設備采集輸入數據時,從p0頁開始存放,當存夠m個數據點后,將從下一頁開始存放,直到pn-1頁存滿,新的數據點將重新存入p0頁,如此循環覆蓋舊的存儲數據,重新存儲設備新采集的輸入數據。環形FIFO可存儲的數據點個數為m×n個,如m=1 000,n=1 000,則可存1 000 000個數據點。查詢設備采集輸入數據時,通過設備主鍵、頁號和數據點即可查詢指定位置的數據。
2.2設備集合結構描述
在MongoDB數據庫中,采用JSON(JavaScriptObjectNotation)格式[11]來建立數據文檔模型。設備集合中的單個文本文檔表達方式如下(以數值型設備文檔為例)。
{
name:'mydevice',//設備名稱,用于查詢
type:'D123',//數值型、位置型、自定義
status:'on',//設備狀態
time:Date,//設備注冊時間
numb:Number,//設備注冊幀序號,用于區別同時建立的設備
description:'dev1',//設備描述,如應用說明
datafifo:{unit:'du',//數據點單位
interval:1000,//數據點上傳間隔,單位為ms;0ms為突發數據點
m: 8,//設定數據頁最大data點數,如256
n: 10,//設定最大存儲數據文檔(頁)數
pj:0,//FIFO數據文檔頁當前寫入下標
di:0,//當前頁data點寫入元素下標
fs:0,//固定為0
time:Date//最新數據點采樣時間,突發數據不設置
},
datatype: [dataType0],//數據點設置原型,只需一個數據點
location:{//設備位置
lon:100,//經度
lat:10,//緯度
address:'cn563'//地址
}
}。
單個數據點文本dataType0表達方式如下。
{
time:newDate(),//最新數據點采樣時間,突發數據必須設置
v:0//數據點v,數值類,最新數據
}。
2.3數據集合結構描述
數據集合中的單個文本文檔表達方式如下(以數值型設備數據文檔為例)。
{
device:Schema.Types.ObjectId,//設備主鍵_id值,用于查詢
pn:Number,//FIFO數據文檔(頁)序號,用于查詢
data:{
v:Number,//數據點值
time:Date//最新數據點采樣時間,突發數據必須設置
}
}。
3數據讀寫過程
3.1數據寫入
采用逐個設備數據點寫入的方式,按需創建數據頁文檔,直到最大頁創建完畢,構成完整FIFO。在環形FIFO中,頁碼依次為p0,p1,p2,…,pn-1,每頁中數據點的位置依次為d0,d1,d2,…,dm-1。用pj和di分別表示將要存儲數據點所在頁碼和在該頁的位置,則環形FIFO中當前存儲的最后一個數據點所在的頁碼為pj,在該頁的位置為di-1。當數據點存儲于MongoDB中時,先判斷di是否小于dm-1,若di 圖3 數據點存儲位置判斷流程 3.2數據讀取 3.2.1單點讀數據 單點讀數據是指一次讀取一個數據。單點讀數據時,只需給出讀數據的起始位置s即可。設l=m×n,則0≤s 3.2.2多點讀數據 多點讀數據就是一次讀取多個數據。MongoDB中讀取數據時采用find方法[12]可以返回符合條件的全部數據。多點讀數據時,以讀數據的起始位置s和讀數據的結束位置e為依據,e為結束位置與環形FIFO中當前存儲的最后一個數據點所在位置之間的距離,且s 4讀寫測試及分析 4.1數據寫入測試 將物聯網開放平臺中設備采集的10個數據點v存入MongoDB數據庫中,v分別取值1,2,3,4,5,6,7,8,9,10,設定環形FIFO的頁數n為3,每頁的設備數據點m為3。依據環形FIFO的設計,數據庫中存儲結果如圖4所示。 圖4 數據庫分頁顯示結果 從圖4可以看出10個數據點分了3頁存儲,頁碼分別為0,1,2,最后一個數據點取代了第一個數據點的位置,所以v的值分別為10,2,3的數據點是第一頁的數據;v的值分別為4,5,6的數據點是第二頁的數據;v的值分別為7,8,9的數據點是第三頁的數據,與預期存儲期望是相同的。 4.2數據讀出測試 4.2.1單點讀出測試 數據點v分別取值1,2,3,4,5,6,7,8,9,10,設定環形FIFO的頁數n為3,每頁的設備數據點m為3。若s為2,則s位置上讀到的數據點v的值為8。多次調用讀函數,把s的值分別設置為0,1,2,3,4,5,6,7,8,存入數據依次讀取結果如圖5所示。 圖5 單點讀取數據 由圖5可以看出,數據讀取的順序和調用讀函數中設定的s值相對應??梢噪S意設置s的值,讀出FIFO中任意位置的數據點文檔。 4.2.2多點讀出測試 將物聯網開放平臺中設備采集的83個數據點存入MongoDB數據庫中,數據點v的值分別為1,2,3...81,82,83,設定環形FIFO的頁數n為10,每頁的設備數據點數m為8,設起始位置s=20,結束位置e=48,每頁存儲的數據如圖6所示。 圖6 FIFO中每頁存儲數據 起始位置數據點所在的頁碼和在該頁的位置分別為7和6,結束位置的數據點所在的頁碼和在該頁中的位置分別為4和2,那么讀到的數據就是35~63這29個數據,分別讀取p7頁中d0到s之間的數據、p5和p6頁的數據和p4頁中從e到dm-1之間的數據,把3次讀取的數據倒序放在一個數組中返回給用戶,讀取結果如圖7所示。 圖7 多點讀取數據 圖7中讀取結果即為根據設定的s和e的值得出的所需要的數據,且是從s依次到e為序在一個數組中輸出的。 5性能測試 為了更明顯地顯示分頁存儲的優點,對分頁存儲和不分頁存儲兩種方案進行測試,運行平臺為Node.js,分頁時每頁為200個數據點,查詢記錄數分別為50個、500個、1 000個、2 000個、3 500個、5 000個、10 000個數據點,每個查詢測10次,取平均值,記錄運行時間,時間對比如表1所示。 表1 查詢時間對比表 由表1可以看出,當記錄數為50個時,兩種存儲方案的運行時間差別很小,因為分頁要進行相關計算,所以查詢時間還要長一點。但是,記錄數為500條以上時,分頁存儲方案的查詢時間明顯低于不分頁的存儲方案。另外,在讀取數據庫時,可能會有新的數據加入或修改,如果一次性提交查詢數據給前端用戶,新加入的數據就無法返回給用戶,而分頁存儲方案可將新數據覆蓋舊數據,及時提交給用戶,有更好的數據實時性。 6結語 設計并實現了基于MongoDB的物聯網開放平臺實時數據存儲方案,該方案中數據庫服務端直接對設備采集輸入的實時數據進行分頁存儲,使得客戶端需要查詢數據時只要傳遞少量參數即可在服務器端獲取其所需的數據,節約了用戶的等待時間。對比測試結果表明,該方案比不分頁存儲方案用時短,能有效地提高數據的查詢速度。 參考文獻 [1]姜超.基于物聯網的智能家居系統的設計與實現[D].長春:吉林大學,2014:10-18. [2]胡朝建.一種物聯網開放平臺認證授權機制的設計與實現[D].廣州:華南理工大學,2014:7-13. [3]陳毓亮.基于接口集成的云開放平臺[D].武漢:華中科技大學,2013:8-20. [4]郭匡宇.基于MongoDB的傳感器數據分布式存儲的研究與應用[D].南京:南京郵電大學,2013:9-15. [5]楊帆,王菲菲,汪蓓.利用SQLServer存儲過程實現數據分頁[J/OL].電腦編程技巧與維護,2011:58[2015-11-02].http://www.docin.com/p-1362555624.html.DOI:10.16184/j.cnki.comprg.2011.06.031. [6]陳敏敏.基于MongoDB云存儲平臺的論壇信息抽取與存儲研究[D].上海:上海交通大學,2012:5-10. [7]董紀國.基于B/S架構的物聯網應用組態平臺研發[D].南京:南京大學,2015:9-21. [8]陳文藝,王知明.基于MATLAB的物聯網網關Web發布系統設計[J/OL].西安郵電學院學報,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]張為,李亮.多傳感器數據采集技術在物聯網的應用研究[J/OL].廣州大學學報:自然科學版,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管理與開發精要[M].北京:機械工業出版社,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的云數據管理技術的研究與應用[D].北京:北京交通大學,2012:12-20. [責任編輯:祝劍] 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-),男,博士,教授,從事數字圖像處理及傳輸研究。E-mail:chenwy@xupt.edu.cn 閆灑灑(1989-),女,碩士研究生,研究方向為物聯網技術及應用。E-mail: 401206525@qq.com 中圖分類號:TP311.133.1 文獻標識碼:A 文章編號:2095-6533(2016)02-0078-05




