物联网实训文件_物联网环境监测系统(大体架构)

本文详细介绍了物联网环境监测系统的架构,包括实验箱的模块组成、数据采集、传输方式以及环境协议。系统涉及客户端和服务器端,分别有配置、日志、采集、备份和网络模块。数据处理涉及温度、湿度、二氧化碳和光照强度的转换,以及异常数据的处理。同时,文章提到了数据库设计,每张表对应一天的数据,用于存储各种环境信息。
摘要由CSDN通过智能技术生成

物联网环境监测系统(大体架构)

1:实验箱介绍

实验箱分上下两个部分.
上半部分有八个模块构成
第一个模块:灯光控制(led灯,呼吸灯等)
第二个模块:环境采集(二氧化碳,温度,湿度,光照强度,紫外钱)
第三个模块:安防控制(烟雾,甲烷,人体红外,火光传感器) 意外防范
第四个模块:环境采集(pm2.5,温湿度)
第五个模块:安防控制(报警灯,报警器,光电开关,窗户开关) 人为防范
第六个模块:车库控制(车库栏杆升降,刷卡,显示读卡信息)
第七个模块:家居控制(窗帘升降,中央空调,风扇控制)
第八个模块:入户门控制(指纹识别,密码输入,读卡,显示读卡信息)
注意:
温度单位: 摄氏度 用符号“°C”表示
湿度单位: RH就是相对湿度,(Relative Humidity)是用露点温度来定义的。
冬季,居室小气候的最佳组合为:温度18—25°C,相对湿度45—65%RH。这时,人
的身体、思维皆处于良好状态,无论工作、休息都可收到较好的效果
光照强度单位: 光照强度是一种物理术语,指单位面积上所接受可见光的光通量。简称照度[1] ,单位勒克斯(Lux或Lx)。用于指示光照的强弱和物体表面积被照明程度的量。
起居间所需之照明照度为150-300Lux;一般书房照度为100Lux,但阅读时所需之照
明照度则为600Lux
二氧化碳单位: ppm浓度(parts per million)是用溶质质量占全部溶液质量的百万分比来表示的浓度,也称百万分比浓度。经常用于浓度非常小的场合下,与之相似的还有ppb(parts per billion)
350~450ppm:同一般室外环境   
350~1000ppm:空气清新,呼吸顺畅   
1000~2000ppm:感觉空气浑浊,并开始觉得昏昏欲睡   
2000~5000ppm:感觉头痛、嗜睡、呆滞、注意力无法集中、心跳加速  
大于5000ppm:可能导致严重缺氧,造成永久性脑损伤、昏迷、甚至死亡
下半部分有三个模块构成
第一个模块:树莓派系统
第二个模块:无程序
第三个模块:节点调试
数据传送原理.
实验箱上的八个节点通过zigbee(一种短距离、低功耗的无线通信技术)将数据发送到树莓
派系统,树莓派再通过无线网(提供ip和port)发送数据.java构建socket获取数据(java
向模块发送数据原理相同).由于实验箱模块都是交互式.必须先发送协议,再做出相应.
环境协议:
协议格式xml,需要对xml进行解析处理.
注意事项:
1.格式必须完全正确,包括标点符号,空格数量,英文<,>符号,手动添加\r\n
String str = “<?xml version=\"1.0\" encoding=\"UTF-8\"?>\r\n” +
“\r\n”+
" 100\r\n" +
" 101\r\n" +
" 2\r\n" +
" 16\r\n" +
" 1\r\n" +
" 3\r\n" +
" 1\r\n"+
“”;
2.发送和接收协议必须使用字符流,字节流会出现问题.系统不报错,传感器不响应
3.对于温度,湿度等环境,需要返回数据.返回的格式是xml类型的字符串.由于一行一行读
取的数据,如果希望使用xml格式处理,需要将字符串拼接起来再使用
DocumentHelper.parseText(string)进行转换.(此时会转换报错,需要处理头文件
DOCTYPE内容,该内容不显示)
<?xml version="1.0" encoding="UTF-8"?>

100
101
2
0
0
3
65b8462002
1

4.定时发送协议,返回数据.使用timer.schedule方法(方法参数介绍在程序中有详细注释)
由于不停的发送协议,实时返回数据.需要逐条处理,遇到跳出循环
while((s=br.readLine())!=null) {
content+=s;
if(s.equals("")) {
break;
}
}
Document document = DocumentHelper.parseText(content);
5.返回的值需要进行封装,生成于类似逐条的原始数据.此时返回的传感器地址和
counter值都为0,需要手动赋值.最后补充一个采集日期字段
.System.currentTimeMillis()

2:环境监测系统介绍

大体分为两个方面:
  1.客户端   负责采集温度,湿度,二氧化碳,光照强度产生的数据信息分为5个模块
    1.1  配置模块
    1.2  日志模块
    1.3  采集模块
    1.4  备份模块
    1.5  网络模块
  2.服务器   接收数据
    1.1  配置模块
    1.2  日志模块
    1.3  入库模块
    1.4  备份模块
    1.5  网络模块
1.6  管理员登录模块
3.图形展示
模块图

Environment类  用来分装采集好的数据

Gather接口    客户端采集模块

负责采集指定文件中的数据(物联网数据中心系统产生的数据)
  需要实现的方法:
  Collection gather();
  采集文件样例:
  100|101|2|16|1|3|5854997802|1|1516361335964
100|101|2|256|1|3|001003|1|1516361342493
100|101|2|256|1|3|001003|1|1516361343403
  …
  …
问题:
    1.了解环境数据值如何转换
1.1 温度:((float)value*0.00268127)-46.85
      1.2 湿度:((float)value*0.00190735)-6
1.3 二氧化碳和光照强度直接16进制转换成10进制
    2.了解每一行数据的意思
      2.1 数据中使用的是|进行分割
      2.2 数据一共分为三种
          包含 16 的数据 表示温度和湿度数据
          包含 256 的数据 表示光照强度数据
          包含1280的数据 表示二氧化碳数据
        数据分为九个部分
          第一部分:发送端id
          第二部分:树莓派系统id
          第三部分:实验箱区域模块id(1-8)
          第四部分:模块上传感器地址
          第五部分:传感器个数
第六部分:指令标号(3表示需要接受数据 16表示需要发送数据)
第七部分:数据16进制,需要转换成10进制(如果是16 前两个字节是
温度数据,中间两个字节是湿度数据。如果不是16 前两个字
节就是对应的数据)
第八部分:状态标示(默认为1表示成功)
第九部分:采集时间(单位时毫秒)
    3.如何读写数据
bufferReader可以逐行读取

怎么尝试让
    4.如何封装数据
    5.采集的数据分俩种特殊情况
      第一种情况数据:
        一行数据即包含温度和又包含湿度
      第二种情况数据:
        数据值有异常
    6.俩种数据情况怎么处理
      上面描述的第一种数据:
        读取一行数据,构建两次Environment对象,分别进行复制.否则会丢失数据
      上面描述的第二种数据:
        读取到错误数据,不允许参与进制转换或者公式转换,否则报错.也可以找到错误数据手动删除(错误数据很少)
7.显示出每种环境类型对应的条数
可以分别定义3个变量,每读取到一条满足条件的数据,该变量就自增.
    8.第二次读取数据的时候,如何从第一次读完数据的下一行开始读(困难部分)
      可以记录一下本次总共读取了多少个字节,下一次可以直接跳过这么多个字节,接着读就可以了
上次已经读过的数据肯定就不读了
用randomAccessFile类来解决
    9.在读取过程中或者处理过程中,如果出现了异常,需要把数据进行备份
    10.注意重要信息的日志记录

Client接口 客户端网络模块

负责把采集好的数据发给服务器
    需要实现的方法:
      void send(Collection c)
问题:
  1.如何得到连接服务器的相关信息
  2.如何得到采集好的数据
  3.如何把数据发送给服务器
  4.如果发送数据失败怎么处理
  5.注意重要信息的日志记录

Server接口 服务器端网络模块
  负责接收客户端传过来的数据
    需要实现的方法:
    Collection revicer();
    void shutdown();
问题:
  1.如何获得服务器启动时候用的相关信息
  2.如何关闭服务器
  3.如何接收客户端传过来的信息
  4.如何处理客户端并发的问题
  5.接收到数据之后下一步怎么做
  6.数据的接收或者处理过程备份的问题
  7.注意重要信息的日志记录

DBStore接口 服务器端入库模块

负责接收到的数据插入到数据库中
    需要实现的方法:
    void saveDB(Collection c)
   问题:
    1.如何获得连接数据库的相关信息
    2.怎么把数据插入到数据库中
    3.插入数据时候的效率问题
    4.什么样的数据对应哪一种表
Logger接口 公共的日志模块
   负责记录系统运行过程的一些重要信息
    需要实现的方法:
      void debug(String msg);
      void info(String msg);
      void warn(String msg);
      void error(String msg);
      void fatal(String msg);
问题:
  1.怎么来实现日记记录
  2.了解日志级别
  3.怎么设置日志的级别
  4.怎么获得日志对象
  5.怎么控制日志的格式
  6.怎么控制日志输出到控制台和指定文件中

BackUP接口 公共的备份模块

负责备份一些没有处理完的数据
  需要实现的方法:
   void store(String filePath, Object obj,boolean append)
   Object load(String filePath, boolean del)
问题:
  1.如何获得备份文件存放的目录信息
  2.如何把数据备份到文件
  3.如何读取文件中的备份数据
  4.如何实现备份数据时候的追加或者是覆盖
  5.如何控制读取备份数据后文件是否需要删除
Login接口 管理员登录模块
  负责图形化界面的控制,包括管理员的登录注册,环境数据查询,环境数据统计等功能
    需要实现的方法:
    void login()
   问题:
    1.gui的不同界面如何相互跳转
    2.根据日期,环境种类查询的数据如何以图表显示
    3.数据日期如何以年月日,小时分钟秒的形式显示
    4.数据统计功能如何实现
推荐网址学习: http://how2j.cn/k/gui/gui-table/410.html#nowhere

Configuration接口 公共的配置模块

该模块相当于一个工厂
负责
  1.产生各个模块对象
  2.读取各个模块所需的信息,并且把信息注入到每个模块中
    注:这时候需要每个模块都实现接口WossModule
  3.如果某个模块A中需要用到配置模块,那么就需要把自己(因为自己就是配置模块)注入到这个模块A中
    需要实现的方法:
      Logger getLogger();
      BackUP getBackup();
      Gather getGather();
      Client getClient();
      Server getServer();
      DBStore getDBStore();
问题:
  1.怎么获得每个模块的相关信息
  2.如何创建每个模块的对象
  3.怎么把每个模块需要的数据注入到模块中
  4.什么时候可以把自己(配置模块本身)注入到需要的模块中
WossModule接口
    例如:模块A中需要使用一些参数(比如读取xml的路径、连接数据的地址等等),模块A就需要实现WossModule接口,那么这个模块A就有一个方法:
    init(Properties p)
    将来我们就可以调用这个init方法,把数据注入到模块A中

数据库:

1.有31张表
  e_detail_1
  …
  e_detail_31

表中的列:
  (
name varchar2(20),
srcId varchar2(5),
dstId varchar2(5),
devId varchar2(5),
sersorAddress varchar2(7),
count number(2),
cmd varchar2(5),
status number(2),
data number(9,4),
gather_date date
  )
  2.每张表对应一个日子
  3.不同的数据需要插入到不同的表里面
    例如:1号(不关注年和月)产生的数据,就需要把数据插入到第1张表中,15号产生的数据,就需要插入到第15张表里面
  4.建表语句
使用PL/SQL建表
  BEGIN
  FOR i IN 1…31 LOOP
  EXECUTE IMMEDIATE
  ‘CREATE TABLE e_detail_’||TO_CHAR(i)||
  ‘(
  name varchar2(20),
srcId varchar2(5),
dstId varchar2(5),
devId varchar2(5),
sersorAddress varchar2(7),
count number(2),
cmd varchar2(5),
status number(2),
data number(9,4),
gather_date date
  )’;
  END LOOP;
  END;
  /
使用PL/SQL删除表
BEGIN
FOR i IN 1…31 LOOP
EXECUTE IMMEDIATE
‘DROP TABLE e_detail_’||TO_CHAR(i);
END LOOP;
END;
/

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值