DIY“物联网”——自己动手处理传感器数据

摘要:传感器已经在航空、电力等行业得到大量的部署应用,而物联网的构建需要基于传感器的大量部署和应用,日前,本文作者DIY了一个办公室“物联网”,模拟了现实生产中传感器应用,我们不妨学习一下。

【编者按】传感器已经大量部署于实际生产中,涉及航空、电力、医疗、教育各个行业的传感器形成大规模的工业物联网,各式各样的传感器产生了大量的数据,如何去分析这些数据,作者用Raspberry Pi和四个Tinkerforge传感器DIY了一个办公室“物联网”,模拟了现实生产中传感器应用,为我们带来了一些有益的借鉴,下面是作者的精彩分析。

以下为译文:

当前的一个客户项目和一般工业大数据项目的有趣性质(数据产生于传感器)给了我启发,我决定自己动手处理传感器数据,我想通过这个小实验,了解具体如何处理、存储和分析这些数据,以及在这一过程中会遇到哪些挑战?

为了获取传感器数据,我们决定把传感器安装到我们的办公室里,生成我们自己的传感器数据,我们发现Tinkerforge的bricks和bricklets系统非常友好,易于上手,于是我们选择采用Tinkerforge系统。

我们得到了以下四个传感器bricklet:

  • 声音强度传感器(实际上是个小麦克风)
  • 温度传感器
  • 多点触摸bricklet(12个自制的可连接铝箔垫)
  • 运动探测器

四个bricklet都连接到主bricklet上,然后将主bricklet连接到Raspberry Pi。

我们把温度传感器放在办公室的中央,将运动探测器安装在厨房和浴室之间的走廊里,把声音强度传感器放在厨房门边,而触摸传感器则放在咖啡机、冰箱门和厕所的门把上。

虽然这样的设备很难跟实际生产中的情形相比(而且为了获取足够多的数据,你需要等很长时间),在这次小小的实验中,我们还是很快遇到了那些现实传感器应用过程中的一些关键问题。

我们选择了MongoDB作为存储解决方案,主要是因为我们的那个客户项目也使用了MongoDB。

四个传感器产生的数据可以分为两类:温度和声音强度传感器输出连续的数据流,运动探测器和多点触摸传感器往往是由非固定频率的事件触发。

这就形成了MongoDB中两种不同的文档模式。对于第一类(流),我们使用MongoDB推荐的模式,实际上也是这种情况下的最佳实践,即“时间序列模式”(见 http://blog.mongodb.org/post/65517193370/schema-design-for-time-series-data-in-mongodb),由一个内部的嵌套文档集合组成。嵌套的层数和每个级别子文档的数量取决于数据的时间粒度。在我们的实验中,Tinkerforge传感器的最高时间分辨率为100ms,产生了下面的文档结构:

  • 每小时一篇文档
  • 字段:小时时间戳、传感器类型、值
  • 值:嵌套的子文档(subdocument)集,每分钟60个子文档(subdocument),每一秒60个子文档(subdoc),每1/10秒10个子文档(subdoc)


MongoDB中文档是预先分配的,预先对所有的字段进行初始化,保证初始值大于传感器的数据范围,这样做是为了避免由于MongoDB数据库中文档持续增多造成的麻烦。

第二个类型的数据(事件驱动/触发)以类“bucket”文档模式存储。针对每个传感器的类型,需要预先为值分配固定数量的条目(一bucket分配100个)。当事件发生时,将其写入这些文件中,每个事件对应100个条目组的一个子文档,子文档贯穿着事件的始终。当记录/事件第一次被写入到文档中时,全部文件获取与开始日期对应的时间戳。每次写入到数据库时,应用程序都会检查当前记录是否已经写入到当前文档,如果写入已经完成,它会设置文档的结束日期/时间并启动引导到下一文档的写入。


这两个文档模式表示权衡的边界情况,在传感器数据中比较常见。

MongoDB推荐的“时间序列”模式很适合高效写入,而且兼具良好、一致性架构的优势:每个文档都对应着一个时间单位(在我们的实验中,时间单位为一个小时),这使得管理和检索数据非常方便。此外,还可以很容易从当前的时间推断出要写入的“当前”文档,所以应用程序不需要一直对文档进行追踪。

嵌套结构实现了对不同粒度级数据的整合——虽然应用中这些整合不得不手动执行。由于这样一个事实,在该文档模式中,“分钟”、“秒”和“毫秒”不再有单一的键,相反,每一分钟、 每一秒、每一毫秒都有各自的键。

一旦数据变得稀疏、不连续,这个模式就会出现问题。实验中,这些数据显然是由运动探测器和多点触摸传感器产生:由于事件是随机发生的,所以数据也没有固定的频率。对于时间序列文档模式,这就意味着文档的某些字段永远用不到,这显然是对磁盘空间的一种浪费。

如果传感器数据开始时不是通过事件驱动的话,也会产生稀疏数据。换句话说,许多传感器,虽然它们以一个固定的频率测量数据,但是只会自动输出相对于上一次测量改变的值,这个问题已经被解决了,如果你想要坚持时间序列文档模式,就需要经常检查是否有值被传感器省去,以传感器发出的最新值更新数据库。当然,这有可能会在数据库中引入大量的冗余。

Bucket模式中用实际已记录的数据填充文档,避免了这一问题,但它也有自身的缺点:

  • 应用程序需要处理有可能出现的全部数据重建问题(包括尚未保存的冗余数据)
  • “bucket”文件没有一致的开始和结束时间——如果你对特定时间范围感兴趣,你就必须查找该范围内的所有文件
  • “bucket”的管理(跟踪当前的bucket,检查bucket是否为满)需要应用程序解决

Tinkerforge传感器带有多语言版本的API,我们决定使用Python,在连接传感器的Raspberry Pi上运行脚本,数据则写入到MongoSoup托管的MongoDB实例中,MongoSoup是我们的MongoDB即服务解决方案。通过API注册例如声音强度和温度bricklet,你需要执行下列操作: 


Tinkerforge API支持通过回调函数从传感器中自动地读取数据。若要使用此功能,你需要注册你想要通过bricklet触发的功能:


它将以每100ms的速度自动查询传感器的新数据并分别调用stream_handler.cb_intensity_SI和stream_handler.cb_temperature函数。

为了节省网络带宽,只在上一次传感器的测量值发生改变时,你提供的功能才会被触发——也产生了上文讨论的稀疏数据。

可以通过直接自定义代码的方式,以一个固定的频率查询传感器来避免这种现象。但是,就如上文所说的那样,这会导致数据库中充满了冗余数据。此外,它增加了从传感器到应用程序的网络开销。

最后,其中一个将必须决定哪种模式更适合用例。关于数据模式,MongoDB提供了大量元数据模式,你的选择应完全由用例(比如你最有可能遇到的读/写模式)来决定。

一个好方法是在决定一个文档模型之前,问以下几个问题:

  • 从整体的角度考虑(考虑到帐户数据库和应用程序性能),是数据库中的稀疏/冗余代价高?还是之后重建应用程序中的冗余数据代价高?
  • 数据实际上有多大变化?如果周期性的持续测量比较少,那最好留有一定量的冗余。
  • 从一个更大的时间尺度看,有恒定的频率吗?例如,你的数据主要是以几秒钟为周期的分段常数,而这些周期的长度相同,那你可能需要考虑粗粒化时间尺度,丢掉小尺度内的冗余信息。
  • 假如出现另一种情况,常数的长度变化太快,事件随机发生,那你最好还是选择用bucket模式。

在我们的实验中,最初的假设是温度数据和声音强度数据会有很大变化,我们需要将它们存储在“时间序列”数据模式中,而运动探测器和触摸传感器数据适合用bucket模式,实际上我们也是这么做的。

在完成安装并执行处理传感器数据的Python脚本后,我们开始收集数据。

我们使用matplotlib和Flask web服务器框架,搭建起一个小型的web服务,直观显示最近收集的数据以用于检查,并将该web服务部署到Heroku。

我们生成三个plot,第一个随着时间变化分别显示触摸传感器和运动探测器的事件,其他两个显示随着时间的推移声音强度和温度水平,plot中的每个数据点平均一秒钟计算一次。

一眼就能看出办公室中人员活动产生的不同传感器数据之间存在明显相关性。

你可以确定选择使用bucket模型是正确的,因为经常会有在长达20 分钟的时间里,传感器没有记录下任何东西。

看一下温度数据,虽然它会有波动,但很明显这种波动保持在1摄氏度的范围内。如果用例是监测全球白天温度的变化,那很可能需要在时间上采用粗粒度数据写入或者切换到bucket模式。

声音强度数据表现为:长时间的安静(测量值很小)之后大声事件突然、短时间爆发。这样短时间的数据肯定不容许被遗漏,所以上述的粗粒度办法行不通,不过可以考虑切换到bucket模型,仅向数据库中写入变化的数据测量值。

http://www.amazon.cn/mn/detailApp/ref=sr_1_1?_encoding=UTF8&s=books&qid=1274361002&asin=B0011F2QH8&sr=1-1 传感器电子制作DIY(54例) 作者:(美国)Tom Petruzzel 译者:李大寨 基本信息 ·出版社:科学 ·页码:285 页 ·出版日期:2007年04月 ·ISBN:7030186796 ·条形码:9787030186799 ·版本:第1版 ·装帧:平装 ·开本:0开 Pages Per Sheet 产品信息有问题吗?请帮我们更新产品信息。 内容简介 《传感器电子制作DIY》(54例)是“图解电子创新制作”丛书之一。《传感器电子制作DIY》(54例)将介绍运用各种传感器感知和测量光、声、热、气等物理量以及振动、磁场、电场、无线电和辐射等现象的方法。全面系统地介绍了54种传感器实验项目的制作过程及方法,并给出了制作过程中的各种操作技巧。并通过所提供的实验项目带给大家很多有用的信息以及一些创新的理念。《传感器电子制作DIY》(54例)提供了大量的照片、示意图及表格。同时,还附有元器件供应商以及所用到工具的来源。 目录 1 声能  第1课 声能  第2课 传声器(麦克风)的类型  第3课 放大声音——声音放大器  第4 课 电子听诊器  第5课 水下听音器  第6课 次声波 2 光的探测和测量   第7课 光探测仪器  第8课 听光的声音——用光听音器  第9课 测量太阳能常数——用辐射计  第10课 一个基本的辐射计电路  第11课 测量紫外线——利用紫外线辐射计  第12课 测量臭氧层——利用臭氧测量仪  第13课 灵敏的光学转速计  第14课 浑浊度 3 热能探测  第15课 红外火焰探测器  第16课 冰点报警器  第17课 过热报警器  第18课 模拟数据记录系统  第19课  LCD温度计  第20课 夜视仪  第21课 红外移动探测器 4 液体传感器  第22课 雨水探测器  第23课 液体传感器  第24课 湿度监测器  第25课 pH计  第26课 河流水位测量  5 气体检测  第27课 空气压力传感器  第28课 电子嗅探器  第29章 图形条压力传感器  第30章 粒化电阻易燃气体传感器  第31章 电子气压计 6 振动传感器  第32课 振动计时器  第33课 地震报警器  第34课 压电式地震探测器  第35课 研究用的地震仪  第36课 A-S-1说明书 7 检测磁场 第37课 历史回顾 第38课 变压器效应 第39课 发射场和感应场 第40课 磁场 第41课 电场 第42课 磁场探测器 第43课 Barkhausen效应 第 44课 2in直径的感应线圈及其应用 第45课 甚低频(ELF)监视器 第46课 防护 第47课 电子指南针 第48课 突发lonospheric干扰接收器 第49课 地磁磁力计 第50课 螺旋磁心磁通传感器 第51课 磁通传感器 第52课 磁通磁力计 8 感知电场 第53课 静电原理 第54课 制作经典验电器 第55课 制作莱顿瓶 第56课 制作静态管 第57课 简单的电子验电器 第58课 离子探测器 第59课 大气静电监测器 第60课 先进的静电计 第 61课 云层电荷监测器 第62课 电场干扰监测器 无线电项目 第63课 无线电历史 第64课 探测闪电 第65课 ELF/VLF无线电或天然无线电 第66课 短波收音机 第67课 频率校准 第68课 木星射电望远镜 第69课 木星射电望远镜的天线 10 辐射感应 第70课 空间辐射 第71课 地球上的辐射资源 第72课 云室趣事 第73课 廉价的离子室 第74课 廉价的离子室辐射探测器 第75课 改进离子室辐射探测器 第76课 盖革计数器相关实验
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值