523096025 vor 11 Monaten
Ursprung
Commit
1494b12eb2
62 geänderte Dateien mit 2469 neuen und 74 gelöschten Zeilen
  1. 75 38
      huimv-env-input/pom.xml
  2. 7 0
      huimv-env-input/src/main/java/com/huimv/env/input/HuimvEnvInputApplication.java
  3. 15 0
      huimv-env-input/src/main/java/com/huimv/env/input/c/MyNativeClass.java
  4. 13 0
      huimv-env-input/src/main/java/com/huimv/env/input/config/WebSocketConfiguration.java
  5. 57 0
      huimv-env-input/src/main/java/com/huimv/env/input/controller/BaseFarmController.java
  6. 20 0
      huimv-env-input/src/main/java/com/huimv/env/input/controller/BasePigpenController.java
  7. 20 0
      huimv-env-input/src/main/java/com/huimv/env/input/controller/EnvDataController.java
  8. 20 0
      huimv-env-input/src/main/java/com/huimv/env/input/controller/HeartInfoController.java
  9. 20 0
      huimv-env-input/src/main/java/com/huimv/env/input/controller/PortChangeDataController.java
  10. 20 0
      huimv-env-input/src/main/java/com/huimv/env/input/controller/PortWarningInfoController.java
  11. 20 0
      huimv-env-input/src/main/java/com/huimv/env/input/controller/TerminalController.java
  12. 20 0
      huimv-env-input/src/main/java/com/huimv/env/input/controller/TerminalPortController.java
  13. 60 0
      huimv-env-input/src/main/java/com/huimv/env/input/entity/BaseFarm.java
  14. 79 0
      huimv-env-input/src/main/java/com/huimv/env/input/entity/BasePigpen.java
  15. 113 0
      huimv-env-input/src/main/java/com/huimv/env/input/entity/EnvData.java
  16. 51 0
      huimv-env-input/src/main/java/com/huimv/env/input/entity/HeartInfo.java
  17. 105 0
      huimv-env-input/src/main/java/com/huimv/env/input/entity/PortChangeData.java
  18. 52 0
      huimv-env-input/src/main/java/com/huimv/env/input/entity/PortWarningInfo.java
  19. 76 0
      huimv-env-input/src/main/java/com/huimv/env/input/entity/Terminal.java
  20. 114 0
      huimv-env-input/src/main/java/com/huimv/env/input/entity/TerminalPort.java
  21. 16 0
      huimv-env-input/src/main/java/com/huimv/env/input/mapper/BaseFarmMapper.java
  22. 16 0
      huimv-env-input/src/main/java/com/huimv/env/input/mapper/BasePigpenMapper.java
  23. 16 0
      huimv-env-input/src/main/java/com/huimv/env/input/mapper/EnvDataMapper.java
  24. 16 0
      huimv-env-input/src/main/java/com/huimv/env/input/mapper/HeartInfoMapper.java
  25. 16 0
      huimv-env-input/src/main/java/com/huimv/env/input/mapper/PortChangeDataMapper.java
  26. 16 0
      huimv-env-input/src/main/java/com/huimv/env/input/mapper/PortWarningInfoMapper.java
  27. 16 0
      huimv-env-input/src/main/java/com/huimv/env/input/mapper/TerminalMapper.java
  28. 16 0
      huimv-env-input/src/main/java/com/huimv/env/input/mapper/TerminalPortMapper.java
  29. 586 16
      huimv-env-input/src/main/java/com/huimv/env/input/server/EnvInputServerHandler.java
  30. 16 0
      huimv-env-input/src/main/java/com/huimv/env/input/service/IBaseFarmService.java
  31. 16 0
      huimv-env-input/src/main/java/com/huimv/env/input/service/IBasePigpenService.java
  32. 16 0
      huimv-env-input/src/main/java/com/huimv/env/input/service/IEnvDataService.java
  33. 16 0
      huimv-env-input/src/main/java/com/huimv/env/input/service/IHeartInfoService.java
  34. 16 0
      huimv-env-input/src/main/java/com/huimv/env/input/service/IPortChangeDataService.java
  35. 16 0
      huimv-env-input/src/main/java/com/huimv/env/input/service/IPortWarningInfoService.java
  36. 16 0
      huimv-env-input/src/main/java/com/huimv/env/input/service/ITerminalPortService.java
  37. 16 0
      huimv-env-input/src/main/java/com/huimv/env/input/service/ITerminalService.java
  38. 20 0
      huimv-env-input/src/main/java/com/huimv/env/input/service/impl/BaseFarmServiceImpl.java
  39. 20 0
      huimv-env-input/src/main/java/com/huimv/env/input/service/impl/BasePigpenServiceImpl.java
  40. 20 0
      huimv-env-input/src/main/java/com/huimv/env/input/service/impl/EnvDataServiceImpl.java
  41. 20 0
      huimv-env-input/src/main/java/com/huimv/env/input/service/impl/HeartInfoServiceImpl.java
  42. 20 0
      huimv-env-input/src/main/java/com/huimv/env/input/service/impl/PortChangeDataServiceImpl.java
  43. 20 0
      huimv-env-input/src/main/java/com/huimv/env/input/service/impl/PortWarningInfoServiceImpl.java
  44. 20 0
      huimv-env-input/src/main/java/com/huimv/env/input/service/impl/TerminalPortServiceImpl.java
  45. 20 0
      huimv-env-input/src/main/java/com/huimv/env/input/service/impl/TerminalServiceImpl.java
  46. 114 0
      huimv-env-input/src/main/java/com/huimv/env/input/ws/WebsocketWorkerUtil.java
  47. 64 0
      huimv-env-input/src/main/java/com/huimv/env/input/ws/WorkerController.java
  48. 20 20
      huimv-env-input/src/main/resources/application-prod.yml
  49. 145 0
      huimv-env-input/src/main/resources/c/0513.model
  50. 1 0
      huimv-env-input/src/main/resources/c/config.txt
  51. BIN
      huimv-env-input/src/main/resources/c/libcpptest.so
  52. BIN
      huimv-env-input/src/main/resources/c/libpredict.so
  53. BIN
      huimv-env-input/src/main/resources/c/libpredict_printf.so
  54. BIN
      huimv-env-input/src/main/resources/c/libpredict_test.so
  55. 20 0
      huimv-env-input/src/main/resources/com/huimv/env/mapper/BaseFarmMapper.xml
  56. 22 0
      huimv-env-input/src/main/resources/com/huimv/env/mapper/BasePigpenMapper.xml
  57. 25 0
      huimv-env-input/src/main/resources/com/huimv/env/mapper/EnvDataMapper.xml
  58. 14 0
      huimv-env-input/src/main/resources/com/huimv/env/mapper/HeartInfoMapper.xml
  59. 17 0
      huimv-env-input/src/main/resources/com/huimv/env/mapper/PortWarningInfoMapper.xml
  60. 26 0
      huimv-env-input/src/main/resources/com/huimv/env/mapper/TerminalPortMapper.xml
  61. 23 0
      huimv-env-input/src/main/resources/mapper/PortChangeDataMapper.xml
  62. 19 0
      huimv-env-input/src/main/resources/mapper/TerminalMapper.xml

+ 75 - 38
huimv-env-input/pom.xml

@@ -1,72 +1,106 @@
 <?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">
+<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 https://maven.apache.org/xsd/maven-4.0.0.xsd">
+    <modelVersion>4.0.0</modelVersion>
     <parent>
         <groupId>org.springframework.boot</groupId>
         <artifactId>spring-boot-starter-parent</artifactId>
-        <version>2.4.3</version>
+        <version>2.6.4</version>
         <relativePath/> <!-- lookup parent from repository -->
     </parent>
-    <modelVersion>4.0.0</modelVersion>
-
-    <artifactId>huimv-env-input</artifactId>
+    <groupId>com.huimv</groupId>
+    <artifactId>huimv-new-env-input</artifactId>
     <version>0.0.1-SNAPSHOT</version>
-
+    <properties>
+        <java.version>8</java.version>
+    </properties>
     <dependencies>
-        <!-- 排除Tomcat容器 -->
         <dependency>
             <groupId>org.springframework.boot</groupId>
-            <artifactId>spring-boot-starter-web</artifactId>
-            <!-- 移除掉默认支持的 Tomcat -->
+            <artifactId>spring-boot-starter-websocket</artifactId>
+            <version>2.3.1.RELEASE</version>
+        </dependency>
+        <!-- https://mvnrepository.com/artifact/net.java.dev.jna/jna -->
+        <dependency>
+            <groupId>net.java.dev.jna</groupId>
+            <artifactId>jna</artifactId>
+            <version>5.13.0</version>
         </dependency>
 
-        <!-- 添加 Undertow 容器 -->
+        <!--生成二维码-->
         <dependency>
-            <groupId>org.springframework.boot</groupId>
-            <artifactId>spring-boot-starter-undertow</artifactId>
+            <groupId>com.google.zxing</groupId>
+            <artifactId>core</artifactId>
+            <version>3.4.1</version>
         </dependency>
-        <!-- mysql -->
         <dependency>
-            <groupId>mysql</groupId>
-            <artifactId>mysql-connector-java</artifactId>
+            <groupId>com.google.zxing</groupId>
+            <artifactId>javase</artifactId>
+            <version>3.4.1</version>
+        </dependency>
+
+        <dependency>
+            <groupId>com.alibaba</groupId>
+            <artifactId>fastjson</artifactId>
+            <version>1.2.78</version>
+        </dependency>
+        <dependency>
+            <groupId>com.baomidou</groupId>
+            <artifactId>mybatis-plus-generator</artifactId>
+            <!--            <version>3.3.1.tmp</version>-->
+            <version>3.3.2</version>
+        </dependency>
+        <!--mybits-plus-->
+        <dependency>
+            <groupId>com.baomidou</groupId>
+            <artifactId>mybatis-plus-boot-starter</artifactId>
+            <!--            <version>3.4.2</version>-->
+            <version>3.4.3.4</version>
+        </dependency>
+        <!-- mybatis-plus-extension -->
+        <dependency>
+            <groupId>com.baomidou</groupId>
+            <artifactId>mybatis-plus-extension</artifactId>
+            <version>3.5.2</version>
         </dependency>
-        <!--rabbitmq-->
         <dependency>
             <groupId>org.springframework.boot</groupId>
-            <artifactId>spring-boot-starter-amqp</artifactId>
+            <artifactId>spring-boot-starter-jdbc</artifactId>
         </dependency>
-        <!-- redis -->
         <dependency>
             <groupId>org.springframework.boot</groupId>
-            <artifactId>spring-boot-starter-data-redis</artifactId>
+            <artifactId>spring-boot-starter-web</artifactId>
         </dependency>
+
+
         <dependency>
             <groupId>org.projectlombok</groupId>
             <artifactId>lombok</artifactId>
             <optional>true</optional>
-            <version>1.18.22</version>
         </dependency>
-        <!-- actuator -->
         <dependency>
             <groupId>org.springframework.boot</groupId>
-            <artifactId>spring-boot-starter-actuator</artifactId>
+            <artifactId>spring-boot-starter-test</artifactId>
+            <scope>test</scope>
         </dependency>
+
+
+        <!-- mysql -->
         <dependency>
-            <groupId>com.alibaba</groupId>
-            <artifactId>fastjson</artifactId>
-            <version>1.2.28</version>
+            <groupId>mysql</groupId>
+            <artifactId>mysql-connector-java</artifactId>
         </dependency>
         <dependency>
-            <groupId>org.springframework.boot</groupId>
-            <artifactId>spring-boot-starter-test</artifactId>
-            <scope>test</scope>
+            <groupId>cn.hutool</groupId>
+            <artifactId>hutool-all</artifactId>
+            <version>5.8.5</version>
         </dependency>
-
         <dependency>
             <groupId>io.netty</groupId>
             <artifactId>netty-all</artifactId>
+            <version>4.1.45.Final</version>
         </dependency>
+
     </dependencies>
 
     <build>
@@ -74,13 +108,16 @@
             <plugin>
                 <groupId>org.springframework.boot</groupId>
                 <artifactId>spring-boot-maven-plugin</artifactId>
-            </plugin>
-
-            <plugin>
-                <groupId>org.apache.maven.plugins</groupId>
-                <artifactId>maven-resources-plugin</artifactId>
-                <version>2.6</version>
+                <configuration>
+                    <excludes>
+                        <exclude>
+                            <groupId>org.projectlombok</groupId>
+                            <artifactId>lombok</artifactId>
+                        </exclude>
+                    </excludes>
+                </configuration>
             </plugin>
         </plugins>
     </build>
-</project>
+
+</project>

+ 7 - 0
huimv-env-input/src/main/java/com/huimv/env/input/HuimvEnvInputApplication.java

@@ -1,16 +1,23 @@
 package com.huimv.env.input;
 
 import com.huimv.env.input.server.EnvInputServer;
+import org.mybatis.spring.annotation.MapperScan;
 import org.springframework.boot.SpringApplication;
 import org.springframework.boot.autoconfigure.SpringBootApplication;
 import org.springframework.context.ApplicationContext;
 
 
 @SpringBootApplication
+@MapperScan("com.huimv.env.input.mapper")
 public class HuimvEnvInputApplication {
     public static void main(String[] args) throws InterruptedException {
         ApplicationContext applicationContext = SpringApplication.run(HuimvEnvInputApplication.class, args);
         // EnvInputServer
         applicationContext.getBean(EnvInputServer.class).run();
     }
+//    @Bean
+//    public ServerEndpointExporter serverEndpointExporter() {
+//        return new ServerEndpointExporter();
+//    }
+
 }

+ 15 - 0
huimv-env-input/src/main/java/com/huimv/env/input/c/MyNativeClass.java

@@ -0,0 +1,15 @@
+package com.huimv.env.input.c;
+
+import com.sun.jna.Native;
+import com.sun.jna.Library;
+
+public class MyNativeClass {
+
+    public  interface LibraryshowChar extends Library {
+//        LibraryshowChar LIBRARY_CHAR = Native.load("/c/libpredict.so", LibraryshowChar.class);
+//        LibraryshowChar LIBRARY_CHAR = Native.load("/c/libpredict_test.so", LibraryshowChar.class);
+        LibraryshowChar LIBRARY_CHAR = Native.load("/c/libpredict_printf.so", LibraryshowChar.class);
+        int current_detection( int[] lastData , int[] curretData);
+    }
+
+}

+ 13 - 0
huimv-env-input/src/main/java/com/huimv/env/input/config/WebSocketConfiguration.java

@@ -0,0 +1,13 @@
+package com.huimv.env.input.config;
+
+import org.springframework.context.annotation.Bean;
+import org.springframework.context.annotation.Configuration;
+import org.springframework.web.socket.server.standard.ServerEndpointExporter;
+
+@Configuration
+public class WebSocketConfiguration {
+    @Bean
+    public ServerEndpointExporter serverEndpointExporter() {
+        return new ServerEndpointExporter();
+    }
+}

+ 57 - 0
huimv-env-input/src/main/java/com/huimv/env/input/controller/BaseFarmController.java

@@ -0,0 +1,57 @@
+package com.huimv.env.input.controller;
+
+
+import com.huimv.env.input.c.MyNativeClass;
+import com.sun.jna.Function;
+import com.sun.jna.Library;
+import com.sun.jna.Native;
+import com.sun.jna.NativeLibrary;
+import org.springframework.web.bind.annotation.GetMapping;
+import org.springframework.web.bind.annotation.RequestMapping;
+
+import org.springframework.web.bind.annotation.RestController;
+
+/**
+ * <p>
+ *  前端控制器
+ * </p>
+ *
+ * @author author
+ * @since 2024-05-09
+ */
+@RestController
+@RequestMapping("/baseFarm")
+public class BaseFarmController {
+
+
+      @GetMapping("/test")
+        public  String add()    {
+
+            // 前有功功率	前无功功率	前视在功率  +  前 128个电流值
+//            int[] lastData = new int[131];
+            // 有功功率	无功功率	视在功率  +  128个电流值
+//            int[] curretData = new int[131];
+
+
+          NativeLibrary instance = NativeLibrary.getInstance("/c/libpredict_printf.so");
+          Function func = instance.getFunction("current_detection");
+          int[] lastData = new int[]{2,0,222,-5,-6,-8,-4,-2,-7,-2,-4,-5,-5,-7,-6,-2,-4,-7,0,-5,-5,-1,0,-2,-4,-6,-4,-2,-6,-5,-6,-3,-4,-6,-7,-6,1,-5,-7,-4,-5,-7,-4,-3,-3,-6,-5,-6,-7,-1,0,-5,-6,-4,-8,-7,-6,-5,-7,-5,-4,-5,-5,-5,-6,-3,-5,-4,-6,-6,-7,-4,-6,-5,-7,-6,-7,-12,1,-8,-6,-6,-4,-6,-5,-5,-4,-4,-4,-6,-4,-8,-11,-5,-2,-6,-5,-3,-7,-4,-6,-5,-5,-6,-7,-5,0,-3,-5,-3,-6,-4,-6,-6,-7,-5,-5,-4,-6,-3,-7,-7,-5,-6,-3,-6,-9,-6,-4,-7,-4};
+          int[] curretData = new int[]{110,22,178,3,-6,-8,-4,-5,-4,-6,-7,-7,-6,-8,-4,-7,-7,-8,-5,-12,-6,-8,-6,-5,-8,-5,-8,-8,-7,-4,-8,-169,-479,-389,-380,-336,-247,-191,-151,-137,-117,-85,-16,-5,-2,-6,-3,-4,-2,-7,-2,-4,-4,-8,-6,-3,-5,-4,-3,-3,-2,-3,-6,-3,-5,-3,-1,-4,-3,1,144,468,409,363,328,238,179,148,124,108,75,6,-7,-3,-6,-5,-3,-5,-8,-5,-7,-7,-7,-7,-1,-3,-5,-5,-9,-6,0,-12,-9,-4,-10,-6,-6,-6,-10,-132,-469,-446,-367,-334,-251,-191,-153,-133,-113,-89,-20,0,-3,-2,-6,-4,-4,-4,-3,-6,-4};
+          Object res = func.invoke(Integer.class, new Object[]{lastData,curretData});
+          System.out.println( res);
+
+//            for (int i = 0; i < 100; i++) {
+//                int[] lastData = new int[]{2,0,222,-5,-6,-8,-4,-2,-7,-2,-4,-5,-5,-7,-6,-2,-4,-7,0,-5,-5,-1,0,-2,-4,-6,-4,-2,-6,-5,-6,-3,-4,-6,-7,-6,1,-5,-7,-4,-5,-7,-4,-3,-3,-6,-5,-6,-7,-1,0,-5,-6,-4,-8,-7,-6,-5,-7,-5,-4,-5,-5,-5,-6,-3,-5,-4,-6,-6,-7,-4,-6,-5,-7,-6,-7,-12,1,-8,-6,-6,-4,-6,-5,-5,-4,-4,-4,-6,-4,-8,-11,-5,-2,-6,-5,-3,-7,-4,-6,-5,-5,-6,-7,-5,0,-3,-5,-3,-6,-4,-6,-6,-7,-5,-5,-4,-6,-3,-7,-7,-5,-6,-3,-6,-9,-6,-4,-7,-4};
+//                int[] curretData = new int[]{110,22,178,3,-6,-8,-4,-5,-4,-6,-7,-7,-6,-8,-4,-7,-7,-8,-5,-12,-6,-8,-6,-5,-8,-5,-8,-8,-7,-4,-8,-169,-479,-389,-380,-336,-247,-191,-151,-137,-117,-85,-16,-5,-2,-6,-3,-4,-2,-7,-2,-4,-4,-8,-6,-3,-5,-4,-3,-3,-2,-3,-6,-3,-5,-3,-1,-4,-3,1,144,468,409,363,328,238,179,148,124,108,75,6,-7,-3,-6,-5,-3,-5,-8,-5,-7,-7,-7,-7,-1,-3,-5,-5,-9,-6,0,-12,-9,-4,-10,-6,-6,-6,-10,-132,-469,-446,-367,-334,-251,-191,-153,-133,-113,-89,-20,0,-3,-2,-6,-4,-4,-4,-3,-6,-4};
+//                int num =  MyNativeClass.LibraryshowChar.LIBRARY_CHAR.current_detection(lastData, curretData);
+//
+//                // 0没测到 1检测到
+//                System.out.println( i+"-->"+num);
+//            }
+
+
+            return  "成功";
+
+    }
+
+}

+ 20 - 0
huimv-env-input/src/main/java/com/huimv/env/input/controller/BasePigpenController.java

@@ -0,0 +1,20 @@
+package com.huimv.env.input.controller;
+
+
+import org.springframework.web.bind.annotation.RequestMapping;
+
+import org.springframework.web.bind.annotation.RestController;
+
+/**
+ * <p>
+ *  前端控制器
+ * </p>
+ *
+ * @author author
+ * @since 2024-05-09
+ */
+@RestController
+@RequestMapping("/base-pigpen")
+public class BasePigpenController {
+
+}

+ 20 - 0
huimv-env-input/src/main/java/com/huimv/env/input/controller/EnvDataController.java

@@ -0,0 +1,20 @@
+package com.huimv.env.input.controller;
+
+
+import org.springframework.web.bind.annotation.RequestMapping;
+
+import org.springframework.web.bind.annotation.RestController;
+
+/**
+ * <p>
+ *  前端控制器
+ * </p>
+ *
+ * @author author
+ * @since 2024-05-09
+ */
+@RestController
+@RequestMapping("/env-data")
+public class EnvDataController {
+
+}

+ 20 - 0
huimv-env-input/src/main/java/com/huimv/env/input/controller/HeartInfoController.java

@@ -0,0 +1,20 @@
+package com.huimv.env.input.controller;
+
+
+import org.springframework.web.bind.annotation.RequestMapping;
+
+import org.springframework.web.bind.annotation.RestController;
+
+/**
+ * <p>
+ *  前端控制器
+ * </p>
+ *
+ * @author author
+ * @since 2024-05-09
+ */
+@RestController
+@RequestMapping("/heart-info")
+public class HeartInfoController {
+
+}

+ 20 - 0
huimv-env-input/src/main/java/com/huimv/env/input/controller/PortChangeDataController.java

@@ -0,0 +1,20 @@
+package com.huimv.env.input.controller;
+
+
+import org.springframework.web.bind.annotation.RequestMapping;
+
+import org.springframework.web.bind.annotation.RestController;
+
+/**
+ * <p>
+ *  前端控制器
+ * </p>
+ *
+ * @author author
+ * @since 2024-05-09
+ */
+@RestController
+@RequestMapping("/port-change-data")
+public class PortChangeDataController {
+
+}

+ 20 - 0
huimv-env-input/src/main/java/com/huimv/env/input/controller/PortWarningInfoController.java

@@ -0,0 +1,20 @@
+package com.huimv.env.input.controller;
+
+
+import org.springframework.web.bind.annotation.RequestMapping;
+
+import org.springframework.web.bind.annotation.RestController;
+
+/**
+ * <p>
+ *  前端控制器
+ * </p>
+ *
+ * @author author
+ * @since 2024-05-09
+ */
+@RestController
+@RequestMapping("/port-warning-info")
+public class PortWarningInfoController {
+
+}

+ 20 - 0
huimv-env-input/src/main/java/com/huimv/env/input/controller/TerminalController.java

@@ -0,0 +1,20 @@
+package com.huimv.env.input.controller;
+
+
+import org.springframework.web.bind.annotation.RequestMapping;
+
+import org.springframework.web.bind.annotation.RestController;
+
+/**
+ * <p>
+ * 监测终端 前端控制器
+ * </p>
+ *
+ * @author author
+ * @since 2024-05-27
+ */
+@RestController
+@RequestMapping("/terminal")
+public class TerminalController {
+
+}

+ 20 - 0
huimv-env-input/src/main/java/com/huimv/env/input/controller/TerminalPortController.java

@@ -0,0 +1,20 @@
+package com.huimv.env.input.controller;
+
+
+import org.springframework.web.bind.annotation.RequestMapping;
+
+import org.springframework.web.bind.annotation.RestController;
+
+/**
+ * <p>
+ * 端口 前端控制器
+ * </p>
+ *
+ * @author author
+ * @since 2024-05-09
+ */
+@RestController
+@RequestMapping("/terminal-port")
+public class TerminalPortController {
+
+}

+ 60 - 0
huimv-env-input/src/main/java/com/huimv/env/input/entity/BaseFarm.java

@@ -0,0 +1,60 @@
+package com.huimv.env.input.entity;
+
+import com.baomidou.mybatisplus.annotation.TableName;
+import com.baomidou.mybatisplus.annotation.IdType;
+import com.baomidou.mybatisplus.annotation.TableId;
+import java.io.Serializable;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+import lombok.experimental.Accessors;
+
+/**
+ * <p>
+ * 
+ * </p>
+ *
+ * @author author
+ * @since 2024-05-09
+ */
+@Data
+@EqualsAndHashCode(callSuper = false)
+@Accessors(chain = true)
+@TableName("base_farm")
+public class BaseFarm implements Serializable {
+
+    private static final long serialVersionUID = 1L;
+
+    @TableId(value = "id", type = IdType.AUTO)
+    private Integer id;
+
+    private String farmName;
+
+    private String location;
+
+    private String frontLocation;
+
+    private Boolean rowStatus;
+
+    private String farmMenu;
+
+    private String farmTopMenu;
+
+    private String function;
+
+    /**
+     * 0显示 1不显示
+     */
+    private Integer isShow;
+
+    /**
+     * 经度
+     */
+    private String lng;
+
+    /**
+     * 纬度
+     */
+    private String lat;
+
+
+}

+ 79 - 0
huimv-env-input/src/main/java/com/huimv/env/input/entity/BasePigpen.java

@@ -0,0 +1,79 @@
+package com.huimv.env.input.entity;
+
+import com.baomidou.mybatisplus.annotation.TableName;
+import com.baomidou.mybatisplus.annotation.IdType;
+import com.baomidou.mybatisplus.annotation.TableId;
+import java.io.Serializable;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+import lombok.experimental.Accessors;
+
+/**
+ * <p>
+ * 
+ * </p>
+ *
+ * @author author
+ * @since 2024-05-09
+ */
+@Data
+@EqualsAndHashCode(callSuper = false)
+@Accessors(chain = true)
+@TableName("base_pigpen")
+public class BasePigpen implements Serializable {
+
+    private static final long serialVersionUID = 1L;
+
+    @TableId(value = "id", type = IdType.AUTO)
+    private Integer id;
+
+    /**
+     * 栋舍名字
+     */
+    private String buildName;
+
+    /**
+     * 父级
+     */
+    private Integer parentId;
+
+    /**
+     * 1栋 2楼层 3单元 4 门号
+     */
+    private Integer fType;
+
+    /**
+     * 阶段
+     */
+    private Integer stageCode;
+
+    private Integer farmId;
+
+    private Integer sort;
+
+    /**
+     * 楼层名称
+     */
+    private String other1;
+
+    /**
+     * 父id集合
+     */
+    private String other2;
+
+    /**
+     * 0为普通栋舍 1为水电表栋舍
+     */
+    private String other3;
+
+    /**
+     * 单元号
+     */
+    private Integer other4;
+
+    private String lng;
+
+    private String lat;
+
+
+}

+ 113 - 0
huimv-env-input/src/main/java/com/huimv/env/input/entity/EnvData.java

@@ -0,0 +1,113 @@
+package com.huimv.env.input.entity;
+
+import com.baomidou.mybatisplus.annotation.TableName;
+import com.baomidou.mybatisplus.annotation.IdType;
+import com.baomidou.mybatisplus.annotation.TableId;
+import java.time.LocalDateTime;
+import java.io.Serializable;
+import java.util.Date;
+
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+import lombok.experimental.Accessors;
+
+/**
+ * <p>
+ * 
+ * </p>
+ *
+ * @author author
+ * @since 2024-05-09
+ */
+@Data
+@EqualsAndHashCode(callSuper = false)
+@Accessors(chain = true)
+@TableName("env_data")
+public class EnvData implements Serializable {
+
+    private static final long serialVersionUID = 1L;
+
+    public EnvData() {
+    }
+
+    public EnvData(String terminalPortCode, String terminalCode, String gatwayCode, String voltage, String electricCurrent, String temp, String leakageValue, Integer activePower, Integer reactivePower, Integer apparentPower, int heightTempWarning, int chargingWarning, int leakageWarning, String originalData, Date createTime) {
+
+        this.terminalPortCode = terminalPortCode;
+        this.terminalCode = terminalCode;
+        this.gatwayCode = gatwayCode;
+        this.voltage = voltage;
+        this.electricCurrent = electricCurrent;
+        this.temp = temp;
+        this.leakageValue = leakageValue;
+        this.activePower = activePower;
+        this.reactivePower = reactivePower;
+        this.apparentPower = apparentPower;
+        this.heightTempWarning = heightTempWarning;
+        this.chargingWarning = chargingWarning;
+        this.leakageWarning = leakageWarning;
+        this.originalData = originalData;
+        this.createTime = createTime;
+    }
+
+    @TableId(value = "id", type = IdType.AUTO)
+    private Integer id;
+
+    private String terminalPortCode;
+
+    private String terminalCode;
+
+    private String gatwayCode;
+
+    /**
+     * 电压有效值
+     */
+    private String voltage;
+
+    /**
+     * 电流有效值
+     */
+    private String electricCurrent;
+
+    private String temp;
+
+    /**
+     * 漏电值
+     */
+    private String leakageValue;
+
+    /**
+     * 有功功率
+     */
+    private Integer activePower;
+
+    /**
+     * 无功功率
+     */
+    private Integer reactivePower;
+
+    /**
+     * 视在功率
+     */
+    private Integer apparentPower;
+
+    /**
+     * 高温报警 0 无
+     */
+    private int heightTempWarning;
+
+    /**
+     * 充电报警 0 无
+     */
+    private int chargingWarning;
+
+    /**
+     * 漏电报警 0 无
+     */
+    private int leakageWarning;
+
+    private String originalData;
+
+    private Date createTime;
+
+
+}

+ 51 - 0
huimv-env-input/src/main/java/com/huimv/env/input/entity/HeartInfo.java

@@ -0,0 +1,51 @@
+package com.huimv.env.input.entity;
+
+import com.baomidou.mybatisplus.annotation.TableName;
+import com.baomidou.mybatisplus.annotation.IdType;
+import com.baomidou.mybatisplus.annotation.TableId;
+import java.io.Serializable;
+import java.util.Date;
+
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+import lombok.experimental.Accessors;
+
+/**
+ * <p>
+ * 
+ * </p>
+ *
+ * @author author
+ * @since 2024-05-09
+ */
+@Data
+@EqualsAndHashCode(callSuper = false)
+@Accessors(chain = true)
+@TableName("heart_info")
+public class HeartInfo implements Serializable {
+
+    private static final long serialVersionUID = 1L;
+
+    public HeartInfo() {
+    }
+
+    public HeartInfo(Date createTime, String terminalCode, String gatwayCode, String originalData) {
+        this.createTime = createTime;
+        this.terminalCode = terminalCode;
+        this.gatwayCode = gatwayCode;
+        this.originalData = originalData;
+    }
+
+    @TableId(value = "id", type = IdType.AUTO)
+    private Integer id;
+
+    private Date createTime;
+
+    private String terminalCode;
+
+    private String gatwayCode;
+
+    private String originalData;
+
+
+}

+ 105 - 0
huimv-env-input/src/main/java/com/huimv/env/input/entity/PortChangeData.java

@@ -0,0 +1,105 @@
+package com.huimv.env.input.entity;
+
+import com.baomidou.mybatisplus.annotation.TableName;
+import com.baomidou.mybatisplus.annotation.IdType;
+import com.baomidou.mybatisplus.annotation.TableId;
+import java.time.LocalDateTime;
+import java.io.Serializable;
+import java.util.Date;
+
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+import lombok.experimental.Accessors;
+
+/**
+ * <p>
+ * 
+ * </p>
+ *
+ * @author author
+ * @since 2024-05-09
+ */
+@Data
+@EqualsAndHashCode(callSuper = false)
+@Accessors(chain = true)
+@TableName("port_change_data")
+public class PortChangeData implements Serializable {
+
+    private static final long serialVersionUID = 1L;
+
+    public PortChangeData() {
+    }
+
+    public PortChangeData(String terminalPortCode, String terminalCode, String gatwayCode, Integer activePower, Integer reactivePower, Integer apparentPower, Integer beforeActivePower, Integer beforeReactivePower, Integer beforeApparentPower, Date createTime, Integer num) {
+        this.terminalPortCode = terminalPortCode;
+        this.terminalCode = terminalCode;
+        this.gatwayCode = gatwayCode;
+        this.activePower = activePower;
+        this.reactivePower = reactivePower;
+        this.apparentPower = apparentPower;
+        this.beforeActivePower = beforeActivePower;
+        this.beforeReactivePower = beforeReactivePower;
+        this.beforeApparentPower = beforeApparentPower;
+        this.createTime = createTime;
+        this.num = num;
+    }
+
+
+    @TableId(value = "id", type = IdType.AUTO)
+    private Integer id;
+
+    private String terminalPortCode;
+
+    private String terminalCode;
+
+    private String gatwayCode;
+
+    /**
+     * 现有功
+     */
+    private Integer activePower;
+
+    /**
+     * ,无功
+     */
+    private Integer reactivePower;
+
+    /**
+     * ,视在
+     */
+    private Integer apparentPower;
+
+    /**
+     * 前功率  有功
+     */
+    private Integer beforeActivePower;
+
+    /**
+     * ,无功
+     */
+    private Integer beforeReactivePower;
+
+    /**
+     * 视在
+     */
+    private Integer beforeApparentPower;
+
+    /**
+     * 电流buf
+     */
+    private String electricCurrent;
+
+    /**
+     * 变化前的电流buf
+     */
+    private String beforeElectricCurrent;
+
+    private Date createTime;
+
+    /**
+     * 序号
+     */
+    private Integer num;
+
+
+}

+ 52 - 0
huimv-env-input/src/main/java/com/huimv/env/input/entity/PortWarningInfo.java

@@ -0,0 +1,52 @@
+package com.huimv.env.input.entity;
+
+import com.baomidou.mybatisplus.annotation.TableName;
+import com.baomidou.mybatisplus.annotation.IdType;
+import com.baomidou.mybatisplus.annotation.TableId;
+import java.io.Serializable;
+import java.util.Date;
+
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+import lombok.experimental.Accessors;
+
+/**
+ * <p>
+ * 
+ * </p>
+ *
+ * @author author
+ * @since 2024-05-09
+ */
+@Data
+@EqualsAndHashCode(callSuper = false)
+@Accessors(chain = true)
+@TableName("port_warning_info")
+public class PortWarningInfo implements Serializable {
+
+    private static final long serialVersionUID = 1L;
+
+    @TableId(value = "id", type = IdType.AUTO)
+    private Integer id;
+
+    private String terminalPortCode;
+
+    private String terminalCode;
+
+    private String gatwayCode;
+
+    /**
+     * 0离线 1高温报警 2充电报警 3漏电报警
+     */
+    private Integer warningType;
+
+    private Integer farmId;
+
+    private Integer locationId;
+
+    private String content;
+
+    private Date createTime;
+
+
+}

+ 76 - 0
huimv-env-input/src/main/java/com/huimv/env/input/entity/Terminal.java

@@ -0,0 +1,76 @@
+package com.huimv.env.input.entity;
+
+import com.baomidou.mybatisplus.annotation.TableName;
+import com.baomidou.mybatisplus.annotation.IdType;
+import com.baomidou.mybatisplus.annotation.TableId;
+import java.io.Serializable;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+import lombok.experimental.Accessors;
+
+/**
+ * <p>
+ * 监测终端
+ * </p>
+ *
+ * @author author
+ * @since 2024-05-27
+ */
+@Data
+@EqualsAndHashCode(callSuper = false)
+@Accessors(chain = true)
+@TableName("terminal")
+public class Terminal implements Serializable {
+
+    private static final long serialVersionUID = 1L;
+
+    @TableId(value = "id", type = IdType.AUTO)
+    private Integer id;
+
+    /**
+     * 编号
+     */
+    private String deviceCode;
+
+    /**
+     * 名称
+     */
+    private String deviceName;
+
+    /**
+     * 型号
+     */
+    private String type;
+
+    /**
+     * 状态 0为离线 1为在线
+     */
+    private Integer status;
+
+    /**
+     * 栋ID
+     */
+    private Integer buildId;
+
+    /**
+     * 楼层ID
+     */
+    private Integer floorId;
+
+    /**
+     * 网关ID
+     */
+    private Integer gatewayId;
+
+    /**
+     * 小区ID
+     */
+    private Integer farmId;
+
+    /**
+     * 序号
+     */
+    private Integer orders;
+
+
+}

+ 114 - 0
huimv-env-input/src/main/java/com/huimv/env/input/entity/TerminalPort.java

@@ -0,0 +1,114 @@
+package com.huimv.env.input.entity;
+
+import com.baomidou.mybatisplus.annotation.TableName;
+import com.baomidou.mybatisplus.annotation.IdType;
+import com.baomidou.mybatisplus.annotation.TableId;
+import java.time.LocalDateTime;
+import java.io.Serializable;
+import java.util.Date;
+
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+import lombok.experimental.Accessors;
+
+/**
+ * <p>
+ * 端口
+ * </p>
+ *
+ * @author author
+ * @since 2024-05-09
+ */
+@Data
+@EqualsAndHashCode(callSuper = false)
+@Accessors(chain = true)
+@TableName("terminal_port")
+public class TerminalPort implements Serializable {
+
+    private static final long serialVersionUID = 1L;
+
+    @TableId(value = "id", type = IdType.AUTO)
+    private Integer id;
+
+    /**
+     * 端口编号
+     */
+    private String deviceCode;
+
+    /**
+     * 终端ID
+     */
+    private Integer terminalId;
+
+    /**
+     * 户名ID
+     */
+    private Integer locationId;
+
+    /**
+     * 小区ID
+     */
+    private Integer farmId;
+
+    /**
+     * 电压有效值
+     */
+    private String voltage;
+
+    /**
+     * 电流有效值
+     */
+    private String electricCurrent;
+
+    /**
+     * 温度
+     */
+    private String temp;
+
+    /**
+     * 漏电值
+     */
+    private String leakageValue;
+
+    /**
+     * 有功功率
+     */
+    private Integer activePower;
+
+    /**
+     * 无功功率
+     */
+    private Integer reactivePower;
+
+    /**
+     * 视在功率
+     */
+    private Integer apparentPower;
+
+    /**
+     * 高温报警 0 无
+     */
+    private Integer heightTempWarning;
+
+    /**
+     * 充电报警 0 无
+     */
+    private Integer chargingWarning;
+
+    /**
+     * 漏电报警 0 无
+     */
+    private Integer leakageWarning;
+
+    /**
+     * 更新时间
+     */
+    private Date updateTime;
+
+    /**
+     * 状态 0为离线 1为在线
+     */
+    private Integer status;
+
+
+}

+ 16 - 0
huimv-env-input/src/main/java/com/huimv/env/input/mapper/BaseFarmMapper.java

@@ -0,0 +1,16 @@
+package com.huimv.env.input.mapper;
+
+import com.huimv.env.input.entity.BaseFarm;
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+
+/**
+ * <p>
+ *  Mapper 接口
+ * </p>
+ *
+ * @author author
+ * @since 2024-05-09
+ */
+public interface BaseFarmMapper extends BaseMapper<BaseFarm> {
+
+}

+ 16 - 0
huimv-env-input/src/main/java/com/huimv/env/input/mapper/BasePigpenMapper.java

@@ -0,0 +1,16 @@
+package com.huimv.env.input.mapper;
+
+import com.huimv.env.input.entity.BasePigpen;
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+
+/**
+ * <p>
+ *  Mapper 接口
+ * </p>
+ *
+ * @author author
+ * @since 2024-05-09
+ */
+public interface BasePigpenMapper extends BaseMapper<BasePigpen> {
+
+}

+ 16 - 0
huimv-env-input/src/main/java/com/huimv/env/input/mapper/EnvDataMapper.java

@@ -0,0 +1,16 @@
+package com.huimv.env.input.mapper;
+
+import com.huimv.env.input.entity.EnvData;
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+
+/**
+ * <p>
+ *  Mapper 接口
+ * </p>
+ *
+ * @author author
+ * @since 2024-05-09
+ */
+public interface EnvDataMapper extends BaseMapper<EnvData> {
+
+}

+ 16 - 0
huimv-env-input/src/main/java/com/huimv/env/input/mapper/HeartInfoMapper.java

@@ -0,0 +1,16 @@
+package com.huimv.env.input.mapper;
+
+import com.huimv.env.input.entity.HeartInfo;
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+
+/**
+ * <p>
+ *  Mapper 接口
+ * </p>
+ *
+ * @author author
+ * @since 2024-05-09
+ */
+public interface HeartInfoMapper extends BaseMapper<HeartInfo> {
+
+}

+ 16 - 0
huimv-env-input/src/main/java/com/huimv/env/input/mapper/PortChangeDataMapper.java

@@ -0,0 +1,16 @@
+package com.huimv.env.input.mapper;
+
+import com.huimv.env.input.entity.PortChangeData;
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+
+/**
+ * <p>
+ *  Mapper 接口
+ * </p>
+ *
+ * @author author
+ * @since 2024-05-09
+ */
+public interface PortChangeDataMapper extends BaseMapper<PortChangeData> {
+
+}

+ 16 - 0
huimv-env-input/src/main/java/com/huimv/env/input/mapper/PortWarningInfoMapper.java

@@ -0,0 +1,16 @@
+package com.huimv.env.input.mapper;
+
+import com.huimv.env.input.entity.PortWarningInfo;
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+
+/**
+ * <p>
+ *  Mapper 接口
+ * </p>
+ *
+ * @author author
+ * @since 2024-05-09
+ */
+public interface PortWarningInfoMapper extends BaseMapper<PortWarningInfo> {
+
+}

+ 16 - 0
huimv-env-input/src/main/java/com/huimv/env/input/mapper/TerminalMapper.java

@@ -0,0 +1,16 @@
+package com.huimv.env.input.mapper;
+
+import com.huimv.env.input.entity.Terminal;
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+
+/**
+ * <p>
+ * 监测终端 Mapper 接口
+ * </p>
+ *
+ * @author author
+ * @since 2024-05-27
+ */
+public interface TerminalMapper extends BaseMapper<Terminal> {
+
+}

+ 16 - 0
huimv-env-input/src/main/java/com/huimv/env/input/mapper/TerminalPortMapper.java

@@ -0,0 +1,16 @@
+package com.huimv.env.input.mapper;
+
+import com.huimv.env.input.entity.TerminalPort;
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+
+/**
+ * <p>
+ * 端口 Mapper 接口
+ * </p>
+ *
+ * @author author
+ * @since 2024-05-09
+ */
+public interface TerminalPortMapper extends BaseMapper<TerminalPort> {
+
+}

+ 586 - 16
huimv-env-input/src/main/java/com/huimv/env/input/server/EnvInputServerHandler.java

@@ -1,6 +1,13 @@
 package com.huimv.env.input.server;
 
 import com.alibaba.fastjson.JSONArray;
+import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
+import com.baomidou.mybatisplus.core.conditions.update.UpdateWrapper;
+import com.huimv.env.input.c.MyNativeClass;
+import com.huimv.env.input.entity.*;
+import com.huimv.env.input.mapper.TerminalPortMapper;
+import com.huimv.env.input.service.*;
+import com.huimv.env.input.ws.WebsocketWorkerUtil;
 import io.netty.buffer.ByteBuf;
 import io.netty.buffer.Unpooled;
 
@@ -9,12 +16,22 @@ import io.netty.channel.ChannelHandlerContext;
 import io.netty.channel.ChannelInboundHandlerAdapter;
 import io.netty.util.CharsetUtil;
 import lombok.extern.log4j.Log4j2;
+import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Component;
+import org.springframework.util.ObjectUtils;
 
 import java.io.IOException;
+import java.math.BigDecimal;
+import java.text.DecimalFormat;
 import java.text.ParseException;
+import java.util.Arrays;
+import java.util.Collections;
+import java.util.Date;
+import java.util.List;
 import java.util.regex.Matcher;
 import java.util.regex.Pattern;
+import java.util.stream.Collectors;
+import java.util.stream.IntStream;
 
 /**
  * @Project : huimv.shiwan
@@ -30,6 +47,29 @@ import java.util.regex.Pattern;
 public class EnvInputServerHandler extends ChannelInboundHandlerAdapter {
     private StringBuilder askTextSb = null;
 
+    @Autowired
+    private IEnvDataService envDataService;
+
+    @Autowired
+    private ITerminalPortService terminalPortService;
+
+    @Autowired
+    private IBaseFarmService baseFarmService;
+
+    @Autowired
+    private IBasePigpenService basePigpenService;
+
+    @Autowired
+    private IPortWarningInfoService portWarningInfoService;
+
+    @Autowired
+    private IPortChangeDataService portChangeDataService;
+
+    @Autowired
+    private ITerminalService terminalService;
+
+    @Autowired
+    private IHeartInfoService heartInfoService;
     //
     public void appendClientAsk(String text) {
         if (this.askTextSb == null) {
@@ -112,47 +152,577 @@ public class EnvInputServerHandler extends ChannelInboundHandlerAdapter {
             log.info("当前命令是非hm命令[" + askText + "]");
             return;
         }
-        //芯片id/设备编码
+        String version = dataArray[dataArray.length - 3];
+        if ("v2.0".equals(version)) {
+            askCmdActuatorV2(askText, ctx, dataArray);
+        } else {
+            askCmdActuatorV1(askText, ctx, dataArray);
+            log.info("当前版本异常[" + askText + "]");
+        }
+    }
 
+    private void askCmdActuatorV2(String askText, ChannelHandlerContext ctx,  String[] dataArray){
+        //芯片id/设备编码
         String cmd = dataArray[1];
-//        Map map = new HashMap();
-//        map.put("askText", askText);
-//        rawDataService.insert(idCode,askText);
         switch (cmd) {
             case "1":
-                //上传温度
-                getTemp(dataArray,ctx);
+                //心跳
+                getHear(askText, dataArray, ctx,2);
                 break;
             case "2":
-                //上传充电状态
-                getChargingStatus(dataArray,ctx);
+                //上传数据
+                getChuanGanData2(askText, dataArray, ctx);
+                break;
             case "3":
-                //上传漏电状态
-                getLeakageStatus(dataArray,ctx);
+                //充电前后功率
+                savePower2(askText, dataArray, ctx);
+                break;
             case "4":
-                //心跳
-                getHear(dataArray,ctx);
+                //充电中电流
+                saveElectric2(askText, dataArray, ctx);
+                break;
+            case "5":
+                //充电前电流
+                saveBeforeElectric2(askText, dataArray, ctx);
+                break;
+            default:
+                log.error(String.format("未知指令 --> %s", askText));
+                answerCmd("hm+4+1+end", ctx);
+        }
+    }
+
+    private  synchronized void saveBeforeElectric2(String askText, String[] dataArray, ChannelHandlerContext ctx) {
+
+        String gateWayCode = dataArray[2];
+        String  terminalCode = dataArray[3];
+        String terminalPortCode = "1";
+        String num = dataArray[4];
+        String eleData = dataArray[5];
+        Date now = new Date();
+
+        try {
+            PortChangeData portChangeData = portChangeDataService.getOne(new QueryWrapper<PortChangeData>().eq("terminal_port_code", gateWayCode + terminalCode + terminalPortCode).eq("num", num));
+            if (ObjectUtils.isEmpty(portChangeData)) {
+                portChangeData = new PortChangeData();
+                portChangeData.setNum(Integer.parseInt(num));
+                portChangeData.setCreateTime(now);
+                portChangeData.setGatwayCode(gateWayCode);
+                portChangeData.setTerminalCode(gateWayCode+terminalCode);
+                portChangeData.setTerminalPortCode(gateWayCode+terminalCode+terminalPortCode);
+                portChangeData.setBeforeElectricCurrent(eleData);
+                portChangeDataService.save(portChangeData);
+            }else {
+                portChangeData.setBeforeElectricCurrent(eleData);
+                portChangeDataService.updateById(portChangeData);
+                if(changeDataIsAll(portChangeData)){
+                    int i  = getStatusEle(portChangeData);
+                    TerminalPort deviceCode = terminalPortService.getOne(new QueryWrapper<TerminalPort>().eq("device_code", portChangeData.getTerminalPortCode()));
+                    System.out.println("---->"+i);
+                    if (i == 1){
+                        deviceCode.setChargingWarning(1);
+                        String ans = "hm+5+1+end";
+                        answerCmd(ans,ctx);
+                        saveChargingWarning(portChangeData,deviceCode);
+                    }else {
+                        String ans = "hm+5+0+end";
+                        answerCmd(ans,ctx);
+                        deviceCode.setChargingWarning(0);
+                    }
+                    terminalPortService.updateById(deviceCode);
+                }
+            }
+        }catch (Exception e){
+            log.error(String.format("点位查询失败--> %s" ,askText));
+            log.error(e);
         }
     }
 
-    private void getHear(String[] dataArray, ChannelHandlerContext ctx) {
+    private  synchronized void saveElectric2(String askText, String[] dataArray, ChannelHandlerContext ctx) {
         String ans = "hm+4+1+end";
         answerCmd(ans,ctx);
+        String gateWayCode = dataArray[2];
+        String  terminalCode = dataArray[3];
+        String terminalPortCode = "1";
+        String num = dataArray[4];
+        String eleData = dataArray[5];
+        Date now = new Date();
+
+        try {
+            PortChangeData portChangeData = portChangeDataService.getOne(new QueryWrapper<PortChangeData>().eq("terminal_port_code", gateWayCode + terminalCode + terminalPortCode).eq("num", num));
+            if (ObjectUtils.isEmpty(portChangeData)) {
+                portChangeData = new PortChangeData();
+                portChangeData.setNum(Integer.parseInt(num));
+                portChangeData.setCreateTime(now);
+
+                portChangeData.setGatwayCode(gateWayCode);
+                portChangeData.setTerminalCode(gateWayCode+terminalCode);
+                portChangeData.setTerminalPortCode(gateWayCode+terminalCode+terminalPortCode);
+                portChangeData.setElectricCurrent(eleData);
+
+                portChangeDataService.save(portChangeData);
+            }else {
+                portChangeData.setElectricCurrent(eleData);
+                portChangeDataService.updateById(portChangeData);
+
+//                if(changeDataIsAll(portChangeData)){
+//                    int i  = getStatusEle(portChangeData);
+//                    TerminalPort deviceCode = terminalPortService.getOne(new QueryWrapper<TerminalPort>().eq("device_code", portChangeData.getTerminalPortCode()));
+//                    if (i == 1){
+//                        deviceCode.setChargingWarning(1);
+//                        saveChargingWarning(portChangeData,deviceCode);
+//                    }else {
+//                        deviceCode.setChargingWarning(0);
+//                    }
+//                    terminalPortService.updateById(deviceCode);
+//                }
+            }
+        }catch (Exception e){
+            log.error(String.format("点位查询失败--> %s" ,askText));
+            log.error(e);
+        }
     }
 
-    private void getLeakageStatus(String[] dataArray, ChannelHandlerContext ctx) {
+    private synchronized void savePower2(String askText, String[] dataArray, ChannelHandlerContext ctx) {
         String ans = "hm+3+1+end";
         answerCmd(ans,ctx);
+        String gateWayCode = dataArray[2];
+        String  terminalCode = dataArray[3];
+        String terminalPortCode = "1";
+        String num = dataArray[4];
+        int[] splitPower = Arrays.stream(dataArray[5].split(",")).mapToInt(Integer::parseInt).toArray();
+        int[] splitBeforePower = Arrays.stream(dataArray[6].split(",")).mapToInt(Integer::parseInt).toArray();
+        Date now = new Date();
+
+        try {
+            PortChangeData portChangeData = portChangeDataService.getOne(new QueryWrapper<PortChangeData>().eq("terminal_port_code", gateWayCode + terminalCode + terminalPortCode).eq("num", num));
+            if (ObjectUtils.isEmpty(portChangeData)) {
+                portChangeData = new PortChangeData(gateWayCode + terminalCode + terminalPortCode,gateWayCode + terminalCode ,gateWayCode,
+                        splitPower[0],splitPower[1],splitPower[2],
+                        splitBeforePower[0],splitBeforePower[1],splitBeforePower[2],
+                        now,Integer.parseInt(num));
+                portChangeDataService.save(portChangeData);
+            }else {
+                portChangeData.setActivePower( splitPower[0]);
+                portChangeData.setReactivePower( splitPower[1]);
+                portChangeData.setApparentPower( splitPower[2]);
+                portChangeData.setBeforeActivePower(splitBeforePower[0]);
+                portChangeData.setBeforeReactivePower(splitBeforePower[1]);
+                portChangeData.setBeforeApparentPower(splitBeforePower[2]);
+                portChangeDataService.updateById(portChangeData);
+
+            }
+        }catch (Exception e){
+            log.error(String.format("点位查询失败--> %s" ,askText));
+            log.error(e);
+        }
     }
 
-    private void getChargingStatus(String[] dataArray, ChannelHandlerContext ctx) {
+    private int getStatusEle(PortChangeData portChangeData) {
+        // 前有功功率	前无功功率	前视在功率  +  前 128个电流值
+        int[] lastEleData =  Arrays.stream(portChangeData.getBeforeElectricCurrent().split(",")).mapToInt(Integer::parseInt).toArray();
+        int[] lastGlData = new int[]{portChangeData.getBeforeActivePower(),portChangeData.getBeforeReactivePower(),portChangeData.getBeforeApparentPower()};
+
+        // 有功功率	无功功率	视在功率  +  128个电流值
+        int[] curretEleData =Arrays.stream(portChangeData.getElectricCurrent().split(",")).mapToInt(Integer::parseInt).toArray();
+        int[] curretGlData = new int[]{portChangeData.getActivePower(),portChangeData.getReactivePower(),portChangeData.getApparentPower()};
+        int[] ints = IntStream.concat( Arrays.stream(lastGlData),Arrays.stream(lastEleData)).toArray();
+        int[] ints1 = IntStream.concat(Arrays.stream(curretGlData) ,Arrays.stream(curretEleData)).toArray();
+
+        System.out.println("last");
+        for (int i : ints) {
+            System.out.print(i+",");
+        }
+        System.out.println();
+        System.out.println("curretData");
+        for (int i : ints1) {
+            System.out.print(i+",");
+        }
+        System.out.println();
+        return MyNativeClass.LibraryshowChar.LIBRARY_CHAR.current_detection(ints,ints1 );
+
+    }
+
+    private void saveChargingWarning(PortChangeData portChangeData ,TerminalPort deviceCode) {
+
+        BasePigpen basePigpen = basePigpenService.getById(deviceCode.getLocationId());
+
+        PortWarningInfo portWarningInfo = new PortWarningInfo();
+        portWarningInfo.setGatwayCode(portChangeData.getGatwayCode());
+
+        portWarningInfo.setTerminalCode(portChangeData.getTerminalCode());
+        portWarningInfo.setTerminalPortCode(portChangeData.getTerminalPortCode());
+        portWarningInfo.setLocationId(deviceCode.getLocationId());
+        portWarningInfo.setFarmId(deviceCode.getFarmId());
+        portWarningInfo.setWarningType(2);
+        portWarningInfo.setCreateTime(new Date());
+        portWarningInfo.setContent(String.format("%s 充电预警",basePigpen.getBuildName()));
+        portWarningInfo.setWarningType(2);
+        portWarningInfoService.save(portWarningInfo);
+        WebsocketWorkerUtil.sendWarningMessage(deviceCode.getFarmId(),String.format("%s 充电预警",basePigpen.getBuildName()));
+    }
+
+    private boolean changeDataIsAll(PortChangeData portChangeData) {
+        return portChangeData.getActivePower() != null &&
+                portChangeData.getBeforeActivePower() != null &&
+                portChangeData.getReactivePower() != null &&
+                portChangeData.getBeforeReactivePower() != null &&
+                portChangeData.getApparentPower() != null &&
+                portChangeData.getBeforeApparentPower() != null &&
+                portChangeData.getElectricCurrent() != null &&
+                portChangeData.getBeforeElectricCurrent() != null ;
+    }
+
+    private void getChuanGanData2(String askText, String[] dataArray, ChannelHandlerContext ctx) {
         String ans = "hm+2+1+end";
         answerCmd(ans,ctx);
+        //hm+2+867699060007086+1+2222+7+260+0+104,17,159+0,0+v2.0+24+end
+        String gateWayCode = dataArray[2];
+        String  terminalCode = dataArray[3];
+        String terminalPortCode = "1";
+        String voltage = getNum(dataArray[4]);
+        String electriCurrent = getNum(dataArray[5]);
+        String temp = getNum(dataArray[6]);
+        String leakageValue = getNum(dataArray[7]);
+        Date now = new Date();
+        int[] splitPower = Arrays.stream(dataArray[8].split(",")).mapToInt(Integer::parseInt).toArray();
+        int[] splitStatus =Arrays.stream(dataArray[9].split(",")).mapToInt(Integer::parseInt).toArray();
+        EnvData envData = new EnvData(gateWayCode+terminalCode+terminalPortCode,gateWayCode+terminalCode,gateWayCode,
+                voltage,electriCurrent,temp, leakageValue,
+                splitPower[0],splitPower[1],splitPower[2],
+                splitStatus[0],0,splitStatus[1],
+                askText,now);
+        envDataService.save(envData);
+        //更新状态
+//        try {
+        TerminalPort deviceCode = terminalPortService.getOne(new QueryWrapper<TerminalPort>().eq("device_code", gateWayCode + terminalCode + terminalPortCode));
+        if (ObjectUtils.isEmpty(deviceCode)){
+            log.info(String.format("无端口设备--> %s" ,askText));
+            return;
+        }
+        deviceCode.setVoltage(voltage);
+        deviceCode.setElectricCurrent(electriCurrent);
+        deviceCode.setTemp(temp);
+        deviceCode.setLeakageValue(leakageValue);
+        deviceCode.setActivePower( splitPower[0]);
+        deviceCode.setReactivePower(splitPower[1]);
+        deviceCode.setApparentPower(splitPower[2]);
+        deviceCode.setHeightTempWarning( splitStatus[0]);
+        deviceCode.setChargingWarning( 0);
+        deviceCode.setLeakageWarning( splitStatus[1]);
+        deviceCode.setUpdateTime(now);
+        deviceCode.setStatus(1);
+        terminalPortService.updateById(deviceCode);
+        //添加报警
+        saveWarning2(gateWayCode,terminalCode,terminalPortCode,deviceCode,splitStatus,now);
+    }
+    private void saveWarning2(String gateWayCode,String terminaCode,String terminalPortCode ,TerminalPort terminalPort,int[] splitStatus,Date now) {
+        if (splitStatus[0] == 0 && splitStatus[1] == 0 )
+            return;
+        Integer farmId = terminalPort.getFarmId();
+        Integer locationId = terminalPort.getLocationId();
+
+        BasePigpen basePigpen = basePigpenService.getById(locationId);
+
+        if (ObjectUtils.isEmpty(basePigpen)){
+            log.info(String.format("无栋舍数据--> %s" ,terminalPort.toString()));
+            return;
+        }
+
+        PortWarningInfo portWarningInfo = new PortWarningInfo();
+        portWarningInfo.setGatwayCode(gateWayCode);
+        portWarningInfo.setTerminalCode(gateWayCode+terminaCode);
+        portWarningInfo.setTerminalPortCode(gateWayCode+ terminaCode +terminalPortCode);
+        portWarningInfo.setLocationId(locationId);
+        portWarningInfo.setFarmId(farmId);
+        portWarningInfo.setWarningType(farmId);
+        portWarningInfo.setCreateTime(now);
+        if (splitStatus[0] == 1){
+            portWarningInfo.setContent(String.format("%s 高温预警",basePigpen.getBuildName()));
+            portWarningInfo.setWarningType(1);
+            portWarningInfoService.save(portWarningInfo);
+            WebsocketWorkerUtil.sendWarningMessage(farmId,String.format("%s 高温预警",basePigpen.getBuildName()));
+        }
+        if (splitStatus[1] == 1){
+            portWarningInfo.setContent(String.format("%s 漏电预警",basePigpen.getBuildName()));
+            portWarningInfo.setWarningType(3);
+            portWarningInfoService.save(portWarningInfo);
+            WebsocketWorkerUtil.sendWarningMessage(farmId,String.format("%s 漏电预警",basePigpen.getBuildName()));
+        }
     }
 
-    private void getTemp(String[] dataArray, ChannelHandlerContext ctx) {
+    private void askCmdActuatorV1(String askText, ChannelHandlerContext ctx,  String[] dataArray){
+        //芯片id/设备编码
+        String cmd = dataArray[1];
+        switch (cmd) {
+            case "1":
+                //心跳
+                getHear(askText, dataArray, ctx,1);
+                break;
+            case "2":
+                //上传数据
+                getChuanGanData(askText, dataArray, ctx);
+                break;
+            case "3":
+                //充电前后功率
+                savePower(askText, dataArray, ctx);
+                break;
+            case "4":
+                //充电中电流
+                saveElectric(askText, dataArray, ctx);
+                break;
+            case "5":
+                //充电前电流
+                saveBeforeElectric(askText, dataArray, ctx);
+                break;
+            default:
+                log.error(String.format("未知指令 --> %s", askText));
+                answerCmd("hm+4+1+end", ctx);
+        }
+    }
+
+    private synchronized void saveBeforeElectric(String askText, String[] dataArray, ChannelHandlerContext ctx) {
+        String ans = "hm+5+1+end";
+        answerCmd(ans,ctx);
+        String gateWayCode = dataArray[2];
+        String  terminalCode = dataArray[3];
+        String terminalPortCode = dataArray[4];
+        String num = dataArray[5];
+        String eleData = dataArray[6];
+        Date now = new Date();
+
+        try {
+            PortChangeData portChangeData = portChangeDataService.getOne(new QueryWrapper<PortChangeData>().eq("terminal_port_code", gateWayCode + terminalCode + terminalPortCode).eq("num", num));
+            if (ObjectUtils.isEmpty(portChangeData)) {
+                portChangeData = new PortChangeData();
+                portChangeData.setNum(Integer.parseInt(num));
+                portChangeData.setCreateTime(now);
+                portChangeData.setGatwayCode(gateWayCode);
+                portChangeData.setTerminalCode(gateWayCode+terminalCode);
+                portChangeData.setTerminalPortCode(gateWayCode+terminalCode+terminalPortCode);
+                portChangeData.setBeforeElectricCurrent(eleData);
+                portChangeDataService.save(portChangeData);
+            }else {
+                portChangeData.setBeforeElectricCurrent(eleData);
+                portChangeDataService.updateById(portChangeData);
+            }
+        }catch (Exception e){
+            log.error(String.format("点位查询失败--> %s" ,askText));
+            log.error(e);
+        }
+    }
+
+    private synchronized void saveElectric(String askText, String[] dataArray, ChannelHandlerContext ctx) {
+        String ans = "hm+4+1+end";
+        answerCmd(ans,ctx);
+        String gateWayCode = dataArray[2];
+        String  terminalCode = dataArray[3];
+        String terminalPortCode = dataArray[4];
+        String num = dataArray[5];
+        String eleData = dataArray[6];
+        Date now = new Date();
+
+        try {
+            PortChangeData portChangeData = portChangeDataService.getOne(new QueryWrapper<PortChangeData>().eq("terminal_port_code", gateWayCode + terminalCode + terminalPortCode).eq("num", num));
+            if (ObjectUtils.isEmpty(portChangeData)) {
+                portChangeData = new PortChangeData();
+                portChangeData.setNum(Integer.parseInt(num));
+                portChangeData.setCreateTime(now);
+
+                portChangeData.setGatwayCode(gateWayCode);
+                portChangeData.setTerminalCode(gateWayCode+terminalCode);
+                portChangeData.setTerminalPortCode(gateWayCode+terminalCode+terminalPortCode);
+                portChangeData.setElectricCurrent(eleData);
+
+                portChangeDataService.save(portChangeData);
+            }else {
+                portChangeData.setElectricCurrent(eleData);
+                portChangeDataService.updateById(portChangeData);
+            }
+        }catch (Exception e){
+            log.error(String.format("点位查询失败--> %s" ,askText));
+            log.error(e);
+        }
+    }
+
+
+    public  String reverseWithComma(String input) {
+        String[] parts = input.split(",");
+        List<String> partList = Arrays.asList(parts);
+        Collections.reverse(partList);
+        StringBuilder reversedBuilder = new StringBuilder();
+        for (int i = 0; i < partList.size(); i++) {
+            reversedBuilder.append(partList.get(i));
+            if (i < partList.size() - 1) {
+                reversedBuilder.append(",");
+            }
+        }
+        return reversedBuilder.toString();
+    }
+
+    private synchronized void savePower(String askText, String[] dataArray, ChannelHandlerContext ctx) {
+        String ans = "hm+3+1+end";
+        answerCmd(ans,ctx);
+        String gateWayCode = dataArray[2];
+        String  terminalCode = dataArray[3];
+        String terminalPortCode = dataArray[4];
+        String num = dataArray[5];
+        int[] splitPower = Arrays.stream(dataArray[6].split(",")).mapToInt(Integer::parseInt).toArray();
+        int[] splitBeforePower = Arrays.stream(dataArray[7].split(",")).mapToInt(Integer::parseInt).toArray();
+        Date now = new Date();
+
+        try {
+            PortChangeData portChangeData = portChangeDataService.getOne(new QueryWrapper<PortChangeData>().eq("terminal_port_code", gateWayCode + terminalCode + terminalPortCode).eq("num", num));
+            if (ObjectUtils.isEmpty(portChangeData)) {
+                portChangeData = new PortChangeData(gateWayCode + terminalCode + terminalPortCode,gateWayCode + terminalCode ,gateWayCode,
+                        splitPower[0],splitPower[1],splitPower[2],
+                        splitBeforePower[0],splitBeforePower[1],splitBeforePower[2],
+                        now,Integer.parseInt(num));
+                portChangeDataService.save(portChangeData);
+            }else {
+                portChangeData.setActivePower( splitPower[0]);
+                portChangeData.setReactivePower( splitPower[1]);
+                portChangeData.setApparentPower( splitPower[2]);
+                portChangeData.setBeforeActivePower(splitBeforePower[0]);
+                portChangeData.setBeforeReactivePower(splitBeforePower[1]);
+                portChangeData.setBeforeApparentPower(splitBeforePower[2]);
+                portChangeDataService.updateById(portChangeData);
+            }
+        }catch (Exception e){
+            log.error(String.format("点位查询失败--> %s" ,askText));
+            log.error(e);
+        }
+    }
+    private void getHear(String askText,String[] dataArray, ChannelHandlerContext ctx,int version) {
+        /**
+         * 接口中只需要定义你要用到的函数或者公共变量,不需要的可以不定义
+         * 映射libadd.so里面的函数,注意类型要匹配
+         */
+
         String ans = "hm+1+1+end";
         answerCmd(ans,ctx);
+        String gateWayCode = dataArray[2];
+        String  terminalCode = dataArray[3];
+        TerminalPort terminalPort = new TerminalPort();
+         terminalPort.setStatus(1);
+        terminalPortService.update(terminalPort,new UpdateWrapper<TerminalPort>().like("device_code",gateWayCode + terminalCode));
+        Terminal terminal = new Terminal();
+        terminal.setStatus(1);
+        terminalService.update(terminal,new UpdateWrapper<Terminal>().eq("device_code",gateWayCode + terminalCode));
+        switch ( version){
+            case 1:
+                HeartInfo heartInfo1 = new HeartInfo(new Date(), gateWayCode + terminalCode, gateWayCode, askText);
+                heartInfoService.save(heartInfo1);
+                break;
+            case 2:
+                HeartInfo heartInfo2 = new HeartInfo(new Date(), gateWayCode + "1", gateWayCode, askText);
+                heartInfoService.save(heartInfo2);
+                break;
+            default:
+                log.info("未知版本");
+                break;
+        }
+
+
+    }
+
+
+    private void getChuanGanData(String askText,String[] dataArray, ChannelHandlerContext ctx) {
+        String ans = "hm+2+1+end";
+        answerCmd(ans,ctx);
+        //hm+1+867699060007086+1+1+242+3+2494+9+0+0+31+0+0+0+V1.0+0+end
+        String gateWayCode = dataArray[2];
+        String  terminalCode = dataArray[3];
+        String terminalPortCode = dataArray[4];
+        String voltage = getNum(dataArray[5]);
+        String electriCurrent = getNum(dataArray[6]);
+        String temp = getNum(dataArray[7]);
+        String leakageValue = getNum(dataArray[8]);
+        Date now = new Date();
+        int[] splitPower = Arrays.stream(dataArray[9].split(",")).mapToInt(Integer::parseInt).toArray();
+        int[] splitStatus =Arrays.stream(dataArray[10].split(",")).mapToInt(Integer::parseInt).toArray();
+        EnvData envData = new EnvData(gateWayCode+terminalCode+terminalPortCode,gateWayCode+terminalCode,gateWayCode,
+                voltage,electriCurrent,temp, leakageValue,
+                splitPower[0],splitPower[1],splitPower[2],
+                splitStatus[0],splitStatus[1],splitStatus[2],
+                askText,now);
+        envDataService.save(envData);
+        //更新状态
+//        try {
+            TerminalPort deviceCode = terminalPortService.getOne(new QueryWrapper<TerminalPort>().eq("device_code", gateWayCode + terminalCode + terminalPortCode));
+            if (ObjectUtils.isEmpty(deviceCode)){
+                log.info(String.format("无端口设备--> %s" ,askText));
+                return;
+            }
+            deviceCode.setVoltage(voltage);
+            deviceCode.setElectricCurrent(electriCurrent);
+            deviceCode.setTemp(temp);
+            deviceCode.setLeakageValue(leakageValue);
+            deviceCode.setActivePower( splitPower[0]);
+            deviceCode.setReactivePower(splitPower[1]);
+            deviceCode.setApparentPower(splitPower[2]);
+            deviceCode.setHeightTempWarning( splitStatus[0]);
+            deviceCode.setChargingWarning( splitStatus[1]);
+            deviceCode.setLeakageWarning( splitStatus[2]);
+            deviceCode.setUpdateTime(now);
+            deviceCode.setStatus(1);
+            terminalPortService.updateById(deviceCode);
+            //添加报警
+            saveWarning(gateWayCode,terminalCode,terminalPortCode,deviceCode,splitStatus,now);
+//        }catch (Exception e){
+//            log.error(String.format("端口设备查询失败--> %s" ,askText));
+//            log.error(e);
+//        }
+
+    }
+
+    private void saveWarning(String gateWayCode,String terminaCode,String terminalPortCode ,TerminalPort terminalPort,int[] splitStatus,Date now) {
+        if (splitStatus[0] == 0 && splitStatus[1] == 0 &&splitStatus[2] == 0 )
+            return;
+        Integer farmId = terminalPort.getFarmId();
+        Integer locationId = terminalPort.getLocationId();
+        BaseFarm baseFarm = baseFarmService.getById(farmId);
+        BasePigpen basePigpen = basePigpenService.getById(locationId);
+        if (ObjectUtils.isEmpty(baseFarm)){
+            log.info(String.format("无小区数据--> %s" ,terminalPort.toString()));
+            return;
+        }
+        if (ObjectUtils.isEmpty(basePigpen)){
+            log.info(String.format("无栋舍数据--> %s" ,terminalPort.toString()));
+            return;
+        }
+        PortWarningInfo portWarningInfo = new PortWarningInfo();
+        portWarningInfo.setGatwayCode(gateWayCode);
+
+        portWarningInfo.setTerminalCode(gateWayCode+terminaCode);
+        portWarningInfo.setTerminalPortCode(gateWayCode+ terminaCode +terminalPortCode);
+        portWarningInfo.setLocationId(locationId);
+        portWarningInfo.setFarmId(farmId);
+        portWarningInfo.setWarningType(1);
+        portWarningInfo.setCreateTime(now);
+        if (splitStatus[0] == 1){
+
+            portWarningInfo.setContent(String.format("%s 高温预警",basePigpen.getBuildName()));
+            portWarningInfo.setWarningType(1);
+            portWarningInfoService.save(portWarningInfo);
+            WebsocketWorkerUtil.sendWarningMessage(farmId,String.format("%s 高温预警",basePigpen.getBuildName()));
+        }
+
+        if (splitStatus[1] == 1){
+            portWarningInfo.setContent(String.format("%s 充电预警",basePigpen.getBuildName()));
+            portWarningInfo.setWarningType(2);
+            portWarningInfoService.save(portWarningInfo);
+            WebsocketWorkerUtil.sendWarningMessage(farmId,String.format("%s 充电预警",basePigpen.getBuildName()));
+        }
+        if (splitStatus[2] == 1){
+            portWarningInfo.setContent(String.format("%s 漏电预警",basePigpen.getBuildName()));
+            portWarningInfo.setWarningType(3);
+            portWarningInfoService.save(portWarningInfo);
+            WebsocketWorkerUtil.sendWarningMessage(farmId,String.format("%s 漏电预警",basePigpen.getBuildName()));
+        }
+    }
+
+    private String getNum(String  num){
+        return String.format("%.1f", Double.parseDouble(num) / 10.0);
     }
 
 

+ 16 - 0
huimv-env-input/src/main/java/com/huimv/env/input/service/IBaseFarmService.java

@@ -0,0 +1,16 @@
+package com.huimv.env.input.service;
+
+import com.huimv.env.input.entity.BaseFarm;
+import com.baomidou.mybatisplus.extension.service.IService;
+
+/**
+ * <p>
+ *  服务类
+ * </p>
+ *
+ * @author author
+ * @since 2024-05-09
+ */
+public interface IBaseFarmService extends IService<BaseFarm> {
+
+}

+ 16 - 0
huimv-env-input/src/main/java/com/huimv/env/input/service/IBasePigpenService.java

@@ -0,0 +1,16 @@
+package com.huimv.env.input.service;
+
+import com.huimv.env.input.entity.BasePigpen;
+import com.baomidou.mybatisplus.extension.service.IService;
+
+/**
+ * <p>
+ *  服务类
+ * </p>
+ *
+ * @author author
+ * @since 2024-05-09
+ */
+public interface IBasePigpenService extends IService<BasePigpen> {
+
+}

+ 16 - 0
huimv-env-input/src/main/java/com/huimv/env/input/service/IEnvDataService.java

@@ -0,0 +1,16 @@
+package com.huimv.env.input.service;
+
+import com.huimv.env.input.entity.EnvData;
+import com.baomidou.mybatisplus.extension.service.IService;
+
+/**
+ * <p>
+ *  服务类
+ * </p>
+ *
+ * @author author
+ * @since 2024-05-09
+ */
+public interface IEnvDataService extends IService<EnvData> {
+
+}

+ 16 - 0
huimv-env-input/src/main/java/com/huimv/env/input/service/IHeartInfoService.java

@@ -0,0 +1,16 @@
+package com.huimv.env.input.service;
+
+import com.huimv.env.input.entity.HeartInfo;
+import com.baomidou.mybatisplus.extension.service.IService;
+
+/**
+ * <p>
+ *  服务类
+ * </p>
+ *
+ * @author author
+ * @since 2024-05-09
+ */
+public interface IHeartInfoService extends IService<HeartInfo> {
+
+}

+ 16 - 0
huimv-env-input/src/main/java/com/huimv/env/input/service/IPortChangeDataService.java

@@ -0,0 +1,16 @@
+package com.huimv.env.input.service;
+
+import com.huimv.env.input.entity.PortChangeData;
+import com.baomidou.mybatisplus.extension.service.IService;
+
+/**
+ * <p>
+ *  服务类
+ * </p>
+ *
+ * @author author
+ * @since 2024-05-09
+ */
+public interface IPortChangeDataService extends IService<PortChangeData> {
+
+}

+ 16 - 0
huimv-env-input/src/main/java/com/huimv/env/input/service/IPortWarningInfoService.java

@@ -0,0 +1,16 @@
+package com.huimv.env.input.service;
+
+import com.huimv.env.input.entity.PortWarningInfo;
+import com.baomidou.mybatisplus.extension.service.IService;
+
+/**
+ * <p>
+ *  服务类
+ * </p>
+ *
+ * @author author
+ * @since 2024-05-09
+ */
+public interface IPortWarningInfoService extends IService<PortWarningInfo> {
+
+}

+ 16 - 0
huimv-env-input/src/main/java/com/huimv/env/input/service/ITerminalPortService.java

@@ -0,0 +1,16 @@
+package com.huimv.env.input.service;
+
+import com.huimv.env.input.entity.TerminalPort;
+import com.baomidou.mybatisplus.extension.service.IService;
+
+/**
+ * <p>
+ * 端口 服务类
+ * </p>
+ *
+ * @author author
+ * @since 2024-05-09
+ */
+public interface ITerminalPortService extends IService<TerminalPort> {
+
+}

+ 16 - 0
huimv-env-input/src/main/java/com/huimv/env/input/service/ITerminalService.java

@@ -0,0 +1,16 @@
+package com.huimv.env.input.service;
+
+import com.huimv.env.input.entity.Terminal;
+import com.baomidou.mybatisplus.extension.service.IService;
+
+/**
+ * <p>
+ * 监测终端 服务类
+ * </p>
+ *
+ * @author author
+ * @since 2024-05-27
+ */
+public interface ITerminalService extends IService<Terminal> {
+
+}

+ 20 - 0
huimv-env-input/src/main/java/com/huimv/env/input/service/impl/BaseFarmServiceImpl.java

@@ -0,0 +1,20 @@
+package com.huimv.env.input.service.impl;
+
+import com.huimv.env.input.entity.BaseFarm;
+import com.huimv.env.input.mapper.BaseFarmMapper;
+import com.huimv.env.input.service.IBaseFarmService;
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import org.springframework.stereotype.Service;
+
+/**
+ * <p>
+ *  服务实现类
+ * </p>
+ *
+ * @author author
+ * @since 2024-05-09
+ */
+@Service
+public class BaseFarmServiceImpl extends ServiceImpl<BaseFarmMapper, BaseFarm> implements IBaseFarmService {
+
+}

+ 20 - 0
huimv-env-input/src/main/java/com/huimv/env/input/service/impl/BasePigpenServiceImpl.java

@@ -0,0 +1,20 @@
+package com.huimv.env.input.service.impl;
+
+import com.huimv.env.input.entity.BasePigpen;
+import com.huimv.env.input.mapper.BasePigpenMapper;
+import com.huimv.env.input.service.IBasePigpenService;
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import org.springframework.stereotype.Service;
+
+/**
+ * <p>
+ *  服务实现类
+ * </p>
+ *
+ * @author author
+ * @since 2024-05-09
+ */
+@Service
+public class BasePigpenServiceImpl extends ServiceImpl<BasePigpenMapper, BasePigpen> implements IBasePigpenService {
+
+}

+ 20 - 0
huimv-env-input/src/main/java/com/huimv/env/input/service/impl/EnvDataServiceImpl.java

@@ -0,0 +1,20 @@
+package com.huimv.env.input.service.impl;
+
+import com.huimv.env.input.entity.EnvData;
+import com.huimv.env.input.mapper.EnvDataMapper;
+import com.huimv.env.input.service.IEnvDataService;
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import org.springframework.stereotype.Service;
+
+/**
+ * <p>
+ *  服务实现类
+ * </p>
+ *
+ * @author author
+ * @since 2024-05-09
+ */
+@Service
+public class EnvDataServiceImpl extends ServiceImpl<EnvDataMapper, EnvData> implements IEnvDataService {
+
+}

+ 20 - 0
huimv-env-input/src/main/java/com/huimv/env/input/service/impl/HeartInfoServiceImpl.java

@@ -0,0 +1,20 @@
+package com.huimv.env.input.service.impl;
+
+import com.huimv.env.input.entity.HeartInfo;
+import com.huimv.env.input.mapper.HeartInfoMapper;
+import com.huimv.env.input.service.IHeartInfoService;
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import org.springframework.stereotype.Service;
+
+/**
+ * <p>
+ *  服务实现类
+ * </p>
+ *
+ * @author author
+ * @since 2024-05-09
+ */
+@Service
+public class HeartInfoServiceImpl extends ServiceImpl<HeartInfoMapper, HeartInfo> implements IHeartInfoService {
+
+}

+ 20 - 0
huimv-env-input/src/main/java/com/huimv/env/input/service/impl/PortChangeDataServiceImpl.java

@@ -0,0 +1,20 @@
+package com.huimv.env.input.service.impl;
+
+import com.huimv.env.input.entity.PortChangeData;
+import com.huimv.env.input.mapper.PortChangeDataMapper;
+import com.huimv.env.input.service.IPortChangeDataService;
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import org.springframework.stereotype.Service;
+
+/**
+ * <p>
+ *  服务实现类
+ * </p>
+ *
+ * @author author
+ * @since 2024-05-09
+ */
+@Service
+public class PortChangeDataServiceImpl extends ServiceImpl<PortChangeDataMapper, PortChangeData> implements IPortChangeDataService {
+
+}

+ 20 - 0
huimv-env-input/src/main/java/com/huimv/env/input/service/impl/PortWarningInfoServiceImpl.java

@@ -0,0 +1,20 @@
+package com.huimv.env.input.service.impl;
+
+import com.huimv.env.input.entity.PortWarningInfo;
+import com.huimv.env.input.mapper.PortWarningInfoMapper;
+import com.huimv.env.input.service.IPortWarningInfoService;
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import org.springframework.stereotype.Service;
+
+/**
+ * <p>
+ *  服务实现类
+ * </p>
+ *
+ * @author author
+ * @since 2024-05-09
+ */
+@Service
+public class PortWarningInfoServiceImpl extends ServiceImpl<PortWarningInfoMapper, PortWarningInfo> implements IPortWarningInfoService {
+
+}

+ 20 - 0
huimv-env-input/src/main/java/com/huimv/env/input/service/impl/TerminalPortServiceImpl.java

@@ -0,0 +1,20 @@
+package com.huimv.env.input.service.impl;
+
+import com.huimv.env.input.entity.TerminalPort;
+import com.huimv.env.input.mapper.TerminalPortMapper;
+import com.huimv.env.input.service.ITerminalPortService;
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import org.springframework.stereotype.Service;
+
+/**
+ * <p>
+ * 端口 服务实现类
+ * </p>
+ *
+ * @author author
+ * @since 2024-05-09
+ */
+@Service
+public class TerminalPortServiceImpl extends ServiceImpl<TerminalPortMapper, TerminalPort> implements ITerminalPortService {
+
+}

+ 20 - 0
huimv-env-input/src/main/java/com/huimv/env/input/service/impl/TerminalServiceImpl.java

@@ -0,0 +1,20 @@
+package com.huimv.env.input.service.impl;
+
+import com.huimv.env.input.entity.Terminal;
+import com.huimv.env.input.mapper.TerminalMapper;
+import com.huimv.env.input.service.ITerminalService;
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import org.springframework.stereotype.Service;
+
+/**
+ * <p>
+ * 监测终端 服务实现类
+ * </p>
+ *
+ * @author author
+ * @since 2024-05-27
+ */
+@Service
+public class TerminalServiceImpl extends ServiceImpl<TerminalMapper, Terminal> implements ITerminalService {
+
+}

+ 114 - 0
huimv-env-input/src/main/java/com/huimv/env/input/ws/WebsocketWorkerUtil.java

@@ -0,0 +1,114 @@
+package com.huimv.env.input.ws;
+
+import com.alibaba.fastjson.JSON;
+import org.springframework.util.ObjectUtils;
+
+import javax.websocket.RemoteEndpoint;
+import javax.websocket.Session;
+import java.io.IOException;
+import java.util.ArrayList;
+import java.util.List;
+import java.util.Map;
+import java.util.concurrent.ConcurrentHashMap;
+
+public class WebsocketWorkerUtil {
+  /**
+   * 记录当前在线的Session
+   */
+  private static final Map<Integer, List<Session>> SESSIONS = new ConcurrentHashMap<>();
+
+
+
+  /**
+   * 添加session
+   * @param userId
+   * @param session
+   */
+
+  public static void addSession(Integer userId, Session session){
+    // 此处只允许一个用户的session链接。一个用户的多个连接,我们视为无效。
+    List<Session> sessions = SESSIONS.get(userId);
+    if (sessions == null){
+      sessions = new ArrayList<Session>();
+    }
+    sessions.add(session);
+    SESSIONS.putIfAbsent ( userId, sessions );
+  }
+
+  /**
+   * 关闭session
+   * @param userId
+   */
+  public static void removeSession(Integer userId){
+    synchronized (SESSIONS){
+      List<Session> sessions = SESSIONS.get(userId);
+      if(sessions == null){
+        return;
+      }
+      List<Integer> list  = new ArrayList<>();
+
+      for (int i = 0; i < sessions.size(); i++) {
+        Session session = sessions.get(i);
+        try {
+          if (session.isOpen()) {
+
+          } else {
+            list.add(i);
+          }
+        } catch (Exception e) {
+          e.printStackTrace();
+          sessions.remove(session);
+        }
+      }
+      for (int i : list) {
+        sessions.remove(i);
+      }
+
+    }
+
+    //集合不能全部清空
+//    SESSIONS.remove ( userId );
+  }
+
+
+  public static void sendMessage(Session session, String msg){
+    if(session == null){
+      return;
+    }
+
+    // 同步
+    RemoteEndpoint.Async async = session.getAsyncRemote ();
+    async.sendText (msg);
+  }
+
+  public synchronized static void sendWarningMessage(Integer farmId ,String msg){
+    synchronized (SESSIONS){
+      List<Session> sessions = SESSIONS.get(farmId);
+      if(sessions == null){
+        return;
+      }
+      List<Integer> list  = new ArrayList<>();
+
+      for (int i = 0; i < sessions.size(); i++) {
+        Session session = sessions.get(i);
+        try {
+          if (session.isOpen()) {
+            session.getBasicRemote().sendText(msg);
+          } else {
+            list.add(i);
+          }
+        } catch (Exception e) {
+          e.printStackTrace();
+          sessions.remove(session);
+        }
+      }
+      for (int i : list) {
+        sessions.remove(i);
+      }
+
+    }
+
+  }
+
+
+}

+ 64 - 0
huimv-env-input/src/main/java/com/huimv/env/input/ws/WorkerController.java

@@ -0,0 +1,64 @@
+package com.huimv.env.input.ws;
+
+import org.springframework.stereotype.Component;
+import org.springframework.web.socket.handler.TextWebSocketHandler;
+
+import javax.websocket.*;
+import javax.websocket.server.PathParam;
+import javax.websocket.server.ServerEndpoint;
+import java.io.IOException;
+
+/**
+ * websocket接口处理类
+ */
+@Component
+@ServerEndpoint(value = "/smart/{token}")
+public class WorkerController extends TextWebSocketHandler {
+
+
+    @OnOpen
+    public void onOpen(@PathParam(value = "token") Integer token, Session session) {
+        // 添加到session的映射关系中
+        WebsocketWorkerUtil.addSession(token, session);
+    }
+
+    /**
+     * 连接事件,加入注解
+     * 用户断开链接
+     */
+    @OnClose
+    public void onClose(@PathParam(value = "token") Integer token, Session session) {
+        // 删除映射关系
+        WebsocketWorkerUtil.removeSession(token);
+    }
+
+    /**
+     * 当接收到用户上传的消息
+     */
+    @OnMessage
+    public void onMessage(@PathParam(value = "token") Integer token, Session session, String message) {
+        String msg = "[" + token + "]:" + message;
+
+        System.out.println("接收到信息:" + msg);
+    }
+
+    private void keepAlive(Session session) {
+//        WebsocketSellerUtil.sendMessage(session,new WsEvent("pon",null));
+    }
+
+    /**
+     * 处理用户活连接异常
+     *
+     * @param session
+     * @param throwable
+     */
+    @OnError
+    public void onError(Session session, Throwable throwable) {
+        try {
+            session.close();
+        } catch (IOException e) {
+            e.printStackTrace();
+        }
+        throwable.printStackTrace();
+    }
+}

+ 20 - 20
huimv-env-input/src/main/resources/application-prod.yml

@@ -6,9 +6,9 @@ spring:
     name: huimv-env-input
 
   datasource:
-    url: jdbc:mysql://139.9.172.209:3309/huimv-farm-env?useUnicode=true&characterEncoding=UTF-8&useSSL=false&autoReconnect=true&serverTimezone=Asia/Shanghai
-    username: eartag
-    password: eartag@2022
+    url: jdbc:mysql://122.112.219.87:3306/huimv-new-input?useUnicode=true&characterEncoding=UTF-8&useSSL=false&autoReconnect=true&serverTimezone=Asia/Shanghai
+    username: root
+    password: ?root@huimv_farm!
     driver-class-name: com.mysql.cj.jdbc.Driver
   jpa:
     show-sql: true
@@ -26,25 +26,25 @@ spring:
 #    password: hm123456
 #    #虚拟host 可以不设置,使用server默认host
 #    virtual-host: /
-  rabbitmq:
-    host: 121.36.134.218
-    port: 5672
-    username: admin
-    password: admin
-    #虚拟host 可以不设置,使用server默认host
-    virtual-host: /env
-
-    #确认消息已发送到交换机(Exchange)
-#    publisher-confirms: true #(过时、弃用)
-    publisher-confirm-type: correlated
-    #确认消息已发送到队列(Queue)
-    publisher-returns: true
+#  rabbitmq:
+#    host: 121.36.134.218
+#    port: 5672
+#    username: admin
+#    password: admin
+#    #虚拟host 可以不设置,使用server默认host
+#    virtual-host: /env
+#
+#    #确认消息已发送到交换机(Exchange)
+##    publisher-confirms: true #(过时、弃用)
+#    publisher-confirm-type: correlated
+#    #确认消息已发送到队列(Queue)
+#    publisher-returns: true
 
   #redis
-  redis:
-    host: 122.112.224.199
-    port: 6379
-    password: hm123456
+#  redis:
+#    host: 122.112.224.199
+#    port: 6379
+#    password: hm123456
 
   data:
     redis:

+ 145 - 0
huimv-env-input/src/main/resources/c/0513.model

@@ -0,0 +1,145 @@
+svm_type one_class
+kernel_type rbf
+gamma 2.6699999999999998e-06
+nr_class 2
+total_sv 138
+rho 16.702674174783283
+SV
+1 1:126 2:43 3:182 4:60.554443 5:99.42956 6:151.38611 7:84.77975 8:242.21777 9:41.188825 10:333.04944 11:21.654038 12:454.15833 13:22.442997 14:756.93054 15:10.53742 16:938.59387 17:10.682771 
+1 1:125 2:47 3:182 4:60.554443 5:101.55044 6:151.38611 7:86.223847 8:242.21777 9:41.446588 10:333.04944 11:22.287838 12:454.15833 13:23.44612 
+1 1:127 2:43 3:183 4:60.554443 5:110.84562 6:151.38611 7:107.15502 8:242.21777 9:45.90342 10:363.32666 11:26.721852 12:454.15833 13:29.568101 14:726.65332 15:10.871863 16:938.59387 17:10.58158 18:1029.4255 19:10.052983 
+1 1:126 2:42 3:185 4:60.554443 5:102.49122 6:151.38611 7:85.427815 8:242.21777 9:43.654681 10:333.04944 11:20.822238 12:454.15833 13:22.868751 14:544.98999 15:12.020001 16:756.93054 17:12.698464 18:1150.5344 19:10.417066 
+0.40065788078824133 1:163 2:60 3:252 4:60.554443 5:167.53016 6:151.38611 7:168.00371 8:242.21777 9:84.770298 10:363.32666 11:40.893478 12:454.15833 13:50.182318 14:544.98999 15:36.338779 16:666.09888 17:18.201347 18:756.93054 19:22.210897 20:847.76221 21:21.408766 
+1 1:127 2:43 3:184 4:60.554443 5:100.88062 6:151.38611 7:82.434678 8:242.21777 9:43.656636 10:333.04944 11:19.696454 12:454.15833 13:22.535376 14:544.98999 15:10.02988 16:938.59387 17:10.833847 18:1029.4255 19:10.127173 
+1 1:88 2:11 3:143 
+1 1:128 2:44 3:186 4:60.554443 5:110.23927 6:151.38611 7:106.04997 8:242.21777 9:50.961319 10:363.32666 11:18.745891 12:454.15833 13:28.413001 14:544.98999 15:21.23594 16:635.82166 17:13.427983 18:1150.5344 19:11.462157 20:1241.3661 21:13.705061 22:1332.1978 23:12.278811 
+1 1:131 2:44 3:185 4:60.554443 5:101.81902 6:151.38611 7:84.234863 8:242.21777 9:42.387694 10:333.04944 11:22.733967 12:454.15833 13:22.610763 14:756.93054 15:11.417988 16:938.59387 17:10.739879 18:1241.3661 19:10.32859 
+1 1:126 2:44 3:182 4:60.554443 5:114.16549 6:151.38611 7:106.50517 8:242.21777 9:48.680914 10:363.32666 11:24.143564 12:454.15833 13:31.257077 14:544.98999 15:14.355098 16:666.09888 17:11.283778 18:756.93054 19:14.053749 20:1332.1978 21:10.167714 
+1 1:130 2:42 3:183 4:60.554443 5:105.98705 6:151.38611 7:102.15257 8:242.21777 9:48.049963 10:363.32666 11:19.316791 12:454.15833 13:30.949497 14:544.98999 15:20.406788 16:635.82166 17:15.420259 18:726.65332 19:10.911879 20:1241.3661 21:10.602115 
+1 1:49 2:20 3:92 4:60.554443 5:100.07044 6:151.38611 7:91.36063 8:242.21777 9:56.01195 10:333.04944 11:36.68523 12:454.15833 13:35.333314 14:544.98999 15:29.45936 16:635.82166 17:16.271862 18:726.65332 19:13.897489 20:847.76221 21:15.317978 22:938.59387 23:13.074852 
+1 1:130 2:45 3:185 4:60.554443 5:102.22745 6:151.38611 7:84.414206 8:242.21777 9:43.511163 10:333.04944 11:21.040228 12:454.15833 13:20.223289 14:756.93054 15:10.881412 
+1 1:126 2:44 3:183 4:60.554443 5:104.30654 6:151.38611 7:86.911245 8:242.21777 9:44.980778 10:333.04944 11:19.409533 12:454.15833 13:18.536043 
+1 1:125 2:44 3:182 4:60.554443 5:99.602407 6:151.38611 7:82.860838 8:242.21777 9:43.53336 10:333.04944 11:21.353505 12:454.15833 13:21.954325 14:756.93054 15:10.235126 16:938.59387 17:10.281251 
+1 1:114 2:10 3:123 4:60.554443 5:123.27321 6:242.21777 7:27.186066 
+1 1:120 2:26 3:170 4:60.554443 5:128.99991 6:151.38611 7:115.99134 8:242.21777 9:28.984198 10:454.15833 11:24.769796 12:544.98999 13:36.823532 14:635.82166 15:26.984505 16:847.76221 17:18.767202 18:1211.0889 19:23.418952 20:1332.1978 21:44.399724 22:1513.8611 23:36.137488 
+1 1:90 2:12 3:149 4:60.554443 5:71.015389 6:151.38611 7:78.640549 8:242.21777 9:53.439857 10:363.32666 11:29.852789 12:454.15833 13:16.558183 14:544.98999 15:14.044134 16:635.82166 17:19.147918 18:726.65332 19:10.592816 20:847.76221 21:10.301368 
+0.87274368388395585 1:116 2:7 3:124 4:60.554443 5:118.76435 6:242.21777 7:29.57766 8:333.04944 9:10.276761 
+1 1:127 2:43 3:183 4:60.554443 5:101.30932 6:151.38611 7:83.83194 8:242.21777 9:40.473603 10:333.04944 11:20.236946 12:454.15833 13:23.444162 14:756.93054 15:12.238104 16:938.59387 17:10.169195 
+1 1:85 2:12 3:143 4:60.554443 5:75.906094 6:151.38611 7:85.981003 8:242.21777 9:58.92815 10:363.32666 11:27.481543 12:454.15833 13:28.413669 14:544.98999 15:25.941546 16:635.82166 17:21.175009 18:726.65332 19:10.53582 20:847.76221 21:10.953722 
+1 1:125 2:44 3:181 4:60.554443 5:114.188 6:151.38611 7:103.84035 8:242.21777 9:48.127407 10:363.32666 11:20.360865 12:454.15833 13:31.132059 14:544.98999 15:19.264668 16:635.82166 17:13.36332 18:1150.5344 19:10.934713 20:1241.3661 21:13.057424 22:1332.1978 23:10.000113 
+1 1:162 2:60 3:252 4:60.554443 5:168.83433 6:151.38611 7:167.4241 8:242.21777 9:83.271364 10:363.32666 11:42.785586 12:454.15833 13:48.011411 14:544.98999 15:33.258285 16:756.93054 17:20.745964 18:847.76221 19:18.600252 
+1 1:67 2:27 3:124 4:60.554443 5:106.24684 6:151.38611 7:98.326118 8:242.21777 9:54.837136 10:363.32666 11:30.859816 12:544.98999 13:25.309429 14:635.82166 15:22.197832 16:847.76221 17:15.477855 18:938.59387 19:13.655004 
+0.26837180267928995 1:123 2:44 3:183 4:60.554443 5:104.78792 6:151.38611 7:91.187188 8:242.21777 9:33.372733 10:333.04944 11:24.118122 12:454.15833 13:17.880656 14:544.98999 15:13.519778 16:756.93054 17:13.98535 18:1029.4255 19:10.583924 
+1 1:113 2:6 3:123 4:60.554443 5:106.69296 6:151.38611 7:58.626127 8:242.21777 9:17.566026 10:363.32666 11:10.605631 
+0.4211704939686694 1:162 2:61 3:253 4:60.554443 5:164.61874 6:151.38611 7:146.67881 8:242.21777 9:72.231109 10:333.04944 11:42.971656 12:454.15833 13:34.559337 14:544.98999 15:41.311577 16:635.82166 17:18.165112 18:756.93054 19:16.442797 20:847.76221 21:16.27172 
+1 1:128 2:48 3:186 4:60.554443 5:113.95387 6:151.38611 7:108.25954 8:242.21777 9:45.024594 10:363.32666 11:25.118767 12:454.15833 13:27.654685 14:726.65332 15:11.833445 16:938.59387 17:11.386614 18:1029.4255 19:11.768116 20:1332.1978 21:10.113485 
+1 1:150 2:34 3:197 4:60.554443 5:141.27219 6:151.38611 7:114.7927 8:242.21777 9:93.120695 10:333.04944 11:67.784714 12:454.15833 13:52.340114 14:544.98999 15:55.002007 16:635.82166 17:38.352056 18:726.65332 19:20.324827 20:847.76221 21:13.324595 22:1513.8611 23:13.534098 
+1 1:127 2:43 3:184 4:60.554443 5:107.81436 6:151.38611 7:84.196219 8:242.21777 9:41.762631 10:333.04944 11:22.025878 12:454.15833 13:21.152558 
+1 1:86 2:11 3:143 4:60.554443 5:72.852903 6:151.38611 7:76.067128 8:242.21777 9:49.625403 10:363.32666 11:25.213614 12:454.15833 13:16.633246 14:544.98999 15:12.493415 16:635.82166 17:17.897563 18:726.65332 19:10.18494 20:847.76221 21:10.613925 
+1 1:126 2:43 3:182 4:60.554443 5:113.14013 6:151.38611 7:107.52387 8:242.21777 9:45.160894 10:363.32666 11:23.189838 12:454.15833 13:28.271788 14:726.65332 15:11.568819 16:1029.4255 17:11.063227 
+1 1:249 2:52 3:308 4:60.554443 5:1563.9296 6:151.38611 7:1040.5484 8:242.21777 9:470.57016 10:333.04944 11:141.92736 12:454.15833 13:88.103753 14:544.98999 15:112.58536 16:635.82166 17:103.03249 18:726.65332 19:30.837096 20:938.59387 21:26.691648 22:1120.2572 23:25.851443 
+1 1:127 2:41 3:183 4:60.554443 5:119.68179 6:151.38611 7:106.0231 8:242.21777 9:46.970378 10:363.32666 11:21.21362 12:454.15833 13:31.760351 14:544.98999 15:20.158438 16:635.82166 17:13.083191 18:1150.5344 19:11.053524 20:1241.3661 21:12.792554 
+1 1:126 2:43 3:183 4:60.554443 5:118.7556 6:151.38611 7:107.83699 8:242.21777 9:44.850632 10:363.32666 11:24.924487 12:454.15833 13:27.012222 14:726.65332 15:12.180447 16:938.59387 17:10.571583 18:1029.4255 19:10.614144 20:1241.3661 21:10.149077 
+1 1:85 2:10 3:143 4:60.554443 5:63.487871 6:151.38611 7:70.723641 8:242.21777 9:52.048488 10:333.04944 11:29.398075 12:454.15833 13:16.529363 14:544.98999 15:14.395658 16:635.82166 17:13.302818 18:756.93054 19:10.007395 
+0.23415156233335113 1:126 2:44 3:181 4:60.554443 5:103.55758 6:151.38611 7:86.955223 8:242.21777 9:37.569467 10:333.04944 11:24.249811 12:454.15833 13:24.206781 
+1 1:287 2:98 3:444 4:60.554443 5:312.73657 6:151.38611 7:331.75517 8:242.21777 9:200.34628 10:333.04944 11:86.04148 12:454.15833 13:85.128354 14:544.98999 15:59.580461 16:635.82166 17:13.647979 18:726.65332 19:10.894134 20:847.76221 21:15.027671 22:938.59387 23:22.237491 
+1 1:286 2:98 3:443 4:60.554443 5:308.1941 6:151.38611 7:321.79677 8:242.21777 9:179.68636 10:363.32666 11:77.785929 12:454.15833 13:103.36477 14:544.98999 15:68.89958 16:756.93054 17:20.760558 18:1029.4255 19:20.369277 20:1332.1978 21:19.386827 22:1423.0294 23:14.825551 
+1 1:127 2:45 3:184 4:60.554443 5:97.665144 6:151.38611 7:84.628116 8:242.21777 9:45.332416 10:333.04944 11:20.194687 12:454.15833 13:21.432782 14:544.98999 15:12.064514 16:938.59387 17:10.100931 
+1 1:125 2:46 3:185 4:60.554443 5:100.45776 6:151.38611 7:85.212719 8:242.21777 9:45.379179 10:333.04944 11:19.167059 12:454.15833 13:20.827283 14:544.98999 15:12.9682 16:635.82166 17:10.121609 18:1029.4255 19:10.115569 
+1 1:125 2:43 3:182 4:60.554443 5:108.50931 6:151.38611 7:82.653907 8:242.21777 9:43.514503 10:333.04944 11:22.536386 12:454.15833 13:23.474889 14:756.93054 15:11.519359 
+0.18790058284392383 1:114 2:8 3:123 4:60.554443 5:108.38873 6:151.38611 7:58.51636 8:242.21777 9:17.58544 10:363.32666 11:10.673452 
+1 1:126 2:45 3:182 4:60.554443 5:104.02633 6:151.38611 7:85.667165 8:242.21777 9:42.145054 10:363.32666 11:20.390644 12:454.15833 13:21.893838 14:756.93054 15:10.994195 
+1 1:287 2:98 3:443 4:60.554443 5:312.19384 6:151.38611 7:329.37714 8:242.21777 9:200.66539 10:333.04944 11:87.488559 12:454.15833 13:79.249822 14:544.98999 15:52.599506 16:938.59387 17:16.520751 18:1029.4255 19:13.827875 20:1150.5344 21:17.032639 22:1241.3661 23:17.804699 
+0.21761102797414811 1:72 2:28 3:129 4:60.554443 5:100.81362 6:151.38611 7:100.45981 8:242.21777 9:57.287471 10:333.04944 11:30.635717 12:544.98999 13:26.036665 14:635.82166 15:20.525526 16:847.76221 17:10.769292 
+1 1:126 2:43 3:182 4:60.554443 5:116.20232 6:151.38611 7:101.0234 8:242.21777 9:47.640061 10:363.32666 11:19.843022 12:454.15833 13:29.281524 14:544.98999 15:18.891912 16:635.82166 17:13.381651 18:726.65332 19:10.484033 20:1241.3661 21:10.870278 
+1 1:113 2:7 3:123 4:60.554443 5:125.34148 6:242.21777 7:30.674159 
+0.35882305112580481 1:128 2:44 3:185 4:60.554443 5:110.982 6:151.38611 7:101.68903 8:242.21777 9:47.87465 10:363.32666 11:19.840015 12:454.15833 13:29.602812 14:544.98999 15:20.11616 16:635.82166 17:13.30119 18:726.65332 19:10.425335 20:1241.3661 21:10.210009 
+1 1:288 2:98 3:444 4:60.554443 5:313.31845 6:151.38611 7:329.09382 8:242.21777 9:202.72507 10:333.04944 11:88.013665 12:454.15833 13:81.327549 14:544.98999 15:54.441882 16:938.59387 17:17.883257 18:1029.4255 19:13.979125 20:1150.5344 21:18.46882 22:1241.3661 23:20.099505 
+1 1:113 2:9 3:123 4:60.554443 5:118.64338 6:242.21777 7:28.075376 8:333.04944 9:10.298885 
+1 1:116 2:10 3:125 4:60.554443 5:128.07925 6:242.21777 7:30.147681 
+1 1:127 2:43 3:183 4:60.554443 5:100.54629 6:151.38611 7:85.940576 8:242.21777 9:41.405724 10:333.04944 11:19.494543 12:454.15833 13:21.27199 14:938.59387 15:11.545395 
+1 1:125 2:44 3:181 4:60.554443 5:114.37491 6:151.38611 7:106.32116 8:242.21777 9:49.297457 10:363.32666 11:23.184673 12:454.15833 13:30.447654 14:544.98999 15:13.724069 16:756.93054 17:12.119248 18:1029.4255 19:11.384346 20:1332.1978 21:10.184855 
+1 1:160 2:60 3:252 4:60.554443 5:150.68897 6:151.38611 7:138.50792 8:242.21777 9:76.3954 10:363.32666 11:36.647839 12:454.15833 13:46.962642 14:544.98999 15:36.721613 16:635.82166 17:18.906866 18:756.93054 19:25.250639 20:847.76221 21:23.511995 22:1544.1383 23:10.147889 
+1 1:126 2:44 3:182 4:60.554443 5:117.72542 6:151.38611 7:98.721206 8:242.21777 9:44.438756 10:363.32666 11:21.37135 12:454.15833 13:31.946783 14:544.98999 15:20.647192 16:635.82166 17:16.175488 18:726.65332 19:11.111809 20:1241.3661 21:12.127028 22:1544.1383 23:10.769736 
+1 1:114 2:8 3:123 4:60.554443 5:126.28584 6:242.21777 7:31.318267 
+1 1:287 2:97 3:443 4:60.554443 5:315.68437 6:151.38611 7:330.2245 8:242.21777 9:199.30222 10:333.04944 11:87.454413 12:454.15833 13:80.546073 14:544.98999 15:53.408328 16:938.59387 17:19.149897 18:1029.4255 19:15.613099 20:1150.5344 21:18.774424 22:1241.3661 23:18.885107 
+1 1:129 2:43 3:184 4:60.554443 5:103.11534 6:151.38611 7:85.581804 8:242.21777 9:42.160642 10:363.32666 11:19.472858 12:454.15833 13:22.178916 14:756.93054 15:10.836541 
+1 1:124 2:42 3:182 4:60.554443 5:110.78895 6:151.38611 7:99.977355 8:242.21777 9:46.650308 10:363.32666 11:24.136918 12:454.15833 13:33.917356 14:544.98999 15:22.587365 16:635.82166 17:15.862654 18:726.65332 19:10.505066 20:1241.3661 21:10.703431 
+1 1:126 2:44 3:182 4:60.554443 5:113.00838 6:151.38611 7:104.96221 8:242.21777 9:48.455106 10:363.32666 11:20.018633 12:454.15833 13:31.154894 14:544.98999 15:21.012266 16:635.82166 17:13.686757 18:1150.5344 19:10.551999 20:1241.3661 21:12.126674 22:1332.1978 23:10.146326 
+1 1:128 2:45 3:184 4:60.554443 5:101.54442 6:151.38611 7:84.039017 8:242.21777 9:42.519867 10:363.32666 11:18.555016 12:454.15833 13:20.716738 14:756.93054 15:10.280949 
+1 1:116 2:9 3:124 4:60.554443 5:102.64034 6:151.38611 7:61.136527 8:242.21777 9:17.398255 10:363.32666 11:10.920343 
+1 1:287 2:99 3:445 4:60.554443 5:314.31234 6:151.38611 7:333.56574 8:242.21777 9:203.89448 10:333.04944 11:86.911793 12:454.15833 13:81.818411 14:544.98999 15:57.244769 16:635.82166 17:10.962469 18:726.65332 19:10.600287 20:847.76221 21:11.783033 22:938.59387 23:19.583873 
+1 1:123 2:44 3:180 4:60.554443 5:104.77979 6:151.38611 7:85.554911 8:242.21777 9:40.401533 10:363.32666 11:22.133981 12:454.15833 13:23.594813 14:756.93054 15:12.519241 
+1 1:125 2:45 3:182 4:60.554443 5:105.12979 6:151.38611 7:86.578603 8:242.21777 9:37.953699 10:333.04944 11:26.910302 12:454.15833 13:24.69502 14:544.98999 15:12.207513 16:1241.3661 17:10.466116 
+1 1:128 2:41 3:183 4:60.554443 5:112.81575 6:151.38611 7:106.3992 8:242.21777 9:44.418717 10:363.32666 11:26.209299 12:454.15833 13:27.490949 14:726.65332 15:11.682859 16:938.59387 17:12.443495 18:1029.4255 19:11.563219 20:1241.3661 21:11.183738 
+1 1:126 2:46 3:182 4:60.554443 5:115.0447 6:151.38611 7:108.71259 8:242.21777 9:47.414859 10:363.32666 11:23.857486 12:454.15833 13:26.173584 14:726.65332 15:11.873906 16:1029.4255 17:10.846034 
+1 1:128 2:46 3:185 4:60.554443 5:99.167081 6:151.38611 7:82.005225 8:242.21777 9:43.394244 10:333.04944 11:19.609491 12:454.15833 13:21.581448 14:544.98999 15:11.258863 16:938.59387 17:10.038061 
+1 1:288 2:98 3:445 4:60.554443 5:312.58273 6:151.38611 7:337.02724 8:242.21777 9:203.26621 10:333.04944 11:84.756432 12:454.15833 13:82.860694 14:544.98999 15:59.10737 16:635.82166 17:11.401535 18:726.65332 19:10.892076 20:847.76221 21:15.888738 22:938.59387 23:22.995319 
+1 1:116 2:8 3:124 4:60.554443 5:121.81117 6:242.21777 7:26.014246 
+1 1:127 2:44 3:182 4:60.554443 5:99.233857 6:151.38611 7:87.713551 8:242.21777 9:42.489523 10:333.04944 11:22.575972 12:454.15833 13:21.129817 
+1 1:129 2:39 3:183 4:60.554443 5:98.350797 6:151.38611 7:86.778235 8:242.21777 9:42.783258 10:333.04944 11:18.391987 12:454.15833 13:21.066713 
+1 1:48 2:20 3:92 4:60.554443 5:99.697916 6:151.38611 7:91.640796 8:242.21777 9:56.630934 10:333.04944 11:37.348983 12:454.15833 13:35.726259 14:544.98999 15:29.72314 16:635.82166 17:18.020054 18:726.65332 19:14.183016 20:847.76221 21:17.8846 22:938.59387 23:14.266463 
+1 1:126 2:41 3:182 4:60.554443 5:103.40481 6:151.38611 7:86.634214 8:242.21777 9:41.09975 10:363.32666 11:20.806141 12:454.15833 13:23.60572 14:544.98999 15:10.01866 16:756.93054 17:13.304721 18:1150.5344 19:10.006963 
+1 1:128 2:45 3:182 4:60.554443 5:111.67174 6:151.38611 7:101.45568 8:242.21777 9:47.598342 10:363.32666 11:21.185028 12:454.15833 13:32.070254 14:544.98999 15:20.138868 16:635.82166 17:13.779142 18:1150.5344 19:10.431265 20:1241.3661 21:12.012143 22:1332.1978 23:10.393749 
+0.28424475722949399 1:287 2:98 3:443 4:60.554443 5:312.58078 6:151.38611 7:331.66395 8:242.21777 9:200.3093 10:333.04944 11:85.118361 12:454.15833 13:83.407073 14:544.98999 15:57.558701 16:635.82166 17:11.672444 18:726.65332 19:11.348889 20:847.76221 21:13.55262 22:938.59387 23:21.490178 
+1 1:126 2:45 3:184 4:60.554443 5:98.707907 6:151.38611 7:84.189202 8:242.21777 9:43.737909 10:333.04944 11:22.216266 12:454.15833 13:22.299598 14:544.98999 15:10.962246 16:1029.4255 17:10.135537 
+1 1:127 2:44 3:185 4:60.554443 5:109.81651 6:151.38611 7:109.77629 8:242.21777 9:51.379326 10:363.32666 11:22.12138 12:454.15833 13:26.490728 14:544.98999 15:13.445952 16:756.93054 17:12.577619 18:1029.4255 19:12.294554 20:1332.1978 21:11.234082 
+1 1:49 2:20 3:93 4:60.554443 5:98.323387 6:151.38611 7:89.331757 8:242.21777 9:57.239264 10:333.04944 11:36.722647 12:454.15833 13:34.502208 14:544.98999 15:28.965944 16:635.82166 17:15.920774 18:726.65332 19:13.327307 20:847.76221 21:15.669058 22:938.59387 23:12.767282 
+1 1:286 2:97 3:441 4:60.554443 5:310.69512 6:151.38611 7:328.4105 8:242.21777 9:199.7725 10:333.04944 11:88.190352 12:454.15833 13:81.501854 14:544.98999 15:53.94253 16:938.59387 17:15.872406 18:1059.7028 19:13.892828 20:1150.5344 21:18.59611 22:1241.3661 23:19.757888 
+1 1:87 2:12 3:144 4:60.554443 5:59.443708 6:151.38611 7:72.316601 8:242.21777 9:51.706045 10:333.04944 11:26.85127 12:454.15833 13:14.677114 14:544.98999 15:15.402788 16:635.82166 17:13.64282 18:756.93054 19:10.444581 
+1 1:287 2:98 3:445 4:60.554443 5:310.90985 6:151.38611 7:333.36391 8:242.21777 9:203.98617 10:333.04944 11:87.351121 12:454.15833 13:81.158115 14:544.98999 15:57.133444 16:938.59387 17:15.06684 18:1029.4255 19:13.235308 20:1150.5344 21:18.882689 22:1241.3661 23:17.238311 
+1 1:189 2:31 3:229 4:60.554443 5:137.29665 6:151.38611 7:116.37652 8:242.21777 9:73.611564 10:333.04944 11:59.316902 12:454.15833 13:46.28172 14:544.98999 15:46.099796 16:635.82166 17:36.467552 18:726.65332 19:19.023538 20:847.76221 21:14.916793 22:1513.8611 23:16.117099 
+1 1:163 2:27 3:212 4:60.554443 5:140.25189 6:151.38611 7:103.92488 8:242.21777 9:86.041184 10:333.04944 11:68.453597 12:454.15833 13:47.351337 14:544.98999 15:47.471123 16:635.82166 17:36.632798 18:726.65332 19:19.889337 20:1332.1978 21:11.179919 22:1513.8611 23:13.406152 
+0.12782239066435511 1:115 2:8 3:124 4:60.554443 5:126.92899 6:242.21777 7:31.293299 
+1 1:287 2:99 3:444 4:60.554443 5:303.63537 6:151.38611 7:309.87949 8:242.21777 9:176.5495 10:363.32666 11:73.669813 12:454.15833 13:105.379 14:544.98999 15:76.002896 16:635.82166 17:26.115453 18:726.65332 19:18.285747 20:817.48499 21:11.391927 22:938.59387 23:18.187519 
+1 1:128 2:45 3:185 4:60.554443 5:108.88789 6:151.38611 7:110.62394 8:242.21777 9:52.791771 10:363.32666 11:20.835316 12:454.15833 13:28.191876 14:544.98999 15:16.369218 16:756.93054 17:12.769459 18:1029.4255 19:10.720638 20:1332.1978 21:10.156975 
+1 1:287 2:97 3:444 4:60.554443 5:310.95576 6:151.38611 7:335.93589 8:242.21777 9:202.71381 10:333.04944 11:86.26773 12:454.15833 13:83.187063 14:544.98999 15:57.727143 16:938.59387 17:17.355457 18:1029.4255 19:16.796882 20:1150.5344 21:21.169472 22:1241.3661 23:20.333484 
+0.5508481461841761 1:128 2:43 3:183 4:60.554443 5:102.01703 6:151.38611 7:83.447902 8:242.21777 9:43.572165 10:333.04944 11:18.848674 12:454.15833 13:20.550394 14:756.93054 15:10.927793 
+1 1:126 2:44 3:183 4:60.554443 5:112.67628 6:151.38611 7:107.64276 8:242.21777 9:48.612405 10:363.32666 11:23.755343 12:454.15833 13:27.433705 14:726.65332 15:12.577654 16:938.59387 17:11.493732 18:1029.4255 19:12.472406 20:1332.1978 21:10.497762 
+0.89737595168171735 1:91 2:13 3:150 4:60.554443 5:77.732825 6:151.38611 7:80.352915 8:242.21777 9:50.944604 10:363.32666 11:28.534594 12:454.15833 13:16.960676 14:544.98999 15:12.750164 16:635.82166 17:18.350945 18:726.65332 19:10.204101 20:847.76221 21:11.254675 
+1 1:113 2:8 3:123 4:60.554443 5:120.36179 6:242.21777 7:27.359476 8:333.04944 9:10.961822 
+1 1:115 2:7 3:123 4:60.554443 5:121.67001 6:242.21777 7:27.289465 8:333.04944 9:10.024073 
+1 1:116 2:9 3:124 4:60.554443 5:112.05771 6:151.38611 7:56.999097 8:272.495 9:14.235526 10:454.15833 11:10.435947 
+1 1:127 2:44 3:183 4:60.554443 5:104.65259 6:151.38611 7:85.247424 8:242.21777 9:37.003543 10:333.04944 11:24.489382 12:454.15833 13:24.147503 14:635.82166 15:12.451711 16:1029.4255 17:10.307614 
+1 1:111 2:10 3:123 4:60.554443 5:116.58552 6:242.21777 7:25.84985 8:333.04944 9:10.135413 
+1 1:124 2:39 3:181 4:60.554443 5:108.92909 6:151.38611 7:106.31177 8:242.21777 9:46.013554 10:363.32666 11:24.209507 12:454.15833 13:26.492489 14:726.65332 15:12.176995 16:938.59387 17:10.475553 18:1029.4255 19:10.356576 20:1241.3661 21:10.28892 
+0.668665032129234 1:126 2:41 3:182 4:60.554443 5:106.64693 6:151.38611 7:89.158939 8:242.21777 9:34.969779 10:333.04944 11:26.755451 12:454.15833 13:20.869476 14:544.98999 15:13.073399 16:938.59387 17:10.322498 
+1 1:129 2:40 3:182 4:60.554443 5:110.9401 6:151.38611 7:107.27642 8:242.21777 9:48.027772 10:363.32666 11:26.487766 12:454.15833 13:26.560052 14:726.65332 15:12.402137 16:1029.4255 17:10.416058 
+1 1:126 2:45 3:185 4:60.554443 5:114.59569 6:151.38611 7:104.48313 8:242.21777 9:48.134513 10:363.32666 11:20.873053 12:454.15833 13:30.120826 14:544.98999 15:19.055474 16:635.82166 17:14.252481 18:1241.3661 19:12.708805 
+1 1:127 2:45 3:184 4:60.554443 5:104.88121 6:151.38611 7:86.12051 8:242.21777 9:35.619845 10:333.04944 11:26.566505 12:454.15833 13:22.208932 14:544.98999 15:12.958887 16:938.59387 17:11.238634 
+1 1:124 2:44 3:183 4:60.554443 5:101.80978 6:151.38611 7:84.909365 8:242.21777 9:43.792961 10:333.04944 11:20.347875 12:454.15833 13:20.540827 14:756.93054 15:10.789382 
+1 1:127 2:47 3:183 4:60.554443 5:109.55251 6:151.38611 7:104.518 8:242.21777 9:50.420985 10:363.32666 11:19.029781 12:454.15833 13:29.98863 14:544.98999 15:21.423838 16:635.82166 17:13.383271 18:1150.5344 19:11.204502 20:1241.3661 21:12.252685 22:1332.1978 23:10.563134 
+1 1:48 2:20 3:93 4:60.554443 5:98.953456 6:151.38611 7:90.486239 8:242.21777 9:58.766757 10:333.04944 11:38.245697 12:454.15833 13:35.386397 14:544.98999 15:28.897652 16:635.82166 17:18.043249 18:726.65332 19:14.707716 20:847.76221 21:16.832564 22:938.59387 23:12.969631 
+1 1:49 2:20 3:93 4:60.554443 5:96.388961 6:151.38611 7:92.685495 8:242.21777 9:57.864866 10:333.04944 11:34.53836 12:454.15833 13:35.330693 14:544.98999 15:28.951535 16:635.82166 17:16.981897 18:726.65332 19:12.510736 20:847.76221 21:16.97304 22:938.59387 23:13.235417 
+0.88430010879111798 1:128 2:44 3:184 4:60.554443 5:101.77712 6:151.38611 7:84.731875 8:242.21777 9:40.904336 10:363.32666 11:22.510034 12:454.15833 13:22.79814 14:756.93054 15:13.869529 16:847.76221 17:10.474848 
+1 1:127 2:46 3:183 4:60.554443 5:103.4037 6:151.38611 7:85.780687 8:242.21777 9:41.732525 10:363.32666 11:19.779453 12:454.15833 13:20.751153 14:756.93054 15:10.923688 
+1 1:157 2:32 3:199 4:60.554443 5:148.51271 6:151.38611 7:124.48971 8:242.21777 9:39.185435 10:454.15833 11:30.450971 12:544.98999 13:41.247553 14:635.82166 15:31.252882 16:847.76221 17:21.011452 18:1241.3661 19:22.869807 20:1332.1978 21:39.072027 22:1513.8611 23:37.33898 
+1 1:126 2:44 3:182 4:60.554443 5:110.73523 6:151.38611 7:97.044896 8:242.21777 9:35.051858 10:333.04944 11:21.6551 12:635.82166 13:12.941192 
+1 1:285 2:98 3:443 4:60.554443 5:301.3856 6:151.38611 7:309.80418 8:242.21777 9:178.82705 10:363.32666 11:73.341666 12:454.15833 13:107.44505 14:544.98999 15:80.824952 16:635.82166 17:29.391479 18:726.65332 19:19.395303 20:817.48499 21:11.323979 22:938.59387 23:18.044337 
+1 1:163 2:61 3:253 4:60.554443 5:163.20828 6:151.38611 7:148.12144 8:242.21777 9:70.719735 10:333.04944 11:41.526144 12:454.15833 13:33.068701 14:544.98999 15:41.366625 16:635.82166 17:23.794392 18:756.93054 19:19.960968 20:847.76221 21:20.689341 
+1 1:288 2:99 3:445 4:60.554443 5:306.01329 6:151.38611 7:306.4756 8:242.21777 9:172.15241 10:363.32666 11:77.445035 12:454.15833 13:103.82961 14:544.98999 15:73.416147 16:635.82166 17:23.922323 18:726.65332 19:20.393562 20:817.48499 21:12.539936 22:938.59387 23:15.370054 
+0.82387756692031999 1:125 2:42 3:183 4:60.554443 5:99.850402 6:151.38611 7:84.769882 8:242.21777 9:41.152048 10:333.04944 11:20.496663 12:454.15833 13:22.496184 14:756.93054 15:11.360072 
+1 1:127 2:41 3:183 4:60.554443 5:113.05525 6:151.38611 7:88.633512 8:242.21777 9:34.546089 10:333.04944 11:26.263708 12:454.15833 13:20.543103 14:544.98999 15:12.696431 16:938.59387 17:10.862341 
+1 1:288 2:100 3:447 4:60.554443 5:310.93751 6:151.38611 7:328.21691 8:242.21777 9:203.83364 10:333.04944 11:87.933618 12:454.15833 13:89.761512 14:544.98999 15:64.565198 16:635.82166 17:17.644821 18:726.65332 19:11.404531 20:847.76221 21:11.545481 22:938.59387 23:22.54795 
+1 1:161 2:60 3:251 4:60.554443 5:153.51758 6:151.38611 7:135.73829 8:242.21777 9:73.844615 10:333.04944 11:43.52715 12:454.15833 13:49.167262 14:544.98999 15:37.459003 16:635.82166 17:21.033944 18:726.65332 19:17.526621 20:847.76221 21:22.812798 
+0.72256190302484846 1:285 2:98 3:441 4:60.554443 5:312.07411 6:151.38611 7:327.59194 8:242.21777 9:201.35349 10:333.04944 11:91.029344 12:454.15833 13:80.381163 14:544.98999 15:56.038241 16:938.59387 17:16.93823 18:1029.4255 19:15.684615 20:1150.5344 21:16.799228 22:1241.3661 23:18.210756 
+0.68275269369662783 1:85 2:13 3:142 4:60.554443 5:64.04804 6:151.38611 7:69.944612 8:242.21777 9:53.22713 10:333.04944 11:26.778265 12:454.15833 13:17.592078 14:544.98999 15:14.949657 16:635.82166 17:13.478249 18:756.93054 19:10.078648 
+1 1:114 2:10 3:123 4:60.554443 5:127.33309 6:242.21777 7:24.92071 
+1 1:115 2:9 3:124 4:60.554443 5:123.56575 6:242.21777 7:26.822282 
+0.4538485081159922 1:286 2:97 3:443 4:60.554443 5:300.55395 6:151.38611 7:310.5074 8:242.21777 9:175.94251 10:363.32666 11:75.416265 12:454.15833 13:106.04861 14:544.98999 15:77.561369 16:635.82166 17:25.951321 18:726.65332 19:18.215329 20:817.48499 21:11.439681 22:938.59387 23:19.367751 
+1 1:129 2:46 3:184 4:60.554443 5:103.81094 6:151.38611 7:85.859336 8:242.21777 9:40.314679 10:333.04944 11:23.790018 12:454.15833 13:21.651492 14:756.93054 15:11.165858 
+1 1:127 2:41 3:185 4:60.554443 5:108.58148 6:151.38611 7:105.83363 8:242.21777 9:48.902733 10:363.32666 11:21.359331 12:454.15833 13:29.286374 14:544.98999 15:21.568138 16:635.82166 17:13.308571 18:1150.5344 19:11.87264 20:1241.3661 21:10.952703 
+1 1:126 2:43 3:182 4:60.554443 5:111.05299 6:151.38611 7:101.39384 8:242.21777 9:46.532717 10:363.32666 11:20.331019 12:454.15833 13:32.460806 14:544.98999 15:20.453288 16:635.82166 17:14.308661 18:1150.5344 19:10.241417 20:1241.3661 21:10.529966 
+1 1:130 2:42 3:182 4:60.554443 5:113.6295 6:151.38611 7:103.58532 8:242.21777 9:46.184 10:363.32666 11:20.260321 12:454.15833 13:30.214015 14:544.98999 15:18.381445 16:635.82166 17:14.147649 18:1241.3661 19:12.100089 
+1 1:127 2:41 3:182 4:60.554443 5:114.41953 6:151.38611 7:106.64779 8:242.21777 9:45.638748 10:363.32666 11:23.289774 12:454.15833 13:26.383196 14:726.65332 15:10.93037 16:938.59387 17:10.538192 18:1029.4255 19:10.595515 
+1 1:163 2:33 3:203 4:60.554443 5:160.44941 6:151.38611 7:100.85968 8:333.04944 9:27.323875 10:454.15833 11:38.433958 12:544.98999 13:44.558914 14:635.82166 15:29.647647 16:847.76221 17:21.63409 18:1029.4255 19:19.503785 20:1241.3661 21:19.907755 22:1332.1978 23:50.601703 
+1 1:126 2:43 3:182 4:60.554443 5:94.438379 6:151.38611 7:85.423482 8:242.21777 9:42.857817 10:333.04944 11:18.537944 12:454.15833 13:21.230686 
+1 1:121 2:28 3:184 4:60.554443 5:107.46613 6:151.38611 7:107.59016 8:242.21777 9:78.311272 10:333.04944 11:63.313068 12:454.15833 13:48.130861 14:544.98999 15:43.704648 16:635.82166 17:33.862945 18:726.65332 19:17.314653 20:847.76221 21:15.455568 22:1513.8611 23:19.710978 
+0.78972120311217819 1:49 2:20 3:92 4:60.554443 5:99.776584 6:151.38611 7:91.450631 8:242.21777 9:58.486689 10:333.04944 11:35.757989 12:454.15833 13:34.417497 14:544.98999 15:26.98879 16:635.82166 17:17.37881 18:726.65332 19:13.283633 20:847.76221 21:15.049607 22:938.59387 23:10.97117 
+0.24365165285256571 1:129 2:42 3:183 4:60.554443 5:115.86845 6:151.38611 7:107.05551 8:242.21777 9:47.789212 10:363.32666 11:25.620222 12:454.15833 13:30.111624 14:544.98999 15:13.877382 16:756.93054 17:12.989099 18:1029.4255 19:12.068163 20:1332.1978 21:11.304234 
+1 1:126 2:45 3:183 4:60.554443 5:100.68777 6:151.38611 7:84.86233 8:242.21777 9:43.873591 10:333.04944 11:21.206732 12:454.15833 13:19.894837 14:544.98999 15:10.611687 16:726.65332 17:10.204926 18:1029.4255 19:10.056755 
+1 1:125 2:46 3:181 4:60.554443 5:98.162914 6:151.38611 7:83.420648 8:242.21777 9:41.811104 10:333.04944 11:20.784062 12:454.15833 13:19.986532 14:938.59387 15:10.115839 
+1 1:49 2:20 3:92 4:60.554443 5:98.743652 6:151.38611 7:93.103961 8:242.21777 9:57.020148 10:333.04944 11:34.471783 12:454.15833 13:32.586146 14:544.98999 15:27.38162 16:635.82166 17:15.595048 18:726.65332 19:12.740676 20:847.76221 21:15.373617 22:938.59387 23:12.961295 
+1 1:129 2:43 3:185 4:60.554443 5:115.0805 6:151.38611 7:98.230532 8:242.21777 9:35.146611 10:454.15833 11:17.455263 12:544.98999 13:12.001915 14:635.82166 15:11.798498 16:756.93054 17:13.343577 18:847.76221 19:11.818394 
+1 1:145 2:28 3:196 4:60.554443 5:131.73211 6:151.38611 7:126.76007 8:242.21777 9:103.3429 10:333.04944 11:72.776097 12:454.15833 13:50.916443 14:544.98999 15:55.246814 16:635.82166 17:46.904743 18:726.65332 19:26.719375 20:1332.1978 21:10.960319 22:1423.0294 23:10.661478 
+1 1:162 2:62 3:254 4:60.554443 5:170.26125 6:151.38611 7:170.86211 8:242.21777 9:87.26885 10:363.32666 11:43.406973 12:454.15833 13:47.755647 14:544.98999 15:32.688104 16:666.09888 17:18.004379 18:1029.4255 19:11.879461 

+ 1 - 0
huimv-env-input/src/main/resources/c/config.txt

@@ -0,0 +1 @@
+model_path = ./0513.model

BIN
huimv-env-input/src/main/resources/c/libcpptest.so


BIN
huimv-env-input/src/main/resources/c/libpredict.so


BIN
huimv-env-input/src/main/resources/c/libpredict_printf.so


BIN
huimv-env-input/src/main/resources/c/libpredict_test.so


+ 20 - 0
huimv-env-input/src/main/resources/com/huimv/env/mapper/BaseFarmMapper.xml

@@ -0,0 +1,20 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<mapper namespace="com.huimv.env.input.mapper.BaseFarmMapper">
+
+    <!-- 通用查询映射结果 -->
+    <resultMap id="BaseResultMap" type="com.huimv.env.input.entity.BaseFarm">
+        <id column="id" property="id" />
+        <result column="farm_name" property="farmName" />
+        <result column="location" property="location" />
+        <result column="front_location" property="frontLocation" />
+        <result column="row_status" property="rowStatus" />
+        <result column="farm_menu" property="farmMenu" />
+        <result column="farm_top_menu" property="farmTopMenu" />
+        <result column="function" property="function" />
+        <result column="is_show" property="isShow" />
+        <result column="lng" property="lng" />
+        <result column="lat" property="lat" />
+    </resultMap>
+
+</mapper>

+ 22 - 0
huimv-env-input/src/main/resources/com/huimv/env/mapper/BasePigpenMapper.xml

@@ -0,0 +1,22 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<mapper namespace="com.huimv.env.input.mapper.BasePigpenMapper">
+
+    <!-- 通用查询映射结果 -->
+    <resultMap id="BaseResultMap" type="com.huimv.env.input.entity.BasePigpen">
+        <id column="id" property="id" />
+        <result column="build_name" property="buildName" />
+        <result column="parent_id" property="parentId" />
+        <result column="f_type" property="fType" />
+        <result column="stage_code" property="stageCode" />
+        <result column="farm_id" property="farmId" />
+        <result column="sort" property="sort" />
+        <result column="other1" property="other1" />
+        <result column="other2" property="other2" />
+        <result column="other3" property="other3" />
+        <result column="other4" property="other4" />
+        <result column="lng" property="lng" />
+        <result column="lat" property="lat" />
+    </resultMap>
+
+</mapper>

+ 25 - 0
huimv-env-input/src/main/resources/com/huimv/env/mapper/EnvDataMapper.xml

@@ -0,0 +1,25 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<mapper namespace="com.huimv.env.input.mapper.EnvDataMapper">
+
+    <!-- 通用查询映射结果 -->
+    <resultMap id="BaseResultMap" type="com.huimv.env.input.entity.EnvData">
+        <id column="id" property="id" />
+        <result column="terminal_port_code" property="terminalPortCode" />
+        <result column="terminal_code" property="terminalCode" />
+        <result column="gatway_code" property="gatwayCode" />
+        <result column="voltage" property="voltage" />
+        <result column="electric_current" property="electricCurrent" />
+        <result column="temp" property="temp" />
+        <result column="leakage_value" property="leakageValue" />
+        <result column="active_power" property="activePower" />
+        <result column="reactive_power" property="reactivePower" />
+        <result column="apparent power" property="apparent power" />
+        <result column="height_temp_warning" property="heightTempWarning" />
+        <result column="charging_warning" property="chargingWarning" />
+        <result column="leakage_warning" property="leakageWarning" />
+        <result column="original_data" property="originalData" />
+        <result column="create_time" property="createTime" />
+    </resultMap>
+
+</mapper>

+ 14 - 0
huimv-env-input/src/main/resources/com/huimv/env/mapper/HeartInfoMapper.xml

@@ -0,0 +1,14 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<mapper namespace="com.huimv.env.input.mapper.HeartInfoMapper">
+
+    <!-- 通用查询映射结果 -->
+    <resultMap id="BaseResultMap" type="com.huimv.env.input.entity.HeartInfo">
+        <id column="id" property="id" />
+        <result column="create_time" property="createTime" />
+        <result column="terminal_code" property="terminalCode" />
+        <result column="gatway_code" property="gatwayCode" />
+        <result column="original_data" property="originalData" />
+    </resultMap>
+
+</mapper>

+ 17 - 0
huimv-env-input/src/main/resources/com/huimv/env/mapper/PortWarningInfoMapper.xml

@@ -0,0 +1,17 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<mapper namespace="com.huimv.env.input.mapper.PortWarningInfoMapper">
+
+    <!-- 通用查询映射结果 -->
+    <resultMap id="BaseResultMap" type="com.huimv.env.input.entity.PortWarningInfo">
+        <id column="id" property="id" />
+        <result column="terminal_port_code" property="terminalPortCode" />
+        <result column="terminal_code" property="terminalCode" />
+        <result column="gatway_code" property="gatwayCode" />
+        <result column="warning_type" property="warningType" />
+        <result column="farm_id" property="farmId" />
+        <result column="location_id" property="locationId" />
+        <result column="content" property="content" />
+    </resultMap>
+
+</mapper>

+ 26 - 0
huimv-env-input/src/main/resources/com/huimv/env/mapper/TerminalPortMapper.xml

@@ -0,0 +1,26 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<mapper namespace="com.huimv.env.input.mapper.TerminalPortMapper">
+
+    <!-- 通用查询映射结果 -->
+    <resultMap id="BaseResultMap" type="com.huimv.env.input.entity.TerminalPort">
+        <id column="id" property="id" />
+        <result column="device_code" property="deviceCode" />
+        <result column="terminal_id" property="terminalId" />
+        <result column="location_id" property="locationId" />
+        <result column="farm_id" property="farmId" />
+        <result column="voltage" property="voltage" />
+        <result column="electric_current" property="electricCurrent" />
+        <result column="temp" property="temp" />
+        <result column="leakage_value" property="leakageValue" />
+        <result column="active_power" property="activePower" />
+        <result column="reactive_power" property="reactivePower" />
+        <result column="apparent_power" property="apparentPower" />
+        <result column="height_temp_warning" property="heightTempWarning" />
+        <result column="charging_warning" property="chargingWarning" />
+        <result column="leakage_warning" property="leakageWarning" />
+        <result column="update_time" property="updateTime" />
+        <result column="status" property="status" />
+    </resultMap>
+
+</mapper>

+ 23 - 0
huimv-env-input/src/main/resources/mapper/PortChangeDataMapper.xml

@@ -0,0 +1,23 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<mapper namespace="com.huimv.env.input.mapper.PortChangeDataMapper">
+
+    <!-- 通用查询映射结果 -->
+    <resultMap id="BaseResultMap" type="com.huimv.env.input.entity.PortChangeData">
+        <id column="id" property="id" />
+        <result column="terminal_port_code" property="terminalPortCode" />
+        <result column="terminal_code" property="terminalCode" />
+        <result column="gatway_code" property="gatwayCode" />
+        <result column="active_power" property="activePower" />
+        <result column="reactive_power" property="reactivePower" />
+        <result column="apparent_power" property="apparentPower" />
+        <result column="before_active_power" property="beforeActivePower" />
+        <result column="before_reactive_power" property="beforeReactivePower" />
+        <result column="before_apparent_power" property="beforeApparentPower" />
+        <result column="electric_current" property="electricCurrent" />
+        <result column="before_electric_current" property="beforeElectricCurrent" />
+        <result column="create_time" property="createTime" />
+        <result column="num" property="num" />
+    </resultMap>
+
+</mapper>

+ 19 - 0
huimv-env-input/src/main/resources/mapper/TerminalMapper.xml

@@ -0,0 +1,19 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<mapper namespace="com.huimv.env.input.mapper.TerminalMapper">
+
+    <!-- 通用查询映射结果 -->
+    <resultMap id="BaseResultMap" type="com.huimv.env.input.entity.Terminal">
+        <id column="id" property="id" />
+        <result column="device_code" property="deviceCode" />
+        <result column="device_name" property="deviceName" />
+        <result column="type" property="type" />
+        <result column="status" property="status" />
+        <result column="build_id" property="buildId" />
+        <result column="floor_id" property="floorId" />
+        <result column="gateway_id" property="gatewayId" />
+        <result column="farm_id" property="farmId" />
+        <result column="orders" property="orders" />
+    </resultMap>
+
+</mapper>