Browse Source

【代码优化】IoT:重构设备 upstream 为 message,包括上行 + 下行

YunaiV 6 months ago
parent
commit
2f1598a5da
12 changed files with 147 additions and 59 deletions
  1. 1 1
      yudao-module-iot/yudao-module-iot-biz/src/main/java/cn/iocoder/yudao/module/iot/api/device/IoTDeviceUpstreamApiImpl.java
  2. 22 5
      yudao-module-iot/yudao-module-iot-biz/src/main/java/cn/iocoder/yudao/module/iot/controller/admin/device/IotDeviceController.java
  3. 30 0
      yudao-module-iot/yudao-module-iot-biz/src/main/java/cn/iocoder/yudao/module/iot/controller/admin/device/vo/message/IotDeviceSimulationDownstreamReqVO.java
  4. 3 3
      yudao-module-iot/yudao-module-iot-biz/src/main/java/cn/iocoder/yudao/module/iot/controller/admin/device/vo/message/IotDeviceSimulationUpstreamReqVO.java
  5. 1 1
      yudao-module-iot/yudao-module-iot-biz/src/main/java/cn/iocoder/yudao/module/iot/job/device/IotDeviceOfflineCheckJob.java
  6. 1 1
      yudao-module-iot/yudao-module-iot-biz/src/main/java/cn/iocoder/yudao/module/iot/mq/consumer/device/IotDeviceOnlineMessageConsumer.java
  7. 0 7
      yudao-module-iot/yudao-module-iot-biz/src/main/java/cn/iocoder/yudao/module/iot/service/device/IotDeviceService.java
  8. 0 39
      yudao-module-iot/yudao-module-iot-biz/src/main/java/cn/iocoder/yudao/module/iot/service/device/IotDeviceServiceImpl.java
  9. 22 0
      yudao-module-iot/yudao-module-iot-biz/src/main/java/cn/iocoder/yudao/module/iot/service/device/message/IotDeviceDownstreamService.java
  10. 23 0
      yudao-module-iot/yudao-module-iot-biz/src/main/java/cn/iocoder/yudao/module/iot/service/device/message/IotDeviceDownstreamServiceImpl.java
  11. 10 1
      yudao-module-iot/yudao-module-iot-biz/src/main/java/cn/iocoder/yudao/module/iot/service/device/message/IotDeviceUpstreamService.java
  12. 34 1
      yudao-module-iot/yudao-module-iot-biz/src/main/java/cn/iocoder/yudao/module/iot/service/device/message/IotDeviceUpstreamServiceImpl.java

+ 1 - 1
yudao-module-iot/yudao-module-iot-biz/src/main/java/cn/iocoder/yudao/module/iot/api/device/IoTDeviceUpstreamApiImpl.java

@@ -4,7 +4,7 @@ import cn.iocoder.yudao.framework.common.pojo.CommonResult;
 import cn.iocoder.yudao.module.iot.api.device.dto.IotDeviceEventReportReqDTO;
 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.IotDevicePropertyReportReqDTO;
 import cn.iocoder.yudao.module.iot.api.device.dto.IotDeviceStateUpdateReqDTO;
 import cn.iocoder.yudao.module.iot.api.device.dto.IotDeviceStateUpdateReqDTO;
-import cn.iocoder.yudao.module.iot.service.device.upstream.IotDeviceUpstreamService;
+import cn.iocoder.yudao.module.iot.service.device.message.IotDeviceUpstreamService;
 import org.springframework.validation.annotation.Validated;
 import org.springframework.validation.annotation.Validated;
 import org.springframework.web.bind.annotation.RestController;
 import org.springframework.web.bind.annotation.RestController;
 
 

+ 22 - 5
yudao-module-iot/yudao-module-iot-biz/src/main/java/cn/iocoder/yudao/module/iot/controller/admin/device/IotDeviceController.java

@@ -7,8 +7,11 @@ import cn.iocoder.yudao.framework.common.pojo.PageResult;
 import cn.iocoder.yudao.framework.common.util.object.BeanUtils;
 import cn.iocoder.yudao.framework.common.util.object.BeanUtils;
 import cn.iocoder.yudao.framework.excel.core.util.ExcelUtils;
 import cn.iocoder.yudao.framework.excel.core.util.ExcelUtils;
 import cn.iocoder.yudao.module.iot.controller.admin.device.vo.device.*;
 import cn.iocoder.yudao.module.iot.controller.admin.device.vo.device.*;
+import cn.iocoder.yudao.module.iot.controller.admin.device.vo.message.IotDeviceSimulationUpstreamReqVO;
 import cn.iocoder.yudao.module.iot.dal.dataobject.device.IotDeviceDO;
 import cn.iocoder.yudao.module.iot.dal.dataobject.device.IotDeviceDO;
 import cn.iocoder.yudao.module.iot.service.device.IotDeviceService;
 import cn.iocoder.yudao.module.iot.service.device.IotDeviceService;
+import cn.iocoder.yudao.module.iot.service.device.message.IotDeviceDownstreamService;
+import cn.iocoder.yudao.module.iot.service.device.message.IotDeviceUpstreamService;
 import io.swagger.v3.oas.annotations.Operation;
 import io.swagger.v3.oas.annotations.Operation;
 import io.swagger.v3.oas.annotations.Parameter;
 import io.swagger.v3.oas.annotations.Parameter;
 import io.swagger.v3.oas.annotations.tags.Tag;
 import io.swagger.v3.oas.annotations.tags.Tag;
@@ -37,6 +40,10 @@ public class IotDeviceController {
 
 
     @Resource
     @Resource
     private IotDeviceService deviceService;
     private IotDeviceService deviceService;
+    @Resource
+    private IotDeviceUpstreamService deviceUpstreamService;
+    @Resource
+    private IotDeviceDownstreamService deviceDownstreamService;
 
 
     @PostMapping("/create")
     @PostMapping("/create")
     @Operation(summary = "创建设备")
     @Operation(summary = "创建设备")
@@ -151,11 +158,21 @@ public class IotDeviceController {
         ExcelUtils.write(response, "设备导入模板.xls", "数据", IotDeviceImportExcelVO.class, list);
         ExcelUtils.write(response, "设备导入模板.xls", "数据", IotDeviceImportExcelVO.class, list);
     }
     }
 
 
-    @PostMapping("/simulation-report")
-    @Operation(summary = "模拟设备上报")
-    @PreAuthorize("@ss.hasPermission('iot:device:simulation-report')")
-    public CommonResult<Boolean> simulationReportDevice(@Valid @RequestBody IotDeviceSimulationReportReqVO simulatorReqVO) {
-        deviceService.simulationReportDevice(simulatorReqVO);
+    @PostMapping("/simulation-upstream")
+    @Operation(summary = "模拟设备上行")
+    @PreAuthorize("@ss.hasPermission('iot:device:simulation')")
+    public CommonResult<Boolean> simulationDeviceUpstream(
+            @Valid @RequestBody IotDeviceSimulationUpstreamReqVO upstreamReqVO) {
+        deviceUpstreamService.simulationDeviceUpstream(upstreamReqVO);
+        return success(true);
+    }
+
+    @PostMapping("/simulation-downstream")
+    @Operation(summary = "模拟设备下行")
+    @PreAuthorize("@ss.hasPermission('iot:device:simulation')")
+    public CommonResult<Boolean> simulationDownstreamDevice(
+            @Valid @RequestBody IotDeviceSimulationUpstreamReqVO downstreamReqVO) {
+        deviceDownstreamService.simulationDeviceDownstream(downstreamReqVO);
         return success(true);
         return success(true);
     }
     }
 
 

+ 30 - 0
yudao-module-iot/yudao-module-iot-biz/src/main/java/cn/iocoder/yudao/module/iot/controller/admin/device/vo/message/IotDeviceSimulationDownstreamReqVO.java

@@ -0,0 +1,30 @@
+package cn.iocoder.yudao.module.iot.controller.admin.device.vo.message;
+
+import cn.iocoder.yudao.framework.common.validation.InEnum;
+import cn.iocoder.yudao.module.iot.enums.device.IotDeviceMessageTypeEnum;
+import io.swagger.v3.oas.annotations.media.Schema;
+import jakarta.validation.constraints.NotEmpty;
+import jakarta.validation.constraints.NotNull;
+import lombok.Data;
+
+@Schema(description = "管理后台 - IoT 模拟设备下行 Request VO") // 服务调用、属性设置、属性获取等
+@Data
+public class IotDeviceSimulationDownstreamReqVO {
+
+    @Schema(description = "设备编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "177")
+    @NotNull(message = "设备编号不能为空")
+    private Long id;
+
+    @Schema(description = "消息类型", requiredMode = Schema.RequiredMode.REQUIRED, example = "property")
+    @NotEmpty(message = "消息类型不能为空")
+    @InEnum(IotDeviceMessageTypeEnum.class)
+    private String type;
+
+    @Schema(description = "标识符", requiredMode = Schema.RequiredMode.REQUIRED, example = "report")
+    @NotEmpty(message = "标识符不能为空")
+    private String identifier; // 参见 IotDeviceMessageIdentifierEnum 枚举类
+
+    @Schema(description = "请求参数", requiredMode = Schema.RequiredMode.REQUIRED)
+    private Object data; // 例如说:服务调用的 params、属性设置的 properties
+
+}

+ 3 - 3
yudao-module-iot/yudao-module-iot-biz/src/main/java/cn/iocoder/yudao/module/iot/controller/admin/device/vo/device/IotDeviceSimulationReportReqVO.java → yudao-module-iot/yudao-module-iot-biz/src/main/java/cn/iocoder/yudao/module/iot/controller/admin/device/vo/message/IotDeviceSimulationUpstreamReqVO.java

@@ -1,4 +1,4 @@
-package cn.iocoder.yudao.module.iot.controller.admin.device.vo.device;
+package cn.iocoder.yudao.module.iot.controller.admin.device.vo.message;
 
 
 import cn.iocoder.yudao.framework.common.validation.InEnum;
 import cn.iocoder.yudao.framework.common.validation.InEnum;
 import cn.iocoder.yudao.module.iot.enums.device.IotDeviceMessageTypeEnum;
 import cn.iocoder.yudao.module.iot.enums.device.IotDeviceMessageTypeEnum;
@@ -7,9 +7,9 @@ import jakarta.validation.constraints.NotEmpty;
 import jakarta.validation.constraints.NotNull;
 import jakarta.validation.constraints.NotNull;
 import lombok.Data;
 import lombok.Data;
 
 
-@Schema(description = "管理后台 - IoT 模拟设备上 Request VO") // 属性上报、事件上报、状态变更等
+@Schema(description = "管理后台 - IoT 模拟设备上 Request VO") // 属性上报、事件上报、状态变更等
 @Data
 @Data
-public class IotDeviceSimulationReportReqVO {
+public class IotDeviceSimulationUpstreamReqVO {
 
 
     @Schema(description = "设备编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "177")
     @Schema(description = "设备编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "177")
     @NotNull(message = "设备编号不能为空")
     @NotNull(message = "设备编号不能为空")

+ 1 - 1
yudao-module-iot/yudao-module-iot-biz/src/main/java/cn/iocoder/yudao/module/iot/job/device/IotDeviceOfflineCheckJob.java

@@ -10,7 +10,7 @@ import cn.iocoder.yudao.module.iot.dal.dataobject.device.IotDeviceDO;
 import cn.iocoder.yudao.module.iot.enums.device.IotDeviceStateEnum;
 import cn.iocoder.yudao.module.iot.enums.device.IotDeviceStateEnum;
 import cn.iocoder.yudao.module.iot.service.device.IotDeviceService;
 import cn.iocoder.yudao.module.iot.service.device.IotDeviceService;
 import cn.iocoder.yudao.module.iot.service.device.data.IotDevicePropertyService;
 import cn.iocoder.yudao.module.iot.service.device.data.IotDevicePropertyService;
-import cn.iocoder.yudao.module.iot.service.device.upstream.IotDeviceUpstreamService;
+import cn.iocoder.yudao.module.iot.service.device.message.IotDeviceUpstreamService;
 import jakarta.annotation.Resource;
 import jakarta.annotation.Resource;
 import org.springframework.stereotype.Component;
 import org.springframework.stereotype.Component;
 
 

+ 1 - 1
yudao-module-iot/yudao-module-iot-biz/src/main/java/cn/iocoder/yudao/module/iot/mq/consumer/device/IotDeviceOnlineMessageConsumer.java

@@ -9,7 +9,7 @@ import cn.iocoder.yudao.module.iot.enums.device.IotDeviceMessageTypeEnum;
 import cn.iocoder.yudao.module.iot.enums.device.IotDeviceStateEnum;
 import cn.iocoder.yudao.module.iot.enums.device.IotDeviceStateEnum;
 import cn.iocoder.yudao.module.iot.mq.message.IotDeviceMessage;
 import cn.iocoder.yudao.module.iot.mq.message.IotDeviceMessage;
 import cn.iocoder.yudao.module.iot.service.device.IotDeviceService;
 import cn.iocoder.yudao.module.iot.service.device.IotDeviceService;
-import cn.iocoder.yudao.module.iot.service.device.upstream.IotDeviceUpstreamService;
+import cn.iocoder.yudao.module.iot.service.device.message.IotDeviceUpstreamService;
 import jakarta.annotation.Resource;
 import jakarta.annotation.Resource;
 import lombok.extern.slf4j.Slf4j;
 import lombok.extern.slf4j.Slf4j;
 import org.springframework.context.event.EventListener;
 import org.springframework.context.event.EventListener;

+ 0 - 7
yudao-module-iot/yudao-module-iot-biz/src/main/java/cn/iocoder/yudao/module/iot/service/device/IotDeviceService.java

@@ -144,11 +144,4 @@ public interface IotDeviceService {
      */
      */
     IotDeviceImportRespVO importDevice(List<IotDeviceImportExcelVO> importDevices, boolean updateSupport);
     IotDeviceImportRespVO importDevice(List<IotDeviceImportExcelVO> importDevices, boolean updateSupport);
 
 
-    /**
-     * 模拟设备上报
-     *
-     * @param reportReqVO 上报信息
-     */
-    void simulationReportDevice(IotDeviceSimulationReportReqVO reportReqVO);
-
 }
 }

+ 0 - 39
yudao-module-iot/yudao-module-iot-biz/src/main/java/cn/iocoder/yudao/module/iot/service/device/IotDeviceServiceImpl.java

@@ -10,18 +10,14 @@ import cn.iocoder.yudao.framework.common.pojo.PageResult;
 import cn.iocoder.yudao.framework.common.util.object.BeanUtils;
 import cn.iocoder.yudao.framework.common.util.object.BeanUtils;
 import cn.iocoder.yudao.framework.common.util.validation.ValidationUtils;
 import cn.iocoder.yudao.framework.common.util.validation.ValidationUtils;
 import cn.iocoder.yudao.framework.tenant.core.util.TenantUtils;
 import cn.iocoder.yudao.framework.tenant.core.util.TenantUtils;
-import cn.iocoder.yudao.module.iot.api.device.dto.IotDevicePropertyReportReqDTO;
-import cn.iocoder.yudao.module.iot.api.device.dto.IotDeviceStateUpdateReqDTO;
 import cn.iocoder.yudao.module.iot.controller.admin.device.vo.device.*;
 import cn.iocoder.yudao.module.iot.controller.admin.device.vo.device.*;
 import cn.iocoder.yudao.module.iot.dal.dataobject.device.IotDeviceDO;
 import cn.iocoder.yudao.module.iot.dal.dataobject.device.IotDeviceDO;
 import cn.iocoder.yudao.module.iot.dal.dataobject.device.IotDeviceGroupDO;
 import cn.iocoder.yudao.module.iot.dal.dataobject.device.IotDeviceGroupDO;
 import cn.iocoder.yudao.module.iot.dal.dataobject.product.IotProductDO;
 import cn.iocoder.yudao.module.iot.dal.dataobject.product.IotProductDO;
 import cn.iocoder.yudao.module.iot.dal.mysql.device.IotDeviceMapper;
 import cn.iocoder.yudao.module.iot.dal.mysql.device.IotDeviceMapper;
 import cn.iocoder.yudao.module.iot.dal.redis.RedisKeyConstants;
 import cn.iocoder.yudao.module.iot.dal.redis.RedisKeyConstants;
-import cn.iocoder.yudao.module.iot.enums.device.IotDeviceMessageTypeEnum;
 import cn.iocoder.yudao.module.iot.enums.device.IotDeviceStateEnum;
 import cn.iocoder.yudao.module.iot.enums.device.IotDeviceStateEnum;
 import cn.iocoder.yudao.module.iot.enums.product.IotProductDeviceTypeEnum;
 import cn.iocoder.yudao.module.iot.enums.product.IotProductDeviceTypeEnum;
-import cn.iocoder.yudao.module.iot.service.device.upstream.IotDeviceUpstreamService;
 import cn.iocoder.yudao.module.iot.service.product.IotProductService;
 import cn.iocoder.yudao.module.iot.service.product.IotProductService;
 import jakarta.annotation.Resource;
 import jakarta.annotation.Resource;
 import jakarta.validation.ConstraintViolationException;
 import jakarta.validation.ConstraintViolationException;
@@ -59,9 +55,6 @@ public class IotDeviceServiceImpl implements IotDeviceService {
     @Resource
     @Resource
     @Lazy // 延迟加载,解决循环依赖
     @Lazy // 延迟加载,解决循环依赖
     private IotDeviceGroupService deviceGroupService;
     private IotDeviceGroupService deviceGroupService;
-    @Resource
-    @Lazy // 延迟加载,解决循环依赖
-    private IotDeviceUpstreamService deviceUpstreamService;
 
 
     @Override
     @Override
     public Long createDevice(IotDeviceSaveReqVO createReqVO) {
     public Long createDevice(IotDeviceSaveReqVO createReqVO) {
@@ -395,38 +388,6 @@ public class IotDeviceServiceImpl implements IotDeviceService {
         return respVO;
         return respVO;
     }
     }
 
 
-    // TODO @芋艿:要不改成 simulationUpstream,原因:里面不只有上报,还有更新状态,那么 upstream 更适合
-    @Override
-    @SuppressWarnings("unchecked")
-    public void simulationReportDevice(IotDeviceSimulationReportReqVO reportReqVO) {
-        // 1. 校验存在
-        IotDeviceDO device = validateDeviceExists(reportReqVO.getId());
-
-        // 2.1 情况一:属性上报
-        String requestId = IdUtil.fastSimpleUUID();
-        if (Objects.equals(reportReqVO.getType(), IotDeviceMessageTypeEnum.PROPERTY.getType())) {
-            deviceUpstreamService.reportDeviceProperty(((IotDevicePropertyReportReqDTO)
-                    new IotDevicePropertyReportReqDTO().setRequestId(requestId).setReportTime(LocalDateTime.now())
-                            .setProductKey(device.getProductKey()).setDeviceName(device.getDeviceName()))
-                    .setProperties((Map<String, Object>) reportReqVO.getData()));
-            return;
-        }
-        // 2.2 情况二:事件上报
-        if (Objects.equals(reportReqVO.getType(), IotDeviceMessageTypeEnum.EVENT.getType())) {
-            // TODO 芋艿:待实现
-            return;
-        }
-        // 2.3 情况三:状态变更
-        if (Objects.equals(reportReqVO.getType(), IotDeviceMessageTypeEnum.STATE.getType())) {
-            deviceUpstreamService.updateDeviceState(((IotDeviceStateUpdateReqDTO)
-                    new IotDeviceStateUpdateReqDTO().setRequestId(IdUtil.fastSimpleUUID()).setReportTime(LocalDateTime.now())
-                            .setProductKey(device.getProductKey()).setDeviceName(device.getDeviceName()))
-                    .setState((Integer) reportReqVO.getData()));
-            return;
-        }
-        throw new IllegalArgumentException("未知的类型:" + reportReqVO.getType());
-    }
-
     private void deleteDeviceCache(IotDeviceDO device) {
     private void deleteDeviceCache(IotDeviceDO device) {
         // 保证在 @CacheEvict 之前,忽略租户
         // 保证在 @CacheEvict 之前,忽略租户
         TenantUtils.executeIgnore(() -> getSelf().deleteDeviceCache0(device));
         TenantUtils.executeIgnore(() -> getSelf().deleteDeviceCache0(device));

+ 22 - 0
yudao-module-iot/yudao-module-iot-biz/src/main/java/cn/iocoder/yudao/module/iot/service/device/message/IotDeviceDownstreamService.java

@@ -0,0 +1,22 @@
+package cn.iocoder.yudao.module.iot.service.device.message;
+
+import cn.iocoder.yudao.module.iot.controller.admin.device.vo.message.IotDeviceSimulationUpstreamReqVO;
+import jakarta.validation.Valid;
+
+/**
+ * 设备下行 Service 接口
+ *
+ * 目的:服务端 -> 插件 -> 设备
+ *
+ * @author 芋道源码
+ */
+public interface IotDeviceDownstreamService {
+
+    /**
+     * 模拟设备下行
+     *
+     * @param downstreamReqVO 设备下行请求 VO
+     */
+    void simulationDeviceDownstream(@Valid IotDeviceSimulationUpstreamReqVO downstreamReqVO);
+
+}

+ 23 - 0
yudao-module-iot/yudao-module-iot-biz/src/main/java/cn/iocoder/yudao/module/iot/service/device/message/IotDeviceDownstreamServiceImpl.java

@@ -0,0 +1,23 @@
+package cn.iocoder.yudao.module.iot.service.device.message;
+
+import cn.iocoder.yudao.module.iot.controller.admin.device.vo.message.IotDeviceSimulationUpstreamReqVO;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.stereotype.Service;
+import org.springframework.validation.annotation.Validated;
+
+/**
+ * 设备下行 Service 实现类
+ *
+ * @author 芋道源码
+ */
+@Service
+@Validated
+@Slf4j
+public class IotDeviceDownstreamServiceImpl implements IotDeviceDownstreamService {
+
+    @Override
+    public void simulationDeviceDownstream(IotDeviceSimulationUpstreamReqVO downstreamReqVO) {
+
+    }
+
+}

+ 10 - 1
yudao-module-iot/yudao-module-iot-biz/src/main/java/cn/iocoder/yudao/module/iot/service/device/upstream/IotDeviceUpstreamService.java → yudao-module-iot/yudao-module-iot-biz/src/main/java/cn/iocoder/yudao/module/iot/service/device/message/IotDeviceUpstreamService.java

@@ -1,8 +1,10 @@
-package cn.iocoder.yudao.module.iot.service.device.upstream;
+package cn.iocoder.yudao.module.iot.service.device.message;
 
 
 import cn.iocoder.yudao.module.iot.api.device.dto.IotDeviceEventReportReqDTO;
 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.IotDevicePropertyReportReqDTO;
 import cn.iocoder.yudao.module.iot.api.device.dto.IotDeviceStateUpdateReqDTO;
 import cn.iocoder.yudao.module.iot.api.device.dto.IotDeviceStateUpdateReqDTO;
+import cn.iocoder.yudao.module.iot.controller.admin.device.vo.message.IotDeviceSimulationUpstreamReqVO;
+import jakarta.validation.Valid;
 
 
 /**
 /**
  * 设备上行 Service 接口
  * 设备上行 Service 接口
@@ -13,6 +15,13 @@ import cn.iocoder.yudao.module.iot.api.device.dto.IotDeviceStateUpdateReqDTO;
  */
  */
 public interface IotDeviceUpstreamService {
 public interface IotDeviceUpstreamService {
 
 
+    /**
+     * 模拟设备上行
+     *
+     * @param simulatorReqVO 设备上行请求 VO
+     */
+    void simulationDeviceUpstream(@Valid IotDeviceSimulationUpstreamReqVO simulatorReqVO);
+
     /**
     /**
      * 更新设备状态
      * 更新设备状态
      *
      *

+ 34 - 1
yudao-module-iot/yudao-module-iot-biz/src/main/java/cn/iocoder/yudao/module/iot/service/device/upstream/IotDeviceUpstreamServiceImpl.java → yudao-module-iot/yudao-module-iot-biz/src/main/java/cn/iocoder/yudao/module/iot/service/device/message/IotDeviceUpstreamServiceImpl.java

@@ -1,4 +1,4 @@
-package cn.iocoder.yudao.module.iot.service.device.upstream;
+package cn.iocoder.yudao.module.iot.service.device.message;
 
 
 import cn.hutool.core.lang.Assert;
 import cn.hutool.core.lang.Assert;
 import cn.hutool.core.util.IdUtil;
 import cn.hutool.core.util.IdUtil;
@@ -11,6 +11,7 @@ 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.IotDevicePropertyReportReqDTO;
 import cn.iocoder.yudao.module.iot.api.device.dto.IotDeviceStateUpdateReqDTO;
 import cn.iocoder.yudao.module.iot.api.device.dto.IotDeviceStateUpdateReqDTO;
 import cn.iocoder.yudao.module.iot.api.device.dto.IotDeviceUpstreamAbstractReqDTO;
 import cn.iocoder.yudao.module.iot.api.device.dto.IotDeviceUpstreamAbstractReqDTO;
+import cn.iocoder.yudao.module.iot.controller.admin.device.vo.message.IotDeviceSimulationUpstreamReqVO;
 import cn.iocoder.yudao.module.iot.dal.dataobject.device.IotDeviceDO;
 import cn.iocoder.yudao.module.iot.dal.dataobject.device.IotDeviceDO;
 import cn.iocoder.yudao.module.iot.enums.device.IotDeviceMessageIdentifierEnum;
 import cn.iocoder.yudao.module.iot.enums.device.IotDeviceMessageIdentifierEnum;
 import cn.iocoder.yudao.module.iot.enums.device.IotDeviceMessageTypeEnum;
 import cn.iocoder.yudao.module.iot.enums.device.IotDeviceMessageTypeEnum;
@@ -25,6 +26,7 @@ import org.springframework.stereotype.Service;
 import org.springframework.validation.annotation.Validated;
 import org.springframework.validation.annotation.Validated;
 
 
 import java.time.LocalDateTime;
 import java.time.LocalDateTime;
+import java.util.Map;
 import java.util.Objects;
 import java.util.Objects;
 
 
 /**
 /**
@@ -45,6 +47,37 @@ public class IotDeviceUpstreamServiceImpl implements IotDeviceUpstreamService {
     @Resource
     @Resource
     private IotDeviceProducer deviceProducer;
     private IotDeviceProducer deviceProducer;
 
 
+    @Override
+    @SuppressWarnings("unchecked")
+    public void simulationDeviceUpstream(IotDeviceSimulationUpstreamReqVO simulatorReqVO) {
+        // 1. 校验存在
+        IotDeviceDO device = deviceService.validateDeviceExists(simulatorReqVO.getId());
+
+        // 2.1 情况一:属性上报
+        String requestId = IdUtil.fastSimpleUUID();
+        if (Objects.equals(simulatorReqVO.getType(), IotDeviceMessageTypeEnum.PROPERTY.getType())) {
+            reportDeviceProperty(((IotDevicePropertyReportReqDTO)
+                    new IotDevicePropertyReportReqDTO().setRequestId(requestId).setReportTime(LocalDateTime.now())
+                            .setProductKey(device.getProductKey()).setDeviceName(device.getDeviceName()))
+                    .setProperties((Map<String, Object>) simulatorReqVO.getData()));
+            return;
+        }
+        // 2.2 情况二:事件上报
+        if (Objects.equals(simulatorReqVO.getType(), IotDeviceMessageTypeEnum.EVENT.getType())) {
+            // TODO 芋艿:待实现
+            return;
+        }
+        // 2.3 情况三:状态变更
+        if (Objects.equals(simulatorReqVO.getType(), IotDeviceMessageTypeEnum.STATE.getType())) {
+            updateDeviceState(((IotDeviceStateUpdateReqDTO)
+                    new IotDeviceStateUpdateReqDTO().setRequestId(IdUtil.fastSimpleUUID()).setReportTime(LocalDateTime.now())
+                            .setProductKey(device.getProductKey()).setDeviceName(device.getDeviceName()))
+                    .setState((Integer) simulatorReqVO.getData()));
+            return;
+        }
+        throw new IllegalArgumentException("未知的类型:" + simulatorReqVO.getType());
+    }
+
     @Override
     @Override
     public void updateDeviceState(IotDeviceStateUpdateReqDTO updateReqDTO) {
     public void updateDeviceState(IotDeviceStateUpdateReqDTO updateReqDTO) {
         Assert.isTrue(ObjectUtils.equalsAny(updateReqDTO.getState(),
         Assert.isTrue(ObjectUtils.equalsAny(updateReqDTO.getState(),