[作品提交] 机房环境监控平台

tobot   2020-7-5 07:38 楼主

忽然发现已经最后一天了,卡点提交。

简单介绍一下我的项目:

一、项目背景

   大家都知道,温度过高,印刷电路板的结构强度会变弱,温度过低,绝缘材料会变脆,同样会使结构强度变弱;对记录介质而言,温度过高或过低都会导致数据的丢失或存取故障。湿度对计算机设备的影响也同样明显,当相对湿度较高时,水蒸汽在电子元器件或电介质材料表面形成水膜,容易引起电子元器件之间出现形成通路;当相对湿度过低时,容易产生较高的静电电压。可见温湿度对计算机机房设备有着较大的影响。环境电磁场,同样是影响设备是否能稳定工作的重要指标,在电磁兼容EMC领域中,设备本身产生电磁干扰EMI和电磁干扰防范EMP的研究工作也是重中之重。另外现在都提倡绿色环保,因此设备的功耗也是我们经常需要的研究对象。

   我希望通过sensortile.box来监控机房环境,分别监控温度、湿度、电磁、功率四个指标。Sensortile.box天生具备温度、湿度、磁场(磁场和电磁干扰应该不是一个玩意吧,我就当它是了)监控功能,自带蓝牙传输,内置TF卡可以记录监控离线时的信息,通过简单编程可以实现功率作为外部数据引入,整合后,向服务器传送,再通过CSBS模式将多个传感器的信息呈现给客户,实现集中监控,未来可以扩展报警联动、分级管理、大数据分析等模块。

 

二、作品简介

   如背景介绍所述,这个项目相对较大,包括传感器编程、前端开发、报警联动、数据分析等工作。其中传感器编程部分已基本完成,通过sensortile.box采集周边温度、湿度、电磁场信息,通过蓝牙将数据传到某个服务器,但时间有限,引入外部监控机柜功率功能相关功能尚未开发,目前已完成的部分包括监控温度、湿度、磁场。Web大致界面如下:

001.png    通过图形化展现可用传感器所在位置,红色表示已内置该传感器,但目前蓝牙未搜索到。对于颜色和图片的优化可以以后再说,大家看在底色(#66ccff)是洛天依小姐姐本命色份上,先凑合着看看吧。

   单击可用的传感器,可以看到传感器读取的信息值。

002.png    页面是准静态的,30秒自动刷新一次,即时数据需要下端刷新按钮手工刷新,图片用PIL生成。

        因为是http方式,所以做多媒体呈现是非常容易的,在这里我只做了图片,但如果有需要,插入视频、声音也很方便。

 

三、系统框图

   构想的使用场景:

123.png

 

   因为蓝牙的传输距离非常有限,不太可能覆盖住整个机房,故采用分级管理的方式:下位机(树莓派)读取sensortile.box信息,上传到云服务器,再通过云服务器进行数据整合呈现。

   开发时,因为sensortile.box的数量实在太少(只有一个),因此把云功能裁剪了。目前开发的部分已可以使用,优化空间还有不少,已实现的功能和待继续优化开发的结构框图如下:

124.png

 

   其中TBD部分的主要包括数据库的搭建,APP界面开发等等,难度不大,只是比较耗时间。

 

四、各部分功能说明

   软件功能流程框图:

125.png    Sensortile.box作为传感器的部分,采集相关信息流,通过蓝牙给到系统,系统再通过数据处理,转换成数组形式存储,访问web页面时生成曲线图片,提交给用户。

 

五、作品源码和简介

   引入库文件:

100.png 其中flask是http的框架,apschedule是定时任务,bluetooth是蓝牙库,random产生随机数字(用途后续章节介绍),drawpic和readsensor都是我自己写的,分别用于提供曲线图和读取传感器。

   自定义传感器数据类:

101.png         之所以只使用81个数值,是画图只画81个点就能够很好呈现出变化趋势。

   传感器读取:套用例程,监控温度、湿度、磁场。上位机读取传感器可以参考我之前的帖子

   Web框架方案:

   采用flask方案,其中@app.route('/<sensor>')可以将<sensor>获取sensor的索引号,无需对每个sensor都写一份代码。

 

运行后服务器界面:

004.png

 

六、视频演示(视频简介+链接)

   第一个视频,是我在模拟了有多个传感器(其实是多个蓝牙)的,只有正确读取信息,才会显示结果。曲线只显示81个点,超过81个点后再读入新值的话,会丢弃list的0位数值,保持曲线结果始终最新。考虑到带宽,30秒自动刷新一次网页时才会更新各项数值,如果需要加速更新,可以点击按钮手工强制刷出最新显示值。


 

   第二个视频,是我晚些时候修改了刷新频率,将网页模板中setTimeout('Refresh()',30000);改为了setTimeout('Refresh()',5000);,把页面刷新调整到5秒尝试效果的视频,曲线果然可以连续画出,但页面闪烁得厉害,估计还是python效率导致,考虑用java重写代码可能会好一点。另外我是用生成图片+链接方式读取图片,而不是直接将图片推送到前端,有个写硬盘的过程,也非常影响效率,这点可以再优化。录视频的时候不小心碰到了传感器,所以有个磁场的跳变。。。


 

七、开发心得

   开发中间过程略,共享一下我碰到的几个问题和解决方案吧: 

  1. 牙死掉的问题:这个似乎无法彻底规避,引用pybluez库,用树莓派读取,平均读五~十分钟就会死一次,用pc读取,概率大幅度降低,但也有出现,不知道是库的原因还是代码错误引入,慢慢研究。
  2. 悲催的硬件:最初希望将历史数据存在tf卡上,当读取传感器时,一并读取tf卡获取历史数据,再历史数据来画曲线,但TF卡似乎被我玩坏了,不过计算一下,也正常,按照我平均每5秒写入一次数据,TF卡寿命10万次,也就几天时间……,所以在成品上,画曲线是通过读取实时信息生成的。
  3. Python的低效率:python的效率实在太低,想做成无刷的html5页面,但用flask多次报错,实在没信心继续调,干脆使用server记录多次读取传感器信息再用来画曲线。未来可以尝试用ajax技术做一下部分刷新,也许会好一点。       
  4. 浏览器兼容:因为在web下涉及多个图片叠加用div标签分层,但IE<div>内<img>的时候,总有一个蓝色的框,很丑;用QQ浏览器就好得多,事实上,我还尝试了360浏览器,效果与QQ浏览器基本一致。Firefox、谷歌浏览器未测试,但推测功能可用,图象效果未知。       
  5. http server:前面我已经说了,选择的是python,为什么不选择更高效率的php呢?虽然我搞得定php画图和页面显示,但我实在不会用php读蓝牙,所以只能忍受python的低执行效率了,考虑换成php做前端,python写数据库,或者整体换成java,有时间可以试试。       
  6. 门限值:机房环境监控一般都有门限,超过门限应该有告警方案,我的图中采用红色表示异常,白色为正常值,温度和湿度采用的是通信机房的A标:温度20~24,湿度45%~65,磁场没做门限异常告警,统一用蓝色,功率根本就没做,显示都是NA       
  7. 多传感器:一般机房肯定不止一个传感器,但我手边只有一个。图片GUI呈现的四个其中3个是假的,读不了数据(我考虑稍晚一点可以做个模拟可读数据的功能)。程序里是通过mac地址区分,固化位置。程序启动时,先通过蓝牙搜索,当蓝牙搜索结果无法匹配到对应mac,传感器图标为红色,匹配成功为绿色,点击图标显示读取传感器的结果,同时将图标带上光环。(实际上就是换一个png图片)
  8. 图片刷新:由于缓存的问题,后端生成新图片,在早些时候编写代码时没有注意名称,当前端页面刷新还是以前的旧图,多次刷新才会显示新的结果。找到原因以后,在链接中增加一个随机值,如:rt.sensorTemperaturepic='img/Temperature.png?t='+str(random.random()),使其链接有所区别,每次都能显示出最新图片。     
  9. tf卡写入的频率:我们大家都知道tf卡读取是无损的,但写入次数有限,一般说10万次左右,但作为一个长期监控的工具,10万次实在不多,我在试用到一半的时候,就已经把tf卡写坏了,后续实验都没该tf卡。如果真如我设想,平素数据都记录在本地tf卡,可以考虑每10分钟写入一次,大约用1年做1次硬件替换。
  10. 使用多线程方案,后台需要多次读取各传感器,而python的定时器timer效率实在让人难以忍受,而且似乎会不断浪费资源,估计是我代码中没有释放。因此直接采用apscheduler,也很简单。

  以上是我开发的小小感悟,在此抛一小砖,望大家不吝赐玉。虽已结题,但后续如有新心得,将继续在本站发帖!

     

 

 

本帖最后由 tobot 于 2020-7-5 21:52 编辑

回复评论

暂无评论,赶紧抢沙发吧
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 京公网安备 11010802033920号
    写回复