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



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

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

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

                 +-----------+
                 |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 类,该类引用了它的最新测量值和一个包含历史测量值的列表。但是,测量值的类型取决于传感器的类型。有没有办法强制执行这一点,这样我就可以将模型简化为类似

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

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

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

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

Sensor<Integer> airPressureSensor = new Sensor<>; 

这可能比整个传感器层次结构编写更短且更易于维护。

如果出于某种原因必须实现 AirPressureSensor 类,则可以这样做:

class AirPressureSensor extends Sensor<Integer> 
听起来像

是一个很酷的项目。如今,物联网变得越来越流行,它带来了一系列挑战。

我对现有的物联网数据模型进行了一些快速挖掘,并发现了这个。看起来它提出了类似的方法,因为sensor有一个data-stream,而data-stream有一个unitOfMeasurement。所以,也许这不是一个糟糕的开始。

如果您要将这些历史数据存储在数据库中,并且有各种各样的传感器来捕获不同的数据,那么它可能非常适合不像传统关系数据库那样定义严格模式的NoSQL数据库。我更喜欢MongoDB。

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

就我个人而言,如果我试一试,我可能会使用 Spring Integration 来设计某种发布-订阅架构,其中对sensors感兴趣的things可以订阅该sensors频道,然后决定该怎么做。 Spring Integration 还具有对 MongoDB 的本机支持,因此可以通过将数据管道传输到 MongoDB 出站通道适配器中来轻松处理历史使用情况。对于奖励积分,您甚至可以在某些事件发生时将状态发布到Twitter。

有很多很酷的可能性。

最新更新