jetlinks之Thing
提示:项目原因,有幸结识一50多岁的老博士,觉得这位老博士是个技术控,挺佩服的,不知道自己达知命之年时会在做什么,或许也是在做技术吧!之前聊过一些低代码,今天聊到物联网平台,谈了一些物联网的看法,博士说物联网平台的关键技术是"规则引擎",好吧,其实自己最早学习jetlinks的初衷是想学习下“物模型”… 路漫漫其修远兮!
前言
本章主要介绍“物实例”相关代码及实现。
一、物实例
1.实例简介
该包是jetlink-core包下org.jetlinks.core.defaults 包下代码
提示:如上StorageConfigurable 已经不是第一次遇见了,可配置存储
Thing 物实例接口,可通过此接口获取物的物模型以及相关配置信息.。
DefaultThing 物实例默认实现。
属性解析:
ThingType 物类型定义,通常使用枚举实现此接口
ThingMetadata 物模型定义 包含 事件 属性 功能 标签定义
ThingTemplate 物模版,统一定义物模型等信息
2.属性
类型 | 字段 | 描述 | 备注 |
---|---|---|---|
String | id | 主键 | |
ThingType | type | 设备元数据更新 | |
Mono<ConfigStorage> | storageMono | 配置存储器 | |
Mono<ThingMetadata> | metadataMono | 物模型定义 | |
Mono<ThingTemplate> | templateMono | 物模板定义 | |
long | lastMetadataTime | 模型最后更新时间 | |
ThingMetadata | metadataCache | 物模型缓存 | |
ThingMetadataCodec | metadataCodec | 物模型编码器 | |
Function<Thing,ThingRpcSupport> | rpcFactory | rpc创建工厂 |
3.构造器
public DefaultThing(ThingType thingType,
String id,
Mono<ConfigStorage> storageSupplier,
ThingMetadataCodec metadataCodec,
ThingsRegistry registry,
Function<Thing,ThingRpcSupport> rpcFactory) {
this.id = id;
this.type = thingType;
this.storageMono = storageSupplier;
this.metadataCodec = metadataCodec;
this.rpcFactory=rpcFactory;
this.templateMono = this
.getSelfConfig(ThingsConfigKeys.templateId)
.flatMap(templateId -> registry.getTemplate(this.type, templateId));
this.metadataMono = this
//获取最后更新物模型的时间
.getSelfConfig(lastMetadataTimeKey.getKey())
.map(Value::asLong)
.flatMap(i -> {
//如果时间一致,则直接返回物模型缓存.
if (i.equals(lastMetadataTime) && metadataCache != null) {
return Mono.just(metadataCache);
}
lastMetadataTime = i;
//加载真实的物模型
return this
.getSelfConfig(metadata)
.flatMap(metadataCodec::decode)
.doOnNext(metadata -> metadataCache = metadata);
})
//获取物模版的物模型
.switchIfEmpty(Mono.defer(() -> getTemplate().flatMap(ThingTemplate::getMetadata)));
}
代码如下(示例): mark一下
二、物模板
物模版,统一定义物模型等信息
1.属性
代码如下(示例):
类型 | 字段 | 描述 | 备注 |
---|---|---|---|
String | id | 主键 | |
Mono<ConfigStorage> | storageMono | 设备元数据更新 | |
Mono<ThingMetadata> | metadataMono | 物模型定义 | |
long | lastMetadataTime | 物模板定义 | |
ThingMetadata | metadataCache | 物模型缓存 | |
ThingMetadataCodec | metadataCodec | 物模型编码器 |
2.构造器
代码如下(示例):
public DefaultThingTemplate(ThingType thingType,
String id,
ConfigStorageManager storageManager,
ThingMetadataCodec metadataCodec) {
this.id = id;
this.storageMono = storageManager.getStorage("thing-template:" + thingType.getId() + ":" + id);
this.metadataCodec = metadataCodec;
this.metadataMono = this
//获取最后更新物模型的时间
.getConfig(ThingsConfigKeys.lastMetadataTimeKey)
.flatMap(i -> {
//如果时间一致,则直接返回物模型缓存.
if (i.equals(lastMetadataTime) && metadataCache != null) {
return Mono.just(metadataCache);
}
lastMetadataTime = i;
//加载真实的物模型
return this
.getConfig(metadata)
.flatMap(metadataCodec::decode)
.doOnNext(metadata -> metadataCache = metadata);
});
}