JAVA实践项目---树莓派信息自动化采集后入库项目(三)

项目源代码可访问我的github:https://github.com/Spacider/Gather-and-store
如果觉得好的话请给个star哦~

开发IDE: IDEA 2018.03 JDK 1.8
开发环境: macOS 10.13.6 (如windows请对项目中部分路径进行改写)
数据库: Oracle 11g


第二阶段:数据的采集和写入日志文件

在这里插入图片描述

在JAVA实践项目—树莓派信息自动化采集后入库项目(二)(https://blog.csdn.net/qq_37163479/article/details/83023261) 中我们从模拟的树莓派服务器上得到了我们需要采集的数据,接下来我们要干的事儿就是把得到的XML继续解析,等到相应的数据把其写入一个文件中!文件内容如下图所示:
在这里插入图片描述


话不多说,开始编写代码:

  1. 在我们的SAXReaderHelper类中编写方法InLogFile:将获取到数据写入到日志文件中。
public static void InLogFile(String str,String SensorAddress,String counter){
}

它由3个参数,分别是我们读取的XML文件(通过流实际上使用的是String来接收),由于SensorAddresscounter参数返回的XML文件中没有这两个参数,所以我们通过传参的方式把这两个参数传入!

这里我们又用到了dom4j技术对其进行解析:

 // 把客户端传过来的 xml 转化为字符串存储
String TotalStr = str.toString();
byte[] TotalBytes = TotalStr.getBytes();
// dom4j 构建对象内填入一个 byte 类型的数组
bais = new ByteArrayInputStream(TotalBytes);
SAXReader reader = new SAXReader();
Document document = null;

通过对象流的方式直接交给dom4j:

try {
   document = reader.read(bais,"utf-8");
}

有了document对象以后我们就可以解析了,接下来我们用一个StringBuilder来对字符串进行拼接,拼接成上图我们讲过的样子。最后加上"\r\n",这样最后写入文件的时候每一条数据会换行。

// 获取根节点
 Element Message = document.getRootElement();
 StringBuilder sb = new StringBuilder();
 // 拼接字符串
 sb.append(Message.element("SrcID").getText()+"|");
 sb.append(Message.element("DstID").getText()+"|");
 sb.append(Message.element("DevID").getText()+"|");
 sb.append(SensorAddress+"|");
 sb.append(counter+"|");
 sb.append(Message.element("Cmd").getText()+"|");
 sb.append(Message.element("Data").getText()+"|");
 sb.append(Message.element("Status").getText()+"|");
 sb.append(new Timestamp(System.currentTimeMillis()));
 sb.append("\r\n");

得到拼接好数据的字符串以后我们要做的就是写入文件了,这里用到了文件输出流,最后记得flush哦!刷一下内容才会进去
注意:请在src下先创建radwtmp文件,这里的"/Users/wjh/Desktop/FirstProject/src/radwtmp"路径为我电脑上路径,请改成你的路径!

File file = new File("/Users/wjh/Desktop/FirstProject/src/radwtmp");
if (!file.exists()){
  	file.createNewFile();
}
fos = new FileOutputStream(file,true);
fos.write(sb.toString().getBytes());
fos.flush();
  1. 封装好方法以后我们就可以调用它了,在ClientReceiveHelperClientGetXml方法最后加入这么一行:
// 根据 XML 文件解析,并将其写入文件中
SAXReaderHelper.InLogFile(sb.toString(), SensorAddress, counter + "");
  1. 编写客户端主程序:
    DataClient(温度湿度客户端),GuangClient(树莓派光照客户端),CarbonDioxideClient(二氧化碳客户端):
    传入SensorAddress为传感器ID,16表示温度湿度传感器,256表示光照传感器,1280表示二氧化碳传感器
 public static void DataGetObj(){
     ClientReceiveHelper.ClientGetXml("16",1);
 }
public static void guangGetObj(){
	ClientReceiveHelper.ClientGetXml("256",1);
}
public static void CarbonDioxideGetObj(){
     ClientReceiveHelper.ClientGetXml("1280",1);
}
  1. 为了方便操作,我们设立一个定时器,编写一个定时器类:
public final class TimerRunClient {

    public static void runClientMain() {
        // 构建定时器
        Timer timer = new Timer(false);

        /**
         * 第一个参数表示定时器执行的函数,第二个参数表示第一次定时器生效的时间,第三个参数表示每隔多长事件调用第一个参数所指向的方法
         * 第二个参数和第三个参数单位是毫秒
         */

        timer.schedule(new TimerTask() {
            @Override
            public void run() {
                // 定时器调用的代码
                DataClient.DataGetObj();
                GuangClient.guangGetObj();
                CarbonDioxideClient.CarbonDioxideGetObj();
            }
        }, 0, 5000);
    }
    public static void main(String[] args) {
        runClientMain();
    }
}
  1. 运行定时器类(TimerRunClient)和树莓派系统数据模拟类(DataServer),看到radwtmp类中数据如下图所示即为成功!
    在这里插入图片描述

本文中为代码详解,可能与源代码不一定相同,可以查看我的github:https://github.com/Spacider/Gather-and-store 查看源代码与你的代码进行比对!如果觉得我写的好的话请给一个star哦!

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章