家庭自动化传感器网络数据模型。从泛型类型推断实例变量的类型?

时间:2016-02-09 10:48:39

标签: java data-modeling

对于家庭自动化项目,我很难想出一个数据模型来代表各种传感器和测量。我将描述情况和我的推理,然后希望有人可以给我一个指示如何继续。我在Java工作。

我想为各种类型的传感器建模。传感器可以测量温度,湿度,气压等。每个传感器都有唯一的标识符,位置和描述。我还想将以前的测量值存储在数据库中,以生成统计数据和历史视图。

从面向对象的角度来看,我创建了一个传感器类,它由每种类型的传感器和每种类型的传感器扩展,具有它自己的属性。像这样:

                 +-----------+
                 |Sensor     |
                 +-----------+
                 |id         |
                 |location   |
                 |description|
                 +-----+-----+
                       ^
                       |
          +------------+-----------+- - - -
          |                        |
+---------+---------+      +-------+------+
|Temperature        |      |AirPressure   |
|Sensor             |      |Sensor        |
+-------------------+      +--------------+
|temperature : float|      |pressure : int|
+-------------------+      +--------------+

但这并不能让我跟踪历史数据。为此,我认为我需要某种“测量”和“测量”。随着时间的推移跟踪每个传感器的测量结果。

                  +----------------------+    
                  |Measurement           |    
                  +----------------------+    +------+
                  |sensor : Sensor       +----+Sensor|
                  |tsMeasured : timestamp|    +------+
                  +-----+----------------+
                        ^
                        |
           +------------+-----------+- - - -
           |                        |
+----------+--------+       +-------+------+
|Temperature        |       |AirPressure   |
|Measurement        |       |Measurement   |
+-------------------+       +--------------+
|temperature : float|       |pressure : int|
+-------------------+       +--------------+

然而,这开始重复感觉错误的类树结构,并且还会使传感器类级别的测量列表变得更加困难。

从概念上讲,我想要一个Sensor类,它引用了它最新的测量值和一个包含历史测量值的列表。但是,测量值的类型取决于传感器的类型。有没有办法强制执行此操作,以便我可以将模型简化为类似

+--------------------------------------------+
|Sensor<SensorType>                          |
+--------------------------------------------+
|id                                          |
|location                                    |    +------------------------+
|measurements : List<Measurement<SensorType>>|----|Measurement<SensorType> |
+--------------------------------------------+    +------------------------+
                                                  |tsMeasured : timestamp  |
                                                  |value : <type dependent |
                                                  | on type of measurement>|
                                                  +------------------------+

我正在考虑使用Java的通用类型,但显然我对它们的了解不够,我可以提出一个可行的解决方案。但也许我完全看错了方向:)。任何帮助将不胜感激。

2 个答案:

答案 0 :(得分:2)

是的,您似乎应该能够以您描述的方式精确地使用泛型。

在这种情况下,您甚至可能根本不需要任何继承(如果传感器没有任何其他数据或操作)。气压传感器可能只是Sensor<Integer>的一个实例,即:

Sensor<Integer> airPressureSensor = new Sensor<>; 

与传感器的整个层次结构相比,这可能更短,更容易维护。

如果您出于某种原因必须实施AirPressureSensor课程,可以这样做:

class AirPressureSensor extends Sensor<Integer> 

答案 1 :(得分:1)

听起来像是一个非常酷的项目。 IoT这些日子越来越受欢迎,它带来了它自身的一系列挑战。

我对现有的物联网数据模型进行了快速挖掘,并找到了this。看起来它建议采用类似的方法,sensor有一个data-streamdata-stream有一个unitOfMeasurement。所以,也许这不是一个糟糕的开始。

如果您要将这些历史数据存储在数据库中并且您拥有捕获不同数据的各种传感器,那么它可能非常适合于没有定义刚性的NoSQL数据库架构就像传统的关系数据库一样。我的偏好是MongoDB

我绝对建议首先阅读一些物联网架构/设计模式/框架。 DZone有一篇关于Architecting the IoT的文章。

就个人而言,如果我去了,我可能会使用Spring Integration来设计某种pub-sub架构,其中对things感兴趣的sensors可以订阅sensors频道,然后决定做什么。 Spring Integration还对MongoDB提供原生支持,因此可以通过将数据汇总到MongoDB Outbound Channel Adapter来轻松处理历史使用情况。对于奖励积分,您甚至可以在发生某些事件时post statuses to twitter

有很多很酷的可能性。