模块需求分析
负责采集指定文件中的数据(智能家居环境监测系统产生的数据)
流程
- 从本地文件按行读取数据
- 解析数据
- 构造
Environment
对象集合并返回
每行数据9
个部分的意义
- 发送端id
- 树莓派系统id
- 实验箱区域模块id(1-8)
- 模块上传感器地址
- 传感器个数
- 指令标号(3表示需要接受数据16表示需要发送数据)
- 数据16进制,需要转换成10进制(如果是16前两个字节是 温度数据,中间两个字节是湿度数据。如果不是16前两个字 节就是对应的数据)
- 状态标示(默认为1表示成功)
- 采集时间(单位时秒)
核心功能实现
假设读取到的一行数据为
100|101|2|16|1|3|5d606f7802|1|1516323596029
使用split
函数将字符串分割为9
个部分,然后按照对应的意义取出相关数据,调用Environment
的构造函数创建Environment
对象,并加到集合中。
特殊知识点复习
通过|分割字符串
由于split
函数的参数是一个正则表达式,而|
在正则表达式是关键字,所以想要实现按|
分割字符串,就必须使用转义字符或使用[]
。
//1
String[] arr = line.split("\\|");
//2
String[] arr = line.split("[|]");
字符串截取
5d606f7802
的前四个字符为温度数据,第5
到8
个字符是湿度数据,需要使用substring
函数实现字符串截取 。
//温度
String str1 = data.substring(0, 4);
String str2 = data.substring(4, 8);
注意:substring(int startIndex, int endIndex)
中是左闭右开的
16进制转换为10进制
5d60
为16
进制数据,在本项目中需要将其转换为10
进制,需要用到基本数据包装类的parse**
函数,下面是几个例子
int _10_int = Integer.parseInt("5d60", 16);
long _10_long = Long.parseLong("5d60", 16);
...
13位时间戳字符串转换为Timestamp对象
使用Long
将字符串解析为long
类型数据,然后使用Timestamp
类的构造函数
Timestamp t = new Timestamp(Long.parseLong("1516323596029"));
相关知识点复习
Timestamp、Date、String之间的转换
String
转 Date
String dateStr = "2019-10-29 20:00:00";
DateFormat sdf = new SimpleDateFormat("YYYY-MM-dd HH:mm:ss"); //需要与字符串格式对应
try{
Date date = sdf.parse(dateStr);
System.out.println(date);
}catch(Exception e){
e.printStackTrace();
}
Date
转 String
Date date = new Date();
DateFormat sdf = new SimpleDateFormat("YYYY-MM-dd HH:mm:ss");
String dateStr = sdf.format(date);
System.out.println(dateStr);
String
转 Timestamp
//13位时间戳
Timestamp t1 = new Timestamp(Long.parseLong("1516323596029"));
//标准日期格式 yyyy-mm-dd hh:mm:ss[.f...]
Timestamp t2 = Timestamp.valueOf("2019-10-29 20:00:00");
Timestamp
转 String
Timestamp ts = new Timestamp(System.currentTimeMillis());
String str1 = ts.toSring();
String str2 = new SimpleDateFormat("YYYY-MM-dd HH:mm:ss").format(ts);
System.out.println(str1);
System.out.println(str2);
Date
转 Timestamp
Date date = new Date();
Timestamp ts = new Timestamp(date.getTime());
Timestamp
转 Date
Timestamp ts = new Timestamp(System.currentTimeMillis());
Date date = new Date(ts.getTime());