2013-04-09 42 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