Bläddra i källkod

【代码优化】IoT:整理 plugins 的依赖,以及对应 server 的启动逻辑

YunaiV 6 månader sedan
förälder
incheckning
30ae986c1a
15 ändrade filer med 66 tillägg och 80 borttagningar
  1. BIN
      plugins/yudao-module-iot-plugin-http-1.0.0.jar
  2. 9 10
      yudao-module-iot/yudao-module-iot-api/pom.xml
  3. 4 10
      yudao-module-iot/yudao-module-iot-biz/pom.xml
  4. 2 2
      yudao-module-iot/yudao-module-iot-biz/src/main/java/cn/iocoder/yudao/module/iot/framework/plugin/config/UnifiedConfiguration.java
  5. 1 1
      yudao-module-iot/yudao-module-iot-biz/src/main/java/cn/iocoder/yudao/module/iot/framework/plugin/core/CustomPluginStateListener.java
  6. 1 1
      yudao-module-iot/yudao-module-iot-biz/src/main/java/cn/iocoder/yudao/module/iot/framework/plugin/core/PluginStart.java
  7. 1 1
      yudao-module-iot/yudao-module-iot-biz/src/main/java/cn/iocoder/yudao/module/iot/framework/tdengine/core/TaosAspect.java
  8. 5 16
      yudao-module-iot/yudao-module-iot-plugins/yudao-module-iot-plugin-common/pom.xml
  9. 5 12
      yudao-module-iot/yudao-module-iot-plugins/yudao-module-iot-plugin-http/pom.xml
  10. 5 8
      yudao-module-iot/yudao-module-iot-plugins/yudao-module-iot-plugin-http/src/main/java/cn/iocoder/yudao/module/iot/plugin/http/HttpPluginSpringbootApplication.java
  11. 9 8
      yudao-module-iot/yudao-module-iot-plugins/yudao-module-iot-plugin-http/src/main/java/cn/iocoder/yudao/module/iot/plugin/http/config/IotHttpVertxPlugin.java
  12. 5 3
      yudao-module-iot/yudao-module-iot-plugins/yudao-module-iot-plugin-http/src/main/java/cn/iocoder/yudao/module/iot/plugin/http/config/IotPluginHttpAutoConfiguration.java
  13. 8 0
      yudao-module-iot/yudao-module-iot-plugins/yudao-module-iot-plugin-http/src/main/java/cn/iocoder/yudao/module/iot/plugin/http/downstream/IotDeviceDownstreamHandlerImpl.java
  14. 1 1
      yudao-module-iot/yudao-module-iot-plugins/yudao-module-iot-plugin-http/src/main/java/cn/iocoder/yudao/module/iot/plugin/http/upstream/IotDeviceUpstreamServer.java
  15. 10 7
      yudao-module-iot/yudao-module-iot-plugins/yudao-module-iot-plugin-http/src/main/java/cn/iocoder/yudao/module/iot/plugin/http/upstream/router/IotDevicePropertyReportVertxHandler.java

BIN
plugins/yudao-module-iot-plugin-http-1.0.0.jar


+ 9 - 10
yudao-module-iot/yudao-module-iot-api/pom.xml

@@ -30,11 +30,17 @@
             <scope>provided</scope> <!-- 设置为 provided,只有工具类需要使用到 -->
         </dependency>
 
-        <!-- PF4J -->
-        <!-- TODO 芋艿:这个依赖,要不要放在 api 包 -->
+        <!-- 工具类相关 -->
+        <dependency>
+            <groupId>com.fasterxml.jackson.core</groupId>
+            <artifactId>jackson-databind</artifactId>
+            <scope>provided</scope> <!-- 设置为 provided,只有工具类需要使用到 -->
+        </dependency>
+
         <dependency>
-            <groupId>org.pf4j</groupId>
+            <groupId>org.pf4j</groupId> <!-- PF4J:内置插件机制 -->
             <artifactId>pf4j-spring</artifactId>
+            <!-- TODO @芋艿:可以放到 bom 里配置 -->
             <exclusions>
                 <exclusion>
                     <groupId>org.slf4j</groupId>
@@ -43,13 +49,6 @@
             </exclusions>
         </dependency>
 
-        <!-- 工具类相关 -->
-        <dependency>
-            <groupId>com.fasterxml.jackson.core</groupId>
-            <artifactId>jackson-databind</artifactId>
-            <scope>provided</scope> <!-- 设置为 provided,只有工具类需要使用到 -->
-        </dependency>
-
         <!-- 参数校验 -->
         <dependency>
             <groupId>org.springframework.boot</groupId>

+ 4 - 10
yudao-module-iot/yudao-module-iot-biz/pom.xml

@@ -64,25 +64,19 @@
             <artifactId>yudao-spring-boot-starter-excel</artifactId>
         </dependency>
 
-        <!-- Vert.x 核心依赖 -->
-        <dependency>
-            <groupId>io.vertx</groupId>
-            <artifactId>vertx-core</artifactId>
-        </dependency>
-        <!-- Vert.x Web 模块 -->
+        <!-- 工具类相关 -->
         <dependency>
             <groupId>io.vertx</groupId>
             <artifactId>vertx-web</artifactId>
         </dependency>
-        <!-- MQTT -->
+
         <dependency>
-            <groupId>org.eclipse.paho</groupId>
+            <groupId>org.eclipse.paho</groupId> <!-- MQTT -->
             <artifactId>org.eclipse.paho.client.mqttv3</artifactId>
         </dependency>
 
-        <!-- PF4J -->
         <dependency>
-            <groupId>org.pf4j</groupId>
+            <groupId>org.pf4j</groupId>  <!-- PF4J:内置插件机制 -->
             <artifactId>pf4j-spring</artifactId>
             <!-- TODO @芋艿:可以放到 bom 里配置 -->
             <exclusions>

+ 2 - 2
yudao-module-iot/yudao-module-iot-biz/src/main/java/cn/iocoder/yudao/module/iot/framework/plugin/UnifiedConfiguration.java → yudao-module-iot/yudao-module-iot-biz/src/main/java/cn/iocoder/yudao/module/iot/framework/plugin/config/UnifiedConfiguration.java

@@ -1,6 +1,6 @@
-package cn.iocoder.yudao.module.iot.framework.plugin;
+package cn.iocoder.yudao.module.iot.framework.plugin.config;
 
-import cn.iocoder.yudao.module.iot.framework.plugin.listener.CustomPluginStateListener;
+import cn.iocoder.yudao.module.iot.framework.plugin.core.CustomPluginStateListener;
 import lombok.extern.slf4j.Slf4j;
 import org.pf4j.spring.SpringPluginManager;
 import org.springframework.beans.factory.annotation.Value;

+ 1 - 1
yudao-module-iot/yudao-module-iot-biz/src/main/java/cn/iocoder/yudao/module/iot/framework/plugin/listener/CustomPluginStateListener.java → yudao-module-iot/yudao-module-iot-biz/src/main/java/cn/iocoder/yudao/module/iot/framework/plugin/core/CustomPluginStateListener.java

@@ -1,4 +1,4 @@
-package cn.iocoder.yudao.module.iot.framework.plugin.listener;
+package cn.iocoder.yudao.module.iot.framework.plugin.core;
 
 import lombok.extern.slf4j.Slf4j;
 import org.pf4j.PluginStateEvent;

+ 1 - 1
yudao-module-iot/yudao-module-iot-biz/src/main/java/cn/iocoder/yudao/module/iot/framework/plugin/PluginStart.java → yudao-module-iot/yudao-module-iot-biz/src/main/java/cn/iocoder/yudao/module/iot/framework/plugin/core/PluginStart.java

@@ -1,4 +1,4 @@
-package cn.iocoder.yudao.module.iot.framework.plugin;
+package cn.iocoder.yudao.module.iot.framework.plugin.core;
 
 import cn.hutool.core.collection.CollUtil;
 import cn.iocoder.yudao.framework.tenant.core.util.TenantUtils;

+ 1 - 1
yudao-module-iot/yudao-module-iot-biz/src/main/java/cn/iocoder/yudao/module/iot/framework/aspect/TaosAspect.java → yudao-module-iot/yudao-module-iot-biz/src/main/java/cn/iocoder/yudao/module/iot/framework/tdengine/core/TaosAspect.java

@@ -1,4 +1,4 @@
-package cn.iocoder.yudao.module.iot.framework.aspect;
+package cn.iocoder.yudao.module.iot.framework.tdengine.core;
 
 import lombok.extern.slf4j.Slf4j;
 import org.aspectj.lang.ProceedingJoinPoint;

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

@@ -18,35 +18,24 @@
     </description>
 
     <dependencies>
-        <!-- TODO 芋艿:依赖整理 -->
         <dependency>
-            <groupId>cn.iocoder.boot</groupId>
-            <artifactId>yudao-common</artifactId>
+            <groupId>org.springframework.boot</groupId>
+            <artifactId>spring-boot-starter</artifactId>
         </dependency>
-        <!-- 项目依赖 -->
+
         <dependency>
             <groupId>cn.iocoder.boot</groupId>
             <artifactId>yudao-module-iot-api</artifactId>
             <version>${revision}</version>
         </dependency>
 
-        <dependency>
-            <groupId>org.projectlombok</groupId>
-            <artifactId>lombok</artifactId>
-        </dependency>
-
+        <!-- Web 相关 -->
         <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>

+ 5 - 12
yudao-module-iot/yudao-module-iot-plugins/yudao-module-iot-plugin-http/pom.xml

@@ -16,6 +16,7 @@
 
     <name>${project.artifactId}</name>
     <description>
+        <!-- TODO @芋艿:注释 -->
         物联网 插件模块 - http 插件
     </description>
 
@@ -31,7 +32,7 @@
 
     <build>
         <plugins>
-            <!--  插件模式 zip  -->
+            <!-- 插件模式 zip -->
             <plugin>
                 <groupId>org.apache.maven.plugins</groupId>
                 <artifactId>maven-antrun-plugin</artifactId>
@@ -75,7 +76,7 @@
                 </executions>
             </plugin>
 
-            <!--  插件模式 jar  -->
+            <!-- 插件模式 jar -->
             <plugin>
                 <groupId>org.apache.maven.plugins</groupId>
                 <artifactId>maven-jar-plugin</artifactId>
@@ -94,7 +95,7 @@
                 </configuration>
             </plugin>
 
-            <!--  独立模式  -->
+            <!-- 独立模式 -->
             <plugin>
                 <groupId>org.springframework.boot</groupId>
                 <artifactId>spring-boot-maven-plugin</artifactId>
@@ -121,21 +122,13 @@
     </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>
             <artifactId>vertx-web</artifactId>

+ 5 - 8
yudao-module-iot/yudao-module-iot-plugins/yudao-module-iot-plugin-http/src/main/java/cn/iocoder/yudao/module/iot/plugin/http/HttpPluginSpringbootApplication.java

@@ -1,9 +1,7 @@
 package cn.iocoder.yudao.module.iot.plugin.http;
 
-import cn.iocoder.yudao.module.iot.plugin.http.upstream.IotDeviceUpstreamServer;
 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;
 
@@ -15,16 +13,15 @@ import org.springframework.context.ConfigurableApplicationContext;
 public class HttpPluginSpringbootApplication {
 
     public static void main(String[] args) {
-        SpringApplication application = new SpringApplication(HttpPluginSpringbootApplication.class);
-        application.setWebApplicationType(WebApplicationType.NONE);
-        ConfigurableApplicationContext context = application.run(args);
+        ConfigurableApplicationContext context = SpringApplication.run(HttpPluginSpringbootApplication.class, args);
 
         // 手动获取 VertxService 并启动
         // TODO @haohao:可以放在 bean 的 init 里么?回复:会和插件模式冲突 @芋艿,测试下
-        IotDeviceUpstreamServer vertxService = context.getBean(IotDeviceUpstreamServer.class);
-        vertxService.start();
+        // TODO @haohao:貌似去掉,没有问题额。。。
+//        IotDeviceUpstreamServer vertxService = context.getBean(IotDeviceUpstreamServer.class);
+//        vertxService.start();
 
-        log.info("[HttpPluginSpringbootApplication] 独立模式启动完成");
+        log.info("[main][独立模式启动完成]");
     }
 
 }

+ 9 - 8
yudao-module-iot/yudao-module-iot-plugins/yudao-module-iot-plugin-http/src/main/java/cn/iocoder/yudao/module/iot/plugin/http/config/IotHttpVertxPlugin.java

@@ -3,7 +3,6 @@ package cn.iocoder.yudao.module.iot.plugin.http.config;
 import cn.hutool.core.lang.Assert;
 import cn.hutool.extra.spring.SpringUtil;
 import cn.iocoder.yudao.module.iot.api.device.IotDeviceUpstreamApi;
-import cn.iocoder.yudao.module.iot.plugin.http.upstream.IotDeviceUpstreamServer;
 import lombok.extern.slf4j.Slf4j;
 import org.pf4j.PluginWrapper;
 import org.pf4j.spring.SpringPlugin;
@@ -11,6 +10,7 @@ import org.springframework.beans.factory.config.ConfigurableListableBeanFactory;
 import org.springframework.context.ApplicationContext;
 import org.springframework.context.annotation.AnnotationConfigApplicationContext;
 
+// TODO @芋艿:完善注释
 /**
  * 负责插件的启动和停止,与 Vert.x 的生命周期管理
  */
@@ -30,8 +30,9 @@ public class IotHttpVertxPlugin extends SpringPlugin {
             Assert.notNull(pluginContext, "pluginContext 不能为空");
 
             // 2. 启动 Vert.x
-            IotDeviceUpstreamServer vertxService = pluginContext.getBean(IotDeviceUpstreamServer.class);
-            vertxService.start();
+            // TODO @haohao:貌似去掉,没有问题额。。。
+//            IotDeviceUpstreamServer vertxService = pluginContext.getBean(IotDeviceUpstreamServer.class);
+//            vertxService.start();
 
             log.info("[HttpVertxPlugin][HttpVertxPlugin 插件启动成功...]");
         } catch (Exception e) {
@@ -44,11 +45,11 @@ public class IotHttpVertxPlugin extends SpringPlugin {
         log.info("[HttpVertxPlugin][HttpVertxPlugin 插件停止开始...]");
         try {
             // 停止服务器
-            ApplicationContext pluginContext = getApplicationContext();
-            if (pluginContext != null) {
-                IotDeviceUpstreamServer vertxService = pluginContext.getBean(IotDeviceUpstreamServer.class);
-                vertxService.stopServer();
-            }
+//            ApplicationContext pluginContext = getApplicationContext();
+//            if (pluginContext != null) {
+//                IotDeviceUpstreamServer vertxService = pluginContext.getBean(IotDeviceUpstreamServer.class);
+//                vertxService.stop();
+//            }
 
             log.info("[HttpVertxPlugin][HttpVertxPlugin 插件停止成功...]");
         } catch (Exception e) {

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

@@ -7,7 +7,9 @@ import org.springframework.context.annotation.Bean;
 import org.springframework.context.annotation.Configuration;
 
 /**
- * 插件与独立运行都可复用的配置类
+ * IoT 插件 HTTP 的专用自动配置类
+ *
+ * @author haohao
  */
 @Configuration
 public class IotPluginHttpAutoConfiguration {
@@ -19,8 +21,8 @@ public class IotPluginHttpAutoConfiguration {
     @Value("${plugin.http.server.port:8092}")
     private Integer port;
 
-    @Bean
-    public IotDeviceUpstreamServer vertxService(IotDeviceUpstreamApi deviceUpstreamApi) {
+    @Bean(initMethod = "start", destroyMethod = "stop")
+    public IotDeviceUpstreamServer deviceUpstreamServer(IotDeviceUpstreamApi deviceUpstreamApi) {
         return new IotDeviceUpstreamServer(port, deviceUpstreamApi);
     }
 

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

@@ -7,6 +7,14 @@ import cn.iocoder.yudao.module.iot.api.device.dto.control.downstream.IotDeviceSe
 import cn.iocoder.yudao.module.iot.plugin.common.downstream.IotDeviceDownstreamHandler;
 import org.springframework.stereotype.Component;
 
+/**
+ * HTTP 插件的 {@link IotDeviceDownstreamHandler} 实现类
+ *
+ * 但是:由于设备通过 HTTP 短链接接入,导致其实无法下行指导给 device 设备,所以基本都是直接返回失败!!!
+ * 类似 MQTT、WebSocket、TCP 插件,是可以实现下行指令的。
+ *
+ * @author 芋道源码
+ */
 @Component // TODO @芋艿:后续统一处理
 public class IotDeviceDownstreamHandlerImpl implements IotDeviceDownstreamHandler {
 

+ 1 - 1
yudao-module-iot/yudao-module-iot-plugins/yudao-module-iot-plugin-http/src/main/java/cn/iocoder/yudao/module/iot/plugin/http/upstream/IotDeviceUpstreamServer.java

@@ -51,7 +51,7 @@ public class IotDeviceUpstreamServer {
     /**
      * 停止所有
      */
-    public void stopServer() {
+    public void stop() {
         log.info("[stop][开始关闭]");
         try {
             // 关闭 HTTP 服务器

+ 10 - 7
yudao-module-iot/yudao-module-iot-plugins/yudao-module-iot-plugin-http/src/main/java/cn/iocoder/yudao/module/iot/plugin/http/upstream/router/IotDevicePropertyReportVertxHandler.java

@@ -10,21 +10,22 @@ import cn.iocoder.yudao.module.iot.enums.device.IotDeviceStateEnum;
 import io.vertx.core.Handler;
 import io.vertx.ext.web.RequestBody;
 import io.vertx.ext.web.RoutingContext;
+import lombok.RequiredArgsConstructor;
 import lombok.extern.slf4j.Slf4j;
 
 import java.time.LocalDateTime;
 import java.util.Map;
 
+/**
+ * IoT 设备属性上报的 Vert.x Handler
+ */
+@RequiredArgsConstructor
 @Slf4j
 public class IotDevicePropertyReportVertxHandler implements Handler<RoutingContext> {
 
     public static final String PATH = "/sys/:productKey/:deviceName/thing/event/property/post";
 
-    private final IotDeviceUpstreamApi deviceDataApi;
-
-    public IotDevicePropertyReportVertxHandler(IotDeviceUpstreamApi deviceDataApi) {
-        this.deviceDataApi = deviceDataApi;
-    }
+    private final IotDeviceUpstreamApi deviceUpstreamApi;
 
     @Override
     public void handle(RoutingContext ctx) {
@@ -51,7 +52,7 @@ public class IotDevicePropertyReportVertxHandler implements Handler<RoutingConte
         try {
             // TODO @haohao:pluginKey 需要设置
             // 设备上线
-            deviceDataApi.updateDeviceState(((IotDeviceStateUpdateReqDTO)
+            deviceUpstreamApi.updateDeviceState(((IotDeviceStateUpdateReqDTO)
                     new IotDeviceStateUpdateReqDTO().setRequestId(IdUtil.fastSimpleUUID())
                             .setPluginKey("http")
                             .setReportTime(LocalDateTime.now())
@@ -59,7 +60,7 @@ public class IotDevicePropertyReportVertxHandler implements Handler<RoutingConte
                     .setState(IotDeviceStateEnum.ONLINE.getState()));
 
             // 属性上报
-            deviceDataApi.reportDeviceProperty(((IotDevicePropertyReportReqDTO)
+            deviceUpstreamApi.reportDeviceProperty(((IotDevicePropertyReportReqDTO)
                     new IotDevicePropertyReportReqDTO().setRequestId(IdUtil.fastSimpleUUID())
                             .setPluginKey("http").setReportTime(LocalDateTime.now())
                             .setProductKey(productKey).setDeviceName(deviceName))
@@ -81,6 +82,7 @@ public class IotDevicePropertyReportVertxHandler implements Handler<RoutingConte
         }
     }
 
+    // TODO @芋艿:抽一个 IotPluginCommonResult 出来?等 mqtt、websocket 出来后,再考虑优化!
     private JSONObject createResponseJson(int code, JSONObject data, String id,
                                           String message, String method, String version) {
         JSONObject res = new JSONObject();
@@ -92,4 +94,5 @@ public class IotDevicePropertyReportVertxHandler implements Handler<RoutingConte
         res.set("version", version);
         return res;
     }
+
 }