浏览代码

【代码新增】IoT:增加 IotDeviceDownstreamHandler 接口的定义,以及 IotDeviceDownstreamServer 的部分实现

YunaiV 6 月之前
父节点
当前提交
2d18e218c7
共有 27 个文件被更改,包括 369 次插入54 次删除
  1. 3 3
      yudao-module-iot/yudao-module-iot-api/src/main/java/cn/iocoder/yudao/module/iot/api/device/IotDeviceUpstreamApi.java
  2. 30 0
      yudao-module-iot/yudao-module-iot-api/src/main/java/cn/iocoder/yudao/module/iot/api/device/dto/control/downstream/IotDeviceDownstreamAbstractReqDTO.java
  3. 22 0
      yudao-module-iot/yudao-module-iot-api/src/main/java/cn/iocoder/yudao/module/iot/api/device/dto/control/downstream/IotDevicePropertyGetReqDTO.java
  4. 22 0
      yudao-module-iot/yudao-module-iot-api/src/main/java/cn/iocoder/yudao/module/iot/api/device/dto/control/downstream/IotDevicePropertySetReqDTO.java
  5. 12 0
      yudao-module-iot/yudao-module-iot-api/src/main/java/cn/iocoder/yudao/module/iot/api/device/dto/control/downstream/IotDeviceServiceInvokeReqDTO.java
  6. 2 2
      yudao-module-iot/yudao-module-iot-api/src/main/java/cn/iocoder/yudao/module/iot/api/device/dto/control/upstream/IotDeviceEventReportReqDTO.java
  7. 2 2
      yudao-module-iot/yudao-module-iot-api/src/main/java/cn/iocoder/yudao/module/iot/api/device/dto/control/upstream/IotDevicePropertyReportReqDTO.java
  8. 2 2
      yudao-module-iot/yudao-module-iot-api/src/main/java/cn/iocoder/yudao/module/iot/api/device/dto/control/upstream/IotDeviceStateUpdateReqDTO.java
  9. 1 1
      yudao-module-iot/yudao-module-iot-api/src/main/java/cn/iocoder/yudao/module/iot/api/device/dto/control/upstream/IotDeviceUpstreamAbstractReqDTO.java
  10. 4 0
      yudao-module-iot/yudao-module-iot-api/src/main/java/cn/iocoder/yudao/module/iot/api/device/dto/package-info.java
  11. 3 3
      yudao-module-iot/yudao-module-iot-biz/src/main/java/cn/iocoder/yudao/module/iot/api/device/IoTDeviceUpstreamApiImpl.java
  12. 1 1
      yudao-module-iot/yudao-module-iot-biz/src/main/java/cn/iocoder/yudao/module/iot/job/device/IotDeviceOfflineCheckJob.java
  13. 1 1
      yudao-module-iot/yudao-module-iot-biz/src/main/java/cn/iocoder/yudao/module/iot/mq/consumer/device/IotDeviceOnlineMessageConsumer.java
  14. 51 0
      yudao-module-iot/yudao-module-iot-biz/src/main/java/cn/iocoder/yudao/module/iot/service/device/control/IotDeviceDownstreamServiceImpl.java
  15. 3 3
      yudao-module-iot/yudao-module-iot-biz/src/main/java/cn/iocoder/yudao/module/iot/service/device/control/IotDeviceUpstreamService.java
  16. 4 4
      yudao-module-iot/yudao-module-iot-biz/src/main/java/cn/iocoder/yudao/module/iot/service/device/control/IotDeviceUpstreamServiceImpl.java
  17. 14 14
      yudao-module-iot/yudao-module-iot-plugins/yudao-module-iot-plugin-common/pom.xml
  18. 13 4
      yudao-module-iot/yudao-module-iot-plugins/yudao-module-iot-plugin-common/src/main/java/cn/iocoder/yudao/module/iot/plugin/common/config/YudaoDeviceDataApiAutoConfiguration.java
  19. 23 0
      yudao-module-iot/yudao-module-iot-plugins/yudao-module-iot-plugin-common/src/main/java/cn/iocoder/yudao/module/iot/plugin/common/core/downstream/IotDeviceDownstreamHandler.java
  20. 71 0
      yudao-module-iot/yudao-module-iot-plugins/yudao-module-iot-plugin-common/src/main/java/cn/iocoder/yudao/module/iot/plugin/common/core/downstream/IotDeviceDownstreamServer.java
  21. 23 0
      yudao-module-iot/yudao-module-iot-plugins/yudao-module-iot-plugin-common/src/main/java/cn/iocoder/yudao/module/iot/plugin/common/core/downstream/router/IotDeviceServiceInvokeVertxHandler.java
  22. 13 8
      yudao-module-iot/yudao-module-iot-plugins/yudao-module-iot-plugin-common/src/main/java/cn/iocoder/yudao/module/iot/plugin/common/core/upstream/IotDeviceUpstreamClient.java
  23. 8 0
      yudao-module-iot/yudao-module-iot-plugins/yudao-module-iot-plugin-http/pom.xml
  24. 3 3
      yudao-module-iot/yudao-module-iot-plugins/yudao-module-iot-plugin-http/src/main/java/cn/iocoder/yudao/module/iot/plugin/http/config/HttpVertxPluginConfiguration.java
  25. 34 0
      yudao-module-iot/yudao-module-iot-plugins/yudao-module-iot-plugin-http/src/main/java/cn/iocoder/yudao/module/iot/plugin/http/framework/downstream/IotDeviceDownstreamHandlerImpl.java
  26. 1 0
      yudao-module-iot/yudao-module-iot-plugins/yudao-module-iot-plugin-http/src/main/java/cn/iocoder/yudao/module/iot/plugin/http/framework/package-info.java
  27. 3 3
      yudao-module-iot/yudao-module-iot-plugins/yudao-module-iot-plugin-http/src/main/java/cn/iocoder/yudao/module/iot/plugin/http/framework/upstream/HttpVertxHandler.java

+ 3 - 3
yudao-module-iot/yudao-module-iot-api/src/main/java/cn/iocoder/yudao/module/iot/api/device/IotDeviceUpstreamApi.java

@@ -1,9 +1,9 @@
 package cn.iocoder.yudao.module.iot.api.device;
 
 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.IotDevicePropertyReportReqDTO;
-import cn.iocoder.yudao.module.iot.api.device.dto.IotDeviceStateUpdateReqDTO;
+import cn.iocoder.yudao.module.iot.api.device.dto.control.upstream.IotDeviceEventReportReqDTO;
+import cn.iocoder.yudao.module.iot.api.device.dto.control.upstream.IotDevicePropertyReportReqDTO;
+import cn.iocoder.yudao.module.iot.api.device.dto.control.upstream.IotDeviceStateUpdateReqDTO;
 import cn.iocoder.yudao.module.iot.enums.ApiConstants;
 import jakarta.validation.Valid;
 import org.springframework.web.bind.annotation.PostMapping;

+ 30 - 0
yudao-module-iot/yudao-module-iot-api/src/main/java/cn/iocoder/yudao/module/iot/api/device/dto/control/downstream/IotDeviceDownstreamAbstractReqDTO.java

@@ -0,0 +1,30 @@
+package cn.iocoder.yudao.module.iot.api.device.dto.control.downstream;
+
+import jakarta.validation.constraints.NotEmpty;
+import lombok.Data;
+
+/**
+ * IoT 设备下行的抽象 Request DTO
+ *
+ * @author 芋道源码
+ */
+@Data
+public abstract class IotDeviceDownstreamAbstractReqDTO {
+
+    /**
+     * 请求编号
+     */
+    private String requestId;
+
+    /**
+     * 产品标识
+     */
+    @NotEmpty(message = "产品标识不能为空")
+    private String productKey;
+    /**
+     * 设备名称
+     */
+    @NotEmpty(message = "设备名称不能为空")
+    private String deviceName;
+
+}

+ 22 - 0
yudao-module-iot/yudao-module-iot-api/src/main/java/cn/iocoder/yudao/module/iot/api/device/dto/control/downstream/IotDevicePropertyGetReqDTO.java

@@ -0,0 +1,22 @@
+package cn.iocoder.yudao.module.iot.api.device.dto.control.downstream;
+
+import jakarta.validation.constraints.NotEmpty;
+import lombok.Data;
+
+import java.util.List;
+
+/**
+ * IoT 设备【属性】获取 Request DTO
+ *
+ * @author 芋道源码
+ */
+@Data
+public class IotDevicePropertyGetReqDTO extends IotDeviceDownstreamAbstractReqDTO {
+
+    /**
+     * 属性标识数组
+     */
+    @NotEmpty(message = "属性标识数组不能为空")
+    private List<String> identifiers;
+
+}

+ 22 - 0
yudao-module-iot/yudao-module-iot-api/src/main/java/cn/iocoder/yudao/module/iot/api/device/dto/control/downstream/IotDevicePropertySetReqDTO.java

@@ -0,0 +1,22 @@
+package cn.iocoder.yudao.module.iot.api.device.dto.control.downstream;
+
+import jakarta.validation.constraints.NotEmpty;
+import lombok.Data;
+
+import java.util.Map;
+
+/**
+ * IoT 设备【属性】设置 Request DTO
+ *
+ * @author 芋道源码
+ */
+@Data
+public class IotDevicePropertySetReqDTO extends IotDeviceDownstreamAbstractReqDTO {
+
+    /**
+     * 属性参数
+     */
+    @NotEmpty(message = "属性参数不能为空")
+    private Map<String, Object> properties;
+
+}

+ 12 - 0
yudao-module-iot/yudao-module-iot-api/src/main/java/cn/iocoder/yudao/module/iot/api/device/dto/control/downstream/IotDeviceServiceInvokeReqDTO.java

@@ -0,0 +1,12 @@
+package cn.iocoder.yudao.module.iot.api.device.dto.control.downstream;
+
+import lombok.Data;
+
+/**
+ * IoT 设备【服务】调用 Request DTO
+ *
+ * @author 芋道源码
+ */
+@Data
+public class IotDeviceServiceInvokeReqDTO extends IotDeviceDownstreamAbstractReqDTO {
+}

+ 2 - 2
yudao-module-iot/yudao-module-iot-api/src/main/java/cn/iocoder/yudao/module/iot/api/device/dto/IotDeviceEventReportReqDTO.java → yudao-module-iot/yudao-module-iot-api/src/main/java/cn/iocoder/yudao/module/iot/api/device/dto/control/upstream/IotDeviceEventReportReqDTO.java

@@ -1,4 +1,4 @@
-package cn.iocoder.yudao.module.iot.api.device.dto;
+package cn.iocoder.yudao.module.iot.api.device.dto.control.upstream;
 
 import jakarta.validation.constraints.NotEmpty;
 import lombok.Data;
@@ -6,7 +6,7 @@ import lombok.Data;
 import java.util.Map;
 
 /**
- * IoT 设备【事件】数据上报 Request DTO
+ * IoT 设备【事件】上报 Request DTO
  */
 @Data
 public class IotDeviceEventReportReqDTO extends IotDeviceUpstreamAbstractReqDTO {

+ 2 - 2
yudao-module-iot/yudao-module-iot-api/src/main/java/cn/iocoder/yudao/module/iot/api/device/dto/IotDevicePropertyReportReqDTO.java → yudao-module-iot/yudao-module-iot-api/src/main/java/cn/iocoder/yudao/module/iot/api/device/dto/control/upstream/IotDevicePropertyReportReqDTO.java

@@ -1,4 +1,4 @@
-package cn.iocoder.yudao.module.iot.api.device.dto;
+package cn.iocoder.yudao.module.iot.api.device.dto.control.upstream;
 
 import jakarta.validation.constraints.NotEmpty;
 import lombok.Data;
@@ -6,7 +6,7 @@ import lombok.Data;
 import java.util.Map;
 
 /**
- * IoT 设备【属性】数据上报 Request DTO
+ * IoT 设备【属性】上报 Request DTO
  */
 @Data
 public class IotDevicePropertyReportReqDTO extends IotDeviceUpstreamAbstractReqDTO {

+ 2 - 2
yudao-module-iot/yudao-module-iot-api/src/main/java/cn/iocoder/yudao/module/iot/api/device/dto/IotDeviceStateUpdateReqDTO.java → yudao-module-iot/yudao-module-iot-api/src/main/java/cn/iocoder/yudao/module/iot/api/device/dto/control/upstream/IotDeviceStateUpdateReqDTO.java

@@ -1,4 +1,4 @@
-package cn.iocoder.yudao.module.iot.api.device.dto;
+package cn.iocoder.yudao.module.iot.api.device.dto.control.upstream;
 
 import cn.iocoder.yudao.framework.common.validation.InEnum;
 import cn.iocoder.yudao.module.iot.enums.device.IotDeviceStateEnum;
@@ -6,7 +6,7 @@ import jakarta.validation.constraints.NotNull;
 import lombok.Data;
 
 /**
- * IoT 设备状态更新 Request DTO
+ * IoT 设备状态更新 Request DTO
  */
 @Data
 public class IotDeviceStateUpdateReqDTO extends IotDeviceUpstreamAbstractReqDTO {

+ 1 - 1
yudao-module-iot/yudao-module-iot-api/src/main/java/cn/iocoder/yudao/module/iot/api/device/dto/IotDeviceUpstreamAbstractReqDTO.java → yudao-module-iot/yudao-module-iot-api/src/main/java/cn/iocoder/yudao/module/iot/api/device/dto/control/upstream/IotDeviceUpstreamAbstractReqDTO.java

@@ -1,4 +1,4 @@
-package cn.iocoder.yudao.module.iot.api.device.dto;
+package cn.iocoder.yudao.module.iot.api.device.dto.control.upstream;
 
 import cn.iocoder.yudao.framework.common.util.json.databind.TimestampLocalDateTimeSerializer;
 import com.fasterxml.jackson.databind.annotation.JsonSerialize;

+ 4 - 0
yudao-module-iot/yudao-module-iot-api/src/main/java/cn/iocoder/yudao/module/iot/api/device/dto/package-info.java

@@ -0,0 +1,4 @@
+/**
+ * TODO 芋艿:占位
+ */
+package cn.iocoder.yudao.module.iot.api.device.dto;

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

@@ -1,9 +1,9 @@
 package cn.iocoder.yudao.module.iot.api.device;
 
 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.IotDevicePropertyReportReqDTO;
-import cn.iocoder.yudao.module.iot.api.device.dto.IotDeviceStateUpdateReqDTO;
+import cn.iocoder.yudao.module.iot.api.device.dto.control.upstream.IotDeviceEventReportReqDTO;
+import cn.iocoder.yudao.module.iot.api.device.dto.control.upstream.IotDevicePropertyReportReqDTO;
+import cn.iocoder.yudao.module.iot.api.device.dto.control.upstream.IotDeviceStateUpdateReqDTO;
 import cn.iocoder.yudao.module.iot.service.device.control.IotDeviceUpstreamService;
 import org.springframework.validation.annotation.Validated;
 import org.springframework.web.bind.annotation.RestController;

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

@@ -5,7 +5,7 @@ import cn.hutool.core.util.IdUtil;
 import cn.iocoder.yudao.framework.common.util.json.JsonUtils;
 import cn.iocoder.yudao.framework.quartz.core.handler.JobHandler;
 import cn.iocoder.yudao.framework.tenant.core.job.TenantJob;
-import cn.iocoder.yudao.module.iot.api.device.dto.IotDeviceStateUpdateReqDTO;
+import cn.iocoder.yudao.module.iot.api.device.dto.control.upstream.IotDeviceStateUpdateReqDTO;
 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.service.device.IotDeviceService;

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

@@ -2,7 +2,7 @@ package cn.iocoder.yudao.module.iot.mq.consumer.device;
 
 import cn.hutool.core.util.IdUtil;
 import cn.hutool.core.util.StrUtil;
-import cn.iocoder.yudao.module.iot.api.device.dto.IotDeviceStateUpdateReqDTO;
+import cn.iocoder.yudao.module.iot.api.device.dto.control.upstream.IotDeviceStateUpdateReqDTO;
 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.IotDeviceMessageTypeEnum;

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

@@ -1,10 +1,17 @@
 package cn.iocoder.yudao.module.iot.service.device.control;
 
 import cn.iocoder.yudao.module.iot.controller.admin.device.vo.control.IotDeviceSimulationUpstreamReqVO;
+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.IotDeviceMessageTypeEnum;
+import cn.iocoder.yudao.module.iot.service.device.IotDeviceService;
+import jakarta.annotation.Resource;
 import lombok.extern.slf4j.Slf4j;
 import org.springframework.stereotype.Service;
 import org.springframework.validation.annotation.Validated;
 
+import java.util.Objects;
+
 /**
  * 设备下行 Service 实现类
  *
@@ -15,9 +22,53 @@ import org.springframework.validation.annotation.Validated;
 @Slf4j
 public class IotDeviceDownstreamServiceImpl implements IotDeviceDownstreamService {
 
+    @Resource
+    private IotDeviceService deviceService;
+
     @Override
     public void simulationDeviceDownstream(IotDeviceSimulationUpstreamReqVO downstreamReqVO) {
+        // 校验设备是否存在
+        IotDeviceDO device = deviceService.validateDeviceExists(downstreamReqVO.getId());
+        // TODO 芋艿:父设备的处理
+        IotDeviceDO parentDevice = null;
+
+        // 服务调用
+        if (Objects.equals(downstreamReqVO.getType(), IotDeviceMessageTypeEnum.SERVICE.getType())) {
+            invokeDeviceService(downstreamReqVO, device, parentDevice);
+            return;
+        }
+        // 属性相关
+        if (Objects.equals(downstreamReqVO.getType(), IotDeviceMessageTypeEnum.PROPERTY.getType()))
+            // 属性设置
+            if (Objects.equals(downstreamReqVO.getIdentifier(), IotDeviceMessageIdentifierEnum.PROPERTY_SET.getIdentifier())) {
+                setDeviceProperty(downstreamReqVO, device, parentDevice);
+                return;
+            }
+        // 属性设置
+        if (Objects.equals(downstreamReqVO.getIdentifier(), IotDeviceMessageIdentifierEnum.PROPERTY_GET.getIdentifier())) {
+            getDeviceProperty(downstreamReqVO, device, parentDevice);
+            return;
+        }
+        // TODO 芋艿:ota 升级
+        // TODO 芋艿:配置下发
+    }
+
+    private void invokeDeviceService(IotDeviceSimulationUpstreamReqVO downstreamReqVO,
+                                     IotDeviceDO device, IotDeviceDO parentDevice) {
+        // 校验服务是否存在
+        // TODO 芋艿:这里需要校验服务是否存在
+        // 调用服务
+        // TODO 芋艿:这里需要调用服务
+    }
+
+    private void setDeviceProperty(IotDeviceSimulationUpstreamReqVO downstreamReqVO,
+                                   IotDeviceDO device, IotDeviceDO parentDevice) {
+        // TODO 芋艿:这里需要设置设备属性
+    }
 
+    private void getDeviceProperty(IotDeviceSimulationUpstreamReqVO downstreamReqVO,
+                                   IotDeviceDO device, IotDeviceDO parentDevice) {
+        // TODO 芋艿:这里需要获取设备属性
     }
 
 }

+ 3 - 3
yudao-module-iot/yudao-module-iot-biz/src/main/java/cn/iocoder/yudao/module/iot/service/device/control/IotDeviceUpstreamService.java

@@ -1,8 +1,8 @@
 package cn.iocoder.yudao.module.iot.service.device.control;
 
-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.IotDeviceStateUpdateReqDTO;
+import cn.iocoder.yudao.module.iot.api.device.dto.control.upstream.IotDeviceEventReportReqDTO;
+import cn.iocoder.yudao.module.iot.api.device.dto.control.upstream.IotDevicePropertyReportReqDTO;
+import cn.iocoder.yudao.module.iot.api.device.dto.control.upstream.IotDeviceStateUpdateReqDTO;
 import cn.iocoder.yudao.module.iot.controller.admin.device.vo.control.IotDeviceSimulationUpstreamReqVO;
 import jakarta.validation.Valid;
 

+ 4 - 4
yudao-module-iot/yudao-module-iot-biz/src/main/java/cn/iocoder/yudao/module/iot/service/device/control/IotDeviceUpstreamServiceImpl.java

@@ -7,10 +7,10 @@ import cn.hutool.core.util.StrUtil;
 import cn.iocoder.yudao.framework.common.util.object.BeanUtils;
 import cn.iocoder.yudao.framework.common.util.object.ObjectUtils;
 import cn.iocoder.yudao.framework.tenant.core.util.TenantUtils;
-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.IotDeviceStateUpdateReqDTO;
-import cn.iocoder.yudao.module.iot.api.device.dto.IotDeviceUpstreamAbstractReqDTO;
+import cn.iocoder.yudao.module.iot.api.device.dto.control.upstream.IotDeviceEventReportReqDTO;
+import cn.iocoder.yudao.module.iot.api.device.dto.control.upstream.IotDevicePropertyReportReqDTO;
+import cn.iocoder.yudao.module.iot.api.device.dto.control.upstream.IotDeviceStateUpdateReqDTO;
+import cn.iocoder.yudao.module.iot.api.device.dto.control.upstream.IotDeviceUpstreamAbstractReqDTO;
 import cn.iocoder.yudao.module.iot.controller.admin.device.vo.control.IotDeviceSimulationUpstreamReqVO;
 import cn.iocoder.yudao.module.iot.dal.dataobject.device.IotDeviceDO;
 import cn.iocoder.yudao.module.iot.enums.device.IotDeviceMessageIdentifierEnum;

+ 14 - 14
yudao-module-iot/yudao-module-iot-plugins/yudao-module-iot-plugin-common/pom.xml

@@ -18,6 +18,7 @@
     </description>
 
     <dependencies>
+        <!-- TODO 芋艿:依赖整理 -->
         <dependency>
             <groupId>cn.iocoder.boot</groupId>
             <artifactId>yudao-common</artifactId>
@@ -29,27 +30,26 @@
             <version>${revision}</version>
         </dependency>
 
-        <!-- 其他依赖项 -->
         <dependency>
-            <groupId>org.springframework.boot</groupId>
-            <artifactId>spring-boot-starter-web</artifactId>
+            <groupId>org.projectlombok</groupId>
+            <artifactId>lombok</artifactId>
         </dependency>
 
-        <!-- PF4J -->
         <dependency>
-            <groupId>org.pf4j</groupId>
-            <artifactId>pf4j-spring</artifactId>
-            <exclusions>
-                <exclusion>
-                    <groupId>org.slf4j</groupId>
-                    <artifactId>slf4j-log4j12</artifactId>
-                </exclusion>
-            </exclusions>
+            <groupId>org.springframework</groupId>
+            <artifactId>spring-web</artifactId>
         </dependency>
 
+        <!-- 其他依赖项 -->
         <dependency>
-            <groupId>org.projectlombok</groupId>
-            <artifactId>lombok</artifactId>
+            <groupId>org.springframework.boot</groupId>
+            <artifactId>spring-boot-starter</artifactId>
+        </dependency>
+
+        <!-- Vert.x Web -->
+        <dependency>
+            <groupId>io.vertx</groupId>
+            <artifactId>vertx-web</artifactId>
         </dependency>
     </dependencies>
 

+ 13 - 4
yudao-module-iot/yudao-module-iot-plugins/yudao-module-iot-plugin-common/src/main/java/cn/iocoder/yudao/module/iot/plugin/common/config/YudaoDeviceDataApiAutoConfiguration.java

@@ -1,7 +1,9 @@
 package cn.iocoder.yudao.module.iot.plugin.common.config;
 
 import cn.iocoder.yudao.module.iot.api.device.IotDeviceUpstreamApi;
-import cn.iocoder.yudao.module.iot.plugin.common.api.DeviceDataApiClient;
+import cn.iocoder.yudao.module.iot.plugin.common.core.downstream.IotDeviceDownstreamHandler;
+import cn.iocoder.yudao.module.iot.plugin.common.core.downstream.IotDeviceDownstreamServer;
+import cn.iocoder.yudao.module.iot.plugin.common.core.upstream.IotDeviceUpstreamClient;
 import org.springframework.beans.factory.annotation.Value;
 import org.springframework.boot.autoconfigure.AutoConfiguration;
 import org.springframework.boot.web.client.RestTemplateBuilder;
@@ -10,6 +12,7 @@ import org.springframework.web.client.RestTemplate;
 
 import java.time.Duration;
 
+// TODO @芋艿:配置类的名字
 /**
  * 设备数据 API 初始化器
  *
@@ -31,8 +34,8 @@ public class YudaoDeviceDataApiAutoConfiguration {
     public RestTemplate restTemplate() {
         // 如果你有更多的自定义需求,比如连接池、超时时间等,可以在这里设置
         return new RestTemplateBuilder()
-                .setConnectTimeout(Duration.ofMillis(5000)) // 设置连接超时时间
-                .setReadTimeout(Duration.ofMillis(5000)) // 设置读取超时时间
+                .connectTimeout(Duration.ofMillis(5000)) // 设置连接超时时间
+                .readTimeout(Duration.ofMillis(5000)) // 设置读取超时时间
                 .build();
     }
 
@@ -44,7 +47,13 @@ public class YudaoDeviceDataApiAutoConfiguration {
      */
     @Bean
     public IotDeviceUpstreamApi deviceDataApi(RestTemplate restTemplate) {
-        return new DeviceDataApiClient(restTemplate, deviceDataUrl);
+        return new IotDeviceUpstreamClient(restTemplate, deviceDataUrl);
+    }
+
+    @Bean(initMethod = "start", destroyMethod = "stop")
+    @SuppressWarnings("SpringJavaInjectionPointsAutowiringInspection")
+    public IotDeviceDownstreamServer deviceDownstreamServer(IotDeviceDownstreamHandler deviceDownstreamHandler) {
+        return new IotDeviceDownstreamServer(deviceDownstreamHandler);
     }
 
 }

+ 23 - 0
yudao-module-iot/yudao-module-iot-plugins/yudao-module-iot-plugin-common/src/main/java/cn/iocoder/yudao/module/iot/plugin/common/core/downstream/IotDeviceDownstreamHandler.java

@@ -0,0 +1,23 @@
+package cn.iocoder.yudao.module.iot.plugin.common.core.downstream;
+
+import cn.iocoder.yudao.framework.common.pojo.CommonResult;
+import cn.iocoder.yudao.module.iot.api.device.dto.control.downstream.IotDevicePropertyGetReqDTO;
+import cn.iocoder.yudao.module.iot.api.device.dto.control.downstream.IotDevicePropertySetReqDTO;
+import cn.iocoder.yudao.module.iot.api.device.dto.control.downstream.IotDeviceServiceInvokeReqDTO;
+
+/**
+ * IoT 设备下行处理器
+ *
+ * 目的:每个 plugin 需要实现,用于处理 server 下行的指令(请求),从而实现从 server => plugin => device 的下行流程
+ *
+ * @author 芋道源码
+ */
+public interface IotDeviceDownstreamHandler {
+
+    CommonResult<Boolean> invokeDeviceService(IotDeviceServiceInvokeReqDTO invokeReqDTO);
+
+    CommonResult<Boolean> getDeviceProperty(IotDevicePropertyGetReqDTO getReqDTO);
+
+    CommonResult<Boolean> setDeviceProperty(IotDevicePropertySetReqDTO setReqDTO);
+
+}

+ 71 - 0
yudao-module-iot/yudao-module-iot-plugins/yudao-module-iot-plugin-common/src/main/java/cn/iocoder/yudao/module/iot/plugin/common/core/downstream/IotDeviceDownstreamServer.java

@@ -0,0 +1,71 @@
+package cn.iocoder.yudao.module.iot.plugin.common.core.downstream;
+
+import cn.iocoder.yudao.module.iot.plugin.common.core.downstream.router.IotDeviceServiceInvokeVertxHandler;
+import io.vertx.core.Vertx;
+import io.vertx.core.http.HttpServer;
+import io.vertx.ext.web.Router;
+import io.vertx.ext.web.handler.BodyHandler;
+import lombok.extern.slf4j.Slf4j;
+
+@Slf4j
+public class IotDeviceDownstreamServer {
+
+    private final Vertx vertx;
+    private final HttpServer server;
+
+    public IotDeviceDownstreamServer(IotDeviceDownstreamHandler deviceDownstreamHandler) {
+        // 创建 Vertx 实例
+        this.vertx = Vertx.vertx();
+        // 创建 Router 实例
+        Router router = Router.router(vertx);
+        router.route().handler(BodyHandler.create()); // 处理 Body
+        router.post(IotDeviceServiceInvokeVertxHandler.PATH).handler(
+                new IotDeviceServiceInvokeVertxHandler(deviceDownstreamHandler)); // 处理 Service Invoke
+        // 创建 HttpServer 实例
+        this.server = vertx.createHttpServer().requestHandler(router);
+    }
+
+    public void start() {
+        log.info("[start][开始启动]");
+        server.listen(0) // 通过 0 自动选择端口
+              .toCompletionStage()
+              .toCompletableFuture()
+              .join();
+        log.info("[start][启动完成,端口({})]", this.server.actualPort());
+    }
+
+    public void stop() {
+        log.info("[stop][开始关闭]");
+        try {
+            // 关闭 HTTP 服务器
+            if (server != null) {
+                server.close()
+                      .toCompletionStage()
+                      .toCompletableFuture()
+                      .join();
+            }
+
+            // 关闭 Vertx 实例
+            if (vertx != null) {
+                vertx.close()
+                     .toCompletionStage()
+                     .toCompletableFuture()
+                     .join();
+            }
+            log.info("[stop][关闭完成]");
+        } catch (Exception e) {
+            log.error("[stop][关闭异常]", e);
+            throw new RuntimeException(e);
+        }
+    }
+
+    /**
+     * 获得端口
+     *
+     * @return 端口
+     */
+    public int getPort() {
+        return this.server.actualPort();
+    }
+
+}

+ 23 - 0
yudao-module-iot/yudao-module-iot-plugins/yudao-module-iot-plugin-common/src/main/java/cn/iocoder/yudao/module/iot/plugin/common/core/downstream/router/IotDeviceServiceInvokeVertxHandler.java

@@ -0,0 +1,23 @@
+package cn.iocoder.yudao.module.iot.plugin.common.core.downstream.router;
+
+import cn.iocoder.yudao.module.iot.plugin.common.core.downstream.IotDeviceDownstreamHandler;
+import io.vertx.core.Handler;
+import io.vertx.ext.web.RoutingContext;
+import lombok.RequiredArgsConstructor;
+import lombok.extern.slf4j.Slf4j;
+
+@Slf4j
+@RequiredArgsConstructor
+public class IotDeviceServiceInvokeVertxHandler implements Handler<RoutingContext> {
+
+    public static final String PATH = "/sys/:productKey/:deviceName/thing/service/:identifier";
+
+    private final IotDeviceDownstreamHandler deviceDownstreamHandler;
+
+    @Override
+    public void handle(RoutingContext routingContext) {
+        // TODO 芋艿:这里没实现
+        deviceDownstreamHandler.invokeDeviceService(null);
+    }
+
+}

+ 13 - 8
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 → yudao-module-iot/yudao-module-iot-plugins/yudao-module-iot-plugin-common/src/main/java/cn/iocoder/yudao/module/iot/plugin/common/core/upstream/IotDeviceUpstreamClient.java

@@ -1,19 +1,24 @@
-package cn.iocoder.yudao.module.iot.plugin.common.api;
+package cn.iocoder.yudao.module.iot.plugin.common.core.upstream;
 
 import cn.iocoder.yudao.framework.common.pojo.CommonResult;
 import cn.iocoder.yudao.module.iot.api.device.IotDeviceUpstreamApi;
-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.IotDeviceStateUpdateReqDTO;
+import cn.iocoder.yudao.module.iot.api.device.dto.control.upstream.IotDeviceEventReportReqDTO;
+import cn.iocoder.yudao.module.iot.api.device.dto.control.upstream.IotDevicePropertyReportReqDTO;
+import cn.iocoder.yudao.module.iot.api.device.dto.control.upstream.IotDeviceStateUpdateReqDTO;
 import lombok.extern.slf4j.Slf4j;
 import org.springframework.web.client.RestTemplate;
 
 import static cn.iocoder.yudao.framework.common.pojo.CommonResult.success;
 
-// TODO @haohao:类注释,写一下,比较好
-// TODO @haohao:类名要改下
+/**
+ * 设备数据 Upstream 上行客户端
+ *
+ * 通过 HTTP 调用远程的 IotDeviceUpstreamApi 接口
+ *
+ * @author haohao
+ */
 @Slf4j
-public class DeviceDataApiClient implements IotDeviceUpstreamApi {
+public class IotDeviceUpstreamClient implements IotDeviceUpstreamApi {
 
     public static final String URL_PREFIX = "/rpc-api/iot/device/upstream";
 
@@ -22,7 +27,7 @@ public class DeviceDataApiClient implements IotDeviceUpstreamApi {
 
     // 可以通过构造器把 RestTemplate 和 baseUrl 注入进来
     // TODO @haohao:可以用 lombok 简化
-    public DeviceDataApiClient(RestTemplate restTemplate, String deviceDataUrl) {
+    public IotDeviceUpstreamClient(RestTemplate restTemplate, String deviceDataUrl) {
         this.restTemplate = restTemplate;
         this.deviceDataUrl = deviceDataUrl;
     }

+ 8 - 0
yudao-module-iot/yudao-module-iot-plugins/yudao-module-iot-plugin-http/pom.xml

@@ -121,12 +121,20 @@
     </build>
 
     <dependencies>
+        <!-- TODO 芋艿:优化下 -->
         <!-- 项目依赖 -->
         <dependency>
             <groupId>cn.iocoder.boot</groupId>
             <artifactId>yudao-module-iot-plugin-common</artifactId>
             <version>${revision}</version>
         </dependency>
+
+        <!-- 其他依赖项 -->
+        <dependency>
+            <groupId>org.springframework.boot</groupId>
+            <artifactId>spring-boot-starter-web</artifactId>
+        </dependency>
+
         <!-- Vert.x Web -->
         <dependency>
             <groupId>io.vertx</groupId>

+ 3 - 3
yudao-module-iot/yudao-module-iot-plugins/yudao-module-iot-plugin-http/src/main/java/cn/iocoder/yudao/module/iot/plugin/http/config/HttpVertxPluginConfiguration.java

@@ -1,7 +1,7 @@
 package cn.iocoder.yudao.module.iot.plugin.http.config;
 
 import cn.iocoder.yudao.module.iot.api.device.IotDeviceUpstreamApi;
-import cn.iocoder.yudao.module.iot.plugin.http.service.HttpVertxHandler;
+import cn.iocoder.yudao.module.iot.plugin.http.framework.upstream.HttpVertxHandler;
 import io.vertx.core.Vertx;
 import io.vertx.ext.web.Router;
 import io.vertx.ext.web.handler.BodyHandler;
@@ -34,7 +34,7 @@ public class HttpVertxPluginConfiguration {
 
     /**
      * 创建路由
-     * 
+     *
      * @param vertx Vertx 实例
      * @param httpVertxHandler HttpVertxHandler 实例
      * @return Router 实例
@@ -68,7 +68,7 @@ public class HttpVertxPluginConfiguration {
     /**
      * 定义一个 VertxService 来管理服务器启动逻辑
      * 无论是独立运行还是插件方式,都可以共用此类
-     * 
+     *
      * @param vertx Vertx 实例
      * @param router Router 实例
      * @return VertxService 实例

+ 34 - 0
yudao-module-iot/yudao-module-iot-plugins/yudao-module-iot-plugin-http/src/main/java/cn/iocoder/yudao/module/iot/plugin/http/framework/downstream/IotDeviceDownstreamHandlerImpl.java

@@ -0,0 +1,34 @@
+package cn.iocoder.yudao.module.iot.plugin.http.framework.downstream;
+
+import cn.iocoder.yudao.framework.common.pojo.CommonResult;
+import cn.iocoder.yudao.module.iot.api.device.dto.control.downstream.IotDevicePropertyGetReqDTO;
+import cn.iocoder.yudao.module.iot.api.device.dto.control.downstream.IotDevicePropertySetReqDTO;
+import cn.iocoder.yudao.module.iot.api.device.dto.control.downstream.IotDeviceServiceInvokeReqDTO;
+import cn.iocoder.yudao.module.iot.plugin.common.core.downstream.IotDeviceDownstreamHandler;
+import org.springframework.stereotype.Component;
+
+@Component // TODO @芋艿:后续统一处理
+public class IotDeviceDownstreamHandlerImpl implements IotDeviceDownstreamHandler {
+
+    @Override
+    public CommonResult<Boolean> invokeDeviceService(IotDeviceServiceInvokeReqDTO invokeReqDTO) {
+        // TODO @芋艿:待实现
+        System.out.println();
+        return null;
+    }
+
+    @Override
+    public CommonResult<Boolean> getDeviceProperty(IotDevicePropertyGetReqDTO getReqDTO) {
+        // TODO @芋艿:待实现
+        System.out.println();
+        return null;
+    }
+
+    @Override
+    public CommonResult<Boolean> setDeviceProperty(IotDevicePropertySetReqDTO setReqDTO) {
+        // TODO @芋艿:待实现
+        System.out.println();
+        return null;
+    }
+
+}

+ 1 - 0
yudao-module-iot/yudao-module-iot-plugins/yudao-module-iot-plugin-http/src/main/java/cn/iocoder/yudao/module/iot/plugin/http/framework/package-info.java

@@ -0,0 +1 @@
+package cn.iocoder.yudao.module.iot.plugin.http.framework;

+ 3 - 3
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 → yudao-module-iot/yudao-module-iot-plugins/yudao-module-iot-plugin-http/src/main/java/cn/iocoder/yudao/module/iot/plugin/http/framework/upstream/HttpVertxHandler.java

@@ -1,11 +1,11 @@
-package cn.iocoder.yudao.module.iot.plugin.http.service;
+package cn.iocoder.yudao.module.iot.plugin.http.framework.upstream;
 
 import cn.hutool.core.util.IdUtil;
 import cn.hutool.json.JSONObject;
 import cn.hutool.json.JSONUtil;
 import cn.iocoder.yudao.module.iot.api.device.IotDeviceUpstreamApi;
-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.control.upstream.IotDevicePropertyReportReqDTO;
+import cn.iocoder.yudao.module.iot.api.device.dto.control.upstream.IotDeviceStateUpdateReqDTO;
 import cn.iocoder.yudao.module.iot.enums.device.IotDeviceStateEnum;
 import io.vertx.core.Handler;
 import io.vertx.ext.web.RequestBody;