1. 程式人生 > >JAVA實踐專案---樹莓派資訊自動化採集後入庫專案(三)

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實踐專案—樹莓派資訊自動化採集後入庫專案(二) 中我們從模擬的樹莓派伺服器上得到了我們需要採集的資料,接下來我們要乾的事兒就是把得到的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哦!