【功能优化】IoT:

1. DeviceDataApi => IotDeviceUpstreamApi,并新建 upstream 包
2. ThingModelMessage => IotDeviceMessage 设备消息
3. 基于 spring event 异步消费 IotDeviceMessage,并实现 IotDeviceLogMessageConsumer 记录日志
This commit is contained in:
YunaiV
2025-01-27 14:15:07 +08:00
parent f4ad3e9d2d
commit 8089f3a319
46 changed files with 648 additions and 790 deletions

View File

@@ -5,49 +5,44 @@ import cn.iocoder.yudao.module.iot.api.device.dto.IotDeviceEventReportReqDTO;
import cn.iocoder.yudao.module.iot.api.device.dto.IotDevicePropertyReportReqDTO;
import cn.iocoder.yudao.module.iot.api.device.dto.IotDeviceStatusUpdateReqDTO;
import cn.iocoder.yudao.module.iot.enums.ApiConstants;
import jakarta.annotation.security.PermitAll;
import jakarta.validation.Valid;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.PutMapping;
import org.springframework.web.bind.annotation.RequestBody;
// TODO 芋艿名字可能看情况改下
/**
* 设备数据 API
* 设备数据 Upstream 上行 API
*
* 目的设备 -> 插件 -> 服务端
*
* @author haohao
*/
public interface DeviceDataApi {
public interface IotDeviceUpstreamApi {
// TODO @芋艿可能会调整
String PREFIX = ApiConstants.PREFIX + "/device-data";
String PREFIX = ApiConstants.PREFIX + "/device/upstream";
/**
* 更新设备状态
*
* @param updateReqDTO 更新请求
* @param updateReqDTO 更新设备状态 DTO
*/
@PutMapping(PREFIX + "/update-status")
@PermitAll // TODO 芋艿后续看看怎么优化下
CommonResult<Boolean> updateDeviceStatus(@Valid @RequestBody IotDeviceStatusUpdateReqDTO updateReqDTO);
/**
* 上报设备属性数据
*
* @param reportReqDTO 上报设备属性数据 DTO
*/
@PostMapping(PREFIX + "/report-property")
CommonResult<Boolean> reportDevicePropertyData(@Valid @RequestBody IotDevicePropertyReportReqDTO reportReqDTO);
/**
* 上报设备事件数据
*
* @param reportReqDTO 设备事件
*/
@PostMapping(PREFIX + "/report-event")
@PermitAll // TODO 芋艿后续看看怎么优化下
CommonResult<Boolean> reportDeviceEventData(@Valid @RequestBody IotDeviceEventReportReqDTO reportReqDTO);
/**
* 上报设备属性数据
*
* @param reportReqDTO 设备数据
*/
@PostMapping(PREFIX + "/report-property")
@PermitAll // TODO 芋艿后续看看怎么优化下
CommonResult<Boolean> reportDevicePropertyData(@Valid @RequestBody IotDevicePropertyReportReqDTO reportReqDTO);
}

View File

@@ -1,10 +1,9 @@
package cn.iocoder.yudao.module.iot.api.device.dto;
import jakarta.validation.constraints.NotEmpty;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;
import lombok.experimental.SuperBuilder;
import java.util.Map;
@@ -12,24 +11,9 @@ import java.util.Map;
* IoT 设备【事件】数据上报 Request DTO
*/
@Data
@SuperBuilder
@NoArgsConstructor
@AllArgsConstructor
@Builder
public class IotDeviceEventReportReqDTO {
// TODO 芋艿:要不要 id
// TODO 芋艿:要不要 time
/**
* 产品标识
*/
@NotEmpty(message = "产品标识不能为空")
private String productKey;
/**
* 设备名称
*/
@NotEmpty(message = "设备名称不能为空")
private String deviceName;
public class IotDeviceEventReportReqDTO extends IotDeviceUpstreamAbstractReqDTO {
/**
* 事件标识

View File

@@ -1,10 +1,9 @@
package cn.iocoder.yudao.module.iot.api.device.dto;
import jakarta.validation.constraints.NotEmpty;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;
import lombok.experimental.SuperBuilder;
import java.util.Map;
@@ -12,28 +11,14 @@ import java.util.Map;
* IoT 设备【属性】数据上报 Request DTO
*/
@Data
@SuperBuilder
@NoArgsConstructor
@AllArgsConstructor
@Builder
public class IotDevicePropertyReportReqDTO {
public class IotDevicePropertyReportReqDTO extends IotDeviceUpstreamAbstractReqDTO {
// TODO 芋艿:要不要 id
// TODO 芋艿:要不要 time
/**
* 产品标识
*/
@NotEmpty(message = "产品标识不能为空")
private String productKey;
/**
* 设备名称
*/
@NotEmpty(message = "设备名称不能为空")
private String deviceName;
/**
* 属性参数
*/
@NotEmpty(message = "属性参数不能为空")
private Map<String, Object> params;
private Map<String, Object> properties;
}

View File

@@ -3,33 +3,18 @@ package cn.iocoder.yudao.module.iot.api.device.dto;
import cn.iocoder.yudao.framework.common.validation.InEnum;
import cn.iocoder.yudao.module.iot.enums.device.IotDeviceStatusEnum;
import jakarta.validation.constraints.NotEmpty;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;
import lombok.experimental.SuperBuilder;
/**
* IoT 设备状态更新 Request DTO
*/
@Data
@SuperBuilder
@NoArgsConstructor
@AllArgsConstructor
@Builder
public class IotDeviceStatusUpdateReqDTO {
public class IotDeviceStatusUpdateReqDTO extends IotDeviceUpstreamAbstractReqDTO {
// TODO 芋艿:要不要 id
// TODO 芋艿:要不要 time
/**
* 产品标识
*/
@NotEmpty(message = "产品标识不能为空")
private String productKey;
/**
* 设备名称
*/
@NotEmpty(message = "设备名称不能为空")
private String deviceName;
/**
* 设备状态
*/

View File

@@ -0,0 +1,46 @@
package cn.iocoder.yudao.module.iot.api.device.dto;
import jakarta.validation.constraints.NotEmpty;
import lombok.Data;
import lombok.NoArgsConstructor;
import lombok.experimental.SuperBuilder;
import java.time.LocalDateTime;
/**
* IoT 设备上行的抽象 Request DTO
*
* @author 芋道源码
*/
@Data
@SuperBuilder
@NoArgsConstructor
public abstract class IotDeviceUpstreamAbstractReqDTO {
/**
* 请求编号
*/
private String requestId;
/**
* 插件标识
*/
private String pluginKey;
/**
* 产品标识
*/
@NotEmpty(message = "产品标识不能为空")
private String productKey;
/**
* 设备名称
*/
@NotEmpty(message = "设备名称不能为空")
private String deviceName;
/**
* 上报时间
*/
private LocalDateTime reportTime;
}

View File

@@ -0,0 +1,22 @@
package cn.iocoder.yudao.module.iot.enums.device;
import lombok.Getter;
import lombok.RequiredArgsConstructor;
/**
* IoT 设备消息标识符枚举
*/
@Getter
@RequiredArgsConstructor
public enum IotDeviceMessageIdentifierEnum {
PROPERTY_GET("get"),
PROPERTY_SET("set"),
PROPERTY_REPORT("report");
/**
* 标志符
*/
private final String identifier;
}

View File

@@ -0,0 +1,22 @@
package cn.iocoder.yudao.module.iot.enums.device;
import lombok.Getter;
import lombok.RequiredArgsConstructor;
/**
* IoT 设备消息类型枚举
*/
@Getter
@RequiredArgsConstructor
public enum IotDeviceMessageTypeEnum {
STATE("state"), // 设备状态
PROPERTY("property"), // 设备属性
EVENT("event"); // 设备事件
/**
* 属性
*/
private final String type;
}