Przeglądaj źródła

Merge branch '2.2.0' of http://shvber.com/Git/VSDSM_SERVER into 2.2.0

Yue 2 lat temu
rodzic
commit
38305bb0b3
56 zmienionych plików z 2453 dodań i 44 usunięć
  1. 1 0
      .gitignore
  2. 60 40
      VB_DSM_V2.1/Scripts/Dockers/docker-compose-iwb.yml
  3. 2 2
      VB_DSM_V2.1/vbdsm-common/vbdsm-base/src/main/java/cn/vbdsm/common/config/CustomConfig.java
  4. 8 1
      VB_DSM_V2.1/vbdsm-data-upload/vbdsm-acquis-ws/src/main/java/cn/vbdsm/acquis/http/mvc/action/UploadDataAction.java
  5. 1 0
      VB_DSM_V2.1/vbdsm-data-upload/vbdsm-hj212/pom.xml
  6. 15 0
      VB_DSM_V2.1/vbdsm-data-upload/vbdsm-hj212/vbdsm-hj212-modbus/Dockerfile
  7. 138 0
      VB_DSM_V2.1/vbdsm-data-upload/vbdsm-hj212/vbdsm-hj212-modbus/pom.xml
  8. 38 0
      VB_DSM_V2.1/vbdsm-data-upload/vbdsm-hj212/vbdsm-hj212-modbus/src/main/java/cn/vbdsm/hj212/modbus/VbdsmHj212ModbusApplication.java
  9. 29 0
      VB_DSM_V2.1/vbdsm-data-upload/vbdsm-hj212/vbdsm-hj212-modbus/src/main/java/cn/vbdsm/hj212/modbus/config/TcpServerProperties.java
  10. 19 0
      VB_DSM_V2.1/vbdsm-data-upload/vbdsm-hj212/vbdsm-hj212-modbus/src/main/java/cn/vbdsm/hj212/modbus/config/WsProperties.java
  11. 39 0
      VB_DSM_V2.1/vbdsm-data-upload/vbdsm-hj212/vbdsm-hj212-modbus/src/main/java/cn/vbdsm/hj212/modbus/controller/MqttAuthController.java
  12. 56 0
      VB_DSM_V2.1/vbdsm-data-upload/vbdsm-hj212/vbdsm-hj212-modbus/src/main/java/cn/vbdsm/hj212/modbus/handler/TcpServerHandler.java
  13. 62 0
      VB_DSM_V2.1/vbdsm-data-upload/vbdsm-hj212/vbdsm-hj212-modbus/src/main/java/cn/vbdsm/hj212/modbus/server/TcpSocketServer.java
  14. 23 0
      VB_DSM_V2.1/vbdsm-data-upload/vbdsm-hj212/vbdsm-hj212-modbus/src/main/java/cn/vbdsm/hj212/modbus/task/UploadDataTask.java
  15. 52 0
      VB_DSM_V2.1/vbdsm-data-upload/vbdsm-hj212/vbdsm-hj212-modbus/src/main/java/cn/vbdsm/hj212/modbus/utils/AESUtil.java
  16. 65 0
      VB_DSM_V2.1/vbdsm-data-upload/vbdsm-hj212/vbdsm-hj212-modbus/src/main/java/cn/vbdsm/hj212/modbus/utils/RandomHelper.java
  17. 16 0
      VB_DSM_V2.1/vbdsm-data-upload/vbdsm-hj212/vbdsm-hj212-modbus/src/main/java/cn/vbdsm/hj212/modbus/utils/WsClientUtil.java
  18. 128 0
      VB_DSM_V2.1/vbdsm-data-upload/vbdsm-hj212/vbdsm-hj212-modbus/src/main/java/cn/vbdsm/hj212/modbus/ws/DataListBuilder.java
  19. 193 0
      VB_DSM_V2.1/vbdsm-data-upload/vbdsm-hj212/vbdsm-hj212-modbus/src/main/java/cn/vbdsm/hj212/modbus/ws/MockUploadWsService.java
  20. 16 0
      VB_DSM_V2.1/vbdsm-data-upload/vbdsm-hj212/vbdsm-hj212-modbus/src/main/java/cn/vbdsm/hj212/modbus/ws/OnlineData.java
  21. 13 0
      VB_DSM_V2.1/vbdsm-data-upload/vbdsm-hj212/vbdsm-hj212-modbus/src/main/java/cn/vbdsm/hj212/modbus/ws/data/MockMonitor.java
  22. 60 0
      VB_DSM_V2.1/vbdsm-data-upload/vbdsm-hj212/vbdsm-hj212-modbus/src/main/java/cn/vbdsm/hj212/modbus/ws/data/RandomHarmonic.java
  23. 228 0
      VB_DSM_V2.1/vbdsm-data-upload/vbdsm-hj212/vbdsm-hj212-modbus/src/main/java/cn/vbdsm/hj212/modbus/ws/data/RandomPower.java
  24. 111 0
      VB_DSM_V2.1/vbdsm-data-upload/vbdsm-hj212/vbdsm-hj212-modbus/src/main/java/cn/vbdsm/hj212/modbus/ws/data/TerminalData.java
  25. 18 0
      VB_DSM_V2.1/vbdsm-data-upload/vbdsm-hj212/vbdsm-hj212-modbus/src/main/resources/application.yml
  26. 57 0
      VB_DSM_V2.1/vbdsm-data-upload/vbdsm-hj212/vbdsm-hj212-modbus/src/main/resources/logback.xml
  27. 12 0
      VB_DSM_V2.1/vbdsm-data-upload/vbdsm-hj212/vbdsm-hj212-modbus/src/main/resources/mock/3@YC10001.json
  28. 6 0
      VB_DSM_V2.1/vbdsm-data-upload/vbdsm-hj212/vbdsm-hj212-modbus/src/main/resources/static/index.html
  29. 13 0
      VB_DSM_V2.1/vbdsm-data-upload/vbdsm-hj212/vbdsm-hj212-modbus/src/test/java/cn/vbdsm/hj212/modbus/VbdsmHj212ModbusApplicationTests.java
  30. 2 1
      VB_DSM_V2.1/vbdsm-job/Dockerfile
  31. 33 0
      iwb-iot-project/.gitignore
  32. 116 0
      iwb-iot-project/pom.xml
  33. 25 0
      iwb-iot-project/src/main/java/com/iwbnet/iot/IwbIotProjectApplication.java
  34. 19 0
      iwb-iot-project/src/main/java/com/iwbnet/iot/common/BaseResponse.java
  35. 22 0
      iwb-iot-project/src/main/java/com/iwbnet/iot/common/CodeEnum.java
  36. 10 0
      iwb-iot-project/src/main/java/com/iwbnet/iot/common/Constant.java
  37. 51 0
      iwb-iot-project/src/main/java/com/iwbnet/iot/common/MqResponse/LoginResp.java
  38. 52 0
      iwb-iot-project/src/main/java/com/iwbnet/iot/common/ResponseData.java
  39. 32 0
      iwb-iot-project/src/main/java/com/iwbnet/iot/config/MqttConfig.java
  40. 44 0
      iwb-iot-project/src/main/java/com/iwbnet/iot/config/SwaggerConfig.java
  41. 77 0
      iwb-iot-project/src/main/java/com/iwbnet/iot/controller/MqttController.java
  42. 22 0
      iwb-iot-project/src/main/java/com/iwbnet/iot/entity/Terminal.java
  43. 25 0
      iwb-iot-project/src/main/java/com/iwbnet/iot/entity/User.java
  44. 13 0
      iwb-iot-project/src/main/java/com/iwbnet/iot/mapper/UserMapper.java
  45. 46 0
      iwb-iot-project/src/main/java/com/iwbnet/iot/model/AuthClientDto.java
  46. 17 0
      iwb-iot-project/src/main/java/com/iwbnet/iot/model/ClientLoginDto.java
  47. 16 0
      iwb-iot-project/src/main/java/com/iwbnet/iot/model/TopicMsgDto.java
  48. 32 0
      iwb-iot-project/src/main/java/com/iwbnet/iot/mqtt/MqCallback.java
  49. 179 0
      iwb-iot-project/src/main/java/com/iwbnet/iot/mqtt/MqttConnect.java
  50. 9 0
      iwb-iot-project/src/main/java/com/iwbnet/iot/service/IPayloadService.java
  51. 24 0
      iwb-iot-project/src/main/java/com/iwbnet/iot/utils/Md5Util.java
  52. 29 0
      iwb-iot-project/src/main/resources/application-dev.yml
  53. 3 0
      iwb-iot-project/src/main/resources/application.yml
  54. 57 0
      iwb-iot-project/src/main/resources/logback.xml
  55. 6 0
      iwb-iot-project/src/main/resources/static/index.html
  56. 13 0
      iwb-iot-project/src/test/java/com/iwbnet/iot/IwbIotProjectApplicationTests.java

+ 1 - 0
.gitignore

@@ -69,3 +69,4 @@ obj/
 !**/js/**/build/
 *.rar
 *.zip
+VB_DSM_V*/mock/*.json

+ 60 - 40
VB_DSM_V2.1/Scripts/Dockers/docker-compose-iwb.yml

@@ -2,7 +2,7 @@ version: '3'
 
 services:
   mysql:
-    image: mysql:5.7.24
+    image: mysql:5.7.4
     container_name: vbdsm-mysql
     restart: always
     environment:
@@ -14,9 +14,10 @@ services:
       # 数据挂载
       - /home/iwb/vbdsm/mysql/data/:/var/lib/mysql/
       # 配置挂载
-      - /home/iwb/vbdsm/mysql/conf:/etc/mysql/conf.d/
-      - /home/iwb/vbdsm/mysql/conf/mysql.conf.d/mysqld.cnf:/etc/mysql/mysql.conf.d/mysqld.cnf
+      - /home/iwb/vbdsm/mysql/conf/my.cnf:/etc/mysql/my.cnf
+
     privileged: true
+
     networks:
       - vbdsm-net
   nginx-web:
@@ -61,7 +62,7 @@ services:
 
   vber-server-passport:
     build: ../../vbdsm-web/vbdsm-passport
-    image: vbdsm-passport:2.1.1
+    image: vbdsm-passport:2.1.0
     container_name: vbdsm-passport
     restart: always
     ports:
@@ -78,7 +79,7 @@ services:
 
   vber-server-manage:
     build: ../../vbdsm-web/vbdsm-manage
-    image: vbdsm-manage:2.1.1
+    image: vbdsm-manage:2.1.0
     container_name: vbdsm-manage
     restart: always
     ports:
@@ -95,7 +96,7 @@ services:
 
   vber-server-powerservice:
     build: ../../vbdsm-web/vbdsm-powerservice
-    image: vbdsm-powerservice:2.1.1
+    image: vbdsm-powerservice:2.1.0
     container_name: vbdsm-powerservice
     restart: always
     ports:
@@ -112,7 +113,7 @@ services:
 
   vber-server-gov:
     build: ../../vbdsm-web/vbdsm-gov
-    image: vbdsm-gov:2.1.1
+    image: vbdsm-gov:2.1.0
     container_name: vbdsm-gov
     restart: always
     ports:
@@ -129,7 +130,7 @@ services:
 
   vber-server-gov-new:
     build: ../../vbdsm-web/vbdsm-gov-new
-    image: vbdsm-gov-new:2.1.1
+    image: vbdsm-gov-new:2.1.0
     container_name: vbdsm-gov-new
     restart: always
     ports:
@@ -146,7 +147,7 @@ services:
 
   vber-server-explorer:
     build: ../../vbdsm-web/vbdsm-explorer
-    image: vbdsm-explorer:2.1.1
+    image: vbdsm-explorer:2.1.0
     container_name: vbdsm-explorer
     restart: always
     ports:
@@ -162,29 +163,13 @@ services:
     networks:
       - vbdsm-net
 
-  vber-server-charts:
-    build: ../../vbdsm-web/vbdsm-charts
-    image: vbdsm-charts:2.1.1
-    container_name: vbdsm-charts
-    restart: always
-    ports:
-      - "7087:8080"
-    environment:
-      TZ: Asia/Shanghai
-    volumes:
-      # 日志文件
-      - /home/yue/vbdsm/server-logs/charts/:/vbdsm/logs/
-    privileged: true
-    networks:
-      - vbdsm-net
-
   vber-server-analysis:
     build: ../../vbdsm-statistics/vbdsm-analysis
-    image: vbdsm-analysis:2.1.1
+    image: vbdsm-analysis:2.1.0
     container_name: vbdsm-analysis
     restart: always
     ports:
-      - "7090:8080"
+      - "7087:8080"
     environment:
       - TZ
       - SERVER_PORT
@@ -197,16 +182,15 @@ services:
 
 
   vber-server-xxl-job:
-    build: ../../vbdsm-job/xxl-job-admin
-    image: vbdsm-job:2.1.1
+    build: ../../vbdsm-job
+    image: vbdsm-job:2.1.0
     container_name: vbdsm-job
     restart: always
     ports:
-      - "7200:7200"
+      - "7200:8080"
     environment:
-      # SERVER_PORT: 7200
-      TZ: Asia/Shanghai
-      PARAMS: --server.port=7200 --spring.datasource.url=jdbc:mysql://vbdsm-mysql:3306/vbdsm_xxl_job?characterEncoding=UTF-8&serverTimezone=UTC&useSSL=false&useSSL=false
+      - TZ
+      - SERVER_PORT
     volumes:
       # 日志文件
       - /home/iwb/vbdsm/server-logs/job/:/vbdsm/logs/
@@ -217,15 +201,16 @@ services:
 
   vber-server-statistics:
     build: ../../vbdsm-statistics/vbdsm-statistic
-    image: vbdsm-statistics:2.1.1
+    image: vbdsm-statistics:2.1.0
     container_name: vbdsm-statistics
     restart: always
     ports:
       # 内部使用了7211端口
       - "7210:8080"
     environment:
-      TZ: Asia/Shanghai
-      PARAMS: --server.port=7210 --xxl.job.admin.addresses=http://vbdsm-job:7200
+      # 时区上海
+      - TZ
+      - SERVER_PORT
     volumes:
       # 日志文件
       - /home/iwb/vbdsm/server-logs/statistics/:/vbdsm/logs/
@@ -233,13 +218,29 @@ services:
     networks:
       - vbdsm-net
 
-  vber-server-acquis-ws:
+  vber-server-acquis-ws1:
     build: ../../vbdsm-data-upload/vbdsm-acquis-ws
-    image: vbdsm-acquis-ws:2.1.0
-    container_name: vbdsm-acquis-ws
+    image: vbdsm-acquis-ws:13306
+    container_name: vbdsm-acquis-ws-13306
     restart: always
     ports:
-      - "7100:8080"
+      - "7101:8080"
+    environment:
+      - TZ
+      - SERVER_PORT
+    volumes:
+      # 日志文件
+      - /home/iwb/vbdsm/server-logs/acquis-ws/:/vbdsm/logs/
+    privileged: true
+    networks:
+      - vbdsm-net
+  vber-server-acquis-ws2:
+    build: ../../vbdsm-data-upload/vbdsm-acquis-ws
+    image: vbdsm-acquis-ws:23306
+    container_name: vbdsm-acquis-ws-23306
+    restart: always
+    ports:
+      - "7102:8080"
     environment:
       - TZ
       - SERVER_PORT
@@ -286,6 +287,25 @@ services:
     networks:
       - vbdsm-net
 
+  vber-server-hj212-modbus-test:
+    build: ../../vbdsm-data-upload/vbdsm-hj212/vbdsm-hj212-modbus
+    image: vbdsm-hj212-mockdata-upload:2.1.0
+    container_name: vbdsm-hj212-mockdata-upload
+    restart: always
+    ports:
+      # 内部使用了7221端口
+      - "18888:7110"
+    environment:
+      TZ: Asia/Shanghai
+      PARAMS: --server.port=7110 --vbdsm.ws.url=http://192.168.0.81:7101/services/UploadData?wsdl --vbdsm.monitor.terminals=3@YC0001,YC0002&7@YD001_01,YD001_02&9@YD002_01,YD002_02&10@YD003_01
+    volumes:
+      # 日志文件
+      - /home/iwb/vbdsm/server-logs/hj212-upload-mockdata/:/vbdsm/logs/
+      - /home/iwb/vbdsm/hj212-upload-mockdata/mock/:/vbdsm/mock/
+    privileged: true
+    networks:
+      - vbdsm-net
+
 networks:
   vbdsm-net:
     external: false

+ 2 - 2
VB_DSM_V2.1/vbdsm-common/vbdsm-base/src/main/java/cn/vbdsm/common/config/CustomConfig.java

@@ -58,9 +58,9 @@ public class CustomConfig extends PropertyPlaceholderConfigurer{
     private void resolvePlaceHolders(Properties properties) {  
         Iterator itr = properties.entrySet().iterator();  
         while ( itr.hasNext() ) {  
-            final Map.Entry entry = ( Map.Entry ) itr.next();  
+            final Map.Entry entry = (Map.Entry ) itr.next();
             final Object value = entry.getValue();  
-            if ( value != null && String.class.isInstance( value ) ) {  
+            if (value != null && String.class.isInstance( value ) ) {
                 final String resolved = resolvePlaceHolder(properties, (String)value );  
                 if ( !value.equals( resolved ) ) {  
                     if ( resolved == null ) {  

+ 8 - 1
VB_DSM_V2.1/vbdsm-data-upload/vbdsm-acquis-ws/src/main/java/cn/vbdsm/acquis/http/mvc/action/UploadDataAction.java

@@ -4,6 +4,7 @@ import javax.core.common.ResultMsg;
 import javax.servlet.http.HttpServletRequest;
 import javax.servlet.http.HttpServletResponse;
 
+import cn.vbdsm.acquis.timer.RebuildTableTimer;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Controller;
 import org.springframework.web.bind.annotation.RequestMapping;
@@ -24,7 +25,8 @@ import cn.vbdsm.core.mvc.action.BaseAction;
 @RequestMapping("/web/upload")
 public class UploadDataAction extends BaseAction{
 	@Autowired private IUploadDataService uploadDataService;
-	
+	@Autowired private RebuildTableTimer timer;
+
 	/**
 	 * 批量设备数据上报
 	 * @param request
@@ -41,4 +43,9 @@ public class UploadDataAction extends BaseAction{
 		ResultMsg<?> result = uploadDataService.uploadAllData(local,key,content);
 		return super.callBackForJsonp(request, response, JSONObject.toJSONString(result));
 	}
+
+	@RequestMapping("baksql.json")
+	public ModelAndView bakSql(HttpServletRequest request,HttpServletResponse response){
+		return super.callBackForJsonp(request, response,"");
+	}
 }

+ 1 - 0
VB_DSM_V2.1/vbdsm-data-upload/vbdsm-hj212/pom.xml

@@ -14,6 +14,7 @@
         <module>vbdsm-hj212-server</module>
         <module>vbdsm-hj212-plugs</module>
         <module>vbdsm-hj212-socket</module>
+        <module>vbdsm-hj212-modbus</module>
     </modules>
     <parent>
         <groupId>org.springframework.boot</groupId>

+ 15 - 0
VB_DSM_V2.1/vbdsm-data-upload/vbdsm-hj212/vbdsm-hj212-modbus/Dockerfile

@@ -0,0 +1,15 @@
+#FROM openjdk:8-jre-slim
+FROM iwbnet.jdk8:202
+MAINTAINER Vber
+
+ENV PARAMS="--server.port=8080"
+
+RUN mkdir -p /vbdsm
+
+ENV TZ=Asia/Shanghai
+RUN ln -snf /usr/share/zoneinfo/$TZ /etc/localtime && echo $TZ > /etc/timezone
+
+ADD ./target/vbdsm-hj212-modbus-*.jar /app.jar
+WORKDIR /vbdsm
+
+ENTRYPOINT ["sh","-c","java -jar $JAVA_OPTS /app.jar $PARAMS"]

+ 138 - 0
VB_DSM_V2.1/vbdsm-data-upload/vbdsm-hj212/vbdsm-hj212-modbus/pom.xml

@@ -0,0 +1,138 @@
+<?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 https://maven.apache.org/xsd/maven-4.0.0.xsd">
+    <modelVersion>4.0.0</modelVersion>
+
+    <groupId>cn.vbdsm</groupId>
+    <artifactId>vbdsm-hj212-modbus</artifactId>
+    <version>2.1.0</version>
+    <name>vbdsm-hj212-modbus</name>
+
+    <properties>
+        <java.version>1.8</java.version>
+        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
+        <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
+        <spring-boot.version>2.6.13</spring-boot.version>
+    </properties>
+    <dependencies>
+        <dependency>
+            <groupId>org.springframework.boot</groupId>
+            <artifactId>spring-boot-starter-web</artifactId>
+        </dependency>
+
+        <dependency>
+            <groupId>org.springframework.boot</groupId>
+            <artifactId>spring-boot-starter-test</artifactId>
+            <scope>test</scope>
+        </dependency>
+        <dependency>
+            <groupId>cn.hutool</groupId>
+            <artifactId>hutool-all</artifactId>
+            <version>5.8.20</version>
+        </dependency>
+        <dependency>
+            <groupId>org.projectlombok</groupId>
+            <artifactId>lombok</artifactId>
+            <version>1.18.28</version>
+            <optional>true</optional>
+        </dependency>
+
+        <dependency>
+            <groupId>io.netty</groupId>
+            <artifactId>netty-all</artifactId>
+            <version>4.1.94.Final</version>
+        </dependency>
+        <!--webservice-->
+        <dependency>
+            <groupId>org.springframework.boot</groupId>
+            <artifactId>spring-boot-starter-web-services</artifactId>
+        </dependency>
+        <dependency>
+            <groupId>org.apache.cxf</groupId>
+            <artifactId>cxf-rt-frontend-jaxws</artifactId>
+            <version>3.1.6</version>
+        </dependency>
+        <dependency>
+            <groupId>org.apache.cxf</groupId>
+            <artifactId>cxf-rt-transports-http</artifactId>
+            <version>3.1.6</version>
+        </dependency>
+        <dependency>
+            <groupId>com.alibaba.fastjson2</groupId>
+            <artifactId>fastjson2</artifactId>
+            <version>2.0.32</version>
+        </dependency>
+        <dependency>
+            <groupId>javax.core.common</groupId>
+            <artifactId>core-common-utils</artifactId>
+            <version>1.0</version>
+            <scope>compile</scope>
+        </dependency>
+    </dependencies>
+<!--    <dependencyManagement>-->
+<!--        <dependencies>-->
+<!--            <dependency>-->
+<!--                <groupId>org.springframework.boot</groupId>-->
+<!--                <artifactId>spring-boot-dependencies</artifactId>-->
+<!--                <version>${spring-boot.version}</version>-->
+<!--                <type>pom</type>-->
+<!--                <scope>import</scope>-->
+<!--            </dependency>-->
+<!--        </dependencies>-->
+<!--    </dependencyManagement>-->
+    <parent>
+        <groupId>org.springframework.boot</groupId>
+        <artifactId>spring-boot-dependencies</artifactId>
+        <version>2.6.13</version>
+        <relativePath/>
+    </parent>
+    <build>
+        <plugins>
+            <plugin>
+                <groupId>org.springframework.boot</groupId>
+                <artifactId>spring-boot-maven-plugin</artifactId>
+                <configuration>
+                    <fork>true</fork>
+<!--                    <classifier>exec</classifier>-->
+                    <mainClass>cn.vbdsm.hj212.modbus.VbdsmHj212ModbusApplication</mainClass>
+                </configuration>
+                <executions>
+                    <execution>
+                        <goals>
+                            <goal>repackage</goal>
+                        </goals>
+                    </execution>
+                </executions>
+            </plugin>
+
+            <plugin>
+                <groupId>org.apache.maven.plugins</groupId>
+                <artifactId>maven-compiler-plugin</artifactId>
+                <version>3.8.1</version>
+                <configuration>
+                    <source>1.8</source>
+                    <target>1.8</target>
+                    <encoding>UTF-8</encoding>
+                </configuration>
+            </plugin>
+<!--            <plugin>-->
+<!--                <groupId>org.springframework.boot</groupId>-->
+<!--                <artifactId>spring-boot-maven-plugin</artifactId>-->
+<!--                <version>${spring-boot.version}</version>-->
+<!--                <configuration>-->
+<!--                    <mainClass>cn.vbdsm.hj212.modbus.VbdsmHj212ModbusApplication</mainClass>-->
+<!--                    <skip>true</skip>-->
+<!--                </configuration>-->
+<!--                <executions>-->
+<!--                    <execution>-->
+<!--                        <id>repackage</id>-->
+<!--                        <goals>-->
+<!--                            <goal>repackage</goal>-->
+<!--                        </goals>-->
+<!--                    </execution>-->
+<!--                </executions>-->
+<!--            </plugin>-->
+        </plugins>
+    </build>
+
+</project>

+ 38 - 0
VB_DSM_V2.1/vbdsm-data-upload/vbdsm-hj212/vbdsm-hj212-modbus/src/main/java/cn/vbdsm/hj212/modbus/VbdsmHj212ModbusApplication.java

@@ -0,0 +1,38 @@
+package cn.vbdsm.hj212.modbus;
+
+import cn.vbdsm.hj212.modbus.server.TcpSocketServer;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.boot.CommandLineRunner;
+import org.springframework.boot.SpringApplication;
+import org.springframework.boot.autoconfigure.SpringBootApplication;
+import org.springframework.scheduling.annotation.EnableScheduling;
+import  cn.vbdsm.hj212.modbus.ws.*;
+
+@SpringBootApplication
+@Slf4j
+@EnableScheduling
+public class VbdsmHj212ModbusApplication implements CommandLineRunner {
+    @Autowired
+    private TcpSocketServer tcpSocketServer;
+    @Autowired
+        private MockUploadWsService uploadDataService;
+
+    public static void main(String[] args) {
+        SpringApplication.run(VbdsmHj212ModbusApplication.class, args);
+    }
+
+    @Override
+    public void run(String... args) throws Exception {
+      //uploadDataService.loadTerminals();
+//        tcpSocketServer.run();
+//        Runtime.getRuntime().addShutdownHook(new Thread(){
+//            @Override
+//            public void run() {
+//                log.info("socket server stop ...");
+//                tcpSocketServer.stop();
+//                log.info("socket server has stoped");
+//            }
+//        });
+    }
+}

+ 29 - 0
VB_DSM_V2.1/vbdsm-data-upload/vbdsm-hj212/vbdsm-hj212-modbus/src/main/java/cn/vbdsm/hj212/modbus/config/TcpServerProperties.java

@@ -0,0 +1,29 @@
+package cn.vbdsm.hj212.modbus.config;
+
+
+import lombok.Getter;
+import lombok.Setter;
+import org.springframework.boot.context.properties.ConfigurationProperties;
+import org.springframework.stereotype.Component;
+
+@Getter
+@Setter
+@Component
+@ConfigurationProperties(prefix = "vbdsm.socket.server")
+public class TcpServerProperties {
+    private Integer bindPort = 18888;
+
+    private String bindIp = "0.0.0.0";
+
+    private Integer bossThreadNum = 1;
+
+    private Integer workThreadNum = 4;
+    public static TcpServerProperties defaultProperties() {
+        TcpServerProperties properties = new TcpServerProperties();
+        properties.bindPort = 18888;
+        properties.bindIp = "0.0.0.0";
+        properties.bossThreadNum = 1;
+        properties.workThreadNum = 4;
+        return properties;
+    }
+}

+ 19 - 0
VB_DSM_V2.1/vbdsm-data-upload/vbdsm-hj212/vbdsm-hj212-modbus/src/main/java/cn/vbdsm/hj212/modbus/config/WsProperties.java

@@ -0,0 +1,19 @@
+package cn.vbdsm.hj212.modbus.config;
+
+import lombok.Data;
+import org.springframework.boot.context.properties.ConfigurationProperties;
+import org.springframework.stereotype.Component;
+
+@Data
+@Component
+@ConfigurationProperties(prefix = "vbdsm.ws")
+public class WsProperties {
+
+    private String url;
+
+    private String method;
+
+    private String key;
+
+
+}

+ 39 - 0
VB_DSM_V2.1/vbdsm-data-upload/vbdsm-hj212/vbdsm-hj212-modbus/src/main/java/cn/vbdsm/hj212/modbus/controller/MqttAuthController.java

@@ -0,0 +1,39 @@
+package cn.vbdsm.hj212.modbus.controller;
+
+import org.springframework.http.ResponseEntity;
+import org.springframework.web.bind.annotation.PostMapping;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.ResponseBody;
+import org.springframework.web.bind.annotation.RestController;
+
+import javax.annotation.PostConstruct;
+import java.util.HashMap;
+import java.util.Map;
+
+@RestController
+@RequestMapping("/mqtt")
+public class MqttAuthController {
+
+    private Map<String,String> users = null;
+
+    @PostConstruct
+    public void init(){
+       users = new HashMap<>();
+       users.put("admin","123456");
+       users.put("user","123456");
+       users.put("guest","123456");
+       users.put("test","123456");
+       users.put("test2","123456");
+    }
+
+    @PostMapping("/login")
+    public ResponseEntity authentication(String username,String password,String clientId){
+        System.out.println("clientId:"+clientId);
+        System.out.println("username:"+username);
+        System.out.println("password:"+password);
+        if(users.containsKey(username) && users.get(username).equals(password)){
+            return ResponseEntity.ok(clientId);
+        }
+        return ResponseEntity.badRequest().build();
+    }
+}

+ 56 - 0
VB_DSM_V2.1/vbdsm-data-upload/vbdsm-hj212/vbdsm-hj212-modbus/src/main/java/cn/vbdsm/hj212/modbus/handler/TcpServerHandler.java

@@ -0,0 +1,56 @@
+package cn.vbdsm.hj212.modbus.handler;
+
+import io.netty.channel.*;
+import lombok.AllArgsConstructor;
+import lombok.Getter;
+import lombok.extern.slf4j.Slf4j;
+
+import java.net.InetSocketAddress;
+import java.util.Map;
+import java.util.concurrent.ConcurrentHashMap;
+
+@Slf4j
+@ChannelHandler.Sharable
+@AllArgsConstructor
+public class TcpServerHandler extends ChannelDuplexHandler {
+    @Getter
+    private final Map<String, Channel> channels = new ConcurrentHashMap<String, Channel>(); // <ip:port, channel>
+
+    //private MessageDriverLoop loop;
+
+    @Override
+    public void channelActive(ChannelHandlerContext ctx) throws Exception {
+        InetSocketAddress address = (InetSocketAddress) ctx.channel().remoteAddress();
+        log.info("新的客户端连接:" + address.getAddress().getHostAddress() + ":" + address.getPort());
+//        channels.put(NettyUtils.toAddressString(address), ctx.channel());
+        super.channelActive(ctx);
+    }
+
+    @Override
+    public void channelInactive(ChannelHandlerContext ctx) throws Exception {
+//        InetSocketAddress address = (InetSocketAddress) ctx.channel().remoteAddress();
+//        log.info("客户端失去连接:" + address.getAddress().getHostAddress() + ":" + address.getPort());
+//        channels.remove(NettyUtils.toAddressString(address));
+        super.channelActive(ctx);
+    }
+
+    @Override
+    public void channelRead(ChannelHandlerContext ctx, Object msg) throws Exception {
+//        IMessage message = (IMessage) msg;
+//        loop.putMessage(new IRequest(message, ctx));
+        log.info("接收数据包:{}", msg);
+    }
+
+
+    @Override
+    public void write(ChannelHandlerContext ctx, Object msg, ChannelPromise promise) throws Exception {
+        ctx.write(msg, promise);
+    }
+
+    @Override
+    public void exceptionCaught(ChannelHandlerContext ctx, Throwable cause)
+            throws Exception {
+        log.error("io exception!", cause);
+        ctx.channel().close();
+    }
+}

+ 62 - 0
VB_DSM_V2.1/vbdsm-data-upload/vbdsm-hj212/vbdsm-hj212-modbus/src/main/java/cn/vbdsm/hj212/modbus/server/TcpSocketServer.java

@@ -0,0 +1,62 @@
+package cn.vbdsm.hj212.modbus.server;
+
+import cn.vbdsm.hj212.modbus.config.TcpServerProperties;
+import cn.vbdsm.hj212.modbus.handler.TcpServerHandler;
+import io.netty.bootstrap.ServerBootstrap;
+import io.netty.buffer.PooledByteBufAllocator;
+import io.netty.channel.Channel;
+import io.netty.channel.ChannelFuture;
+import io.netty.channel.ChannelInitializer;
+import io.netty.channel.ChannelOption;
+import io.netty.channel.nio.NioEventLoopGroup;
+import io.netty.channel.socket.nio.NioServerSocketChannel;
+import io.netty.channel.socket.nio.NioSocketChannel;
+import io.netty.util.concurrent.DefaultThreadFactory;
+import lombok.Getter;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Component;
+
+@Component
+@Slf4j
+public class TcpSocketServer {
+    @Autowired
+    private TcpServerProperties properties;
+
+    @Getter
+    private Channel channel;
+    public void run(){
+        NioEventLoopGroup bossGroup = new NioEventLoopGroup(properties.getBossThreadNum(), new DefaultThreadFactory("NettyServerBoss", true));
+        NioEventLoopGroup workerGroup = new NioEventLoopGroup(properties.getWorkThreadNum(), new DefaultThreadFactory("NettyServerWorker", true));
+        ServerBootstrap bootstrap = new ServerBootstrap();
+
+        final TcpServerHandler serverHandler = new TcpServerHandler();
+        //channels = serverHandler.getChannels();
+        bootstrap.group(bossGroup, workerGroup)
+                .channel(NioServerSocketChannel.class)
+                .childOption(ChannelOption.TCP_NODELAY, Boolean.TRUE)
+                .childOption(ChannelOption.SO_REUSEADDR, Boolean.TRUE)
+                .childOption(ChannelOption.ALLOCATOR, PooledByteBufAllocator.DEFAULT)
+                .childOption(ChannelOption.SO_KEEPALIVE, Boolean.TRUE)
+                .childHandler(new ChannelInitializer<NioSocketChannel>() {
+
+                    @Override
+                    protected void initChannel(NioSocketChannel ch) throws Exception {
+
+                        ch.pipeline()
+
+                                .addLast("handler", serverHandler);
+                    }
+                });
+        // bind
+        ChannelFuture channelFuture = bootstrap.bind(properties.getBindIp(), properties.getBindPort());
+        log.info("sever starting ....");
+        channelFuture.syncUninterruptibly();
+        channel = channelFuture.channel();
+        log.info("sever has started, ip:" + properties.getBindIp() + "," + "port:" + properties.getBindPort());
+    }
+
+    public void stop(){
+
+    }
+}

+ 23 - 0
VB_DSM_V2.1/vbdsm-data-upload/vbdsm-hj212/vbdsm-hj212-modbus/src/main/java/cn/vbdsm/hj212/modbus/task/UploadDataTask.java

@@ -0,0 +1,23 @@
+package cn.vbdsm.hj212.modbus.task;
+
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.scheduling.annotation.Scheduled;
+import org.springframework.stereotype.Component;
+import cn.vbdsm.hj212.modbus.ws.*;
+
+import java.time.LocalDateTime;
+import java.time.format.DateTimeFormatter;
+
+@Component
+public class UploadDataTask {
+//    @Autowired
+//    private  UploadDataService uploadDataService;
+    @Autowired
+    private MockUploadWsService uploadWsService;
+
+    @Scheduled(cron = "0 0/15 * * * ?")
+    public void uploadData() throws Exception {
+        uploadWsService.loadTerminals();
+        //System.out.println(LocalDateTime.now().format(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss")));
+    }
+}

+ 52 - 0
VB_DSM_V2.1/vbdsm-data-upload/vbdsm-hj212/vbdsm-hj212-modbus/src/main/java/cn/vbdsm/hj212/modbus/utils/AESUtil.java

@@ -0,0 +1,52 @@
+package cn.vbdsm.hj212.modbus.utils;
+
+import lombok.extern.slf4j.Slf4j;
+
+import javax.crypto.Cipher;
+import javax.crypto.spec.SecretKeySpec;
+@Slf4j
+public class AESUtil {
+    public static boolean checkKey(String key)
+    {
+        if (key == null) {
+            log.error("密码为空!");
+        }else if (key.length() != 16) {
+            log.error("Key:"+key+"长度不是16位!");
+        }
+        return true;
+    }
+    /***
+     * 加密
+     * @param sSrc
+     * @param key
+     * @return
+     * @throws Exception
+     */
+    public static String Encrypt(String sSrc, String key) throws Exception {
+        if(checkKey(key))
+        {
+            byte[] raw = key.getBytes("ASCII");
+            SecretKeySpec skeySpec = new SecretKeySpec(raw, "AES");
+            Cipher cipher = Cipher.getInstance("AES");
+            cipher.init(Cipher.ENCRYPT_MODE, skeySpec);
+            byte[] encrypted = cipher.doFinal(sSrc.getBytes());
+//			System.out.println(">>>>>"+encrypted);
+            return byte2hex(encrypted).toLowerCase();
+        }
+        return null;
+    }
+    public static String byte2hex(byte[] b) {
+        String hs = "";
+        String stmp = "";
+        for (int n = 0; n < b.length; n++) {
+            stmp = (java.lang.Integer.toHexString(b[n] & 0XFF));
+            if (stmp.length() == 1)
+            {
+                hs = hs + "0" + stmp;
+            } else {
+                hs = hs + stmp;
+            }
+        }
+        return hs;
+    }
+}

+ 65 - 0
VB_DSM_V2.1/vbdsm-data-upload/vbdsm-hj212/vbdsm-hj212-modbus/src/main/java/cn/vbdsm/hj212/modbus/utils/RandomHelper.java

@@ -0,0 +1,65 @@
+package cn.vbdsm.hj212.modbus.utils;
+
+import cn.hutool.core.util.RandomUtil;
+
+import java.math.BigDecimal;
+import java.math.RoundingMode;
+import java.util.Random;
+
+public  class RandomHelper {
+    /**
+     *  获取随机数
+     * @param middle  中间值
+     * @param deviation 根据中间值所取的上下偏差
+
+     * @return
+     */
+    public static BigDecimal getRandom(Integer middle, Integer deviation ) {
+        int max = middle + deviation;
+        int min = middle - deviation;
+        return RandomUtil.randomBigDecimal(new BigDecimal(min), new BigDecimal(max)).setScale(3,RoundingMode.UP);
+    }
+    /**
+     *  获取随机数
+     * @param middle  中间值
+     * @param deviation 根据中间值所取的上下偏差
+     * @param divisor  除数
+     * @return
+     */
+    public static BigDecimal getRandom(Integer middle, Integer deviation,Integer divisor) {
+
+        int max = middle + deviation;
+        int min = middle - deviation;
+        BigDecimal val = RandomUtil.randomBigDecimal(new BigDecimal(min), new BigDecimal(max));
+
+        return val.divide(new BigDecimal(divisor),RoundingMode.UP).setScale(3, RoundingMode.HALF_UP);
+
+    }
+
+    /**
+     *  获取随机数
+     * @param middle  中间值
+     * @param deviation 根据中间值所取的上下偏差
+     * @param divisor  除数
+     * @return
+     */
+    public static BigDecimal getRandom(BigDecimal middle, BigDecimal deviation,BigDecimal divisor) {
+        BigDecimal max = middle.add(deviation);
+        BigDecimal min = middle.subtract(deviation);
+        BigDecimal val = RandomUtil.randomBigDecimal(min, max);
+        return val.divide(divisor).setScale(3, RoundingMode.HALF_UP);
+    }
+
+    /**
+     *  获取随机数
+     * @param middle  中间值
+     * @param deviation 根据中间值所取的上下偏差
+     * @return
+     */
+    public static BigDecimal getRandom(BigDecimal middle, BigDecimal deviation ) {
+        BigDecimal max = middle.add(deviation);
+        BigDecimal min = middle.subtract(deviation);
+        return RandomUtil.randomBigDecimal(min, max);
+
+    }
+}

+ 16 - 0
VB_DSM_V2.1/vbdsm-data-upload/vbdsm-hj212/vbdsm-hj212-modbus/src/main/java/cn/vbdsm/hj212/modbus/utils/WsClientUtil.java

@@ -0,0 +1,16 @@
+package cn.vbdsm.hj212.modbus.utils;
+import org.apache.cxf.endpoint.Client;
+import org.apache.cxf.jaxws.endpoint.dynamic.JaxWsDynamicClientFactory;
+
+public class WsClientUtil {
+    public static String callWebSV(String wsdUrl, String operationName, String... params) throws Exception {
+        JaxWsDynamicClientFactory dcf = JaxWsDynamicClientFactory.newInstance();
+        Client client = dcf.createClient(wsdUrl);
+        //client.getOutInterceptors().add(new ClientLoginInterceptor(USER_NAME, PASS_WORD));
+        Object[] objects;
+        // invoke("方法名",参数1,参数2,参数3....);
+        objects = client.invoke(operationName, params);
+        return objects[0].toString();
+    }
+
+}

+ 128 - 0
VB_DSM_V2.1/vbdsm-data-upload/vbdsm-hj212/vbdsm-hj212-modbus/src/main/java/cn/vbdsm/hj212/modbus/ws/DataListBuilder.java

@@ -0,0 +1,128 @@
+package cn.vbdsm.hj212.modbus.ws;
+
+import cn.vbdsm.hj212.modbus.ws.data.RandomHarmonic;
+import cn.vbdsm.hj212.modbus.ws.data.RandomPower;
+
+
+import java.util.Map;
+import java.util.Objects;
+
+public class DataListBuilder {
+
+    public static void  buildDataList(String dataType, Map<String,String> resultMap, RandomPower power
+            , String ht, RandomHarmonic harmonic) {
+
+        if(Objects.equals(dataType, "01")){
+            resultMap.put("01", String.valueOf(power.getP()));
+            resultMap.put("02", String.valueOf(power.getPa()));
+            resultMap.put("03", String.valueOf(power.getPb()));
+            resultMap.put("04", String.valueOf(power.getPc()));
+            resultMap.put("05", String.valueOf(power.getQ()));
+            resultMap.put("06", String.valueOf(power.getQa()));
+            resultMap.put("07", String.valueOf(power.getQb()));
+            resultMap.put("08", String.valueOf(power.getQc()));
+            resultMap.put("09", String.valueOf(power.getPf()));
+            resultMap.put("10", String.valueOf(power.getPfa()));
+            resultMap.put("11", String.valueOf(power.getPfb()));
+            resultMap.put("12", String.valueOf(power.getPfc()));
+            resultMap.put("13", String.valueOf(power.getIa()));
+            resultMap.put("14", String.valueOf(power.getIb()));
+            resultMap.put("15", String.valueOf(power.getIc()));
+            resultMap.put("16", String.valueOf(power.getIz()));
+            resultMap.put("17", String.valueOf(power.getUa()));
+            resultMap.put("18", String.valueOf(power.getUb()));
+            resultMap.put("19", String.valueOf(power.getUc()));
+            resultMap.put("20", String.valueOf(power.getUab()));
+            resultMap.put("21", String.valueOf(power.getUbc()));
+            resultMap.put("22", String.valueOf(power.getUca()));
+            resultMap.put("23", String.valueOf(power.getPv()));
+            resultMap.put("24", String.valueOf(power.getF()));
+            resultMap.put("25", String.valueOf(power.getInbalance()));
+            resultMap.put("26", String.valueOf(power.getUnbalance()));
+            resultMap.put("27", String.valueOf(power.getUaw()));
+            resultMap.put("28", String.valueOf(power.getUbw()));
+            resultMap.put("29", String.valueOf(power.getUcw()));
+            resultMap.put("30", String.valueOf(power.getUabw()));
+            resultMap.put("31", String.valueOf(power.getUbcw()));
+            resultMap.put("32", String.valueOf(power.getUcaw()));
+            resultMap.put("33", String.valueOf(power.getFw()));
+            resultMap.put("34", String.valueOf(power.getT()));
+            resultMap.put("35", String.valueOf(power.getT2()));
+            resultMap.put("36", String.valueOf(power.getT3()));
+            resultMap.put("37", String.valueOf(power.getT4()));
+            resultMap.put("38", String.valueOf(power.getT5()));
+            resultMap.put("39", String.valueOf(power.getT6()));
+            resultMap.put("40", String.valueOf(power.getT7()));
+            resultMap.put("41", String.valueOf(power.getT8()));
+        }
+
+        if(Objects.equals(dataType, "02")){
+            resultMap.put("01", String.valueOf(power.getTpe()));
+            resultMap.put("02", String.valueOf(power.getTqe()));
+            resultMap.put("03", String.valueOf(power.getFpe()));
+            resultMap.put("04", String.valueOf(power.getFqe()));
+            resultMap.put("05", String.valueOf(power.getTps()));
+            resultMap.put("06", String.valueOf(power.getTqs()));
+            resultMap.put("07", String.valueOf(power.getFps()));
+            resultMap.put("08", String.valueOf(power.getFqs()));
+        }
+
+        if(Objects.equals(dataType, "03")){
+            resultMap.put("harmonicType", ht);
+
+            resultMap.put("01", String.valueOf(harmonic.getH3()));
+            resultMap.put("02", String.valueOf(harmonic.getH5()));
+            resultMap.put("03", String.valueOf(harmonic.getH7()));
+            resultMap.put("04", String.valueOf(harmonic.getH9()));
+            resultMap.put("05", String.valueOf(harmonic.getH11()));
+            resultMap.put("06", String.valueOf(harmonic.getH13()));
+            resultMap.put("07", String.valueOf(harmonic.getH15()));
+            resultMap.put("08", String.valueOf(harmonic.getH17()));
+            resultMap.put("09", String.valueOf(harmonic.getH19()));
+            resultMap.put("10", String.valueOf(harmonic.getH21()));
+            resultMap.put("11", String.valueOf(harmonic.getH23()));
+            resultMap.put("12", String.valueOf(harmonic.getH25()));
+            resultMap.put("13", String.valueOf(harmonic.getH27()));
+            resultMap.put("14", String.valueOf(harmonic.getH29()));
+            resultMap.put("15", String.valueOf(harmonic.getH31()));
+            resultMap.put("16", String.valueOf(harmonic.getHall()));
+            resultMap.put("17", String.valueOf(harmonic.getBaseU()));
+        }
+
+        if(Objects.equals(dataType, "04")){
+            resultMap.put("harmonicType", ht);
+            resultMap.put("01", String.valueOf(harmonic.getH3()));
+            resultMap.put("02", String.valueOf(harmonic.getH5()));
+            resultMap.put("03", String.valueOf(harmonic.getH7()));
+            resultMap.put("04", String.valueOf(harmonic.getH9()));
+            resultMap.put("05", String.valueOf(harmonic.getH11()));
+            resultMap.put("06", String.valueOf(harmonic.getH13()));
+            resultMap.put("07", String.valueOf(harmonic.getH15()));
+            resultMap.put("08", String.valueOf(harmonic.getH17()));
+            resultMap.put("09", String.valueOf(harmonic.getH19()));
+            resultMap.put("10", String.valueOf(harmonic.getH21()));
+            resultMap.put("11", String.valueOf(harmonic.getH23()));
+            resultMap.put("12", String.valueOf(harmonic.getH25()));
+            resultMap.put("13", String.valueOf(harmonic.getH27()));
+            resultMap.put("14", String.valueOf(harmonic.getH29()));
+            resultMap.put("15", String.valueOf(harmonic.getH31()));
+            resultMap.put("16", String.valueOf(harmonic.getHall()));
+            resultMap.put("17", String.valueOf(harmonic.getBaseI()));
+        }
+
+        if(Objects.equals(dataType, "05")){
+           //todo 电量整点表(编号: 05)  小时数据获取
+            resultMap.put("getDate", "");  //yyyyMMdd
+            resultMap.put("hour", "");  //HH
+            resultMap.put("01", String.valueOf(power.getTpe()));
+            resultMap.put("02", String.valueOf(power.getTqe()));
+            resultMap.put("03", String.valueOf(power.getFpe()));
+            resultMap.put("04", String.valueOf(power.getFqe()));
+            resultMap.put("05", String.valueOf(power.getTps()));
+            resultMap.put("06", String.valueOf(power.getTqs()));
+            resultMap.put("07", String.valueOf(power.getFps()));
+            resultMap.put("08", String.valueOf(power.getFqs()));
+        }
+
+    }
+}

+ 193 - 0
VB_DSM_V2.1/vbdsm-data-upload/vbdsm-hj212/vbdsm-hj212-modbus/src/main/java/cn/vbdsm/hj212/modbus/ws/MockUploadWsService.java

@@ -0,0 +1,193 @@
+package cn.vbdsm.hj212.modbus.ws;
+
+import cn.hutool.core.io.file.FileReader;
+import cn.hutool.core.util.StrUtil;
+import cn.vbdsm.hj212.modbus.config.WsProperties;
+import cn.vbdsm.hj212.modbus.utils.AESUtil;
+import cn.vbdsm.hj212.modbus.utils.RandomHelper;
+import cn.vbdsm.hj212.modbus.utils.WsClientUtil;
+import cn.vbdsm.hj212.modbus.ws.data.MockMonitor;
+import cn.vbdsm.hj212.modbus.ws.data.RandomHarmonic;
+import cn.vbdsm.hj212.modbus.ws.data.RandomPower;
+import cn.vbdsm.hj212.modbus.ws.data.TerminalData;
+
+import com.alibaba.fastjson2.JSON;
+import lombok.extern.slf4j.Slf4j;
+import lombok.var;
+import org.springframework.beans.factory.annotation.Autowired;
+
+import org.springframework.core.io.Resource;
+import org.springframework.core.io.ResourceLoader;
+import org.springframework.core.io.support.PathMatchingResourcePatternResolver;
+import org.springframework.stereotype.Component;
+
+
+import java.io.*;
+import java.math.BigDecimal;
+import java.time.LocalDateTime;
+import java.time.format.DateTimeFormatter;
+import java.util.*;
+
+
+@Slf4j
+@Component
+public class MockUploadWsService {
+    @Autowired
+    private WsProperties wsProperties;
+
+    @Autowired
+    private MockMonitor mockMonitor;
+
+//    @Autowired
+//    private ResourceLoader resourceLoader;
+
+
+//    public void loadTerminals() throws Exception {
+//        var resolver = new PathMatchingResourcePatternResolver();
+//        var resources = resolver.getResources("classpath:mock/*.json");
+//        for (var resource:resources){
+//            File file = resource.getFile();
+//            TerminalData td = getTerminalData(file);
+//            RandomPower power = new RandomPower();
+//            if(td != null){
+//                setEngine(power,td);
+//                uploadData(td,power);
+//            }
+//        }
+//    }
+    public void loadTerminals() throws Exception {
+        String terminals = mockMonitor.getTerminals();
+        String[] coms = terminals.split("&");
+        for(String c : coms){
+            String[] cts = c.split("@");
+            String[] ts = cts[1].split(",");
+            for(String t : ts){
+                TerminalData td = getTerminal(cts[0],t);
+                RandomPower power = new RandomPower();
+                setEngine(power,td);
+                uploadData(td,power);
+            }
+        }
+    }
+
+    private TerminalData getTerminal(String companyId,String terminalId){
+        String filePath = StrUtil.format("./mock/{}@{}.json",companyId,terminalId);
+        //Resource fileResource =resourceLoader.getResource(filePath);
+        File file = null;
+        try {
+            file = new File(filePath);
+            if(file.exists()){
+                FileReader fr = new FileReader(file);
+                String ts = fr.readString();
+                return JSON.parseObject(ts, TerminalData.class);
+            }
+        } catch (Exception e) {
+            log.error("{}文件不存在",filePath);
+        }
+        return new TerminalData(terminalId,companyId);
+    }
+    private void setEngine(RandomPower power, TerminalData td){
+        var dp = RandomHelper.getRandom(22000,3000,100);
+        var de = RandomHelper.getRandom(6600,600,100);
+        var pe = td.getCurDayTotalP().equals(new BigDecimal(0))?new BigDecimal(0):td.getCurDayTotalP().add(dp);
+        var qe = td.getCurDayTotalE().equals(new BigDecimal(0))?new BigDecimal(0):td.getCurDayTotalE().add(de);
+        var ps = td.getTotal_p().add(dp);
+        var qs = td.getTotal_e().add(de);
+        power.setEngine(pe,qe,ps,qs);
+        td.SetDayTotalP(pe.equals(new BigDecimal(0))?new BigDecimal("0.01"):pe)
+                .SetTotalP(ps)
+                .SetDayTotalE(qe.equals(new BigDecimal(0))?new BigDecimal("0.01"):qe)
+                .SetTotalE(qs);
+
+        td.saveFileInfo();
+    }
+
+
+
+
+    public void uploadData(TerminalData td,RandomPower power) throws Exception {
+        String nowStr = LocalDateTime.now().format(DateTimeFormatter.ofPattern("yyyyMMddHHmmss"));
+        long now = Long.parseLong(nowStr);
+        now = now - (now - (now / 10000) * 10000) % 1500;
+        sendData("01",td,now,power);
+        sendData("02",td,now,power);
+        sendData("03",td,now,power);
+        sendData("04",td,now,power);
+    }
+
+    private void sendData(String type, TerminalData td ,Long date,RandomPower power) throws Exception {
+        OnlineData onlineData_power = new OnlineData();
+        onlineData_power.setCompanyId(td.getCompanyId());
+        onlineData_power.setDataType(type);
+        List<Map<String,String>> list = new ArrayList<>();
+        String terminalId = td.getTerminalId();
+        if(type.equals("01")||type.equals("02")){
+            Map<String,String> map = new HashMap<>();
+            map.put("terminalId",terminalId);
+            map.put("getTime", Long.toString(date));
+            DataListBuilder.buildDataList(type,map,power,
+                    "",null );
+            list.add(map);
+        }
+        else if(type.equals("03")){
+            Map<String, String> uaMap = createHi_HuMap(type, terminalId, "UA",date,power);
+            Map<String, String> ubMap = createHi_HuMap(type, terminalId, "UB", date,power);
+            Map<String, String> ucMap = createHi_HuMap(type, terminalId, "UC", date,power);
+            list.add(uaMap);
+            list.add(ubMap);
+            list.add(ucMap);
+        }else if(type.equals("04")){
+            Map<String, String> iaMap = createHi_HuMap(type, terminalId, "IA", date,power);
+            Map<String, String> ibMap = createHi_HuMap(type, terminalId, "IB", date,power);
+            Map<String, String> icMap = createHi_HuMap(type, terminalId, "IC", date,power);
+            list.add(iaMap);
+            list.add(ibMap);
+            list.add(icMap);
+        }
+
+
+        onlineData_power.setDataList(list);
+        String data = JSON.toJSONString(onlineData_power);
+        String content = null;
+        try {
+            content = AESUtil.Encrypt(data, wsProperties.getKey());
+            String[] urls = wsProperties.getUrl().split(";");
+            for (String url : urls) {
+                String result = WsClientUtil.callWebSV(url, wsProperties.getMethod(), content);
+                log.info("地址:{},企业编号:{},设备号信息:{},上传结果:{}",url,td.getCompanyId(),terminalId,result);
+            }
+        } catch (Exception e) {
+            throw new RuntimeException(e);
+        }
+    }
+
+    private Map<String,String> createHi_HuMap(String type,String terminalId,String ht,Long date,RandomPower power){
+        Map<String,String> map = new HashMap<>();
+        map.put("terminalId",terminalId);
+        map.put("getTime", Long.toString(date));
+        RandomHarmonic randomHarmonic = new RandomHarmonic(ht);
+        switch (ht){
+            case "UA":
+                randomHarmonic.setBaseU(power.getUa());
+                break;
+            case "UB":
+                randomHarmonic.setBaseU(power.getUb());
+                break;
+            case "UC":
+                randomHarmonic.setBaseU(power.getUc());
+                break;
+            case "IA":
+                randomHarmonic.setBaseI(power.getIa());
+                break;
+            case "IB":
+                randomHarmonic.setBaseI(power.getIb());
+                break;
+            case "IC":
+                randomHarmonic.setBaseI(power.getIc());
+                break;
+
+        }
+        DataListBuilder.buildDataList(type,map,null,ht,randomHarmonic);
+        return map;
+    }
+}

+ 16 - 0
VB_DSM_V2.1/vbdsm-data-upload/vbdsm-hj212/vbdsm-hj212-modbus/src/main/java/cn/vbdsm/hj212/modbus/ws/OnlineData.java

@@ -0,0 +1,16 @@
+package cn.vbdsm.hj212.modbus.ws;
+
+import lombok.Data;
+
+import java.util.List;
+import java.util.Map;
+
+@Data
+public class OnlineData {
+
+    private String companyId;
+
+    private String dataType;
+
+    private List<Map<String,String>> dataList;
+}

+ 13 - 0
VB_DSM_V2.1/vbdsm-data-upload/vbdsm-hj212/vbdsm-hj212-modbus/src/main/java/cn/vbdsm/hj212/modbus/ws/data/MockMonitor.java

@@ -0,0 +1,13 @@
+package cn.vbdsm.hj212.modbus.ws.data;
+
+import lombok.Data;
+import org.springframework.boot.context.properties.ConfigurationProperties;
+import org.springframework.stereotype.Component;
+
+@Component
+@ConfigurationProperties(prefix = "vbdsm.monitor")
+@Data
+public class MockMonitor {
+    private String terminals;
+
+}

+ 60 - 0
VB_DSM_V2.1/vbdsm-data-upload/vbdsm-hj212/vbdsm-hj212-modbus/src/main/java/cn/vbdsm/hj212/modbus/ws/data/RandomHarmonic.java

@@ -0,0 +1,60 @@
+package cn.vbdsm.hj212.modbus.ws.data;
+
+import cn.hutool.core.util.RandomUtil;
+import cn.vbdsm.hj212.modbus.utils.RandomHelper;
+import lombok.AllArgsConstructor;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+
+import java.math.BigDecimal;
+@Data
+@NoArgsConstructor
+@AllArgsConstructor
+public class RandomHarmonic {
+    public String type ;
+    public BigDecimal h3 ;
+    public BigDecimal h5 ;
+    public BigDecimal h7 ;
+    public BigDecimal h9 ;
+    public BigDecimal h11 ;
+    public BigDecimal h13 ;
+    public BigDecimal h15 ;
+    public BigDecimal h17 ;
+    public BigDecimal h19 ;
+    public BigDecimal h21 ;
+    public BigDecimal h23 ;
+    public BigDecimal h25 ;
+    public BigDecimal h27 ;
+    public BigDecimal h29 ;
+    public BigDecimal h31 ;
+    public BigDecimal hall;
+    public BigDecimal baseI ;
+    public BigDecimal baseU ;
+
+    public RandomHarmonic(String type){
+        this.type = type;
+        this.hall = RandomHelper.getRandom(550,100,100);
+        this.setH3(GetVal());
+        this.setH5(GetVal());
+        this.setH7(GetVal());
+        this.setH9(GetVal());
+        this.setH11(GetVal());
+        this.setH13(GetVal());
+        this.setH15(GetVal());
+        this.setH17(GetVal());
+        this.setH19(GetVal());
+        this.setH21(GetVal());
+        this.setH23(GetVal());
+        this.setH25(GetVal());
+        this.setH27(GetVal());
+        this.setH29(GetVal());
+        this.setH31(GetVal());
+
+    }
+    private BigDecimal GetVal()
+    {
+        return RandomUtil.randomInt(0, 100) > 50 ? RandomHelper.getRandom(150, 50, 100) : new BigDecimal(0);
+    }
+
+
+}

+ 228 - 0
VB_DSM_V2.1/vbdsm-data-upload/vbdsm-hj212/vbdsm-hj212-modbus/src/main/java/cn/vbdsm/hj212/modbus/ws/data/RandomPower.java

@@ -0,0 +1,228 @@
+package cn.vbdsm.hj212.modbus.ws.data;
+
+import cn.hutool.core.util.ArrayUtil;
+import cn.hutool.core.util.RandomUtil;
+import cn.vbdsm.hj212.modbus.utils.RandomHelper;
+import lombok.Data;
+
+import java.math.BigDecimal;
+import java.math.RoundingMode;
+import java.util.ArrayList;
+import java.util.List;
+
+@Data
+public class RandomPower {
+
+    private BigDecimal pa;
+    private BigDecimal pb;
+    private BigDecimal pc;
+    private BigDecimal p;
+
+    private BigDecimal qa;
+    private BigDecimal qb;
+    private BigDecimal qc;
+    private BigDecimal q;
+
+    private BigDecimal pfa;
+    private BigDecimal pfb;
+    private BigDecimal pfc;
+    private BigDecimal pf;
+
+    private BigDecimal ia;
+    private BigDecimal ib;
+    private BigDecimal ic ;
+    private BigDecimal iz ;
+    private BigDecimal ua ;
+    private BigDecimal ub ;
+    private BigDecimal uc ;
+    private BigDecimal uab ;
+    private BigDecimal ubc ;
+    private BigDecimal uca;
+
+    //需量负荷
+    private BigDecimal dp ;
+
+    //负荷率
+    private BigDecimal pv;
+
+   private BigDecimal uaw;
+   private BigDecimal ubw;
+   private BigDecimal ucw;
+   private BigDecimal uabw;
+   private BigDecimal ubcw;
+   private BigDecimal ucaw;
+   private BigDecimal fw;
+   private BigDecimal f;
+   private BigDecimal inbalance;
+   private BigDecimal unbalance;
+   private BigDecimal t;
+    private BigDecimal t2 ;
+    private BigDecimal t3;
+    private BigDecimal t4;
+    private BigDecimal t5 ;
+    private BigDecimal t6 ;
+    private BigDecimal t7 ;
+    private BigDecimal t8 ;
+
+    private BigDecimal tpe ;
+    private BigDecimal tqe ;
+    private BigDecimal fpe ;
+    private BigDecimal fqe ;
+    private BigDecimal tps ;
+    private BigDecimal tqs ;
+    private BigDecimal fps ;
+    private BigDecimal fqs ;
+
+
+    public  RandomPower (){
+        BigDecimal div_1000 = new BigDecimal(1000);
+        BigDecimal div_100 = new BigDecimal(100);
+        BigDecimal div_500 = new BigDecimal(500);
+        BigDecimal div_0 = new BigDecimal(0);
+        BigDecimal div_220 = new BigDecimal(220);
+        BigDecimal div_380 = new BigDecimal(380);
+        BigDecimal div_50 = new BigDecimal(50);
+        //todo 创建随机电能数据
+        //RandomPower power = new RandomPower();
+        List<BigDecimal> list_i = getI();
+        List<BigDecimal> list_u200 = getU_220();
+        List<BigDecimal> list_u380 = getU_380();
+        List<BigDecimal> list_pf = get_Pf();
+        this.setIa(list_i.get(0));
+        this.setIb(list_i.get(1));
+        this.setIc(list_i.get(2));
+
+        this.setUa(list_u200.get(0));
+        this.setUb(list_u200.get(1));
+        this.setUc(list_u200.get(2));
+
+        this.setUab(list_u380.get(0));
+        this.setUbc(list_u380.get(1));
+        this.setUca(list_u380.get(2));
+
+        this.setPfa(list_pf.get(0));
+        this.setPfb(list_pf.get(1));
+        this.setPfc(list_pf.get(2));
+
+        this.setF(RandomHelper.getRandom(5000,20,100));
+
+
+        this.setPa(ia.multiply(ua).multiply(pfa).divide(div_1000,RoundingMode.UP).setScale(3, RoundingMode.HALF_UP));
+        this.setPb(ib.multiply(ub).multiply(pfb).divide(div_1000,RoundingMode.UP).setScale(3, RoundingMode.HALF_UP));
+        this.setPc(ic.multiply(uc).multiply(pfc).divide(div_1000,RoundingMode.UP).setScale(3, RoundingMode.HALF_UP));
+        this.setP(pa.add(pb).add(pc));
+        this.setQa(ia.multiply(ua).multiply(new BigDecimal(1).subtract(pfa)).divide(div_1000, RoundingMode.HALF_UP).setScale(3, RoundingMode.HALF_UP));
+        this.setQb(ib.multiply(ub).multiply(new BigDecimal(1).subtract(pfb)).divide(div_1000, RoundingMode.HALF_UP).setScale(3, RoundingMode.HALF_UP));
+        this.setQc(ic.multiply(uc).multiply(new BigDecimal(1).subtract(pfc)).divide(div_1000, RoundingMode.HALF_UP).setScale(3, RoundingMode.HALF_UP));
+        this.setQ(qa.add(qb).add(qc));
+
+        BigDecimal allP = (ia.multiply(ua).divide(div_1000,RoundingMode.HALF_UP)).add(ib.multiply(ub).divide(div_1000, RoundingMode.HALF_UP)).add(ic.multiply(uc).divide(div_1000, RoundingMode.HALF_UP));
+        this.setPf(p.multiply(div_100).divide(allP, RoundingMode.HALF_UP).divide(div_100, RoundingMode.HALF_UP).setScale(3, RoundingMode.HALF_UP));
+
+        this.setIz(RandomHelper.getRandom(1100,100,10));
+        //需量负荷
+        this.setDp(RandomHelper.getRandom(p.multiply(div_1000),div_500,div_1000));
+        //负荷率
+        this.setPv(RandomHelper.getRandom(8500,1500,100));
+        this.setUaw(getUw(ua,div_220));
+        this.setUbw(getUw(ub,div_220));
+        this.setUcw(getUw(uc,div_220));
+        this.setUabw(getUw(uab,div_380));
+        this.setUbcw(getUw(ubc,div_380));
+        this.setUcaw(getUw(uca,div_380));
+
+        this.setFw(f.subtract(div_50));
+
+        this.setInbalance(getUnbalance_I());
+        this.setUnbalance(getUnbalance_U());
+
+        this.setT(RandomHelper.getRandom(42,3));
+        this.setT2(div_0);
+        this.setT3(div_0);
+        this.setT4(div_0);
+        this.setT5(div_0);
+        this.setT6(div_0);
+        this.setT7(div_0);
+        this.setT8(div_0);
+
+
+    }
+
+    public void setEngine(BigDecimal pe, BigDecimal qe, BigDecimal ps, BigDecimal qs){
+        this.tpe = pe;
+        this.tqe = qe;
+        this.fpe = new BigDecimal(0);
+        this.fqe = new BigDecimal(0);
+        this.tps = ps;
+        this.tqs = qs;
+        this.fps = new BigDecimal(0);
+        this.fqs = new BigDecimal(0);
+
+    }
+    private List<BigDecimal> getU_220()
+    {
+        int ran =  RandomUtil.randomInt(2303, 2308);
+        List<BigDecimal> result = new ArrayList<>();
+        result.add(RandomHelper.getRandom(new BigDecimal(ran*10),new BigDecimal(150),new BigDecimal(100)));
+        result.add(RandomHelper.getRandom(new BigDecimal(ran*10),new BigDecimal(250),new BigDecimal(100)));
+        result.add(RandomHelper.getRandom(new BigDecimal(ran*10),new BigDecimal(150),new BigDecimal(100)));
+        return result;
+
+    }
+    private List<BigDecimal> getU_380()
+    {
+        int ran =  RandomUtil.randomInt(4003, 4008);
+        List<BigDecimal> result = new ArrayList<>();
+        result.add(RandomHelper.getRandom(new BigDecimal(ran*10),new BigDecimal(150),new BigDecimal(100)));
+        result.add(RandomHelper.getRandom(new BigDecimal(ran*10),new BigDecimal(250),new BigDecimal(100)));
+        result.add(RandomHelper.getRandom(new BigDecimal(ran*10),new BigDecimal(150),new BigDecimal(100)));
+        return result;
+    }
+    private List<BigDecimal> getI(){
+        int ran = RandomUtil.randomInt(1000, 1200);
+        List<BigDecimal> result = new ArrayList<>();
+        result.add(RandomHelper.getRandom(ran*100,450,100));
+        result.add(RandomHelper.getRandom(ran*100,350,100));
+        result.add(RandomHelper.getRandom(ran*100,550,100));
+        return result;
+    }
+    public BigDecimal getUw(BigDecimal u, BigDecimal un)
+    {
+        BigDecimal w = (u.subtract(un)).multiply(new BigDecimal(100)).divide(un, RoundingMode.HALF_UP);
+        return w;
+    }
+
+    private List<BigDecimal> get_Pf()
+    {
+        int ran = RandomUtil.randomInt(955, 965);
+        List<BigDecimal> list = new ArrayList<BigDecimal>();
+        list.add(RandomHelper.getRandom(ran * 10, 50, 10000));
+        list.add(RandomHelper.getRandom(ran * 10, 50, 10000));
+        list.add(RandomHelper.getRandom(ran * 10, 50, 10000));
+        return list;
+    }
+
+    private BigDecimal getUnbalance_I()
+    {
+        BigDecimal[] arr = new BigDecimal[3];
+        arr[0] = ia;
+        arr[1] = ib;
+        arr[2] = ic;
+        BigDecimal max = ArrayUtil.max(arr);
+        BigDecimal min = ArrayUtil.min(arr);
+        return (max.subtract(min)).multiply(new BigDecimal(100)).divide(max, RoundingMode.HALF_UP).setScale(3, RoundingMode.HALF_UP);
+    }
+
+    private BigDecimal getUnbalance_U()
+    {
+        BigDecimal[] arr = new BigDecimal[3];
+        arr[0] = ua;
+        arr[1] = ub;
+        arr[2] = uc;
+        BigDecimal max = ArrayUtil.max(arr);
+        BigDecimal ave = ua.add(ub).add(uc).divide(new BigDecimal(3), RoundingMode.HALF_UP);
+        return  (max.subtract(ave)).multiply(new BigDecimal(100)).divide(ave, RoundingMode.HALF_UP).setScale(3, RoundingMode.HALF_UP);
+
+    }
+
+}

+ 111 - 0
VB_DSM_V2.1/vbdsm-data-upload/vbdsm-hj212/vbdsm-hj212-modbus/src/main/java/cn/vbdsm/hj212/modbus/ws/data/TerminalData.java

@@ -0,0 +1,111 @@
+package cn.vbdsm.hj212.modbus.ws.data;
+
+import cn.hutool.core.io.FileUtil;
+import cn.hutool.core.util.StrUtil;
+import com.alibaba.fastjson2.JSON;
+import com.fasterxml.jackson.annotation.JsonIgnore;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+import lombok.extern.slf4j.Slf4j;
+import org.omg.CORBA.PUBLIC_MEMBER;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.core.io.ClassPathResource;
+import org.springframework.core.io.Resource;
+import org.springframework.core.io.ResourceLoader;
+
+import java.io.*;
+import java.math.BigDecimal;
+import java.net.URL;
+import java.time.LocalDate;
+import java.time.format.DateTimeFormatter;
+import java.util.HashMap;
+import java.util.Map;
+import java.util.concurrent.TransferQueue;
+
+
+@Data
+@Slf4j
+public class TerminalData {
+
+
+    public TerminalData(){
+       // this.key = LocalDate.now().format(DateTimeFormatter.ofPattern("yyyyMMdd"));
+    }
+
+    public TerminalData(String terminalId,String companyId){
+      this.terminalId = terminalId;
+      this.companyId = companyId;
+    }
+
+    private  String terminalId;
+
+    private String companyId;
+
+    private Map<String, BigDecimal> dayTotal_p = new HashMap<>();
+
+    private Map<String,BigDecimal> dayTotal_e = new HashMap<>();
+
+    private BigDecimal total_p = new BigDecimal(0);
+
+    private BigDecimal total_e = new BigDecimal(0);
+
+    @JsonIgnore
+    private String key = LocalDate.now().format(DateTimeFormatter.ofPattern("yyyyMMdd"));
+
+    public BigDecimal getCurDayTotalP(){
+        return this.dayTotal_p.getOrDefault(this.key,new BigDecimal(0));
+    }
+    public BigDecimal getCurDayTotalE(){
+        return this.dayTotal_e.getOrDefault(this.key,new BigDecimal(0));
+    }
+
+    public TerminalData SetDayTotalP(BigDecimal d){
+        if(this.dayTotal_p.containsKey(key)){
+            dayTotal_p.remove(key);
+        }
+        dayTotal_p.put(key,d);
+        return this;
+    }
+    public TerminalData SetTotalP(BigDecimal d)
+    {
+        total_p = d;
+        return this;
+    }
+    public TerminalData SetDayTotalE(BigDecimal d){
+        if(this.dayTotal_e.containsKey(key)){
+            dayTotal_e.remove(key);
+        }
+        dayTotal_e.put(key,d);
+        return this;
+    }
+    public TerminalData SetTotalE(BigDecimal d)
+    {
+        total_e = d;
+        return this;
+    }
+
+
+    public void saveFileInfo()  {
+
+        String fileName = StrUtil.format("{}@{}.json",companyId,terminalId);
+        //ClassPathResource classPathResource = new ClassPathResource(StrUtil.format("mock"));
+        try {
+            //String resourcePath = classPathResource.getURL().toString().substring(6);
+            File saveDir = new File("./mock");
+            if (!saveDir.exists()) {
+                saveDir.mkdir();
+            }
+            File file = new File(saveDir.getAbsoluteFile()+ "/" + fileName);
+            if(!file.exists()){
+                file.createNewFile();
+            }
+            FileWriter fw = new FileWriter(file);
+            String content = JSON.toJSONString(this);
+            fw.write(content);
+            fw.flush();
+            fw.close();
+        } catch (IOException e) {
+            log.error("{}@{}.json文件保存失败!",companyId,terminalId);
+        }
+    }
+}

+ 18 - 0
VB_DSM_V2.1/vbdsm-data-upload/vbdsm-hj212/vbdsm-hj212-modbus/src/main/resources/application.yml

@@ -0,0 +1,18 @@
+server:
+    port: 18080
+vbdsm:
+    socket:
+        server:
+            enable: true
+            bindPort: 18888 #服务器端口,默认是19999
+            bindIp: 0.0.0.0 #服务器ip 默认0.0.0.0
+            bossThreadNum: 1 #netty boss线程数 默认为1
+            workThreadNum: 4 #netty work线程数,默认为4
+    ws:
+        url: http://192.168.0.104:7100/services/UploadData?wsdl;http://192.168.0.104:7100/services/UploadData?wsdl
+        method: UploadAllData
+        key: WOSHI123456MIYAO
+    monitor:
+        terminals: 3@YC0001,YC0002&7@YD001_01,YD001_02&9@YD002_01,YD002_02&10@YD003_01
+
+

+ 57 - 0
VB_DSM_V2.1/vbdsm-data-upload/vbdsm-hj212/vbdsm-hj212-modbus/src/main/resources/logback.xml

@@ -0,0 +1,57 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<configuration scan="true" scanPeriod="60 seconds" debug="false">
+    <property name="rootLevel" value="INFO"/>
+    <property name="appName" value="vbdsm-hj212-modbus-server"/>
+    <contextName>${appName}</contextName>
+    <appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">
+        <encoder>
+            <pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger- %msg%n</pattern>
+            <charset>UTF-8</charset>
+        </encoder>
+    </appender>
+
+    <appender name="INFO" class="ch.qos.logback.core.rolling.RollingFileAppender">
+        <rollingPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy">
+            <FileNamePattern>${catalina.home:-.}/logs/${appName}.%d{yyyy-MM-dd}.%i.log</FileNamePattern>
+            <maxFileSize>100MB</maxFileSize>
+            <maxHistory>30</maxHistory>
+            <totalSizeCap>2GB</totalSizeCap>
+        </rollingPolicy>
+        <encoder>
+            <pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger - %msg%n</pattern>
+            <charset>UTF-8</charset>
+        </encoder>
+        <filter class="ch.qos.logback.classic.filter.LevelFilter">
+            <level>INFO</level>
+            <onMatch>ACCEPT</onMatch>
+            <onMismatch>DENY</onMismatch>
+        </filter>
+    </appender>
+
+    <appender name="ERROR" class="ch.qos.logback.core.rolling.RollingFileAppender">
+        <rollingPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy">
+            <FileNamePattern>${catalina.home:-.}/logs/${appName}.%d{yyyy-MM-dd}.%i.error.log</FileNamePattern>
+            <maxFileSize>100MB</maxFileSize>
+            <maxHistory>30</maxHistory>
+            <totalSizeCap>2GB</totalSizeCap>
+        </rollingPolicy>
+        <encoder>
+            <pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger - %msg%n</pattern>
+            <charset>UTF-8</charset>
+        </encoder>
+        <filter class="ch.qos.logback.classic.filter.LevelFilter">
+            <level>ERROR</level>
+            <onMatch>ACCEPT</onMatch>
+            <onMismatch>DENY</onMismatch>
+        </filter>
+    </appender>
+
+    <logger name="org.springframework" level="warn"/>
+    <logger name="org.apache.http" level="warn"/>
+    <logger name="io.netty" level="info"/>
+    <root level="${rootLevel}">
+        <appender-ref ref="STDOUT"/>
+        <appender-ref ref="INFO"/>
+        <appender-ref ref="ERROR"/>
+    </root>
+</configuration>

+ 12 - 0
VB_DSM_V2.1/vbdsm-data-upload/vbdsm-hj212/vbdsm-hj212-modbus/src/main/resources/mock/3@YC10001.json

@@ -0,0 +1,12 @@
+{
+  "terminalId": "YC10001",
+  "companyId": "3",
+  "dayTotal_p": {
+    "20230925": 0
+  },
+  "dayTotal_e": {
+    "20230925": 0
+  },
+  "total_p": 0,
+  "total_e": 0
+}

+ 6 - 0
VB_DSM_V2.1/vbdsm-data-upload/vbdsm-hj212/vbdsm-hj212-modbus/src/main/resources/static/index.html

@@ -0,0 +1,6 @@
+<html>
+<body>
+<h1>hello word!!!</h1>
+<p>this is a html page</p>
+</body>
+</html>

+ 13 - 0
VB_DSM_V2.1/vbdsm-data-upload/vbdsm-hj212/vbdsm-hj212-modbus/src/test/java/cn/vbdsm/hj212/modbus/VbdsmHj212ModbusApplicationTests.java

@@ -0,0 +1,13 @@
+package cn.vbdsm.hj212.modbus;
+
+import org.junit.jupiter.api.Test;
+import org.springframework.boot.test.context.SpringBootTest;
+
+@SpringBootTest
+class VbdsmHj212ModbusApplicationTests {
+
+    @Test
+    void contextLoads() {
+    }
+
+}

+ 2 - 1
VB_DSM_V2.1/vbdsm-job/Dockerfile

@@ -2,9 +2,10 @@ FROM openjdk:8-jre-slim
 MAINTAINER Vber
 
 ENV PARAMS="--server.port=8080"
-
+USER root
 RUN mkdir -p /vbdsm/logs
 
+
 ENV TZ=Asia/Shanghai
 RUN ln -snf /usr/share/zoneinfo/$TZ /etc/localtime && echo $TZ > /etc/timezone
 

+ 33 - 0
iwb-iot-project/.gitignore

@@ -0,0 +1,33 @@
+HELP.md
+target/
+!.mvn/wrapper/maven-wrapper.jar
+!**/src/main/**/target/
+!**/src/test/**/target/
+
+### STS ###
+.apt_generated
+.classpath
+.factorypath
+.project
+.settings
+.springBeans
+.sts4-cache
+
+### IntelliJ IDEA ###
+.idea
+*.iws
+*.iml
+*.ipr
+
+### NetBeans ###
+/nbproject/private/
+/nbbuild/
+/dist/
+/nbdist/
+/.nb-gradle/
+build/
+!**/src/main/**/build/
+!**/src/test/**/build/
+
+### VS Code ###
+.vscode/

+ 116 - 0
iwb-iot-project/pom.xml

@@ -0,0 +1,116 @@
+<?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 https://maven.apache.org/xsd/maven-4.0.0.xsd">
+    <modelVersion>4.0.0</modelVersion>
+    <groupId>com.iwbnet</groupId>
+    <artifactId>iwb-iot-project</artifactId>
+    <version>0.0.1-SNAPSHOT</version>
+    <name>iwb-iot-project</name>
+    <description>iwb-iot-project</description>
+    <properties>
+        <java.version>1.8</java.version>
+        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
+        <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
+        <spring-boot.version>2.6.13</spring-boot.version>
+    </properties>
+    <dependencies>
+
+        <dependency>
+            <groupId>org.springframework.boot</groupId>
+            <artifactId>spring-boot-starter-web</artifactId>
+        </dependency>
+
+        <dependency>
+            <groupId>org.mybatis.spring.boot</groupId>
+            <artifactId>mybatis-spring-boot-starter</artifactId>
+            <version>2.2.2</version>
+        </dependency>
+        <dependency>
+            <groupId>com.alibaba</groupId>
+            <artifactId>druid</artifactId>
+            <version>1.2.16</version>
+        </dependency>
+        <dependency>
+            <groupId>com.mysql</groupId>
+            <artifactId>mysql-connector-j</artifactId>
+            <scope>runtime</scope>
+        </dependency>
+        <dependency>
+            <groupId>org.springframework.boot</groupId>
+            <artifactId>spring-boot-starter-test</artifactId>
+            <scope>test</scope>
+        </dependency>
+
+        <dependency>
+            <groupId>cn.hutool</groupId>
+            <artifactId>hutool-all</artifactId>
+            <version>5.8.20</version>
+        </dependency>
+        <dependency>
+            <groupId>org.projectlombok</groupId>
+            <artifactId>lombok</artifactId>
+            <optional>true</optional>
+        </dependency>
+        <dependency>
+            <groupId>com.alibaba.fastjson2</groupId>
+            <artifactId>fastjson2</artifactId>
+            <version>2.0.32</version>
+        </dependency>
+
+        <dependency>
+            <groupId>io.springfox</groupId>
+            <artifactId>springfox-boot-starter</artifactId>
+            <version>3.0.0</version>
+        </dependency>
+
+        <dependency>
+            <groupId>org.springframework.integration</groupId>
+            <artifactId>spring-integration-mqtt</artifactId>
+            <version>5.5.14</version>
+        </dependency>
+    </dependencies>
+    <dependencyManagement>
+        <dependencies>
+            <dependency>
+                <groupId>org.springframework.boot</groupId>
+                <artifactId>spring-boot-dependencies</artifactId>
+                <version>${spring-boot.version}</version>
+                <type>pom</type>
+                <scope>import</scope>
+            </dependency>
+        </dependencies>
+    </dependencyManagement>
+
+    <build>
+        <plugins>
+            <plugin>
+                <groupId>org.apache.maven.plugins</groupId>
+                <artifactId>maven-compiler-plugin</artifactId>
+                <version>3.8.1</version>
+                <configuration>
+                    <source>1.8</source>
+                    <target>1.8</target>
+                    <encoding>UTF-8</encoding>
+                </configuration>
+            </plugin>
+            <plugin>
+                <groupId>org.springframework.boot</groupId>
+                <artifactId>spring-boot-maven-plugin</artifactId>
+                <version>${spring-boot.version}</version>
+                <configuration>
+                    <mainClass>com.iwbnet.iot.IwbIotProjectApplication</mainClass>
+                    <skip>true</skip>
+                </configuration>
+                <executions>
+                    <execution>
+                        <id>repackage</id>
+                        <goals>
+                            <goal>repackage</goal>
+                        </goals>
+                    </execution>
+                </executions>
+            </plugin>
+        </plugins>
+    </build>
+
+</project>

+ 25 - 0
iwb-iot-project/src/main/java/com/iwbnet/iot/IwbIotProjectApplication.java

@@ -0,0 +1,25 @@
+package com.iwbnet.iot;
+
+import com.iwbnet.iot.mqtt.MqttConnect;
+import org.mybatis.spring.annotation.MapperScan;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.boot.CommandLineRunner;
+import org.springframework.boot.SpringApplication;
+import org.springframework.boot.autoconfigure.SpringBootApplication;
+
+@SpringBootApplication
+@MapperScan("com.iwbnet.iot.mapper")
+public class IwbIotProjectApplication implements CommandLineRunner {
+    @Autowired
+    private MqttConnect mqttConnect;
+
+    public static void main(String[] args) {
+        SpringApplication.run(IwbIotProjectApplication.class, args);
+    }
+
+    @Override
+    public void run(String... args) throws Exception {
+        //程序启动时候,创建一个mqtt连接
+        mqttConnect.connect("", "", null);
+    }
+}

+ 19 - 0
iwb-iot-project/src/main/java/com/iwbnet/iot/common/BaseResponse.java

@@ -0,0 +1,19 @@
+package com.iwbnet.iot.common;
+
+import lombok.Data;
+
+@Data
+public class BaseResponse {
+    /**
+     * 状态码
+     */
+    private Integer code;
+
+
+
+    protected BaseResponse(CodeEnum code) {
+        this.code = code.getCode();
+
+    }
+
+}

+ 22 - 0
iwb-iot-project/src/main/java/com/iwbnet/iot/common/CodeEnum.java

@@ -0,0 +1,22 @@
+package com.iwbnet.iot.common;
+
+public enum CodeEnum {
+    SUCCESS(200),
+    FAIL(500),
+    ;
+
+    private final Integer code;
+
+
+
+    CodeEnum(Integer code) {
+        this.code = code;
+
+    }
+
+    public Integer getCode() {
+        return code;
+    }
+
+
+}

+ 10 - 0
iwb-iot-project/src/main/java/com/iwbnet/iot/common/Constant.java

@@ -0,0 +1,10 @@
+package com.iwbnet.iot.common;
+
+public class Constant {
+
+
+    public static final Integer USER_STATUS_ACTIVE = 0;
+    public static final Integer USER_STATUS_FORBID = 1;
+
+
+}

+ 51 - 0
iwb-iot-project/src/main/java/com/iwbnet/iot/common/MqResponse/LoginResp.java

@@ -0,0 +1,51 @@
+package com.iwbnet.iot.common.MqResponse;
+
+import lombok.Data;
+
+
+
+public class LoginResp {
+    public String getResult() {
+        return result;
+    }
+
+    public void setResult(String result) {
+        this.result = result;
+    }
+
+    public boolean isIs_superuser() {
+        return is_superuser;
+    }
+
+    public void setIs_superuser(boolean is_superuser) {
+        this.is_superuser = is_superuser;
+    }
+
+    private String result;
+
+    private boolean is_superuser;
+    public LoginResp(String result) {
+        this.result = result;
+    }
+    public LoginResp(String result, boolean is_superuser) {
+        this.result = result;
+        this.is_superuser = is_superuser;
+    }
+
+    public static LoginResp allow(boolean is_superuser) {
+        return new LoginResp("allow", is_superuser);
+    }
+    public static LoginResp allow( ) {
+        return new LoginResp("allow");
+    }
+    public static LoginResp deny(boolean is_superuser) {
+        return new LoginResp("deny", is_superuser);
+    }
+    public static LoginResp deny() {
+        return new LoginResp("deny");
+    }
+    public static LoginResp ignore(boolean is_superuser) {
+        return new LoginResp("ignore", is_superuser);
+    }
+
+}

+ 52 - 0
iwb-iot-project/src/main/java/com/iwbnet/iot/common/ResponseData.java

@@ -0,0 +1,52 @@
+package com.iwbnet.iot.common;
+
+import lombok.Data;
+import lombok.Getter;
+import lombok.Setter;
+
+@Getter
+@Setter
+public class ResponseData<T> extends BaseResponse {
+    /**
+     * 数据
+     */
+    private T data;
+
+
+    private String msg;
+
+    private ResponseData(CodeEnum code) {
+        super(code);
+    }
+
+    private ResponseData(CodeEnum code, T data) {
+        super(code);
+        this.data = data;
+    }
+    private ResponseData(CodeEnum code, T data,String msg) {
+        super(code);
+        this.data = data;
+        this.msg = msg;
+    }
+
+    /**
+     * 对外开放基础响应体已供调用,可用于增、删、改接口操作
+     */
+    public static BaseResponse out(CodeEnum code) {
+        return new BaseResponse(code);
+    }
+
+    /**
+     * 对外开放数据响应体已供调用,可用于查询数据实用,引用了范型设计,支持各种数据类型
+     */
+    public static <T> ResponseData<T> out(CodeEnum code, T data) {
+        return new ResponseData<>(code, data);
+    }
+    public static <T> ResponseData<T> success(T data) {
+        return new ResponseData<>(CodeEnum.SUCCESS, data);
+    }
+
+    public static <T> ResponseData<T> fail(T data,String msg) {
+        return new ResponseData<>(CodeEnum.FAIL, data,msg);
+    }
+}

+ 32 - 0
iwb-iot-project/src/main/java/com/iwbnet/iot/config/MqttConfig.java

@@ -0,0 +1,32 @@
+package com.iwbnet.iot.config;
+
+import cn.hutool.core.collection.CollectionUtil;
+import lombok.Data;
+import lombok.var;
+import org.springframework.boot.context.properties.ConfigurationProperties;
+import org.springframework.stereotype.Component;
+
+import java.util.List;
+
+@Data
+@Component
+@ConfigurationProperties(prefix = "mqtt")
+public class MqttConfig {
+    private String host;
+
+    private String username;
+
+    private String password;
+
+    private String clientId;
+
+    private String sub;
+
+
+    public String[] getInitSub() {
+        if(this.getSub() == null) {
+            return null;
+        }
+        return this.getSub().split(",");
+    }
+}

+ 44 - 0
iwb-iot-project/src/main/java/com/iwbnet/iot/config/SwaggerConfig.java

@@ -0,0 +1,44 @@
+package com.iwbnet.iot.config;
+
+import org.springframework.beans.factory.annotation.Value;
+import org.springframework.context.annotation.Bean;
+import org.springframework.context.annotation.Configuration;
+import springfox.documentation.builders.ApiInfoBuilder;
+import springfox.documentation.builders.PathSelectors;
+import springfox.documentation.builders.RequestHandlerSelectors;
+
+import springfox.documentation.oas.annotations.EnableOpenApi;
+import springfox.documentation.service.ApiInfo;
+import springfox.documentation.service.Contact;
+import springfox.documentation.spi.DocumentationType;
+import springfox.documentation.spring.web.plugins.Docket;
+
+@Configuration
+@EnableOpenApi
+public class SwaggerConfig {
+        /**
+     * 用于读取配置文件 application.properties 中 swagger 属性是否开启
+     */
+    @Value("${swagger.enabled}")
+    Boolean swaggerEnabled;
+    @Bean
+    public Docket desertsApi(){
+        return new Docket(DocumentationType.OAS_30)
+                .apiInfo(apiInfo())
+                .select()
+                .apis(RequestHandlerSelectors.basePackage("com.iwbnet.iot.controller"))
+                .paths(PathSelectors.any())
+                .build()
+                .groupName("iotServerGroup")
+                .enable(swaggerEnabled);
+    }
+
+    private ApiInfo apiInfo(){
+        return new ApiInfoBuilder()
+                .title("IOT-HTTP-TEST-Swagger3文档")
+                .description("文档描述信息")
+                .contact(new Contact("IWBNET-IOT", "#", "IWBNET@qq.com"))
+                .version("1.0")
+                .build();
+    }
+}

+ 77 - 0
iwb-iot-project/src/main/java/com/iwbnet/iot/controller/MqttController.java

@@ -0,0 +1,77 @@
+package com.iwbnet.iot.controller;
+
+import com.alibaba.fastjson2.JSON;
+import com.iwbnet.iot.common.MqResponse.LoginResp;
+import com.iwbnet.iot.common.ResponseData;
+import com.iwbnet.iot.entity.User;
+import com.iwbnet.iot.model.AuthClientDto;
+import com.iwbnet.iot.model.ClientLoginDto;
+import com.iwbnet.iot.model.TopicMsgDto;
+import com.iwbnet.iot.mqtt.MqttConnect;
+import com.iwbnet.iot.utils.Md5Util;
+import io.swagger.annotations.Api;
+import com.iwbnet.iot.mapper.UserMapper;
+import io.swagger.annotations.ApiOperation;
+import io.swagger.annotations.ApiParam;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.*;
+
+@Slf4j
+@Api(tags = "mqtt-API")
+@RestController
+@RequestMapping("/mqtt")
+public class MqttController {
+    @Autowired
+    private UserMapper userMapper;
+
+
+    @Autowired
+    private MqttConnect mqttConnect;
+
+    @ApiOperation("认证")
+    @PostMapping(value = "/login",produces = "application/json")
+    public LoginResp authentication(@ApiParam(value = "访问设备客户端用户") @RequestBody ClientLoginDto client){
+        log.info("client:{},username:{},pwd:{},发起连接...",
+                client.getClientId(),client.getUsername(),client.getPassword());
+
+        User user = userMapper.selectUserByUsername(client.getUsername());
+        if(user==null){
+            return LoginResp.deny(false);
+        }
+        String password = user.getPassword().trim();
+        if(!password.equals(Md5Util.getMD5Str(client.getPassword()))){
+            return LoginResp.deny(false);
+        }
+        return LoginResp.allow(user.getIsSuperuser() == 1);
+
+    }
+    @ApiOperation("鉴权")
+    @PostMapping(value = "/auth",produces = "application/json")
+    public LoginResp auth(@RequestBody AuthClientDto client){
+        String jsonString = JSON.toJSONString(client);
+        log.info(jsonString);
+        return LoginResp.allow();
+    }
+
+    @ApiOperation("订阅主题")
+    @GetMapping(value = "/sub")
+    public ResponseData sub(@ApiParam(value = "主题",readOnly = true) @RequestParam(value = "topic") String topic){
+        log.info("订阅主题:{}",topic);
+        if (!mqttConnect.isConnect()) {
+            mqttConnect.connect("", "", null);
+        }
+        return  ResponseData.success(topic+ (mqttConnect.sub(topic)?"订阅成功":"订阅失败"));
+    }
+
+    @ApiOperation("发布主题payload")
+    @PostMapping(value = "/pub")
+    public ResponseData pub(@ApiParam(value = "主题+payload",required = true) @RequestBody TopicMsgDto input){
+        log.info("发布主题:{}",JSON.toJSONString(input));
+        if (!mqttConnect.isConnect()) {
+            mqttConnect.connect("", "", null);
+        }
+        return  ResponseData.success((mqttConnect.pub(input)?"发布成功":"发布失败"));
+    }
+
+}

+ 22 - 0
iwb-iot-project/src/main/java/com/iwbnet/iot/entity/Terminal.java

@@ -0,0 +1,22 @@
+package com.iwbnet.iot.entity;
+
+ import lombok.Data;
+
+@Data
+//@Table("t_terminal")
+public class Terminal {
+    //@Id(keyType = KeyType.Auto)
+    private Long id;
+
+    private String clientId;
+
+    private Long userId;
+
+    private String terminalName;
+
+    private String terminalCode;
+
+    private Integer terminalType;
+
+    private Integer terminalStatus;
+}

+ 25 - 0
iwb-iot-project/src/main/java/com/iwbnet/iot/entity/User.java

@@ -0,0 +1,25 @@
+package com.iwbnet.iot.entity;
+
+import io.swagger.annotations.ApiModel;
+import lombok.Data;
+import lombok.Getter;
+
+//设备厂家账号信息
+@Getter
+//@Table("t_user")
+@ApiModel(value = "User", description = "设备厂家账号信息")
+public class User {
+    //@Id(keyType = KeyType.Auto)
+    private Long id;
+
+    private String username;
+
+    private String password;
+
+    private Integer status;
+
+    private Integer isSuperuser;
+
+
+
+}

+ 13 - 0
iwb-iot-project/src/main/java/com/iwbnet/iot/mapper/UserMapper.java

@@ -0,0 +1,13 @@
+package com.iwbnet.iot.mapper;
+
+import com.iwbnet.iot.entity.User;
+import org.apache.ibatis.annotations.Mapper;
+import org.apache.ibatis.annotations.Select;
+
+@Mapper
+public interface UserMapper {
+
+
+    @Select("select * from t_user where username = #{username}")
+    public User selectUserByUsername(String username);
+}

+ 46 - 0
iwb-iot-project/src/main/java/com/iwbnet/iot/model/AuthClientDto.java

@@ -0,0 +1,46 @@
+package com.iwbnet.iot.model;
+
+
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+ @ApiModel("mqtt认证实体")
+@Data
+public class AuthClientDto {
+    //${clientid}: 客户端的 ID
+//    ${username}: 客户端登录时用的用户名
+//    ${peerhost}: 客户端的源 IP 地址
+//    ${proto_name}: 客户端使用的协议名称。例如 MQTT,CoAP 等
+//    ${mountpoint}: 网关监听器的挂载点(主题前缀)
+//    ${action}: 当前执行的动作请求,例如 publish,subscribe
+//    ${topic}: 当前请求想要发布或订阅的主题(或主题过滤器)
+//    ${qos}: 当前请求想要发布或订阅的消息 QoS
+//    ${retain}: 当前请求想要发布的消息是否为保留消息
+    @ApiModelProperty("客户端的ID")
+    private String clientId;
+
+    @ApiModelProperty("客户端登录时用的用户名")
+    private String username;
+
+    @ApiModelProperty("当前请求想要发布或订阅的主题(或主题过滤器)")
+    private String topic;
+
+    @ApiModelProperty("当前执行的动作请求,例如publish,subscribe")
+    private String action;
+
+    @ApiModelProperty("客户端的源IP地址")
+    private String peerHost;
+
+    @ApiModelProperty("客户端使用的协议名称。例如 MQTT,CoAP 等")
+    private String protoName;
+
+    // @ApiModelProperty("网关监听器的挂载点(主题前缀)")
+    private String mountPoint;
+
+    @ApiModelProperty("当前请求想要发布或订阅的消息 QoS")
+    private String qos;
+
+    @ApiModelProperty("当前请求想要发布的消息是否为保留消息")
+    private String retain;
+
+}

+ 17 - 0
iwb-iot-project/src/main/java/com/iwbnet/iot/model/ClientLoginDto.java

@@ -0,0 +1,17 @@
+package com.iwbnet.iot.model;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+@ApiModel("mqtt登录请求")
+@Data
+public class ClientLoginDto {
+     @ApiModelProperty("用户名")
+    private String username;
+
+      @ApiModelProperty("密码")
+    private String password;
+
+      @ApiModelProperty("客户端Id")
+    private String clientId;
+}

+ 16 - 0
iwb-iot-project/src/main/java/com/iwbnet/iot/model/TopicMsgDto.java

@@ -0,0 +1,16 @@
+package com.iwbnet.iot.model;
+
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+@ApiModel("mqtt订阅主题实体类")
+@Data
+public class TopicMsgDto {
+     @ApiModelProperty("主题")
+    private String topic;
+    @ApiModelProperty("消息信息")
+    private String payload;
+     @ApiModelProperty("QoS等级,0为至多一次,1为至少一次,2为确保只有一次")
+    private int qos;
+}

+ 32 - 0
iwb-iot-project/src/main/java/com/iwbnet/iot/mqtt/MqCallback.java

@@ -0,0 +1,32 @@
+package com.iwbnet.iot.mqtt;
+
+import lombok.extern.slf4j.Slf4j;
+import org.eclipse.paho.client.mqttv3.IMqttDeliveryToken;
+import org.eclipse.paho.client.mqttv3.MqttCallback;
+import org.eclipse.paho.client.mqttv3.MqttMessage;
+
+@Slf4j
+public class MqCallback implements MqttCallback{
+    /**
+     * MQTT 断开连接会执行此方法
+     */
+    @Override
+    public void connectionLost(Throwable throwable) {
+        log.info("断开了MQTT连接 :{}", throwable.getMessage());
+        log.error(throwable.getMessage(), throwable);
+    }
+    /**
+     * subscribe订阅后得到的消息会执行到这里
+     */
+    @Override
+    public void messageArrived(String topic, MqttMessage mqttMessage) throws Exception {
+        log.info("收到来自 " + topic + " 的消息:{}", new String(mqttMessage.getPayload()));
+    }
+    /**
+     * publish发布成功后会执行到这里
+     */
+    @Override
+    public void deliveryComplete(IMqttDeliveryToken iMqttDeliveryToken) {
+        log.info("发布消息成功");
+    }
+}

+ 179 - 0
iwb-iot-project/src/main/java/com/iwbnet/iot/mqtt/MqttConnect.java

@@ -0,0 +1,179 @@
+package com.iwbnet.iot.mqtt;
+
+import com.alibaba.fastjson2.JSON;
+import com.iwbnet.iot.config.MqttConfig;
+import com.iwbnet.iot.model.TopicMsgDto;
+import lombok.extern.slf4j.Slf4j;
+import org.eclipse.paho.client.mqttv3.*;
+import org.eclipse.paho.client.mqttv3.persist.MemoryPersistence;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Component;
+
+import javax.annotation.PreDestroy;
+
+
+@Slf4j
+@Component
+public class MqttConnect {
+
+    @Autowired
+    private MqttConfig mqttConfig;
+
+    private MqttClient mqttClient;
+
+
+    public boolean isConnect() {
+        return mqttClient.isConnected();
+    }
+        /**
+     * 客户端connect连接mqtt服务器
+     *
+     * @param userName     用户名
+     * @param passWord     密码
+     * @param mqttCallback 回调函数
+     **/
+    public void connect(String userName, String passWord, MqttCallback mqttCallback){
+        if(userName.equals("") || passWord.equals("")) {
+            userName = mqttConfig.getUsername();
+            passWord = mqttConfig.getPassword();
+        }
+
+        try {
+            MqttConnectOptions options = mqttConnectOptions(userName, passWord);
+            if (mqttCallback == null) {
+                mqttClient.setCallback(new MqCallback());
+            } else {
+                mqttClient.setCallback(mqttCallback);
+            }
+            mqttClient.connect(options);
+        } catch (MqttException e) {
+            log.error(e.getMessage(), e);
+        }
+    }
+
+    /**
+     * 订阅默认主题
+     */
+    public void subInitTopic(){
+        try {
+
+            mqttClient.subscribe(mqttConfig.getInitSub());
+        } catch (MqttException e) {
+            log.error(e.getMessage(), e);
+        }
+    }
+
+
+
+    /**
+     * MQTT连接参数设置
+     */
+    private MqttConnectOptions mqttConnectOptions(String userName, String passWord) throws MqttException {
+        String host = "tcp://127.0.0.1:1883";
+        String clientId = "vbdsm-hj212-iot";
+        if(mqttConfig != null && mqttConfig.getHost() != null && !"".equals(mqttConfig.getHost())) {
+            host = mqttConfig.getHost();
+            clientId = mqttConfig.getClientId();
+        }
+        mqttClient = new MqttClient(host, clientId, new MemoryPersistence());
+        MqttConnectOptions options = new MqttConnectOptions();
+        options.setUserName(userName);
+        options.setPassword(passWord.toCharArray());
+        options.setConnectionTimeout(10);///默认:30
+        options.setAutomaticReconnect(true);//默认:false
+        options.setCleanSession(false);//默认:true
+        //options.setKeepAliveInterval(20);//默认:60
+        return options;
+    }
+
+     /**
+     * 关闭MQTT连接
+     */
+     @PreDestroy
+    public void close() throws MqttException {
+         log.info("关闭MQTT连接");
+        mqttClient.disconnect();
+        mqttClient.close();
+    }
+
+    /**
+     * 向某个主题发布消息 默认qos:1
+     *
+     * @param topic:发布的主题
+     * @param msg:发布的消息
+     */
+    public boolean pub(String topic, String msg)   {
+        return pub(topic, msg, 1);
+    }
+
+    public boolean pub(TopicMsgDto input)   {
+        String topic = input.getTopic();
+        String payLoad = input.getPayload();
+        if (payLoad == null) {
+            return false;
+        }
+        return pub(topic, payLoad, input.getQos());
+    }
+
+    /**
+     * 向某个主题发布消息
+     *
+     * @param topic: 发布的主题
+     * @param msg:   发布的消息
+     * @param qos:   消息质量    Qos:0、1、2
+     */
+    public boolean pub(String topic, String msg, int qos) {
+        MqttMessage mqttMessage = new MqttMessage();
+        mqttMessage.setQos(qos);
+        mqttMessage.setPayload(msg.getBytes());
+        MqttTopic mqttTopic = mqttClient.getTopic(topic);
+        try{
+            MqttDeliveryToken token = mqttTopic.publish(mqttMessage);
+            token.waitForCompletion();
+            return true;
+        }catch (MqttException e) {
+            log.error(e.getMessage(), e);
+        }
+        return false;
+    }
+
+    /**
+     * 订阅某一个主题 ,此方法默认的的Qos等级为:1
+     *
+     * @param topic 主题
+     */
+    public boolean sub(String topic)   {
+        try{
+            mqttClient.subscribe(topic);
+            return true;
+        }catch (MqttException e) {
+            log.error(e.getMessage(), e);
+        }
+        return false;
+    }
+
+    /**
+     * 订阅某一个主题,可携带Qos
+     *
+     * @param topic 所要订阅的主题
+     * @param qos   消息质量:0、1、2
+     */
+    public boolean sub(String topic, int qos)   {
+        try{
+            mqttClient.subscribe(topic, qos);
+            return true;
+        }catch (MqttException e) {
+            log.error(e.getMessage(), e);
+        }
+        return false;
+    }
+
+
+//    public void destroy() {
+//        try {
+//            this.close();
+//        } catch (MqttException e) {
+//            log.error(e.getMessage(), e);
+//        }
+//    }
+}

+ 9 - 0
iwb-iot-project/src/main/java/com/iwbnet/iot/service/IPayloadService.java

@@ -0,0 +1,9 @@
+package com.iwbnet.iot.service;
+
+
+public interface IPayloadService {
+
+
+
+    public void send(String topic, String payload);
+}

+ 24 - 0
iwb-iot-project/src/main/java/com/iwbnet/iot/utils/Md5Util.java

@@ -0,0 +1,24 @@
+package com.iwbnet.iot.utils;
+
+import java.math.BigInteger;
+import java.nio.charset.StandardCharsets;
+import java.security.MessageDigest;
+import java.security.NoSuchAlgorithmException;
+
+public class Md5Util {
+    public static String getMD5Str(String str) {
+        byte[] digest = null;
+        try {
+            MessageDigest md5 = MessageDigest.getInstance("md5");
+            digest = md5.digest(str.getBytes(StandardCharsets.UTF_8));
+        } catch (NoSuchAlgorithmException e) {
+            e.printStackTrace();
+        }
+        //16是表示转换为16进制数
+        String md5Str = null;
+        if (digest != null) {
+            md5Str = new BigInteger(1, digest).toString(16);
+        }
+        return md5Str;
+    }
+}

+ 29 - 0
iwb-iot-project/src/main/resources/application-dev.yml

@@ -0,0 +1,29 @@
+server:
+  port: 5080
+swagger:
+  enabled: true
+mybatis:
+  mapper-locations: classpath:mappers/*xml
+  type-aliases-package: com.iwbnet.iot.entity
+  configuration:
+    map-underscore-to-camel-case: true
+    log-impl: org.apache.ibatis.logging.stdout.StdOutImpl
+# DataSource Config
+spring:
+  datasource:
+    type: com.alibaba.druid.pool.DruidDataSource
+    url: jdbc:mysql://47.112.30.247:43308/iot_com?allowMultiQueries=true&useUnicode=true&characterEncoding=UTF-8&useSSL=false
+    username: root
+    password: 123456
+    driver-class-name: com.mysql.cj.jdbc.Driver
+  mvc:
+    pathmatch:
+      matching-strategy: ant_path_matcher
+
+mqtt:
+  host: tcp://127.0.0.1:1883
+  username: admin
+  password: 123456
+  clientId: vbdsm-hj212-iot
+  sub: vbdsm/device/+/+,system/+/+
+

+ 3 - 0
iwb-iot-project/src/main/resources/application.yml

@@ -0,0 +1,3 @@
+spring:
+    profiles:
+        active: dev

+ 57 - 0
iwb-iot-project/src/main/resources/logback.xml

@@ -0,0 +1,57 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<configuration scan="true" scanPeriod="60 seconds" debug="false">
+    <property name="rootLevel" value="INFO"/>
+    <property name="appName" value="vbdsm-hj212-IOT-server"/>
+    <contextName>${appName}</contextName>
+    <appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">
+        <encoder>
+            <pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger- %msg%n</pattern>
+            <charset>UTF-8</charset>
+        </encoder>
+        <filter class="ch.qos.logback.classic.filter.LevelFilter">
+            <level>DEBUG</level>
+        </filter>
+    </appender>
+
+    <appender name="INFO" class="ch.qos.logback.core.rolling.RollingFileAppender">
+        <rollingPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy">
+            <FileNamePattern>./logs/${appName}.%d{yyyy-MM-dd}.%i.log</FileNamePattern>
+            <maxFileSize>100MB</maxFileSize>
+            <maxHistory>30</maxHistory>
+            <totalSizeCap>2GB</totalSizeCap>
+        </rollingPolicy>
+        <encoder>
+            <pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger - %msg%n</pattern>
+            <charset>UTF-8</charset>
+        </encoder>
+        <filter class="ch.qos.logback.classic.filter.LevelFilter">
+            <level>INFO</level>
+            <onMatch>ACCEPT</onMatch>
+            <onMismatch>DENY</onMismatch>
+        </filter>
+    </appender>
+
+    <appender name="ERROR" class="ch.qos.logback.core.rolling.RollingFileAppender">
+        <rollingPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy">
+            <FileNamePattern>./logs/${appName}.%d{yyyy-MM-dd}.%i.error.log</FileNamePattern>
+            <maxFileSize>100MB</maxFileSize>
+            <maxHistory>30</maxHistory>
+            <totalSizeCap>2GB</totalSizeCap>
+        </rollingPolicy>
+        <encoder>
+            <pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger - %msg%n</pattern>
+            <charset>UTF-8</charset>
+        </encoder>
+        <filter class="ch.qos.logback.classic.filter.LevelFilter">
+            <level>ERROR</level>
+            <onMatch>ACCEPT</onMatch>
+            <onMismatch>DENY</onMismatch>
+        </filter>
+    </appender>
+
+    <root level="info">
+        <appender-ref ref="STDOUT"/>
+        <appender-ref ref="INFO"/>
+        <appender-ref ref="ERROR"/>
+    </root>
+</configuration>

+ 6 - 0
iwb-iot-project/src/main/resources/static/index.html

@@ -0,0 +1,6 @@
+<html>
+<body>
+<h1>hello word!!!</h1>
+<p>this is a html page</p>
+</body>
+</html>

+ 13 - 0
iwb-iot-project/src/test/java/com/iwbnet/iot/IwbIotProjectApplicationTests.java

@@ -0,0 +1,13 @@
+package com.iwbnet.iot;
+
+import org.junit.jupiter.api.Test;
+import org.springframework.boot.test.context.SpringBootTest;
+
+@SpringBootTest
+class IwbIotProjectApplicationTests {
+
+    @Test
+    void contextLoads() {
+    }
+
+}