基于MongoDB的物联网开放平台数据存储设计

2016-07-06 01:44陈文艺闫洒洒宋亚红
西安邮电大学学报 2016年2期

陈文艺, 闫洒洒, 宋亚红

(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的值,读出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