Commit f5f8c418dcde92e70b15292af2b0a2636074bf16

Authored by YunaiV
1 parent f6366d9b

【功能新增】IoT:设备状态上传的部分实现

Showing 14 changed files with 96 additions and 52 deletions
yudao-module-iot/yudao-module-iot-api/pom.xml
@@ -12,6 +12,7 @@ @@ -12,6 +12,7 @@
12 <packaging>jar</packaging> 12 <packaging>jar</packaging>
13 13
14 <name>${project.artifactId}</name> 14 <name>${project.artifactId}</name>
  15 + <!-- TODO 芋艿:需要在整理下,特别是 PF4J -->
15 <description> 16 <description>
16 物联网 模块 API,暴露给其它模块调用 17 物联网 模块 API,暴露给其它模块调用
17 </description> 18 </description>
@@ -42,6 +43,13 @@ @@ -42,6 +43,13 @@
42 </exclusions> 43 </exclusions>
43 </dependency> 44 </dependency>
44 45
  46 + <!-- 工具类相关 -->
  47 + <dependency>
  48 + <groupId>com.fasterxml.jackson.core</groupId>
  49 + <artifactId>jackson-databind</artifactId>
  50 + <scope>provided</scope> <!-- 设置为 provided,只有工具类需要使用到 -->
  51 + </dependency>
  52 +
45 <!-- 参数校验 --> 53 <!-- 参数校验 -->
46 <dependency> 54 <dependency>
47 <groupId>org.springframework.boot</groupId> 55 <groupId>org.springframework.boot</groupId>
yudao-module-iot/yudao-module-iot-api/src/main/java/cn/iocoder/yudao/module/iot/api/device/IotDeviceUpstreamApi.java
@@ -3,11 +3,10 @@ package cn.iocoder.yudao.module.iot.api.device; @@ -3,11 +3,10 @@ package cn.iocoder.yudao.module.iot.api.device;
3 import cn.iocoder.yudao.framework.common.pojo.CommonResult; 3 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.IotDeviceStatusUpdateReqDTO; 6 +import cn.iocoder.yudao.module.iot.api.device.dto.IotDeviceStateUpdateReqDTO;
7 import cn.iocoder.yudao.module.iot.enums.ApiConstants; 7 import cn.iocoder.yudao.module.iot.enums.ApiConstants;
8 import jakarta.validation.Valid; 8 import jakarta.validation.Valid;
9 import org.springframework.web.bind.annotation.PostMapping; 9 import org.springframework.web.bind.annotation.PostMapping;
10 -import org.springframework.web.bind.annotation.PutMapping;  
11 import org.springframework.web.bind.annotation.RequestBody; 10 import org.springframework.web.bind.annotation.RequestBody;
12 11
13 /** 12 /**
@@ -26,8 +25,8 @@ public interface IotDeviceUpstreamApi { @@ -26,8 +25,8 @@ public interface IotDeviceUpstreamApi {
26 * 25 *
27 * @param updateReqDTO 更新设备状态 DTO 26 * @param updateReqDTO 更新设备状态 DTO
28 */ 27 */
29 - @PutMapping(PREFIX + "/update-status")  
30 - CommonResult<Boolean> updateDeviceStatus(@Valid @RequestBody IotDeviceStatusUpdateReqDTO updateReqDTO); 28 + @PostMapping(PREFIX + "/update-state")
  29 + CommonResult<Boolean> updateDeviceState(@Valid @RequestBody IotDeviceStateUpdateReqDTO updateReqDTO);
31 30
32 /** 31 /**
33 * 上报设备属性数据 32 * 上报设备属性数据
yudao-module-iot/yudao-module-iot-api/src/main/java/cn/iocoder/yudao/module/iot/api/device/dto/IotDeviceEventReportReqDTO.java
@@ -2,8 +2,6 @@ package cn.iocoder.yudao.module.iot.api.device.dto; @@ -2,8 +2,6 @@ package cn.iocoder.yudao.module.iot.api.device.dto;
2 2
3 import jakarta.validation.constraints.NotEmpty; 3 import jakarta.validation.constraints.NotEmpty;
4 import lombok.Data; 4 import lombok.Data;
5 -import lombok.NoArgsConstructor;  
6 -import lombok.experimental.SuperBuilder;  
7 5
8 import java.util.Map; 6 import java.util.Map;
9 7
@@ -11,8 +9,6 @@ import java.util.Map; @@ -11,8 +9,6 @@ import java.util.Map;
11 * IoT 设备【事件】数据上报 Request DTO 9 * IoT 设备【事件】数据上报 Request DTO
12 */ 10 */
13 @Data 11 @Data
14 -@SuperBuilder  
15 -@NoArgsConstructor  
16 public class IotDeviceEventReportReqDTO extends IotDeviceUpstreamAbstractReqDTO { 12 public class IotDeviceEventReportReqDTO extends IotDeviceUpstreamAbstractReqDTO {
17 13
18 /** 14 /**
yudao-module-iot/yudao-module-iot-api/src/main/java/cn/iocoder/yudao/module/iot/api/device/dto/IotDevicePropertyReportReqDTO.java
@@ -2,8 +2,6 @@ package cn.iocoder.yudao.module.iot.api.device.dto; @@ -2,8 +2,6 @@ package cn.iocoder.yudao.module.iot.api.device.dto;
2 2
3 import jakarta.validation.constraints.NotEmpty; 3 import jakarta.validation.constraints.NotEmpty;
4 import lombok.Data; 4 import lombok.Data;
5 -import lombok.NoArgsConstructor;  
6 -import lombok.experimental.SuperBuilder;  
7 5
8 import java.util.Map; 6 import java.util.Map;
9 7
@@ -11,8 +9,6 @@ import java.util.Map; @@ -11,8 +9,6 @@ import java.util.Map;
11 * IoT 设备【属性】数据上报 Request DTO 9 * IoT 设备【属性】数据上报 Request DTO
12 */ 10 */
13 @Data 11 @Data
14 -@SuperBuilder  
15 -@NoArgsConstructor  
16 public class IotDevicePropertyReportReqDTO extends IotDeviceUpstreamAbstractReqDTO { 12 public class IotDevicePropertyReportReqDTO extends IotDeviceUpstreamAbstractReqDTO {
17 13
18 /** 14 /**
yudao-module-iot/yudao-module-iot-api/src/main/java/cn/iocoder/yudao/module/iot/api/device/dto/IotDeviceStatusUpdateReqDTO.java renamed to yudao-module-iot/yudao-module-iot-api/src/main/java/cn/iocoder/yudao/module/iot/api/device/dto/IotDeviceStateUpdateReqDTO.java
@@ -2,24 +2,20 @@ package cn.iocoder.yudao.module.iot.api.device.dto; @@ -2,24 +2,20 @@ package cn.iocoder.yudao.module.iot.api.device.dto;
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.IotDeviceStateEnum; 4 import cn.iocoder.yudao.module.iot.enums.device.IotDeviceStateEnum;
5 -import jakarta.validation.constraints.NotEmpty; 5 +import jakarta.validation.constraints.NotNull;
6 import lombok.Data; 6 import lombok.Data;
7 -import lombok.NoArgsConstructor;  
8 -import lombok.experimental.SuperBuilder;  
9 7
10 /** 8 /**
11 * IoT 设备状态更新 Request DTO 9 * IoT 设备状态更新 Request DTO
12 */ 10 */
13 @Data 11 @Data
14 -@SuperBuilder  
15 -@NoArgsConstructor  
16 -public class IotDeviceStatusUpdateReqDTO extends IotDeviceUpstreamAbstractReqDTO { 12 +public class IotDeviceStateUpdateReqDTO extends IotDeviceUpstreamAbstractReqDTO {
17 13
18 /** 14 /**
19 * 设备状态 15 * 设备状态
20 */ 16 */
21 - @NotEmpty(message = "设备状态不能为空") 17 + @NotNull(message = "设备状态不能为空")
22 @InEnum(IotDeviceStateEnum.class) // 只使用:在线、离线 18 @InEnum(IotDeviceStateEnum.class) // 只使用:在线、离线
23 - private Integer status; 19 + private Integer state;
24 20
25 } 21 }
yudao-module-iot/yudao-module-iot-api/src/main/java/cn/iocoder/yudao/module/iot/api/device/dto/IotDeviceUpstreamAbstractReqDTO.java
1 package cn.iocoder.yudao.module.iot.api.device.dto; 1 package cn.iocoder.yudao.module.iot.api.device.dto;
2 2
  3 +import cn.iocoder.yudao.framework.common.util.json.databind.TimestampLocalDateTimeSerializer;
  4 +import com.fasterxml.jackson.databind.annotation.JsonSerialize;
3 import jakarta.validation.constraints.NotEmpty; 5 import jakarta.validation.constraints.NotEmpty;
4 import lombok.Data; 6 import lombok.Data;
5 -import lombok.NoArgsConstructor;  
6 -import lombok.experimental.SuperBuilder;  
7 7
8 import java.time.LocalDateTime; 8 import java.time.LocalDateTime;
9 9
@@ -13,8 +13,6 @@ import java.time.LocalDateTime; @@ -13,8 +13,6 @@ import java.time.LocalDateTime;
13 * @author 芋道源码 13 * @author 芋道源码
14 */ 14 */
15 @Data 15 @Data
16 -@SuperBuilder  
17 -@NoArgsConstructor  
18 public abstract class IotDeviceUpstreamAbstractReqDTO { 16 public abstract class IotDeviceUpstreamAbstractReqDTO {
19 17
20 /** 18 /**
@@ -41,6 +39,7 @@ public abstract class IotDeviceUpstreamAbstractReqDTO { @@ -41,6 +39,7 @@ public abstract class IotDeviceUpstreamAbstractReqDTO {
41 /** 39 /**
42 * 上报时间 40 * 上报时间
43 */ 41 */
  42 + @JsonSerialize(using = TimestampLocalDateTimeSerializer.class) // 解决 iot plugins 序列化 LocalDateTime 是数组,导致无法解析的问题
44 private LocalDateTime reportTime; 43 private LocalDateTime reportTime;
45 44
46 } 45 }
yudao-module-iot/yudao-module-iot-api/src/main/java/cn/iocoder/yudao/module/iot/enums/device/IotDeviceMessageIdentifierEnum.java
@@ -12,7 +12,11 @@ public enum IotDeviceMessageIdentifierEnum { @@ -12,7 +12,11 @@ public enum IotDeviceMessageIdentifierEnum {
12 12
13 PROPERTY_GET("get"), 13 PROPERTY_GET("get"),
14 PROPERTY_SET("set"), 14 PROPERTY_SET("set"),
15 - PROPERTY_REPORT("report"); 15 + PROPERTY_REPORT("report"),
  16 +
  17 + STATE_ONLINE("online"),
  18 + STATE_OFFLINE("offline");
  19 +
16 20
17 /** 21 /**
18 * 标志符 22 * 标志符
yudao-module-iot/yudao-module-iot-biz/src/main/java/cn/iocoder/yudao/module/iot/api/device/IoTDeviceUpstreamApiImpl.java
@@ -3,7 +3,7 @@ package cn.iocoder.yudao.module.iot.api.device; @@ -3,7 +3,7 @@ package cn.iocoder.yudao.module.iot.api.device;
3 import cn.iocoder.yudao.framework.common.pojo.CommonResult; 3 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.IotDeviceStatusUpdateReqDTO; 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.upstream.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;
@@ -23,8 +23,8 @@ public class IoTDeviceUpstreamApiImpl implements IotDeviceUpstreamApi { @@ -23,8 +23,8 @@ public class IoTDeviceUpstreamApiImpl implements IotDeviceUpstreamApi {
23 private IotDeviceUpstreamService deviceUpstreamService; 23 private IotDeviceUpstreamService deviceUpstreamService;
24 24
25 @Override 25 @Override
26 - public CommonResult<Boolean> updateDeviceStatus(IotDeviceStatusUpdateReqDTO updateReqDTO) {  
27 - deviceUpstreamService.updateDeviceStatus(updateReqDTO); 26 + public CommonResult<Boolean> updateDeviceState(IotDeviceStateUpdateReqDTO updateReqDTO) {
  27 + deviceUpstreamService.updateDeviceState(updateReqDTO);
28 return success(true); 28 return success(true);
29 } 29 }
30 30
yudao-module-iot/yudao-module-iot-biz/src/main/java/cn/iocoder/yudao/module/iot/emq/service/EmqxServiceImpl.java
1 package cn.iocoder.yudao.module.iot.emq.service; 1 package cn.iocoder.yudao.module.iot.emq.service;
2 2
3 -import cn.iocoder.yudao.module.iot.api.device.dto.IotDevicePropertyReportReqDTO;  
4 import cn.iocoder.yudao.module.iot.service.device.data.IotDevicePropertyService; 3 import cn.iocoder.yudao.module.iot.service.device.data.IotDevicePropertyService;
5 import jakarta.annotation.Resource; 4 import jakarta.annotation.Resource;
6 import lombok.extern.slf4j.Slf4j; 5 import lombok.extern.slf4j.Slf4j;
@@ -34,11 +33,11 @@ public class EmqxServiceImpl implements EmqxService { @@ -34,11 +33,11 @@ public class EmqxServiceImpl implements EmqxService {
34 String productKey = topic.split("/")[2]; 33 String productKey = topic.split("/")[2];
35 String deviceName = topic.split("/")[3]; 34 String deviceName = topic.split("/")[3];
36 String message = new String(mqttMessage.getPayload()); 35 String message = new String(mqttMessage.getPayload());
37 - IotDevicePropertyReportReqDTO createDTO = IotDevicePropertyReportReqDTO.builder() 36 +// IotDevicePropertyReportReqDTO createDTO = IotDevicePropertyReportReqDTO.builder()
38 // .productKey(productKey) 37 // .productKey(productKey)
39 // .deviceName(deviceName) 38 // .deviceName(deviceName)
40 // .properties(message) // TODO 芋艿:临时去掉,看看 39 // .properties(message) // TODO 芋艿:临时去掉,看看
41 - .build(); 40 +// .build();
42 // iotDeviceDataService.saveDeviceProperty(createDTO); 41 // iotDeviceDataService.saveDeviceProperty(createDTO);
43 } 42 }
44 } 43 }
yudao-module-iot/yudao-module-iot-biz/src/main/java/cn/iocoder/yudao/module/iot/service/device/IotDeviceServiceImpl.java
@@ -395,10 +395,10 @@ public class IotDeviceServiceImpl implements IotDeviceService { @@ -395,10 +395,10 @@ public class IotDeviceServiceImpl implements IotDeviceService {
395 // 2.1 情况一:属性上报 395 // 2.1 情况一:属性上报
396 String requestId = IdUtil.fastSimpleUUID(); 396 String requestId = IdUtil.fastSimpleUUID();
397 if (Objects.equals(reportReqVO.getType(), IotDeviceMessageTypeEnum.PROPERTY.getType())) { 397 if (Objects.equals(reportReqVO.getType(), IotDeviceMessageTypeEnum.PROPERTY.getType())) {
398 - deviceUpstreamService.reportDeviceProperty(IotDevicePropertyReportReqDTO.builder()  
399 - .requestId(requestId).reportTime(LocalDateTime.now())  
400 - .productKey(device.getProductKey()).deviceName(device.getDeviceName())  
401 - .properties((Map<String, Object>) reportReqVO.getData()).build()); 398 + deviceUpstreamService.reportDeviceProperty(((IotDevicePropertyReportReqDTO)
  399 + new IotDevicePropertyReportReqDTO().setRequestId(requestId).setReportTime(LocalDateTime.now())
  400 + .setProductKey(device.getProductKey()).setDeviceName(device.getDeviceName()))
  401 + .setProperties((Map<String, Object>) reportReqVO.getData()));
402 return; 402 return;
403 } 403 }
404 // 2.2 情况二:事件上报 404 // 2.2 情况二:事件上报
yudao-module-iot/yudao-module-iot-biz/src/main/java/cn/iocoder/yudao/module/iot/service/device/upstream/IotDeviceUpstreamService.java
@@ -2,7 +2,7 @@ package cn.iocoder.yudao.module.iot.service.device.upstream; @@ -2,7 +2,7 @@ package cn.iocoder.yudao.module.iot.service.device.upstream;
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.IotDeviceStatusUpdateReqDTO; 5 +import cn.iocoder.yudao.module.iot.api.device.dto.IotDeviceStateUpdateReqDTO;
6 6
7 /** 7 /**
8 * 设备上行 Service 接口 8 * 设备上行 Service 接口
@@ -18,7 +18,7 @@ public interface IotDeviceUpstreamService { @@ -18,7 +18,7 @@ public interface IotDeviceUpstreamService {
18 * 18 *
19 * @param updateReqDTO 更新设备状态 DTO 19 * @param updateReqDTO 更新设备状态 DTO
20 */ 20 */
21 - void updateDeviceStatus(IotDeviceStatusUpdateReqDTO updateReqDTO); 21 + void updateDeviceState(IotDeviceStateUpdateReqDTO updateReqDTO);
22 22
23 /** 23 /**
24 * 上报设备属性数据 24 * 上报设备属性数据
yudao-module-iot/yudao-module-iot-biz/src/main/java/cn/iocoder/yudao/module/iot/service/device/upstream/IotDeviceUpstreamServiceImpl.java
1 package cn.iocoder.yudao.module.iot.service.device.upstream; 1 package cn.iocoder.yudao.module.iot.service.device.upstream;
2 2
  3 +import cn.hutool.core.lang.Assert;
3 import cn.hutool.core.util.IdUtil; 4 import cn.hutool.core.util.IdUtil;
  5 +import cn.hutool.core.util.ObjUtil;
4 import cn.hutool.core.util.StrUtil; 6 import cn.hutool.core.util.StrUtil;
5 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.common.util.object.ObjectUtils;
  9 +import cn.iocoder.yudao.framework.tenant.core.util.TenantUtils;
6 import cn.iocoder.yudao.module.iot.api.device.dto.IotDeviceEventReportReqDTO; 10 import cn.iocoder.yudao.module.iot.api.device.dto.IotDeviceEventReportReqDTO;
7 import cn.iocoder.yudao.module.iot.api.device.dto.IotDevicePropertyReportReqDTO; 11 import cn.iocoder.yudao.module.iot.api.device.dto.IotDevicePropertyReportReqDTO;
8 -import cn.iocoder.yudao.module.iot.api.device.dto.IotDeviceStatusUpdateReqDTO; 12 +import cn.iocoder.yudao.module.iot.api.device.dto.IotDeviceStateUpdateReqDTO;
9 import cn.iocoder.yudao.module.iot.api.device.dto.IotDeviceUpstreamAbstractReqDTO; 13 import cn.iocoder.yudao.module.iot.api.device.dto.IotDeviceUpstreamAbstractReqDTO;
10 import cn.iocoder.yudao.module.iot.dal.dataobject.device.IotDeviceDO; 14 import cn.iocoder.yudao.module.iot.dal.dataobject.device.IotDeviceDO;
11 import cn.iocoder.yudao.module.iot.enums.device.IotDeviceMessageIdentifierEnum; 15 import cn.iocoder.yudao.module.iot.enums.device.IotDeviceMessageIdentifierEnum;
12 import cn.iocoder.yudao.module.iot.enums.device.IotDeviceMessageTypeEnum; 16 import cn.iocoder.yudao.module.iot.enums.device.IotDeviceMessageTypeEnum;
  17 +import cn.iocoder.yudao.module.iot.enums.device.IotDeviceStateEnum;
13 import cn.iocoder.yudao.module.iot.mq.message.IotDeviceMessage; 18 import cn.iocoder.yudao.module.iot.mq.message.IotDeviceMessage;
14 import cn.iocoder.yudao.module.iot.mq.producer.device.IotDeviceProducer; 19 import cn.iocoder.yudao.module.iot.mq.producer.device.IotDeviceProducer;
15 import cn.iocoder.yudao.module.iot.service.device.IotDeviceService; 20 import cn.iocoder.yudao.module.iot.service.device.IotDeviceService;
@@ -19,6 +24,7 @@ import org.springframework.stereotype.Service; @@ -19,6 +24,7 @@ import org.springframework.stereotype.Service;
19 import org.springframework.validation.annotation.Validated; 24 import org.springframework.validation.annotation.Validated;
20 25
21 import java.time.LocalDateTime; 26 import java.time.LocalDateTime;
  27 +import java.util.Objects;
22 28
23 /** 29 /**
24 * 设备上行 Service 实现类 30 * 设备上行 Service 实现类
@@ -37,9 +43,39 @@ public class IotDeviceUpstreamServiceImpl implements IotDeviceUpstreamService { @@ -37,9 +43,39 @@ public class IotDeviceUpstreamServiceImpl implements IotDeviceUpstreamService {
37 private IotDeviceProducer deviceProducer; 43 private IotDeviceProducer deviceProducer;
38 44
39 @Override 45 @Override
40 - public void updateDeviceStatus(IotDeviceStatusUpdateReqDTO updateReqDTO) {  
41 - log.info("[updateDeviceStatus][更新设备状态: {}]", updateReqDTO);  
42 - // TODO 芋艿:插件状态 46 + public void updateDeviceState(IotDeviceStateUpdateReqDTO updateReqDTO) {
  47 + Assert.isTrue(ObjectUtils.equalsAny(updateReqDTO.getState(),
  48 + IotDeviceStateEnum.ONLINE.getState(), IotDeviceStateEnum.OFFLINE.getState()),
  49 + "状态不合法");
  50 + // 1.1 获得设备
  51 + log.info("[updateDeviceState][更新设备状态: {}]", updateReqDTO);
  52 + IotDeviceDO device = deviceService.getDeviceByProductKeyAndDeviceNameFromCache(
  53 + updateReqDTO.getProductKey(), updateReqDTO.getDeviceName());
  54 + if (device == null) {
  55 + log.error("[updateDeviceState][设备({}/{}) 不存在]",
  56 + updateReqDTO.getProductKey(), updateReqDTO.getDeviceName());
  57 + return;
  58 + }
  59 + // 1.2 记录设备的最后时间
  60 + updateDeviceLastTime(device, updateReqDTO);
  61 + // 1.3 当前状态一致,不处理
  62 + if (Objects.equals(device.getState(), updateReqDTO.getState())) {
  63 + return;
  64 + }
  65 +
  66 + // 2. 更新设备状态
  67 + TenantUtils.executeIgnore(() ->
  68 + deviceService.updateDeviceState(device.getId(), updateReqDTO.getState()));
  69 +
  70 + // 3. TODO 芋艿:子设备的关联
  71 +
  72 + // 4. 发送设备消息
  73 + IotDeviceMessage message = BeanUtils.toBean(updateReqDTO, IotDeviceMessage.class)
  74 + .setType(IotDeviceMessageTypeEnum.STATE.getType())
  75 + .setIdentifier(ObjUtil.equals(updateReqDTO.getState(), IotDeviceStateEnum.ONLINE.getState())
  76 + ? IotDeviceMessageIdentifierEnum.STATE_ONLINE.getIdentifier()
  77 + : IotDeviceMessageIdentifierEnum.STATE_OFFLINE.getIdentifier());
  78 + sendDeviceMessage(message, device);
43 } 79 }
44 80
45 @Override 81 @Override
yudao-module-iot/yudao-module-iot-plugins/yudao-module-iot-plugin-common/src/main/java/cn/iocoder/yudao/module/iot/plugin/common/api/DeviceDataApiClient.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.IotDeviceUpstreamApi; 4 import cn.iocoder.yudao.module.iot.api.device.IotDeviceUpstreamApi;
5 import cn.iocoder.yudao.module.iot.api.device.dto.IotDeviceEventReportReqDTO; 5 import cn.iocoder.yudao.module.iot.api.device.dto.IotDeviceEventReportReqDTO;
6 import cn.iocoder.yudao.module.iot.api.device.dto.IotDevicePropertyReportReqDTO; 6 import cn.iocoder.yudao.module.iot.api.device.dto.IotDevicePropertyReportReqDTO;
7 -import cn.iocoder.yudao.module.iot.api.device.dto.IotDeviceStatusUpdateReqDTO; 7 +import cn.iocoder.yudao.module.iot.api.device.dto.IotDeviceStateUpdateReqDTO;
8 import lombok.extern.slf4j.Slf4j; 8 import lombok.extern.slf4j.Slf4j;
9 import org.springframework.web.client.RestTemplate; 9 import org.springframework.web.client.RestTemplate;
10 10
@@ -29,9 +29,9 @@ public class DeviceDataApiClient implements IotDeviceUpstreamApi { @@ -29,9 +29,9 @@ public class DeviceDataApiClient implements IotDeviceUpstreamApi {
29 29
30 // TODO @haohao:返回结果,不用 CommonResult 哈。 30 // TODO @haohao:返回结果,不用 CommonResult 哈。
31 @Override 31 @Override
32 - public CommonResult<Boolean> updateDeviceStatus(IotDeviceStatusUpdateReqDTO updateReqDTO) {  
33 - String url = deviceDataUrl + URL_PREFIX + "/update-status";  
34 - return doPost(url, updateReqDTO, "updateDeviceStatus"); 32 + public CommonResult<Boolean> updateDeviceState(IotDeviceStateUpdateReqDTO updateReqDTO) {
  33 + String url = deviceDataUrl + URL_PREFIX + "/update-state";
  34 + return doPost(url, updateReqDTO, "updateDeviceState");
35 } 35 }
36 36
37 @Override 37 @Override
yudao-module-iot/yudao-module-iot-plugins/yudao-module-iot-plugin-http/src/main/java/cn/iocoder/yudao/module/iot/plugin/http/service/HttpVertxHandler.java
1 package cn.iocoder.yudao.module.iot.plugin.http.service; 1 package cn.iocoder.yudao.module.iot.plugin.http.service;
2 2
  3 +import cn.hutool.core.util.IdUtil;
3 import cn.hutool.json.JSONObject; 4 import cn.hutool.json.JSONObject;
4 import cn.hutool.json.JSONUtil; 5 import cn.hutool.json.JSONUtil;
5 import cn.iocoder.yudao.module.iot.api.device.IotDeviceUpstreamApi; 6 import cn.iocoder.yudao.module.iot.api.device.IotDeviceUpstreamApi;
6 import cn.iocoder.yudao.module.iot.api.device.dto.IotDevicePropertyReportReqDTO; 7 import cn.iocoder.yudao.module.iot.api.device.dto.IotDevicePropertyReportReqDTO;
  8 +import cn.iocoder.yudao.module.iot.api.device.dto.IotDeviceStateUpdateReqDTO;
  9 +import cn.iocoder.yudao.module.iot.enums.device.IotDeviceStateEnum;
7 import io.vertx.core.Handler; 10 import io.vertx.core.Handler;
8 import io.vertx.ext.web.RequestBody; 11 import io.vertx.ext.web.RequestBody;
9 import io.vertx.ext.web.RoutingContext; 12 import io.vertx.ext.web.RoutingContext;
10 import lombok.extern.slf4j.Slf4j; 13 import lombok.extern.slf4j.Slf4j;
11 14
  15 +import java.time.LocalDateTime;
12 import java.util.Map; 16 import java.util.Map;
13 17
14 @Slf4j 18 @Slf4j
@@ -43,20 +47,27 @@ public class HttpVertxHandler implements Handler&lt;RoutingContext&gt; { @@ -43,20 +47,27 @@ public class HttpVertxHandler implements Handler&lt;RoutingContext&gt; {
43 String id = jsonData.getStr("id"); 47 String id = jsonData.getStr("id");
44 48
45 try { 49 try {
46 - IotDevicePropertyReportReqDTO reportReqDTO = IotDevicePropertyReportReqDTO.builder()  
47 - .productKey(productKey)  
48 - .deviceName(deviceName)  
49 - .properties((Map<String, Object>) requestBody.asJsonObject().getMap().get("properties"))  
50 - .build(); 50 + // TODO @haohao:pluginKey 需要设置
  51 + // 设备上线
  52 + deviceDataApi.updateDeviceState(((IotDeviceStateUpdateReqDTO)
  53 + new IotDeviceStateUpdateReqDTO().setRequestId(IdUtil.fastSimpleUUID())
  54 + .setPluginKey("http")
  55 + .setReportTime(LocalDateTime.now())
  56 + .setProductKey(productKey).setDeviceName(deviceName))
  57 + .setState(IotDeviceStateEnum.ONLINE.getState()));
51 58
52 - deviceDataApi.reportDeviceProperty(reportReqDTO); 59 + // 属性上报
  60 + deviceDataApi.reportDeviceProperty(((IotDevicePropertyReportReqDTO)
  61 + new IotDevicePropertyReportReqDTO().setRequestId(IdUtil.fastSimpleUUID())
  62 + .setPluginKey("http").setReportTime(LocalDateTime.now())
  63 + .setProductKey(productKey).setDeviceName(deviceName))
  64 + .setProperties((Map<String, Object>) requestBody.asJsonObject().getMap().get("properties")));
53 65
54 ctx.response() 66 ctx.response()
55 .setStatusCode(200) 67 .setStatusCode(200)
56 .putHeader("Content-Type", "application/json; charset=UTF-8") 68 .putHeader("Content-Type", "application/json; charset=UTF-8")
57 .end(createResponseJson(200, new JSONObject(), id, "success", 69 .end(createResponseJson(200, new JSONObject(), id, "success",
58 "thing.event.property.post", "1.0").toString()); 70 "thing.event.property.post", "1.0").toString());
59 -  
60 } catch (Exception e) { 71 } catch (Exception e) {
61 log.error("[HttpVertxHandler] 上报属性数据失败", e); 72 log.error("[HttpVertxHandler] 上报属性数据失败", e);
62 ctx.response() 73 ctx.response()