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

This commit is contained in:
YunaiV 2025-01-30 18:10:46 +08:00
parent 6a7aa3c3fc
commit 2d18e218c7
27 changed files with 373 additions and 58 deletions

View File

@ -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;

View File

@ -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;
}

View File

@ -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;
}

View File

@ -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;
}

View File

@ -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 {
}

View File

@ -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 {

View File

@ -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 {

View File

@ -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 {

View File

@ -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;

View File

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

View File

@ -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;

View File

@ -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;

View File

@ -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;

View File

@ -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 芋艿这里需要获取设备属性
}
}

View File

@ -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;

View File

@ -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;

View File

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

View File

@ -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);
}
}

View File

@ -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);
}

View File

@ -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();
}
}

View File

@ -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);
}
}

View File

@ -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;
}

View File

@ -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>

View File

@ -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 实例

View File

@ -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;
}
}

View File

@ -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;