Преглед на файлове

更改模拟数据发送TCP数据包

klzhangweiya преди 2 години
родител
ревизия
d294e429d7
променени са 19 файла, в които са добавени 412 реда и са изтрити 192 реда
  1. BIN
      VB_DSM_V2.1/mock/mock_data.db
  2. 5 5
      VB_DSM_V2.1/vbdsm-data-upload/vbdsm-hj212/vbdsm-hj212-datacollect/src/main/resources/config/application.yml
  3. 19 17
      VB_DSM_V2.1/vbdsm-data-upload/vbdsm-hj212/vbdsm-hj212-modbus/pom.xml
  4. 14 0
      VB_DSM_V2.1/vbdsm-data-upload/vbdsm-hj212/vbdsm-hj212-modbus/src/main/java/cn/vbdsm/hj212/modbus/coder/MyEncoder.java
  5. 7 0
      VB_DSM_V2.1/vbdsm-data-upload/vbdsm-hj212/vbdsm-hj212-modbus/src/main/java/cn/vbdsm/hj212/modbus/config/ClientAttributeKey.java
  6. 0 39
      VB_DSM_V2.1/vbdsm-data-upload/vbdsm-hj212/vbdsm-hj212-modbus/src/main/java/cn/vbdsm/hj212/modbus/controller/MqttAuthController.java
  7. 10 1
      VB_DSM_V2.1/vbdsm-data-upload/vbdsm-hj212/vbdsm-hj212-modbus/src/main/java/cn/vbdsm/hj212/modbus/handler/TcpClientHandler.java
  8. 56 8
      VB_DSM_V2.1/vbdsm-data-upload/vbdsm-hj212/vbdsm-hj212-modbus/src/main/java/cn/vbdsm/hj212/modbus/server/TcpSocketClient.java
  9. 6 2
      VB_DSM_V2.1/vbdsm-data-upload/vbdsm-hj212/vbdsm-hj212-modbus/src/main/java/cn/vbdsm/hj212/modbus/task/UploadDataTask.java
  10. 23 0
      VB_DSM_V2.1/vbdsm-data-upload/vbdsm-hj212/vbdsm-hj212-modbus/src/main/java/cn/vbdsm/hj212/modbus/utils/AESUtil.java
  11. 49 0
      VB_DSM_V2.1/vbdsm-data-upload/vbdsm-hj212/vbdsm-hj212-modbus/src/main/java/cn/vbdsm/hj212/modbus/utils/FtpDemo.java
  12. 20 20
      VB_DSM_V2.1/vbdsm-data-upload/vbdsm-hj212/vbdsm-hj212-modbus/src/main/java/cn/vbdsm/hj212/modbus/utils/WsClientUtil.java
  13. 138 0
      VB_DSM_V2.1/vbdsm-data-upload/vbdsm-hj212/vbdsm-hj212-modbus/src/main/java/cn/vbdsm/hj212/modbus/ws/MockUploadTcpService.java
  14. 29 22
      VB_DSM_V2.1/vbdsm-data-upload/vbdsm-hj212/vbdsm-hj212-modbus/src/main/java/cn/vbdsm/hj212/modbus/ws/MockUploadWsService.java
  15. 17 0
      VB_DSM_V2.1/vbdsm-data-upload/vbdsm-hj212/vbdsm-hj212-modbus/src/main/java/cn/vbdsm/hj212/modbus/ws/data/RandomHarmonic.java
  16. 9 0
      VB_DSM_V2.1/vbdsm-data-upload/vbdsm-hj212/vbdsm-hj212-modbus/src/main/java/cn/vbdsm/hj212/modbus/ws/data/RandomPower.java
  17. 5 73
      VB_DSM_V2.1/vbdsm-data-upload/vbdsm-hj212/vbdsm-hj212-modbus/src/main/java/cn/vbdsm/hj212/modbus/ws/data/TerminalData.java
  18. 2 2
      VB_DSM_V2.1/vbdsm-data-upload/vbdsm-hj212/vbdsm-hj212-modbus/src/main/resources/application.yml
  19. 3 3
      VB_DSM_V2.1/vbdsm-data-upload/vbdsm-hj212/vbdsm-hj212-server/src/main/resources/config/application.yml

BIN
VB_DSM_V2.1/mock/mock_data.db


+ 5 - 5
VB_DSM_V2.1/vbdsm-data-upload/vbdsm-hj212/vbdsm-hj212-datacollect/src/main/resources/config/application.yml

@@ -4,8 +4,8 @@ server:
   port: 7220
 spring:
   redis:
-    host: vbdsm-redis
-    #    password: Abcd1234!.com
+    host: 192.168.0.104
+    password: Iwb-2017
     port: 6379
     database: 3
     lettuce:
@@ -32,7 +32,7 @@ sharding:
     datasource:
       names: vbdsm,vbdsm-2023,vbdsm-2024
       vbdsm:
-        url: jdbc:mysql://47.112.30.247:23306/vbdsm?useUnicode=true&characterEncoding=utf-8&zeroDateTimeBehavior=convertToNull&allowMultiQueries=true&useSSL=false
+        url: jdbc:mysql://47.112.30.247:13306/vbdsm?useUnicode=true&characterEncoding=utf-8&zeroDateTimeBehavior=convertToNull&allowMultiQueries=true&useSSL=false
         username: root
         password: 123456
         driverClassName: com.mysql.jdbc.Driver
@@ -46,7 +46,7 @@ sharding:
         testWhileIdle: true
         maxActive: 30
       vbdsm-2023:
-        url: jdbc:mysql://47.112.30.247:23306/vbdsm_2023?useUnicode=true&characterEncoding=utf-8&zeroDateTimeBehavior=convertToNull&allowMultiQueries=true&useSSL=false
+        url: jdbc:mysql://47.112.30.247:13306/vbdsm_2023?useUnicode=true&characterEncoding=utf-8&zeroDateTimeBehavior=convertToNull&allowMultiQueries=true&useSSL=false
         username: root
         password: 123456
         driverClassName: com.mysql.jdbc.Driver
@@ -60,7 +60,7 @@ sharding:
         testWhileIdle: true
         maxActive: 30
       vbdsm-2024:
-        url: jdbc:mysql://47.112.30.247:23306/vbdsm_2024?useUnicode=true&characterEncoding=utf-8&zeroDateTimeBehavior=convertToNull&allowMultiQueries=true&useSSL=false
+        url: jdbc:mysql://47.112.30.247:13306/vbdsm_2024?useUnicode=true&characterEncoding=utf-8&zeroDateTimeBehavior=convertToNull&allowMultiQueries=true&useSSL=false
         username: root
         password: 123456
         driverClassName: com.mysql.jdbc.Driver

+ 19 - 17
VB_DSM_V2.1/vbdsm-data-upload/vbdsm-hj212/vbdsm-hj212-modbus/pom.xml

@@ -47,16 +47,16 @@
             <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>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>
@@ -69,12 +69,6 @@
             <scope>compile</scope>
         </dependency>
 <!--        <dependency>-->
-<!--            <groupId>org.apache.cxf</groupId>-->
-<!--            <artifactId>cxf-rt-transports-http</artifactId>-->
-<!--            <version>2.7.1</version>-->
-<!--            <scope>compile</scope>-->
-<!--        </dependency>-->
-<!--        <dependency>-->
 <!--            <groupId>com.alibaba.csp</groupId>-->
 <!--            <artifactId>sentinel-core</artifactId>-->
 <!--            <version>1.8.6</version>-->
@@ -94,7 +88,15 @@
             <groupId>org.springframework.boot</groupId>
             <artifactId>spring-boot-starter-jdbc</artifactId>
         </dependency>
-
+        <dependency>
+            <groupId>commons-net</groupId>
+            <artifactId>commons-net</artifactId>
+            <version>3.8.0</version>
+        </dependency>
+        <dependency>
+            <groupId>io.netty</groupId>
+            <artifactId>netty-common</artifactId>
+        </dependency>
     </dependencies>
 <!--    <dependencyManagement>-->
 <!--        <dependencies>-->

+ 14 - 0
VB_DSM_V2.1/vbdsm-data-upload/vbdsm-hj212/vbdsm-hj212-modbus/src/main/java/cn/vbdsm/hj212/modbus/coder/MyEncoder.java

@@ -0,0 +1,14 @@
+package cn.vbdsm.hj212.modbus.coder;
+
+import io.netty.buffer.ByteBuf;
+import io.netty.channel.ChannelHandlerContext;
+import io.netty.handler.codec.MessageToByteEncoder;
+
+import java.nio.charset.StandardCharsets;
+
+public class MyEncoder extends MessageToByteEncoder<String> {
+    @Override
+    protected void encode(ChannelHandlerContext channelHandlerContext, String s, ByteBuf byteBuf) throws Exception {
+        byteBuf.writeBytes(s.getBytes(StandardCharsets.UTF_8));
+    }
+}

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

@@ -0,0 +1,7 @@
+package cn.vbdsm.hj212.modbus.config;
+
+import io.netty.util.AttributeKey;
+
+public class ClientAttributeKey {
+    public static final AttributeKey<String> terminalKey = AttributeKey.valueOf("terminal.id");
+}

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

@@ -1,39 +0,0 @@
-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();
-    }
-}

+ 10 - 1
VB_DSM_V2.1/vbdsm-data-upload/vbdsm-hj212/vbdsm-hj212-modbus/src/main/java/cn/vbdsm/hj212/modbus/handler/TcpClientHandler.java

@@ -1,5 +1,7 @@
 package cn.vbdsm.hj212.modbus.handler;
 
+import cn.vbdsm.hj212.modbus.config.ClientAttributeKey;
+import io.netty.buffer.ByteBuf;
 import io.netty.channel.ChannelDuplexHandler;
 import io.netty.channel.ChannelHandler;
 import io.netty.channel.ChannelHandlerAdapter;
@@ -29,7 +31,14 @@ public class TcpClientHandler extends ChannelDuplexHandler {
     }
     @Override
     public void channelRead(ChannelHandlerContext ctx, Object msg) throws Exception {
-        log.info("接收数据包:{}", msg);
+        String tid = ctx.channel().attr(ClientAttributeKey.terminalKey).get();
+        //log.info("接收数据包:{}", msg);
+        ByteBuf buf = (ByteBuf)msg;
+        int max = buf.readableBytes();
+        byte[] bytes = new byte[max];
+        buf.readBytes(bytes);
+        String str = new String(bytes);
+        log.info("设备id:{},接收数据包:{}", tid,str);
     }
 
     public void channelReadComplete(ChannelHandlerContext ctx) throws Exception {

+ 56 - 8
VB_DSM_V2.1/vbdsm-data-upload/vbdsm-hj212/vbdsm-hj212-modbus/src/main/java/cn/vbdsm/hj212/modbus/server/TcpSocketClient.java

@@ -1,11 +1,15 @@
 package cn.vbdsm.hj212.modbus.server;
 
+import cn.vbdsm.hj212.modbus.coder.MyEncoder;
+import cn.vbdsm.hj212.modbus.config.ClientAttributeKey;
 import cn.vbdsm.hj212.modbus.handler.TcpClientHandler;
+import cn.vbdsm.hj212.modbus.ws.data.TerminalData;
 import io.netty.bootstrap.Bootstrap;
 import io.netty.channel.*;
 import io.netty.channel.nio.NioEventLoopGroup;
 import io.netty.channel.socket.SocketChannel;
 import io.netty.channel.socket.nio.NioSocketChannel;
+
 import lombok.Getter;
 import lombok.extern.slf4j.Slf4j;
 import org.springframework.beans.factory.annotation.Value;
@@ -13,22 +17,37 @@ import org.springframework.stereotype.Component;
 
 import java.net.InetSocketAddress;
 import java.util.Scanner;
+import java.util.concurrent.TimeUnit;
+
 
-@Component
 @Slf4j
 public class TcpSocketClient {
 
+
+
     @Getter
     private Bootstrap bootstrap;
     @Getter
     private Channel channel;
 
-    @Value("${vbdsm.socket.client.port}")
+
     private int port;
-    @Value("${vbdsm.socket.client.bindIp}")
+
     private String host;
 
-    public void connect(){
+    @Getter
+    private TerminalData terminalData;
+    @Getter
+    private boolean isConnect = false;
+
+    public TcpSocketClient(String host, int port, TerminalData terminalData){
+        this.host = host;
+        this.port = port;
+        this.terminalData = terminalData;
+        init();
+    }
+
+    public void init(){
         EventLoopGroup group = new NioEventLoopGroup();
         this.bootstrap = new Bootstrap();
         bootstrap.group(group).channel(NioSocketChannel.class)
@@ -36,16 +55,45 @@ public class TcpSocketClient {
                 .handler(new ChannelInitializer<SocketChannel>() {
                     @Override
                     protected void initChannel(SocketChannel ch) throws Exception {
-//                        ch.pipeline().addLast("decoder",new DealMsg()); //设置自定义解码器
-//                        ch.pipeline().addLast("encoder",new MsgEncode()); //设置自定义编码器
-                        ch.pipeline().addLast(new TcpClientHandler());//设置客户端网络IO处理器
+                        ChannelPipeline pipeline = ch.pipeline();
+                        pipeline.addLast("encoder",new MyEncoder());
+                        pipeline.addLast("handler",new TcpClientHandler());
                     }
                 });
+
+    }
+
+
+    public void Connect(){
         //连接服务器 同步等待成功
         ChannelFuture f = bootstrap.connect(new InetSocketAddress(host, port));
         //同步等待客户端通道关闭
         try {
+            log.info("->服务端连接成功...");
             this.channel = f.sync().channel();
+            this.channel.attr(ClientAttributeKey.terminalKey).set(terminalData.getTerminalId());
+            isConnect = true;
+            //断线重连
+            f.addListener(new ChannelFutureListener() {
+                @Override
+                public void operationComplete(ChannelFuture channelFuture) throws Exception {
+                    if (!channelFuture.isSuccess()) {
+                        isConnect = false;
+                        final EventLoop loop = channelFuture.channel().eventLoop();
+                        loop.schedule(new Runnable() {
+                            @Override
+                            public void run() {
+                                log.info("设备号:"+terminalData.getTerminalId()+"  not connect service");
+                                Connect();
+                            }
+                        }, 15, TimeUnit.SECONDS);
+                    } else {
+                        isConnect = true;
+                        channel = channelFuture.channel();
+                        System.out.println("设备号:"+terminalData.getTerminalId()+" connected!");
+                    }
+                }
+            });
         } catch (InterruptedException e) {
             throw new RuntimeException(e);
         }
@@ -53,7 +101,7 @@ public class TcpSocketClient {
         //group.shutdownGracefully();
     }
 
-    public void sendMsg(String msg){
+    public void sendData(String msg){
         try {
             this.channel.writeAndFlush(msg);
         } catch (Exception e) {

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

@@ -20,8 +20,10 @@ import java.util.concurrent.ScheduledFuture;
 public class UploadDataTask {
 //    @Autowired
 //    private  UploadDataService uploadDataService;
+//    @Autowired
+//    private MockUploadWsService uploadWsService;
     @Autowired
-    private MockUploadWsService uploadWsService;
+    private MockUploadTcpService uploadTcpService;
 
 
 
@@ -49,9 +51,11 @@ public class UploadDataTask {
     public void startUpload(){
         //每次调用前,可执行一次关闭之前的
         stopUpload();
+        uploadTcpService.connect();//启动定时任务前,有线尝试连接服务器!
         future = taskScheduler.schedule(()->{
             try{
-                uploadWsService.loadTerminals();
+                //uploadWsService.loadTerminals();
+                uploadTcpService.SendAllData();//定时发送数据
             }catch (Exception e){
                 log.error("uploadData error:" + e.getMessage());
             }

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

@@ -49,4 +49,27 @@ public class AESUtil {
         }
         return hs;
     }
+    public static String getHj212CRC16(byte[] contents)
+    {
+        int crc16 = 0xFFFF;
+        for (byte one : contents)
+        {
+            crc16 = (crc16 >> 8) ^ one;
+            for (int i = 0; i < 8; i ++)
+            {
+                int check = crc16 & 0x0001;
+                crc16 = crc16 >> 1;
+                if (check == 0x0001)
+                {
+                    crc16=crc16 ^ 0xA001;
+                }
+            }
+        }
+        StringBuilder result = new StringBuilder(Integer.toHexString(crc16).toLowerCase());
+        while (result.length() < 4)
+        {
+            result.insert(0, "0");
+        }
+        return result.toString().toUpperCase();
+    }
 }

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

@@ -0,0 +1,49 @@
+package cn.vbdsm.hj212.modbus.utils;
+
+import org.apache.commons.net.ftp.FTP;
+import org.apache.commons.net.ftp.FTPClient;
+
+import java.io.File;
+import java.io.FileInputStream;
+import java.io.FileOutputStream;
+import java.io.IOException;
+
+public class FtpDemo {
+    public static void main(String[] args) {
+        String server = "120.25.176.175";
+        int port = 21;
+        String username = "iwbnet";
+        String password = "Iwb2019";
+
+        FTPClient ftpClient = new FTPClient();
+        try {
+            // 连接到FTP服务器
+            ftpClient.connect(server, port);
+            ftpClient.login(username, password);
+
+            // 设置文件传输模式为二进制
+            ftpClient.setFileType(FTP.BINARY_FILE_TYPE);
+
+            // 上传文件到FTP服务器
+//            File fileToUpload = new File("path/to/local/file.txt");
+//            FileInputStream inputStream = new FileInputStream(fileToUpload);
+//            ftpClient.storeFile("remote/file.txt", inputStream);
+//            inputStream.close();
+
+            // 下载文件从FTP服务器
+
+            File fileToDownload = new File("./logs/111.bak");
+            FileOutputStream outputStream = new FileOutputStream(fileToDownload);
+            ftpClient.retrieveFile("ysdb/F/YangShenSysDb_V2_FULL_11132023_142359.BAK", outputStream);
+            outputStream.close();
+
+            // 断开连接
+            ftpClient.logout();
+            ftpClient.disconnect();
+
+            System.out.println("文件上传和下载成功");
+        } catch (IOException e) {
+            e.printStackTrace();
+        }
+    }
+}

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

@@ -1,10 +1,10 @@
 package cn.vbdsm.hj212.modbus.utils;
 
 import lombok.extern.slf4j.Slf4j;
-import org.apache.cxf.endpoint.Client;
-import org.apache.cxf.jaxws.endpoint.dynamic.JaxWsDynamicClientFactory;
-import org.apache.cxf.transport.http.HTTPConduit;
-import org.apache.cxf.transports.http.configuration.HTTPClientPolicy;
+//import org.apache.cxf.endpoint.Client;
+//import org.apache.cxf.jaxws.endpoint.dynamic.JaxWsDynamicClientFactory;
+//import org.apache.cxf.transport.http.HTTPConduit;
+//import org.apache.cxf.transports.http.configuration.HTTPClientPolicy;
 
 import java.util.ArrayList;
 import java.util.List;
@@ -12,22 +12,22 @@ import java.util.List;
 @Slf4j
 public class WsClientUtil {
     public static String callWebSV(String wsdUrl, String operationName, String... params){
-        JaxWsDynamicClientFactory dcf = JaxWsDynamicClientFactory.newInstance();
-        Client client = dcf.createClient(wsdUrl);
-        HTTPConduit conduit = (HTTPConduit) client.getConduit();
-        HTTPClientPolicy policy = new HTTPClientPolicy();
-        long timeout =  10 * 1000;// 10s timeout
-        policy.setConnectionTimeout(timeout);
-        policy.setReceiveTimeout(timeout);
-        conduit.setClient(policy);
-        Object[] objects;
-        try{
-            objects = client.invoke(operationName, params);
-            return objects[0].toString();
-        }catch (Exception e){
-             log.error("发送错误!请检查日志记录!{}", e.getMessage());
-        }
-        // invoke("方法名",参数1,参数2,参数3....);
+//        JaxWsDynamicClientFactory dcf = JaxWsDynamicClientFactory.newInstance();
+//        Client client = dcf.createClient(wsdUrl);
+//        HTTPConduit conduit = (HTTPConduit) client.getConduit();
+//        HTTPClientPolicy policy = new HTTPClientPolicy();
+//        long timeout =  10 * 1000;// 10s timeout
+//        policy.setConnectionTimeout(timeout);
+//        policy.setReceiveTimeout(timeout);
+//        conduit.setClient(policy);
+//        Object[] objects;
+//        try{
+//            objects = client.invoke(operationName, params);
+//            return objects[0].toString();
+//        }catch (Exception e){
+//             log.error("发送错误!请检查日志记录!{}", e.getMessage());
+//        }
+
         return "发送错误!请检查日志记录!";
     }
 

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

@@ -0,0 +1,138 @@
+package cn.vbdsm.hj212.modbus.ws;
+
+import cn.hutool.core.util.ByteUtil;
+import cn.hutool.core.util.CharsetUtil;
+import cn.hutool.core.util.StrUtil;
+import cn.vbdsm.hj212.modbus.server.TcpSocketClient;
+import cn.vbdsm.hj212.modbus.utils.AESUtil;
+import cn.vbdsm.hj212.modbus.utils.RandomHelper;
+import cn.vbdsm.hj212.modbus.ws.data.*;
+import lombok.extern.slf4j.Slf4j;
+import lombok.var;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.beans.factory.annotation.Value;
+import org.springframework.stereotype.Component;
+
+import java.math.BigDecimal;
+import java.nio.charset.StandardCharsets;
+import java.time.LocalDateTime;
+import java.time.format.DateTimeFormatter;
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.List;
+import java.util.stream.Collectors;
+
+@Slf4j
+@Component
+public class MockUploadTcpService {
+    @Autowired
+    private MockMonitor mockMonitor;
+
+    @Autowired
+    private TerminalDataDao terminalDataDao;
+
+    public List<TcpSocketClient> clients = new ArrayList<>();
+    @Value("${vbdsm.socket.client.bindIp}")
+    private String host;
+
+    @Value("${vbdsm.socket.client.port}")
+    private String port;
+
+
+    public void connect(){
+        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);
+                TcpSocketClient client = new TcpSocketClient(host,Integer.parseInt(port),td);
+                clients.add(client);
+                client.Connect();
+            }
+        }
+    }
+
+
+    public void SendAllData() {
+        //定时任务启动前,需要先将客户端全部连接成功!遍历客户端发送数据!
+        for(TcpSocketClient client : clients){
+            TerminalData td = client.getTerminalData();
+            if(td==null){
+                continue;
+            }
+            RandomPower power = new RandomPower();
+            setEngine(power,td);
+            try {
+                String nowStr = LocalDateTime.now().format(DateTimeFormatter.ofPattern("yyyyMMddHHmmss"));
+                long now = Long.parseLong(nowStr);
+                now = now - (now - (now / 10000) * 10000) % 500;
+                uploadData(client,td,power,now);
+            }catch (Exception e){
+                log.error("uploadData error:" + e.getMessage());
+            }
+        }
+
+
+    }
+
+    private TerminalData getTerminal(String companyId,String terminalId){
+        return terminalDataDao.getCurDayTerminalData(companyId,terminalId,true);
+    }
+
+    private void setEngine(RandomPower power, TerminalData td){
+        var dp = RandomHelper.getRandom(22000,3000,100);
+        var de = RandomHelper.getRandom(6600,600,100);
+        var pe = td.getDayTotal_p().equals(new BigDecimal(0))?new BigDecimal(0):td.getDayTotal_p().add(dp);
+        var qe = td.getDayTotal_e().equals(new BigDecimal(0))?new BigDecimal(0):td.getDayTotal_e().add(de);
+        var ps = td.getTotal_p().add(dp);
+        var qs = td.getTotal_e().add(de);
+        power.setEngine(pe,qe,ps,qs);
+        td.setTotal_p(ps);
+        td.setTotal_e(qs);
+        td.setDayTotal_p(pe);
+        td.setDayTotal_e(qe);
+        terminalDataDao.updateOrInsertTerminalData(td);
+    }
+
+    private void uploadData(TcpSocketClient client,TerminalData td,RandomPower power,long date){
+        String str = StrUtil.format("st=01;cn={};datatime={};cphh=&&",
+                td.getCompanyId(),String.valueOf(date));
+        str += genStr(td,power);
+        String result = "##"+StrUtil.padPre(String.valueOf(str.length()), 6, '0');
+        result += str;
+        result += AESUtil.getHj212CRC16(str.getBytes(StandardCharsets.UTF_8));
+        result += "\r\n";
+        log.info("终端:{},send data:{}" ,td.getTerminalId(), result);
+        //当前客户端如果没有保持在线状态,不发送
+        if(client.isConnect()){
+            client.sendData(result);
+        }
+    }
+
+    private String genStr(TerminalData td,RandomPower power){
+        String str = StrUtil.format("tid={}",td.getTerminalId());
+        str += "&"+ power.getStr();
+        RandomHarmonic hia = new RandomHarmonic("a");
+        hia.setBaseI(power.getIa());
+        str += "&" + hia.getStr_I();
+        RandomHarmonic hib = new RandomHarmonic("b");
+        hib.setBaseI(power.getIb());
+        str += "&" + hib.getStr_I();
+        RandomHarmonic hic = new RandomHarmonic("c");
+        hic.setBaseI(power.getIc());
+        str += "&" + hic.getStr_I();
+        RandomHarmonic hua = new RandomHarmonic("a");
+        hua.setBaseU(power.getUa());
+        str += "&" + hua.getStr_U();
+        RandomHarmonic hub = new RandomHarmonic("b");
+        hub.setBaseU(power.getUb());
+        str += "&" + hub.getStr_U();
+        RandomHarmonic huc = new RandomHarmonic("c");
+        huc.setBaseU(power.getUc());
+        str += "&" + huc.getStr_U();
+        return str;
+    }
+
+}

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

@@ -149,33 +149,38 @@ public class MockUploadWsService {
         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);
+        switch (type) {
+            case "01":
+            case "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);
+                break;
+            case "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);
+                break;
+            case "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);
+                break;
         }
 
 
         onlineData_power.setDataList(list);
         String data = JSON.toJSONString(onlineData_power);
+
         String content = null;
         try {
             content = AESUtil.Encrypt(data, wsProperties.getKey());
@@ -187,7 +192,9 @@ public class MockUploadWsService {
             }
         } catch (Exception e) {
             log.error("数据上报异常:" + e.getMessage() + "\nKEY:" + wsProperties.getKey() + "\nCONTENT:" + content);
+            onlineData_power=null;
         }
+
     }
 
     private Map<String,String> createHi_HuMap(String type,String terminalId,String ht,Long date,RandomPower power){

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

@@ -1,6 +1,7 @@
 package cn.vbdsm.hj212.modbus.ws.data;
 
 import cn.hutool.core.util.RandomUtil;
+import cn.hutool.core.util.StrUtil;
 import cn.vbdsm.hj212.modbus.utils.RandomHelper;
 import lombok.AllArgsConstructor;
 import lombok.Data;
@@ -57,4 +58,20 @@ public class RandomHarmonic {
     }
 
 
+    private String getStr(){
+        return StrUtil.format("h3:{},h5:{},h7:{},h9:{},h11:{},h13:{},h15:{},h17:{},h19:{},h21:{}" +
+                ",h23:{},h25:{},h27:{},h29:{},h31:{},hall:{}",h3,h5,h7,h9,h11,h13,h15,h17,h19,h21,h23,h25,h27,h29,h31,hall);
+    }
+
+    public String getStr_I(){
+        return StrUtil.format("hi{}={},basei:{}",type,getStr(),baseI);
+    }
+
+    public String getStr_U(){
+        return StrUtil.format("hu{}={},baseu:{}",type,getStr(),baseU);
+    }
+
+
+
+
 }

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

@@ -2,8 +2,10 @@ package cn.vbdsm.hj212.modbus.ws.data;
 
 import cn.hutool.core.util.ArrayUtil;
 import cn.hutool.core.util.RandomUtil;
+import cn.hutool.core.util.StrUtil;
 import cn.vbdsm.hj212.modbus.utils.RandomHelper;
 import lombok.Data;
+import lombok.var;
 
 import java.math.BigDecimal;
 import java.math.RoundingMode;
@@ -225,4 +227,11 @@ public class RandomPower {
 
     }
 
+
+    public String getStr(){
+        var Str = StrUtil.format("p={}&pa={}&pb={}&pc={}&q={}&qa={}&qb={}&qc={}&pf={}&pfa={}&pfb={}&pfc={}&ia={}&ib={}&ic={}&iz={}&ua={}&ub={}&uc={}&uab={}&ubc={}&uca={}&dp={}&pv={}&uaw={}&ubw={}&ucw={}&uabw={}&ubcw={}&ucaw={}&f={}&fw={}&inbalance={}&unbalance={}&t={}&t2={}&t3={}&t4={}&t5={}&t6={}&t7={}&t8={}&tps={}&tqs={}&fps={}&fqs={}&tpe={}&tqe={}&fpe={}&fqe={}",
+                p,pa,pb,pc,q,qa,qb,qc,pf,pfa,pfb,pfc,ia,ib,ic,iz,ua,ub,uc,uab,ubc,uca,dp,pv,uaw,ubw,ucw,uabw,ubcw,ucaw,f,fw,inbalance,unbalance,t,t2,t3,t4,t5,t6,t7,t8,tps,tqs,fps,fqs,tpe,tqe,fpe,fqe);
+        return Str;
+    }
+
 }

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

@@ -31,7 +31,6 @@ public class TerminalData {
 
 
     public TerminalData(){
-       // this.key = LocalDate.now().format(DateTimeFormatter.ofPattern("yyyyMMdd"));
     }
 
     public TerminalData(String terminalId,String companyId){
@@ -45,9 +44,6 @@ public class TerminalData {
 
     private Integer uploadDate;
 
-//    private Map<String, BigDecimal> dayTotal_p = new HashMap<>();
-//
-//    private Map<String,BigDecimal> dayTotal_e = new HashMap<>();
 
     private BigDecimal total_p = new BigDecimal(0);
 
@@ -58,73 +54,9 @@ public class TerminalData {
     private BigDecimal dayTotal_e = new BigDecimal(0);
 
 
-//    @JsonIgnore
-//    private String key = LocalDate.now().format(DateTimeFormatter.ofPattern("yyyyMMdd"));
-//
-//    public BigDecimal getCurDayTotalP(){
-//        if(this.dayTotal_p.containsKey(this.key)){
-//            return this.dayTotal_p.get(this.key);
-//        }
-//        return new BigDecimal(0);
-//    }
-//    public BigDecimal getCurDayTotalE(){
-//        if(this.dayTotal_e.containsKey(this.key)){
-//            return this.dayTotal_e.get(this.key);
-//        }
-//        return new BigDecimal(0);
-//    }
-//
-//    public TerminalData SetDayTotalP(BigDecimal d){
-////        if(this.dayTotal_p.containsKey(key)){
-////            dayTotal_p.remove(key);
-////        }
-////        dayTotal_p.put(key,d);
-//        dayTotal_p.compute(key,(k,v)->d);
-//        return this;
-//    }
-//    public TerminalData SetTotalP(BigDecimal d)
-//    {
-//        total_p = d;
-//        return this;
-//    }
-//    public TerminalData SetDayTotalE(BigDecimal d){
-//        dayTotal_e.compute(key, (k,v)-> d);
-//        return this;
-//    }
-//    public TerminalData SetTotalE(BigDecimal d)
-//    {
-//        total_e = d;
-//        return this;
-//    }
-//
-//
-//    public void saveFileInfo()  {
-//        String fileName = StrUtil.format("{}@{}.json",companyId,terminalId);
-//        FileWriter fw = null;
-//        try {
-//            //String resourcePath = classPathResource.getURL().toString().substring(6);
-//            File saveDir = new File("./mock");
-//            if (!saveDir.exists()) {
-//                boolean mkdir = saveDir.mkdir();
-//            }
-//            File file = new File(saveDir.getAbsoluteFile()+ "/" + fileName);
-//            if(!file.exists()){
-//                boolean newFile = file.createNewFile();
-//            }
-//            fw = new FileWriter(file);
-//            String content = JSON.toJSONString(this);
-//            fw.write(content);
-//        } catch (IOException e) {
-//            log.error("{}@{}.json文件保存失败!",companyId,terminalId);
-//        }finally {
-//            if(fw != null){
-//                try {
-//                    fw.flush();
-//                    fw.close();
-//                } catch (IOException e) {
-//                    log.error("{}@{}.json文件保存失败!error:{}",companyId,terminalId,e.getMessage());
-//                }
-//        }
-//      }
-//    }
+
+
+
+
+
 }

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

@@ -9,8 +9,8 @@ vbdsm:
             bossThreadNum: 1 #netty boss线程数 默认为1
             workThreadNum: 4 #netty work线程数,默认为4
         client:
-            port: 19999
-            bindIp: 192.168.0.81
+            port: 7777
+            bindIp: 127.0.0.1
     ws:
         #url: http://192.168.0.104:7100/services/UploadData?wsdl;http://192.168.0.104:7100/services/UploadData?wsdl
         url: http://192.168.0.81:7101/services/UploadData?wsdl

+ 3 - 3
VB_DSM_V2.1/vbdsm-data-upload/vbdsm-hj212/vbdsm-hj212-server/src/main/resources/config/application.yml

@@ -9,9 +9,9 @@ vbdsm:
 
 spring:
   redis:
-    host: 47.112.30.247
-    #password: Iwb-2017
-    port: 4502
+    host: 192.168.0.104
+    password: Iwb-2017
+    port: 6379
     database: 3
     lettuce:
       pool: