物联网环境监测项目
项目背景:
此项目主要用途为批量处理庞大且繁琐的数据,并将其与数据库进行连接
详细步骤说明:
数据从客户端读取后,批量读取内容,将一条数字,字母与符号所组成的数据分割为不同种类的小节,按照不同种类存储到数据库表中。
流程演示:
模块简介:
1.采集模块(解析模块)
读取和解析原始数据数据文件,将读取到的数据进行分割处理,每一行数据封装成一个对象
并把对象写入集合中
2.网络模块(Server.java、Client.java)
Client:发送数据(采集模块整理好的数据清单)
Server:接收数据
3.入库模块
使用JDBC技术和Oracle数据库进行连接,
把集合中的所有数据全部都插入到数据库表中。
4.备份模块
把一些数据写入到本地文件中。
三个位置需要备份:
1)必须每次解析完记录原始数据文件中已经读取过的字符数量,下一次读取的时候直接跳过这么 多个字符。
2)网络模块发送数据的时候,如果出现了发送失败的情况,需要把未发送的数据备份到本地文件中,以便下一次重新发送。
3)入库模块在插入数据的时候,如果出现了异常情况,需要把还没有来得及插入到数据库的数据进行备份存储。
5.日志模块
实时更新数据动向
6.配置模块
三个作用:
1)提供每个模块正常工作所需要的配置信息
2)创建每个模块的实例化对象
3)向其他模块提供自身的引用
核心代码
采集模块对数据的处理:
public Collection<Environment> gather() throws Exception {
// 声明备份文件的名称
// String backupFileName = "char_number";
// 创建一个集合,用来保存所有封装好的Environment对象
Collection<Environment> coll = new ArrayList<>();
// 准备一个文件流FileReader
// String path = "src/main/java/com/briup/environment/radwtmp2";
FileReader fr = new FileReader(filePath);
// 把FileReader包装成一个BufferedReader
BufferedReader br = new BufferedReader(fr);
// 在开始解析之前,先读取备份文件
// 拿到的obj就是一个数字
// 就是之前记录的要跳过的字符数
long charNumber = 0;
Object obj = backup.load(backupFileName);
if(obj != null) {
br.skip((long)obj);
charNumber = (long)obj;
// 读取完备份之后,把备份删除掉
// 解析文件结束之后,又会写入一个新的数据
backup.deleteBackup(backupFileName);
}
// 用来接收每一次读取一行的结果
String line = null;
// 逐行读取文件中的数据(循环)
while ((line = br.readLine()) != null) {
// 每行结束之后有\r回车符 \n换行符
charNumber += line.length() + 2;
// 已经拿到了一行数据
// 把这一条数据根据"|"分割成9部分内容
// 这9部分内容大致对应一个Environment对象的属性
String[] split = line.split("\\|");
// 把数组中的各部分数据取出来
String srcId = split[0]; // 发送端ID
String dstId = split[1]; // 树莓派ID
String devId = split[2]; // 区域模块ID
String sersorAddress = split[3]; // 传感器地址
int count = Integer.parseInt(split[4]); // 传感器个数
String cmd = split[5]; // 指令标号
int status = Integer.parseInt(split[7]);// 状态位
Timestamp time = new Timestamp(Long.parseLong(split[8])); // 采集时间
String data = split[6]; // 数据值
// 先判断本条数据是温度湿度、二氧化碳、光照强度?
if ("16".equals(sersorAddress)) {
// 如果传感器地址是16,代表数据中包含温度和湿度数据
float temp = (float) (Integer.parseInt(data.substring(0, 4), 16) * 0.00268127 - 46.85);
float hum = (float) (Integer.parseInt(data.substring(4, 8), 16) * 0.00190735 - 6);
// 需要使用两个Environment对象来保存
Environment e1 = new Environment("温度", srcId, dstId, devId, sersorAddress, count, cmd, status, temp,
time);
Environment e2 = new Environment("湿度", srcId, dstId, devId, sersorAddress, count, cmd, status, hum,
time);
// 把封装好的两个对象存入集合
coll.add(e1);
coll.add(e2);
} else {
// 如果传感器地址不是16则说明数据是光照强度或者二氧化碳
float value = Integer.parseInt(data.substring(0, 4), 16);
Environment e = new Environment("256".equals(sersorAddress) ? "光照强度" : "二氧化碳", srcId, dstId, devId,
sersorAddress, count, cmd, status, value, time);
// 把封装好的Environment对象存入到集合中
coll.add(e);
}
} // while结束
log.debug("解析结束,本次解析了"
+ coll.size() + "条数据。");
// 写入备份,记录本次解析结束之后,到目前一共读取过多少字符
backup.backup("char_number", charNumber);
log.debug("备份已更新!");
// 关闭资源
if (br != null) {
br.close();
}
// 把集合返回
return coll;
}
jdbc将文件写入数据库:
@Override
public void saveDb(Collection<Environment> coll) throws Exception {
// 传入一个集合,把集合中的数据插入到数据库中
// 提供连接数据库的四要素
String driver = "oracle.jdbc.driver.OracleDriver";
String url = "jdbc:oracle:thin:@localhost:1521:xe";
String user = "environment";
String password = "environment";
// 注册驱动
Class.forName(driver);
// 获取连接
Connection conn = DriverManager.getConnection(url, user, password);
// 创建执行SQL命令的Statement对象(ST、PST)
Statement st = conn.createStatement();
long t1 = System.currentTimeMillis();
// 编写和执行SQL命令(循环)
for (Environment e: coll) {
// 需要从一个Timestamp对象身上提取出指定格式的年月日时分秒字符串
// SimpleDateFormat 直接把某个Date对象转换成指定内容的字符串
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd hh:mm:ss");
String format = sdf.format(e.getGatherDate());
// insert into e_detail values('温度','100','101'....);
// to_date('2019-12-24 14:31:25','yyyy-mm-dd hh:mi:ss')
String sql = "insert into e_detail values('"
+ e.getName() + "','" + e.getSrcId() + "','"
+ e.getDstId() + "','" + e.getDevId() + "','"
+ e.getSersorAddress() + "'," + e.getCount()
+ ",'" + e.getCmd() + "'," + e.getData() + ","
+ e.getStatus() + ",to_date('" + format
+ "','yyyy-mm-dd hh:mi:ss'))";
System.out.println(sql);
st.execute(sql);
}
long t2 = System.currentTimeMillis();
System.out.println("插入完毕,耗时:" + (t2 - t1) + "毫秒。");
// 关闭资源
if (st != null)
st.close();
if (conn != null)
conn.close();
}
项目总结
在自动控制技术、数据通讯技术、数据库技术、地理信息技术迅速发展的今天,如何充分利用这些技术,建立起完善而先进的数字化环境监控体系,是各个城市进行环境监控工作建设的一项重要内容,也是目前城市环境监控的一个重要的发展趋势。为了减轻环境监察人员的工作压力、加大环境治理的监管力度、提高工作效率和管理水平,有效地改善本地区环境状况,开发一套运行稳定、通讯可靠、操作简便、功能完备的污染源在线自动监控系统,以实现环境监控的自动化、网络化、现代化,已成为环境监察工作的当务之急。