【代码优化】IoT:设备上行时,增加 processId,用于设备与插件的映射

This commit is contained in:
YunaiV
2025-01-30 21:06:47 +08:00
parent 30ae986c1a
commit e650e75271
25 changed files with 277 additions and 190 deletions

View File

@@ -0,0 +1,31 @@
package cn.iocoder.yudao.module.iot.plugin.common.util;
import cn.hutool.core.util.IdUtil;
import cn.hutool.core.util.StrUtil;
import cn.hutool.system.SystemUtil;
/**
* IoT 插件的通用工具类
*
* 芋道源码
*/
public class IotPluginCommonUtils {
/**
* 流程实例的进程编号
*/
private static String processId;
public static String getProcessId() {
if (StrUtil.isEmpty(processId)) {
initProcessId();
}
return processId;
}
private synchronized static void initProcessId() {
processId = String.format("%s@%d@%s", // IP@PID@${uuid}
SystemUtil.getHostInfo().getAddress(), SystemUtil.getCurrentPID(), IdUtil.fastSimpleUUID());
}
}

View File

@@ -128,6 +128,12 @@
<version>${revision}</version>
</dependency>
<!-- Web 相关 -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<!-- 工具类相关 -->
<dependency>
<groupId>io.vertx</groupId>

View File

@@ -2,6 +2,7 @@ package cn.iocoder.yudao.module.iot.plugin.http;
import lombok.extern.slf4j.Slf4j;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.WebApplicationType;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.context.ConfigurableApplicationContext;
@@ -10,10 +11,12 @@ import org.springframework.context.ConfigurableApplicationContext;
*/
@Slf4j
@SpringBootApplication
public class HttpPluginSpringbootApplication {
public class IotHttpPluginApplication {
public static void main(String[] args) {
ConfigurableApplicationContext context = SpringApplication.run(HttpPluginSpringbootApplication.class, args);
SpringApplication application = new SpringApplication(IotHttpPluginApplication.class);
application.setWebApplicationType(WebApplicationType.NONE);
ConfigurableApplicationContext context = application.run(args);
// 手动获取 VertxService 并启动
// TODO @haohao可以放在 bean init 里么回复会和插件模式冲突 @芋艿测试下

View File

@@ -7,6 +7,7 @@ import cn.iocoder.yudao.module.iot.api.device.IotDeviceUpstreamApi;
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 cn.iocoder.yudao.module.iot.plugin.common.util.IotPluginCommonUtils;
import io.vertx.core.Handler;
import io.vertx.ext.web.RequestBody;
import io.vertx.ext.web.RoutingContext;
@@ -50,19 +51,17 @@ public class IotDevicePropertyReportVertxHandler implements Handler<RoutingConte
String id = jsonData.getStr("id");
try {
// TODO @haohaopluginKey 需要设置
// 设备上线
deviceUpstreamApi.updateDeviceState(((IotDeviceStateUpdateReqDTO)
new IotDeviceStateUpdateReqDTO().setRequestId(IdUtil.fastSimpleUUID())
.setPluginKey("http")
.setReportTime(LocalDateTime.now())
.setProcessId(IotPluginCommonUtils.getProcessId()).setReportTime(LocalDateTime.now())
.setProductKey(productKey).setDeviceName(deviceName))
.setState(IotDeviceStateEnum.ONLINE.getState()));
// 属性上报
deviceUpstreamApi.reportDeviceProperty(((IotDevicePropertyReportReqDTO)
new IotDevicePropertyReportReqDTO().setRequestId(IdUtil.fastSimpleUUID())
.setPluginKey("http").setReportTime(LocalDateTime.now())
.setProcessId(IotPluginCommonUtils.getProcessId()).setReportTime(LocalDateTime.now())
.setProductKey(productKey).setDeviceName(deviceName))
.setProperties((Map<String, Object>) requestBody.asJsonObject().getMap().get("properties")));