物联网环境监测项目

物联网环境监测项目

项目背景:
此项目主要用途为批量处理庞大且繁琐的数据,并将其与数据库进行连接

详细步骤说明:
数据从客户端读取后,批量读取内容,将一条数字,字母与符号所组成的数据分割为不同种类的小节,按照不同种类存储到数据库表中。

流程演示:
在这里插入图片描述
模块简介:
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();
}

项目总结
在自动控制技术、数据通讯技术、数据库技术、地理信息技术迅速发展的今天,如何充分利用这些技术,建立起完善而先进的数字化环境监控体系,是各个城市进行环境监控工作建设的一项重要内容,也是目前城市环境监控的一个重要的发展趋势。为了减轻环境监察人员的工作压力、加大环境治理的监管力度、提高工作效率和管理水平,有效地改善本地区环境状况,开发一套运行稳定、通讯可靠、操作简便、功能完备的污染源在线自动监控系统,以实现环境监控的自动化、网络化、现代化,已成为环境监察工作的当务之急。

Guess you like

Origin blog.csdn.net/weixin_44168948/article/details/107250005
Recommended