Commit 2f1598a5daf6320a9096ca92d51d739f44864508

Authored by YunaiV
1 parent 5110948d

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

Showing 12 changed files with 147 additions and 59 deletions
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; @@ -4,7 +4,7 @@ import cn.iocoder.yudao.framework.common.pojo.CommonResult;
4 import cn.iocoder.yudao.module.iot.api.device.dto.IotDeviceEventReportReqDTO; 4 import cn.iocoder.yudao.module.iot.api.device.dto.IotDeviceEventReportReqDTO;
5 import cn.iocoder.yudao.module.iot.api.device.dto.IotDevicePropertyReportReqDTO; 5 import cn.iocoder.yudao.module.iot.api.device.dto.IotDevicePropertyReportReqDTO;
6 import cn.iocoder.yudao.module.iot.api.device.dto.IotDeviceStateUpdateReqDTO; 6 import cn.iocoder.yudao.module.iot.api.device.dto.IotDeviceStateUpdateReqDTO;
7 -import cn.iocoder.yudao.module.iot.service.device.upstream.IotDeviceUpstreamService; 7 +import cn.iocoder.yudao.module.iot.service.device.message.IotDeviceUpstreamService;
8 import org.springframework.validation.annotation.Validated; 8 import org.springframework.validation.annotation.Validated;
9 import org.springframework.web.bind.annotation.RestController; 9 import org.springframework.web.bind.annotation.RestController;
10 10
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; @@ -7,8 +7,11 @@ import cn.iocoder.yudao.framework.common.pojo.PageResult;
7 import cn.iocoder.yudao.framework.common.util.object.BeanUtils; 7 import cn.iocoder.yudao.framework.common.util.object.BeanUtils;
8 import cn.iocoder.yudao.framework.excel.core.util.ExcelUtils; 8 import cn.iocoder.yudao.framework.excel.core.util.ExcelUtils;
9 import cn.iocoder.yudao.module.iot.controller.admin.device.vo.device.*; 9 import cn.iocoder.yudao.module.iot.controller.admin.device.vo.device.*;
  10 +import cn.iocoder.yudao.module.iot.controller.admin.device.vo.message.IotDeviceSimulationUpstreamReqVO;
10 import cn.iocoder.yudao.module.iot.dal.dataobject.device.IotDeviceDO; 11 import cn.iocoder.yudao.module.iot.dal.dataobject.device.IotDeviceDO;
11 import cn.iocoder.yudao.module.iot.service.device.IotDeviceService; 12 import cn.iocoder.yudao.module.iot.service.device.IotDeviceService;
  13 +import cn.iocoder.yudao.module.iot.service.device.message.IotDeviceDownstreamService;
  14 +import cn.iocoder.yudao.module.iot.service.device.message.IotDeviceUpstreamService;
12 import io.swagger.v3.oas.annotations.Operation; 15 import io.swagger.v3.oas.annotations.Operation;
13 import io.swagger.v3.oas.annotations.Parameter; 16 import io.swagger.v3.oas.annotations.Parameter;
14 import io.swagger.v3.oas.annotations.tags.Tag; 17 import io.swagger.v3.oas.annotations.tags.Tag;
@@ -37,6 +40,10 @@ public class IotDeviceController { @@ -37,6 +40,10 @@ public class IotDeviceController {
37 40
38 @Resource 41 @Resource
39 private IotDeviceService deviceService; 42 private IotDeviceService deviceService;
  43 + @Resource
  44 + private IotDeviceUpstreamService deviceUpstreamService;
  45 + @Resource
  46 + private IotDeviceDownstreamService deviceDownstreamService;
40 47
41 @PostMapping("/create") 48 @PostMapping("/create")
42 @Operation(summary = "创建设备") 49 @Operation(summary = "创建设备")
@@ -151,11 +158,21 @@ public class IotDeviceController { @@ -151,11 +158,21 @@ public class IotDeviceController {
151 ExcelUtils.write(response, "设备导入模板.xls", "数据", IotDeviceImportExcelVO.class, list); 158 ExcelUtils.write(response, "设备导入模板.xls", "数据", IotDeviceImportExcelVO.class, list);
152 } 159 }
153 160
154 - @PostMapping("/simulation-report")  
155 - @Operation(summary = "模拟设备上报")  
156 - @PreAuthorize("@ss.hasPermission('iot:device:simulation-report')")  
157 - public CommonResult<Boolean> simulationReportDevice(@Valid @RequestBody IotDeviceSimulationReportReqVO simulatorReqVO) {  
158 - deviceService.simulationReportDevice(simulatorReqVO); 161 + @PostMapping("/simulation-upstream")
  162 + @Operation(summary = "模拟设备上行")
  163 + @PreAuthorize("@ss.hasPermission('iot:device:simulation')")
  164 + public CommonResult<Boolean> simulationDeviceUpstream(
  165 + @Valid @RequestBody IotDeviceSimulationUpstreamReqVO upstreamReqVO) {
  166 + deviceUpstreamService.simulationDeviceUpstream(upstreamReqVO);
  167 + return success(true);
  168 + }
  169 +
  170 + @PostMapping("/simulation-downstream")
  171 + @Operation(summary = "模拟设备下行")
  172 + @PreAuthorize("@ss.hasPermission('iot:device:simulation')")
  173 + public CommonResult<Boolean> simulationDownstreamDevice(
  174 + @Valid @RequestBody IotDeviceSimulationUpstreamReqVO downstreamReqVO) {
  175 + deviceDownstreamService.simulationDeviceDownstream(downstreamReqVO);
159 return success(true); 176 return success(true);
160 } 177 }
161 178
yudao-module-iot/yudao-module-iot-biz/src/main/java/cn/iocoder/yudao/module/iot/controller/admin/device/vo/message/IotDeviceSimulationDownstreamReqVO.java 0 → 100644
  1 +package cn.iocoder.yudao.module.iot.controller.admin.device.vo.message;
  2 +
  3 +import cn.iocoder.yudao.framework.common.validation.InEnum;
  4 +import cn.iocoder.yudao.module.iot.enums.device.IotDeviceMessageTypeEnum;
  5 +import io.swagger.v3.oas.annotations.media.Schema;
  6 +import jakarta.validation.constraints.NotEmpty;
  7 +import jakarta.validation.constraints.NotNull;
  8 +import lombok.Data;
  9 +
  10 +@Schema(description = "管理后台 - IoT 模拟设备下行 Request VO") // 服务调用、属性设置、属性获取等
  11 +@Data
  12 +public class IotDeviceSimulationDownstreamReqVO {
  13 +
  14 + @Schema(description = "设备编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "177")
  15 + @NotNull(message = "设备编号不能为空")
  16 + private Long id;
  17 +
  18 + @Schema(description = "消息类型", requiredMode = Schema.RequiredMode.REQUIRED, example = "property")
  19 + @NotEmpty(message = "消息类型不能为空")
  20 + @InEnum(IotDeviceMessageTypeEnum.class)
  21 + private String type;
  22 +
  23 + @Schema(description = "标识符", requiredMode = Schema.RequiredMode.REQUIRED, example = "report")
  24 + @NotEmpty(message = "标识符不能为空")
  25 + private String identifier; // 参见 IotDeviceMessageIdentifierEnum 枚举类
  26 +
  27 + @Schema(description = "请求参数", requiredMode = Schema.RequiredMode.REQUIRED)
  28 + private Object data; // 例如说:服务调用的 params、属性设置的 properties
  29 +
  30 +}
yudao-module-iot/yudao-module-iot-biz/src/main/java/cn/iocoder/yudao/module/iot/controller/admin/device/vo/device/IotDeviceSimulationReportReqVO.java renamed to yudao-module-iot/yudao-module-iot-biz/src/main/java/cn/iocoder/yudao/module/iot/controller/admin/device/vo/message/IotDeviceSimulationUpstreamReqVO.java
1 -package cn.iocoder.yudao.module.iot.controller.admin.device.vo.device; 1 +package cn.iocoder.yudao.module.iot.controller.admin.device.vo.message;
2 2
3 import cn.iocoder.yudao.framework.common.validation.InEnum; 3 import cn.iocoder.yudao.framework.common.validation.InEnum;
4 import cn.iocoder.yudao.module.iot.enums.device.IotDeviceMessageTypeEnum; 4 import cn.iocoder.yudao.module.iot.enums.device.IotDeviceMessageTypeEnum;
@@ -7,9 +7,9 @@ import jakarta.validation.constraints.NotEmpty; @@ -7,9 +7,9 @@ import jakarta.validation.constraints.NotEmpty;
7 import jakarta.validation.constraints.NotNull; 7 import jakarta.validation.constraints.NotNull;
8 import lombok.Data; 8 import lombok.Data;
9 9
10 -@Schema(description = "管理后台 - IoT 模拟设备上报 Request VO") // 属性上报、事件上报、状态变更等 10 +@Schema(description = "管理后台 - IoT 模拟设备上行 Request VO") // 属性上报、事件上报、状态变更等
11 @Data 11 @Data
12 -public class IotDeviceSimulationReportReqVO { 12 +public class IotDeviceSimulationUpstreamReqVO {
13 13
14 @Schema(description = "设备编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "177") 14 @Schema(description = "设备编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "177")
15 @NotNull(message = "设备编号不能为空") 15 @NotNull(message = "设备编号不能为空")
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; @@ -10,7 +10,7 @@ import cn.iocoder.yudao.module.iot.dal.dataobject.device.IotDeviceDO;
10 import cn.iocoder.yudao.module.iot.enums.device.IotDeviceStateEnum; 10 import cn.iocoder.yudao.module.iot.enums.device.IotDeviceStateEnum;
11 import cn.iocoder.yudao.module.iot.service.device.IotDeviceService; 11 import cn.iocoder.yudao.module.iot.service.device.IotDeviceService;
12 import cn.iocoder.yudao.module.iot.service.device.data.IotDevicePropertyService; 12 import cn.iocoder.yudao.module.iot.service.device.data.IotDevicePropertyService;
13 -import cn.iocoder.yudao.module.iot.service.device.upstream.IotDeviceUpstreamService; 13 +import cn.iocoder.yudao.module.iot.service.device.message.IotDeviceUpstreamService;
14 import jakarta.annotation.Resource; 14 import jakarta.annotation.Resource;
15 import org.springframework.stereotype.Component; 15 import org.springframework.stereotype.Component;
16 16
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; @@ -9,7 +9,7 @@ import cn.iocoder.yudao.module.iot.enums.device.IotDeviceMessageTypeEnum;
9 import cn.iocoder.yudao.module.iot.enums.device.IotDeviceStateEnum; 9 import cn.iocoder.yudao.module.iot.enums.device.IotDeviceStateEnum;
10 import cn.iocoder.yudao.module.iot.mq.message.IotDeviceMessage; 10 import cn.iocoder.yudao.module.iot.mq.message.IotDeviceMessage;
11 import cn.iocoder.yudao.module.iot.service.device.IotDeviceService; 11 import cn.iocoder.yudao.module.iot.service.device.IotDeviceService;
12 -import cn.iocoder.yudao.module.iot.service.device.upstream.IotDeviceUpstreamService; 12 +import cn.iocoder.yudao.module.iot.service.device.message.IotDeviceUpstreamService;
13 import jakarta.annotation.Resource; 13 import jakarta.annotation.Resource;
14 import lombok.extern.slf4j.Slf4j; 14 import lombok.extern.slf4j.Slf4j;
15 import org.springframework.context.event.EventListener; 15 import org.springframework.context.event.EventListener;
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 { @@ -144,11 +144,4 @@ public interface IotDeviceService {
144 */ 144 */
145 IotDeviceImportRespVO importDevice(List<IotDeviceImportExcelVO> importDevices, boolean updateSupport); 145 IotDeviceImportRespVO importDevice(List<IotDeviceImportExcelVO> importDevices, boolean updateSupport);
146 146
147 - /**  
148 - * 模拟设备上报  
149 - *  
150 - * @param reportReqVO 上报信息  
151 - */  
152 - void simulationReportDevice(IotDeviceSimulationReportReqVO reportReqVO);  
153 -  
154 } 147 }
155 \ No newline at end of file 148 \ No newline at end of file
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; @@ -10,18 +10,14 @@ import cn.iocoder.yudao.framework.common.pojo.PageResult;
10 import cn.iocoder.yudao.framework.common.util.object.BeanUtils; 10 import cn.iocoder.yudao.framework.common.util.object.BeanUtils;
11 import cn.iocoder.yudao.framework.common.util.validation.ValidationUtils; 11 import cn.iocoder.yudao.framework.common.util.validation.ValidationUtils;
12 import cn.iocoder.yudao.framework.tenant.core.util.TenantUtils; 12 import cn.iocoder.yudao.framework.tenant.core.util.TenantUtils;
13 -import cn.iocoder.yudao.module.iot.api.device.dto.IotDevicePropertyReportReqDTO;  
14 -import cn.iocoder.yudao.module.iot.api.device.dto.IotDeviceStateUpdateReqDTO;  
15 import cn.iocoder.yudao.module.iot.controller.admin.device.vo.device.*; 13 import cn.iocoder.yudao.module.iot.controller.admin.device.vo.device.*;
16 import cn.iocoder.yudao.module.iot.dal.dataobject.device.IotDeviceDO; 14 import cn.iocoder.yudao.module.iot.dal.dataobject.device.IotDeviceDO;
17 import cn.iocoder.yudao.module.iot.dal.dataobject.device.IotDeviceGroupDO; 15 import cn.iocoder.yudao.module.iot.dal.dataobject.device.IotDeviceGroupDO;
18 import cn.iocoder.yudao.module.iot.dal.dataobject.product.IotProductDO; 16 import cn.iocoder.yudao.module.iot.dal.dataobject.product.IotProductDO;
19 import cn.iocoder.yudao.module.iot.dal.mysql.device.IotDeviceMapper; 17 import cn.iocoder.yudao.module.iot.dal.mysql.device.IotDeviceMapper;
20 import cn.iocoder.yudao.module.iot.dal.redis.RedisKeyConstants; 18 import cn.iocoder.yudao.module.iot.dal.redis.RedisKeyConstants;
21 -import cn.iocoder.yudao.module.iot.enums.device.IotDeviceMessageTypeEnum;  
22 import cn.iocoder.yudao.module.iot.enums.device.IotDeviceStateEnum; 19 import cn.iocoder.yudao.module.iot.enums.device.IotDeviceStateEnum;
23 import cn.iocoder.yudao.module.iot.enums.product.IotProductDeviceTypeEnum; 20 import cn.iocoder.yudao.module.iot.enums.product.IotProductDeviceTypeEnum;
24 -import cn.iocoder.yudao.module.iot.service.device.upstream.IotDeviceUpstreamService;  
25 import cn.iocoder.yudao.module.iot.service.product.IotProductService; 21 import cn.iocoder.yudao.module.iot.service.product.IotProductService;
26 import jakarta.annotation.Resource; 22 import jakarta.annotation.Resource;
27 import jakarta.validation.ConstraintViolationException; 23 import jakarta.validation.ConstraintViolationException;
@@ -59,9 +55,6 @@ public class IotDeviceServiceImpl implements IotDeviceService { @@ -59,9 +55,6 @@ public class IotDeviceServiceImpl implements IotDeviceService {
59 @Resource 55 @Resource
60 @Lazy // 延迟加载,解决循环依赖 56 @Lazy // 延迟加载,解决循环依赖
61 private IotDeviceGroupService deviceGroupService; 57 private IotDeviceGroupService deviceGroupService;
62 - @Resource  
63 - @Lazy // 延迟加载,解决循环依赖  
64 - private IotDeviceUpstreamService deviceUpstreamService;  
65 58
66 @Override 59 @Override
67 public Long createDevice(IotDeviceSaveReqVO createReqVO) { 60 public Long createDevice(IotDeviceSaveReqVO createReqVO) {
@@ -395,38 +388,6 @@ public class IotDeviceServiceImpl implements IotDeviceService { @@ -395,38 +388,6 @@ public class IotDeviceServiceImpl implements IotDeviceService {
395 return respVO; 388 return respVO;
396 } 389 }
397 390
398 - // TODO @芋艿:要不改成 simulationUpstream,原因:里面不只有上报,还有更新状态,那么 upstream 更适合  
399 - @Override  
400 - @SuppressWarnings("unchecked")  
401 - public void simulationReportDevice(IotDeviceSimulationReportReqVO reportReqVO) {  
402 - // 1. 校验存在  
403 - IotDeviceDO device = validateDeviceExists(reportReqVO.getId());  
404 -  
405 - // 2.1 情况一:属性上报  
406 - String requestId = IdUtil.fastSimpleUUID();  
407 - if (Objects.equals(reportReqVO.getType(), IotDeviceMessageTypeEnum.PROPERTY.getType())) {  
408 - deviceUpstreamService.reportDeviceProperty(((IotDevicePropertyReportReqDTO)  
409 - new IotDevicePropertyReportReqDTO().setRequestId(requestId).setReportTime(LocalDateTime.now())  
410 - .setProductKey(device.getProductKey()).setDeviceName(device.getDeviceName()))  
411 - .setProperties((Map<String, Object>) reportReqVO.getData()));  
412 - return;  
413 - }  
414 - // 2.2 情况二:事件上报  
415 - if (Objects.equals(reportReqVO.getType(), IotDeviceMessageTypeEnum.EVENT.getType())) {  
416 - // TODO 芋艿:待实现  
417 - return;  
418 - }  
419 - // 2.3 情况三:状态变更  
420 - if (Objects.equals(reportReqVO.getType(), IotDeviceMessageTypeEnum.STATE.getType())) {  
421 - deviceUpstreamService.updateDeviceState(((IotDeviceStateUpdateReqDTO)  
422 - new IotDeviceStateUpdateReqDTO().setRequestId(IdUtil.fastSimpleUUID()).setReportTime(LocalDateTime.now())  
423 - .setProductKey(device.getProductKey()).setDeviceName(device.getDeviceName()))  
424 - .setState((Integer) reportReqVO.getData()));  
425 - return;  
426 - }  
427 - throw new IllegalArgumentException("未知的类型:" + reportReqVO.getType());  
428 - }  
429 -  
430 private void deleteDeviceCache(IotDeviceDO device) { 391 private void deleteDeviceCache(IotDeviceDO device) {
431 // 保证在 @CacheEvict 之前,忽略租户 392 // 保证在 @CacheEvict 之前,忽略租户
432 TenantUtils.executeIgnore(() -> getSelf().deleteDeviceCache0(device)); 393 TenantUtils.executeIgnore(() -> getSelf().deleteDeviceCache0(device));
yudao-module-iot/yudao-module-iot-biz/src/main/java/cn/iocoder/yudao/module/iot/service/device/message/IotDeviceDownstreamService.java 0 → 100644
  1 +package cn.iocoder.yudao.module.iot.service.device.message;
  2 +
  3 +import cn.iocoder.yudao.module.iot.controller.admin.device.vo.message.IotDeviceSimulationUpstreamReqVO;
  4 +import jakarta.validation.Valid;
  5 +
  6 +/**
  7 + * 设备下行 Service 接口
  8 + *
  9 + * 目的:服务端 -> 插件 -> 设备
  10 + *
  11 + * @author 芋道源码
  12 + */
  13 +public interface IotDeviceDownstreamService {
  14 +
  15 + /**
  16 + * 模拟设备下行
  17 + *
  18 + * @param downstreamReqVO 设备下行请求 VO
  19 + */
  20 + void simulationDeviceDownstream(@Valid IotDeviceSimulationUpstreamReqVO downstreamReqVO);
  21 +
  22 +}
yudao-module-iot/yudao-module-iot-biz/src/main/java/cn/iocoder/yudao/module/iot/service/device/message/IotDeviceDownstreamServiceImpl.java 0 → 100644
  1 +package cn.iocoder.yudao.module.iot.service.device.message;
  2 +
  3 +import cn.iocoder.yudao.module.iot.controller.admin.device.vo.message.IotDeviceSimulationUpstreamReqVO;
  4 +import lombok.extern.slf4j.Slf4j;
  5 +import org.springframework.stereotype.Service;
  6 +import org.springframework.validation.annotation.Validated;
  7 +
  8 +/**
  9 + * 设备下行 Service 实现类
  10 + *
  11 + * @author 芋道源码
  12 + */
  13 +@Service
  14 +@Validated
  15 +@Slf4j
  16 +public class IotDeviceDownstreamServiceImpl implements IotDeviceDownstreamService {
  17 +
  18 + @Override
  19 + public void simulationDeviceDownstream(IotDeviceSimulationUpstreamReqVO downstreamReqVO) {
  20 +
  21 + }
  22 +
  23 +}
yudao-module-iot/yudao-module-iot-biz/src/main/java/cn/iocoder/yudao/module/iot/service/device/upstream/IotDeviceUpstreamService.java renamed to yudao-module-iot/yudao-module-iot-biz/src/main/java/cn/iocoder/yudao/module/iot/service/device/message/IotDeviceUpstreamService.java
1 -package cn.iocoder.yudao.module.iot.service.device.upstream; 1 +package cn.iocoder.yudao.module.iot.service.device.message;
2 2
3 import cn.iocoder.yudao.module.iot.api.device.dto.IotDeviceEventReportReqDTO; 3 import cn.iocoder.yudao.module.iot.api.device.dto.IotDeviceEventReportReqDTO;
4 import cn.iocoder.yudao.module.iot.api.device.dto.IotDevicePropertyReportReqDTO; 4 import cn.iocoder.yudao.module.iot.api.device.dto.IotDevicePropertyReportReqDTO;
5 import cn.iocoder.yudao.module.iot.api.device.dto.IotDeviceStateUpdateReqDTO; 5 import cn.iocoder.yudao.module.iot.api.device.dto.IotDeviceStateUpdateReqDTO;
  6 +import cn.iocoder.yudao.module.iot.controller.admin.device.vo.message.IotDeviceSimulationUpstreamReqVO;
  7 +import jakarta.validation.Valid;
6 8
7 /** 9 /**
8 * 设备上行 Service 接口 10 * 设备上行 Service 接口
@@ -14,6 +16,13 @@ import cn.iocoder.yudao.module.iot.api.device.dto.IotDeviceStateUpdateReqDTO; @@ -14,6 +16,13 @@ import cn.iocoder.yudao.module.iot.api.device.dto.IotDeviceStateUpdateReqDTO;
14 public interface IotDeviceUpstreamService { 16 public interface IotDeviceUpstreamService {
15 17
16 /** 18 /**
  19 + * 模拟设备上行
  20 + *
  21 + * @param simulatorReqVO 设备上行请求 VO
  22 + */
  23 + void simulationDeviceUpstream(@Valid IotDeviceSimulationUpstreamReqVO simulatorReqVO);
  24 +
  25 + /**
17 * 更新设备状态 26 * 更新设备状态
18 * 27 *
19 * @param updateReqDTO 更新设备状态 DTO 28 * @param updateReqDTO 更新设备状态 DTO
yudao-module-iot/yudao-module-iot-biz/src/main/java/cn/iocoder/yudao/module/iot/service/device/upstream/IotDeviceUpstreamServiceImpl.java renamed to yudao-module-iot/yudao-module-iot-biz/src/main/java/cn/iocoder/yudao/module/iot/service/device/message/IotDeviceUpstreamServiceImpl.java
1 -package cn.iocoder.yudao.module.iot.service.device.upstream; 1 +package cn.iocoder.yudao.module.iot.service.device.message;
2 2
3 import cn.hutool.core.lang.Assert; 3 import cn.hutool.core.lang.Assert;
4 import cn.hutool.core.util.IdUtil; 4 import cn.hutool.core.util.IdUtil;
@@ -11,6 +11,7 @@ import cn.iocoder.yudao.module.iot.api.device.dto.IotDeviceEventReportReqDTO; @@ -11,6 +11,7 @@ import cn.iocoder.yudao.module.iot.api.device.dto.IotDeviceEventReportReqDTO;
11 import cn.iocoder.yudao.module.iot.api.device.dto.IotDevicePropertyReportReqDTO; 11 import cn.iocoder.yudao.module.iot.api.device.dto.IotDevicePropertyReportReqDTO;
12 import cn.iocoder.yudao.module.iot.api.device.dto.IotDeviceStateUpdateReqDTO; 12 import cn.iocoder.yudao.module.iot.api.device.dto.IotDeviceStateUpdateReqDTO;
13 import cn.iocoder.yudao.module.iot.api.device.dto.IotDeviceUpstreamAbstractReqDTO; 13 import cn.iocoder.yudao.module.iot.api.device.dto.IotDeviceUpstreamAbstractReqDTO;
  14 +import cn.iocoder.yudao.module.iot.controller.admin.device.vo.message.IotDeviceSimulationUpstreamReqVO;
14 import cn.iocoder.yudao.module.iot.dal.dataobject.device.IotDeviceDO; 15 import cn.iocoder.yudao.module.iot.dal.dataobject.device.IotDeviceDO;
15 import cn.iocoder.yudao.module.iot.enums.device.IotDeviceMessageIdentifierEnum; 16 import cn.iocoder.yudao.module.iot.enums.device.IotDeviceMessageIdentifierEnum;
16 import cn.iocoder.yudao.module.iot.enums.device.IotDeviceMessageTypeEnum; 17 import cn.iocoder.yudao.module.iot.enums.device.IotDeviceMessageTypeEnum;
@@ -25,6 +26,7 @@ import org.springframework.stereotype.Service; @@ -25,6 +26,7 @@ import org.springframework.stereotype.Service;
25 import org.springframework.validation.annotation.Validated; 26 import org.springframework.validation.annotation.Validated;
26 27
27 import java.time.LocalDateTime; 28 import java.time.LocalDateTime;
  29 +import java.util.Map;
28 import java.util.Objects; 30 import java.util.Objects;
29 31
30 /** 32 /**
@@ -46,6 +48,37 @@ public class IotDeviceUpstreamServiceImpl implements IotDeviceUpstreamService { @@ -46,6 +48,37 @@ public class IotDeviceUpstreamServiceImpl implements IotDeviceUpstreamService {
46 private IotDeviceProducer deviceProducer; 48 private IotDeviceProducer deviceProducer;
47 49
48 @Override 50 @Override
  51 + @SuppressWarnings("unchecked")
  52 + public void simulationDeviceUpstream(IotDeviceSimulationUpstreamReqVO simulatorReqVO) {
  53 + // 1. 校验存在
  54 + IotDeviceDO device = deviceService.validateDeviceExists(simulatorReqVO.getId());
  55 +
  56 + // 2.1 情况一:属性上报
  57 + String requestId = IdUtil.fastSimpleUUID();
  58 + if (Objects.equals(simulatorReqVO.getType(), IotDeviceMessageTypeEnum.PROPERTY.getType())) {
  59 + reportDeviceProperty(((IotDevicePropertyReportReqDTO)
  60 + new IotDevicePropertyReportReqDTO().setRequestId(requestId).setReportTime(LocalDateTime.now())
  61 + .setProductKey(device.getProductKey()).setDeviceName(device.getDeviceName()))
  62 + .setProperties((Map<String, Object>) simulatorReqVO.getData()));
  63 + return;
  64 + }
  65 + // 2.2 情况二:事件上报
  66 + if (Objects.equals(simulatorReqVO.getType(), IotDeviceMessageTypeEnum.EVENT.getType())) {
  67 + // TODO 芋艿:待实现
  68 + return;
  69 + }
  70 + // 2.3 情况三:状态变更
  71 + if (Objects.equals(simulatorReqVO.getType(), IotDeviceMessageTypeEnum.STATE.getType())) {
  72 + updateDeviceState(((IotDeviceStateUpdateReqDTO)
  73 + new IotDeviceStateUpdateReqDTO().setRequestId(IdUtil.fastSimpleUUID()).setReportTime(LocalDateTime.now())
  74 + .setProductKey(device.getProductKey()).setDeviceName(device.getDeviceName()))
  75 + .setState((Integer) simulatorReqVO.getData()));
  76 + return;
  77 + }
  78 + throw new IllegalArgumentException("未知的类型:" + simulatorReqVO.getType());
  79 + }
  80 +
  81 + @Override
49 public void updateDeviceState(IotDeviceStateUpdateReqDTO updateReqDTO) { 82 public void updateDeviceState(IotDeviceStateUpdateReqDTO updateReqDTO) {
50 Assert.isTrue(ObjectUtils.equalsAny(updateReqDTO.getState(), 83 Assert.isTrue(ObjectUtils.equalsAny(updateReqDTO.getState(),
51 IotDeviceStateEnum.ONLINE.getState(), IotDeviceStateEnum.OFFLINE.getState()), 84 IotDeviceStateEnum.ONLINE.getState(), IotDeviceStateEnum.OFFLINE.getState()),