【功能完善】IoT: 重命名插件模块,重构插件管理逻辑,优化代码结构,更新配置文件以支持新插件架构。

This commit is contained in:
安浩浩 2025-01-24 23:17:26 +08:00
parent 916024b891
commit 698cec92bd
27 changed files with 198 additions and 168 deletions

View File

@ -10,7 +10,7 @@
<modules>
<module>yudao-module-iot-api</module>
<module>yudao-module-iot-biz</module>
<module>yudao-module-iot-plugin</module>
<module>yudao-module-iot-plugins</module>
</modules>
<modelVersion>4.0.0</modelVersion>

View File

@ -1,43 +0,0 @@
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
<parent>
<artifactId>yudao-module-iot-plugin</artifactId>
<groupId>cn.iocoder.boot</groupId>
<version>2.2.0-snapshot</version>
</parent>
<modelVersion>4.0.0</modelVersion>
<artifactId>yudao-module-iot-plugin-http</artifactId>
<name>${project.artifactId}</name>
<version>1.0.0</version>
<description>物联网 插件模块 - http 插件</description>
<build>
<plugins>
<plugin>
<artifactId>maven-shade-plugin</artifactId>
<version>3.2.4</version>
<executions>
<execution>
<phase>package</phase>
<goals>
<goal>shade</goal>
</goals>
<configuration>
<transformers>
<transformer>
<mainClass>com.example.HttpPluginSpringbootApplication</mainClass>
</transformer>
</transformers>
</configuration>
</execution>
</executions>
</plugin>
</plugins>
</build>
<properties>
<plugin.id>${project.artifactId}</plugin.id>
<plugin.description>${project.artifactId}-${project.version}</plugin.description>
<plugin.class>cn.iocoder.yudao.module.iot.config.HttpVertxPlugin</plugin.class>
<plugin.version>${project.version}</plugin.version>
<plugin.provider>yudao</plugin.provider>
</properties>
</project>

View File

@ -1,6 +0,0 @@
plugin.id=yudao-module-iot-plugin-http
plugin.class=cn.iocoder.yudao.module.iot.config.HttpVertxPlugin
plugin.version=1.0.0
plugin.provider=yudao
plugin.dependencies=
plugin.description=yudao-module-iot-plugin-http-1.0.0

View File

@ -1,26 +0,0 @@
package cn.iocoder.yudao.module.iot;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.WebApplicationType;
import org.springframework.boot.autoconfigure.SpringBootApplication;
// TODO @haohao建议包名cn.iocoder.yudao.module.iot.plugin.${pluginName}例如说 http然后子包如下
// config方配置类以及 HttpVertxPlugin 初始化
// service HttpVertxHandler 逻辑
@SpringBootApplication
public class HttpPluginSpringbootApplication {
public static void main(String[] args) {
// SpringApplication.run(HttpPluginSpringbootApplication.class, args);
SpringApplication application = new SpringApplication(HttpPluginSpringbootApplication.class);
application.setWebApplicationType(WebApplicationType.NONE);
application.run(args);
}
}
// TODO @haohao如下是 sdk 的包cn.iocoder.yudao.module.iot.plugin.sdk
// 1. api 实现 DeviceDataApi 接口通过 resttemplate 调用
// 2. config 初始化 DeviceDataApi 等等
// 3. 其中 resttemplate 调用的后端地址通过每个服务的 application.yaml 进行注入

View File

@ -1,69 +0,0 @@
package cn.iocoder.yudao.module.iot.config;
import cn.iocoder.yudao.framework.common.pojo.CommonResult;
import cn.iocoder.yudao.module.iot.api.device.DeviceDataApi;
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.IotDeviceStatusUpdateReqDTO;
import org.pf4j.DefaultPluginManager;
import org.pf4j.PluginWrapper;
import org.springframework.boot.web.client.RestTemplateBuilder;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.client.RestTemplate;
import static cn.iocoder.yudao.framework.common.pojo.CommonResult.success;
// TODO 芋艿临时实现
@Configuration
public class TestConfiguration {
// @Resource
// private RestTemplate restTemplate;
// TODO 芋艿这里后续看看怎么创建好点
@Bean
public RestTemplate restTemplate() {
return new RestTemplateBuilder().build();
}
@Bean
public DeviceDataApi deviceDataApi(RestTemplate restTemplate) {
return new DeviceDataApi() {
@Override
public CommonResult<Boolean> updateDeviceStatus(IotDeviceStatusUpdateReqDTO updateReqDTO) {
// TODO haohao待实现
return null;
}
@Override
public CommonResult<Boolean> reportDeviceEventData(IotDeviceEventReportReqDTO reportReqDTO) {
// TODO haohao待实现
return null;
}
@Override
public CommonResult<Boolean> reportDevicePropertyData(IotDevicePropertyReportReqDTO reportReqDTO) {
// TODO haohao待完整实现
String url = "http://127.0.0.1:48080/rpc-api/iot/device-data/report-property";
try {
restTemplate.postForObject(url, reportReqDTO, CommonResult.class);
return success(true);
} catch (Exception e) {
e.printStackTrace();
return CommonResult.error(400, "error");
}
}
};
}
// TODO @haohao可能要看下有没更好的方式
@Bean(initMethod = "start")
public HttpVertxPlugin HttpVertxPlugin() {
PluginWrapper pluginWrapper = new PluginWrapper(new DefaultPluginManager(), null, null, null);
return new HttpVertxPlugin(pluginWrapper);
}
}

View File

@ -8,6 +8,7 @@
<version>${revision}</version>
</parent>
<modules>
<module>yudao-module-iot-plugin-common</module>
<module>yudao-module-iot-plugin-http</module>
<module>yudao-module-iot-plugin-mqtt</module>
<module>yudao-module-iot-plugin-emqx</module>
@ -15,7 +16,7 @@
<modelVersion>4.0.0</modelVersion>
<artifactId>yudao-module-iot-plugin</artifactId>
<artifactId>yudao-module-iot-plugins</artifactId>
<packaging>pom</packaging>
<name>${project.artifactId}</name>

View File

@ -0,0 +1,55 @@
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<parent>
<artifactId>yudao-module-iot-plugins</artifactId>
<groupId>cn.iocoder.boot</groupId>
<version>${revision}</version>
</parent>
<modelVersion>4.0.0</modelVersion>
<artifactId>yudao-module-iot-plugin-common</artifactId>
<packaging>jar</packaging>
<name>${project.artifactId}</name>
<description>
物联网 插件 模块 - 通用功能
</description>
<dependencies>
<dependency>
<groupId>cn.iocoder.boot</groupId>
<artifactId>yudao-common</artifactId>
</dependency>
<!-- 项目依赖 -->
<dependency>
<groupId>cn.iocoder.boot</groupId>
<artifactId>yudao-module-iot-api</artifactId>
<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>
</dependencies>
</project>

View File

@ -0,0 +1,60 @@
package cn.iocoder.yudao.module.iot.plugin.common.api;
import cn.iocoder.yudao.framework.common.pojo.CommonResult;
import cn.iocoder.yudao.module.iot.api.device.DeviceDataApi;
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.IotDeviceStatusUpdateReqDTO;
import lombok.extern.slf4j.Slf4j;
import org.springframework.web.client.RestTemplate;
import static cn.iocoder.yudao.framework.common.pojo.CommonResult.success;
@Slf4j
public class DeviceDataApiClient implements DeviceDataApi {
private final RestTemplate restTemplate;
private final String deviceDataUrl;
// 可以通过构造器把 RestTemplate baseUrl 注入进来
public DeviceDataApiClient(RestTemplate restTemplate, String deviceDataUrl) {
this.restTemplate = restTemplate;
this.deviceDataUrl = deviceDataUrl;
}
@Override
public CommonResult<Boolean> updateDeviceStatus(IotDeviceStatusUpdateReqDTO updateReqDTO) {
// 示例如果对应的远程地址是 /rpc-api/iot/device-data/update-status
String url = deviceDataUrl + "/rpc-api/iot/device-data/update-status";
return doPost(url, updateReqDTO, "updateDeviceStatus");
}
@Override
public CommonResult<Boolean> reportDeviceEventData(IotDeviceEventReportReqDTO reportReqDTO) {
// 示例如果对应的远程地址是 /rpc-api/iot/device-data/report-event
String url = deviceDataUrl + "/rpc-api/iot/device-data/report-event";
return doPost(url, reportReqDTO, "reportDeviceEventData");
}
@Override
public CommonResult<Boolean> reportDevicePropertyData(IotDevicePropertyReportReqDTO reportReqDTO) {
// 示例如果对应的远程地址是 /rpc-api/iot/device-data/report-property
String url = deviceDataUrl + "/rpc-api/iot/device-data/report-property";
return doPost(url, reportReqDTO, "reportDevicePropertyData");
}
/**
* 将与远程服务交互的通用逻辑抽取成一个私有方法
*/
private <T> CommonResult<Boolean> doPost(String url, T requestBody, String actionName) {
log.info("[{}] Sending request to URL: {}", actionName, url);
try {
// 这里指定返回类型为 CommonResult<?>根据后台服务返回的实际结构做调整
restTemplate.postForObject(url, requestBody, CommonResult.class);
return success(true);
} catch (Exception e) {
log.error("[{}] Error sending request to URL: {}", actionName, url, e);
return CommonResult.error(400, "Request error: " + e.getMessage());
}
}
}

View File

@ -0,0 +1,29 @@
package cn.iocoder.yudao.module.iot.plugin.common.config;
import cn.iocoder.yudao.module.iot.api.device.DeviceDataApi;
import cn.iocoder.yudao.module.iot.plugin.common.api.DeviceDataApiClient;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.boot.web.client.RestTemplateBuilder;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.client.RestTemplate;
@Configuration
public class DeviceDataApiInitializer {
@Value("${iot.device-data.url}")
private String deviceDataUrl;
@Bean
public RestTemplate restTemplate() {
// 如果你有更多的自定义需求比如连接池超时时间等可以在这里设置
return new RestTemplateBuilder().build();
}
@Bean
public DeviceDataApi deviceDataApi(RestTemplate restTemplate) {
// 返回我们自定义的 Client 实例
return new DeviceDataApiClient(restTemplate, deviceDataUrl);
}
}

View File

@ -4,7 +4,7 @@
http://maven.apache.org/POM/4.0.0
http://maven.apache.org/xsd/maven-4.0.0.xsd">
<parent>
<artifactId>yudao-module-iot-plugin</artifactId>
<artifactId>yudao-module-iot-plugins</artifactId>
<groupId>cn.iocoder.boot</groupId>
<version>${revision}</version>
</parent>

View File

@ -0,0 +1,6 @@
plugin.id=yudao-module-iot-plugin-http
plugin.class=cn.iocoder.yudao.module.iot.plugin.http.config.HttpVertxPlugin
plugin.version=1.0.0
plugin.provider=yudao
plugin.dependencies=
plugin.description=yudao-module-iot-plugin-http-1.0.0

View File

@ -4,7 +4,7 @@
http://maven.apache.org/POM/4.0.0
http://maven.apache.org/xsd/maven-4.0.0.xsd">
<parent>
<artifactId>yudao-module-iot-plugin</artifactId>
<artifactId>yudao-module-iot-plugins</artifactId>
<groupId>cn.iocoder.boot</groupId>
<version>${revision}</version>
</parent>
@ -22,7 +22,7 @@
<properties>
<!-- 插件相关 -->
<plugin.id>${project.artifactId}</plugin.id>
<plugin.class>cn.iocoder.yudao.module.iot.config.HttpVertxPlugin</plugin.class>
<plugin.class>cn.iocoder.yudao.module.iot.plugin.http.config.HttpVertxPlugin</plugin.class>
<plugin.version>${project.version}</plugin.version>
<plugin.provider>yudao</plugin.provider>
<plugin.description>${project.artifactId}-${project.version}</plugin.description>
@ -121,26 +121,12 @@
</build>
<dependencies>
<!-- 其他依赖项 -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<!-- PF4J Spring 集成 -->
<dependency>
<groupId>org.pf4j</groupId>
<artifactId>pf4j-spring</artifactId>
</dependency>
<!-- 项目依赖 -->
<dependency>
<groupId>cn.iocoder.boot</groupId>
<artifactId>yudao-module-iot-api</artifactId>
<artifactId>yudao-module-iot-plugin-common</artifactId>
<version>${revision}</version>
</dependency>
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
</dependency>
<!-- Vert.x Web -->
<dependency>
<groupId>io.vertx</groupId>

View File

@ -0,0 +1,16 @@
package cn.iocoder.yudao.module.iot.plugin.http;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.WebApplicationType;
import org.springframework.boot.autoconfigure.SpringBootApplication;
@SpringBootApplication(scanBasePackages = "cn.iocoder.yudao.module.iot.plugin")
public class HttpPluginSpringbootApplication {
public static void main(String[] args) {
SpringApplication application = new SpringApplication(HttpPluginSpringbootApplication.class);
application.setWebApplicationType(WebApplicationType.NONE);
application.run(args);
}
}

View File

@ -1,8 +1,8 @@
package cn.iocoder.yudao.module.iot.config;
package cn.iocoder.yudao.module.iot.plugin.http.config;
import cn.hutool.extra.spring.SpringUtil;
import cn.iocoder.yudao.module.iot.api.device.DeviceDataApi;
import cn.iocoder.yudao.module.iot.service.HttpVertxHandler;
import cn.iocoder.yudao.module.iot.plugin.http.service.HttpVertxHandler;
import io.vertx.core.Vertx;
import io.vertx.ext.web.Router;
import io.vertx.ext.web.handler.BodyHandler;

View File

@ -0,0 +1,16 @@
package cn.iocoder.yudao.module.iot.plugin.http.config;
import org.pf4j.DefaultPluginManager;
import org.pf4j.PluginWrapper;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
@Configuration
public class HttpVertxPluginConfiguration {
@Bean(initMethod = "start")
public HttpVertxPlugin httpVertxPlugin() {
PluginWrapper pluginWrapper = new PluginWrapper(new DefaultPluginManager(), null, null, null);
return new HttpVertxPlugin(pluginWrapper);
}
}

View File

@ -4,7 +4,7 @@
http://maven.apache.org/POM/4.0.0
http://maven.apache.org/xsd/maven-4.0.0.xsd">
<parent>
<artifactId>yudao-module-iot-plugin</artifactId>
<artifactId>yudao-module-iot-plugins</artifactId>
<groupId>cn.iocoder.boot</groupId>
<version>${revision}</version>
</parent>