【问题标题】:Assosiate mathematic equation in data base for runtime processing with JAVA将数据库中的数学方程与 JAVA 关联以进行运行时处理
【发布时间】:2013-04-09 23:54:29
【问题描述】:

我目前正在运行一个学生项目,在该项目中我使用 java 接收物理传感器值。

要转换传感器值(从一种物理亮度转换为另一种物理亮度),每个传感器都有特定的输入数据类型(8 位、16 位、双精度等)和用于数据转换的数学方程。此配置应存储在数据库中(直接或链接到脚本)

您建议如何实现这样的功能?

转换示例: Sensor0 发送它的值,应用程序应该在数据库中查找 Sensor0 的传感器值必须如何转换。它获取转换方程并转换值。 (例如,输出值计算为:output_val = (input_val^2) * pi / (2*inputval))

前面的数学方程应以某种方式存储为各种传感器的数据库条目或脚本定义,并应在运行时进行处理。

我的测试系统是一台带有 java 运行时和 mysql 服务器的 debian x86 计算机。

【问题讨论】:

    标签: java database type-conversion


    【解决方案1】:

    使用calculate 方法创建一个Calculation 抽象类,然后为每个传感器创建一个继承类,例如Input_1 extends Calculation。然后序列化Input_1,例如使用Jackson,并将序列化的实例存储在您的数据库中。当需要进行计算时,读入序列化实例,反序列化,运行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 对象。

    【讨论】:

    • 感谢您的帮助...但我不想为每个传感器创建继承。
    • 在这种情况下,要么使用一个包含所有传感器计算的类,要么为每个传感器创建一个类,而不从抽象类继承
    • 感谢您的帮助...但我不想为每个传感器创建继承...所有不同的传感器都应该存储在数据库中,并且每个传感器都存储一个转换函数.例如:数据库中有100个不同的传感器(sensor_id从0到99),有100个不同的转换函数。想象一下 ID 为 34 的传感器将其采样值发送到应用程序。此时应用程序应在数据库中查找特定传感器应使用哪种计算方法并执行转换...
    • 这个想法是将传感器的转换函数存储在序列化类中,例如public class Sensor_34 { public double conversion(double d) { return d * 4 + 3.4; }};你读入序列化的类,反序列化它,然后调用它的转换方法。这样你就不需要解析任何方程,它们已经是可执行的形式了。
    • 对不起,我不是最好的 Java 开发人员 :) 据我了解您的解决方案,我需要为源代码中的每个传感器 ID 实现类定义吗? ...我的方法是将有效传感器类型和转换信息的全部知识存储在数据库表中。最终用户应该能够使用传感器 ID 和仅使用数据库的转换函数声明所有有效的传感器类型。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-10-18
    • 2013-01-16
    • 1970-01-01
    • 2019-04-27
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多