设备/实体构建
概述
本章节主要介绍Beaver IoT平台关键对象: 设备、实体。以及如何基于注解、编程式、YAML构建它们。
关键对象
Device
Device
是设备的实例,里面有:
- id
- 所属集成的id
- 名称
- 额外数据: 采用Map结构存储设备的额外信息,如设备的SN等
- key:设备key, key规则详见关键编码概念介绍章节
- identifier: 设备identifier, identifier规则详见关键编码概念介绍章节
- 包含的实体
提示
设备在保存后,除了名称和额外数据都不建议再改变其它元数据。
Entity
Entity
是实体的实例,对象内容是实体的元数据(不包含实体的值),包括:
- id
- 设备key: 如果是设备的实体,那么会含有设备的key,规则详见关键编码概念介绍章节
- 集成ID
- 实体名称
- 访问权限: 只读/只写/读写
- identifier:实体identifier, identifier规则详见关键编码概念介绍章节
- 实体值类型:包括:STRING, LONG, DOUBLE, BOOLEAN, BINARY, OBJECT
- 实体类型: 包括:属性实体, 事件实体, 服务实体
- 实体属性: 实体的属性,如单位, 精度, 最大值, 最小值, 最大长度, 最小长度, 枚举等
- 子实体:实体的子实体,当前最多支持两层关系
- key: 实体key, key规则详见关键编码概念介绍章节
提示
实体在保存后,除了名称和实体属性都不建议再改变其它元数据。
对象构建
基于注解构建
Beaver IoT平台提供了基于注解的方式构建设备、实体,开发者只需在设备类、实体类上添加相应的注解即可完成设备、实体的构建。平台将会在集成启动时加载对应的实体、集成并初始化
注解说明
类注解
@IntegrationEntities
:标识当前类为集成实体类@DeviceEntities
:标识当前类为设备实体类identifier
:设备identifiername
:设备名称additional
:设备额外数据,通过@KeyValue注解声明
@Entities
:标识当前类为子实体类
字段注解
@Entity
:标识当前属性为实体属性type
:实体类型,包括:属性实体, 事件实体, 服务实体name
:实体名称identifier
:实体identifierattributes
:@Attribute注解声明实体属性,包括如单位, 精度, 最大值, 最小值, 最大长度, 最小长度, 枚举格式等accessMod
:实体访问权限,包括:只读, 只写, 读写
@Attribute
:实体属性注解enumClass
:枚举类unit
:单位fractionDigits
:精度max
:最大值min
:最小值maxLength
:最大长度minLength
:最小长度format
:格式
构建集成实体
- 定义集成实体
@Data
@EqualsAndHashCode(callSuper = true)
@IntegrationEntities
public class MyIntegrationEntities extends ExchangePayload {
@Entity(type = EntityType.SERVICE, name = "Device Connection Benchmark", identifier = "benchmark")
private String benchmark;
@Entity(type = EntityType.PROPERTY, name = "Detect Status", identifier = "detect_status", attributes = @Attribute(enumClass = DetectStatus.class), accessMod = AccessMod.R)
private Long detectStatus;
@Entity(type = EntityType.SERVICE, identifier = "delete_device")
private String deleteDevice;
public enum DetectStatus {
STANDBY, DETECTING;
}
}
提示
- 默认情况下,@Entity实体注解采用对象字段(驼峰转下划线)名作为实体name、identifier,开发者可通过name、identifier属性自定义实体名称、identifier
- 当在消费者端订阅实体时,注解的实体对象同时可用于接收ExchangePayload事件数据,即可通过Getter方法获取到属性值,从而简化代码开发,可参见事件订阅章节。 需注意当用于接收事件数据时,实体对象需继承ExchangePayload类,并且实体属性包含对应的Getter方法
- 定义集成子实体
@Data
@EqualsAndHashCode(callSuper = true)
@IntegrationEntities
public class MyIntegrationEntities extends ExchangePayload {
@Entity(type = EntityType.EVENT, name = "Detect Report", identifier = "detect_report")
private DetectReport detectReport;
@Entity(type = EntityType.SERVICE, identifier = "add_device")
private AddDevice addDevice;
@Data
@EqualsAndHashCode(callSuper = true)
@Entities
public static class DetectReport extends ExchangePayload {
// Entity type inherits from parent entity (DetectReport)
@Entity
private Long consumedTime;
@Entity
private Long onlineCount;
@Entity
private Long offlineCount;
}
@Data
@EqualsAndHashCode(callSuper = true)
@Entities
public static class AddDevice extends ExchangePayload {
@Entity
private String ip;
}
}
提示
当实体类为子实体时,需在子实体类上添加@Entities注解,即可完成子实体的构建。子实体默认继承父实体的属性,即子实体不需要设置type类型