对于一个家庭自动化项目,我正在努力提出一个数据模型来表示各种传感器和测量。我将描述情况和我的推理,然后希望有人可以给我一个如何继续的指示。我正在用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。
有很多很酷的可能性。