2013-04-09 85 views
0

我目前正在運行一個學生項目,其中使用java接收物理傳感器值。爲了將傳感器值(從一個物理變量轉換爲另一個物理變量)轉換,每個傳感器都有一個特定的輸入數據類型(8位,16位,雙精度等)和一個數據轉換的數學公式。這種配置應該存儲在數據庫中(直接或到腳本的鏈接)在JAVA中爲運行時處理提供數據庫中的數學公式

你會如何建議實現這樣的功能?

轉換示例: 傳感器0發送其值,應用程序應查看數據庫中傳感器0的傳感器值如何轉換。它獲取轉換方程並轉換該值。 。output_val = (input_val^2) * pi/(2*inputval))

先前數學方程式應該以某種方式作爲一個數據庫條目或腳本定義爲各種傳感器被存儲,並應在運行時處理

我的測試系統是一個Debian 86: (例如輸出值與計算出的計算機與Java運行時和一個MySQL服務器。

回答

0

創建具有calculate方法的Calculation抽象類,然後創建每一個傳感器繼承類,例如Input_1 extends Calculation。然後,使用Jackson序列Input_1,例如,並存儲該序列化實例在你的數據庫中。當需要執行計算時,請讀入序列化的實例,對其進行反序列化,然後運行其方法calculate

作爲替代,創建執行所有必要的輸入的計算中的一個類,那麼序列並在必要時反序列化。哪一個對你的數據庫最有意義。

序列化和反序列化類最簡單的方法是使用默認的Java序列化,像這樣。

public abstract class Calculation { 
    public double conversion(double d); 
} 

public class Sensor_34 extends Calculation implements Serializable { 
    public double conversion(double d) { 
     // conversion code 
    } 
} 

ByteArrayOutputStream byteOut = new ByteArrayOutputStream(); 
ObjectOutputStream objectOut = new ObjectOutputStream(byteOut); 
Sensor_34 sensor34 = new Sensor_34(); 
objectOut.writeObject(sensor34); 
objectOut.close(); 
byte[] saveThisValue = byteOut.toByteArray(); // save the byte[] to the database 

// *** 

byte[] input = Database.read(); // read the byte[] back from the database 
ByteArrayInputStream byteIn = new ByteArrayInputStream(input); 
ObjectInputStream objectIn = new ObjectInputSteam(byteIn); 
Calculation calculation = (Calculation)objectIn.readObject(); 
// Now use the calculation object's "conversion" method to perform the conversion 

因此,在總結,序列化對象Sensor_34爲一個字節數組,並將其保存到數據庫,然後讀取字節數組回並將其轉換回成Sensor_34對象。

+0

感謝您的幫助...但我不想爲每個傳感器創建繼承。 – see0jay 2013-04-10 00:38:58

+0

在這種情況下,要麼使用一個包含所有傳感器計算的類,要麼爲每個傳感器創建一個類而不從一個抽象類繼承 – 2013-04-10 00:43:43

+0

感謝您的幫助......但是我不想爲每一個單獨的創建繼承傳感器...所有不同的傳感器都應該存儲在數據庫中,並且每個傳感器都存儲一個轉換功能。例如:數據庫中有100個不同的傳感器(sensor_id從0到99),具有100種不同的轉換功能。想象一下ID 34的傳感器將其採樣值發送給應用程序。此時,應用程序應該在數據庫中查找哪個計算方法應該用於特定傳感器並執行轉換... – see0jay 2013-04-10 00:48:35