Explorar el Código

提交测试代码

hbjzws hace 2 años
padre
commit
bfe2a5fb1e
Se han modificado 23 ficheros con 1107 adiciones y 57 borrados
  1. 27 27
      common/src/main/java/com/jpsoft/education/netty/MyClientNetty.java
  2. 98 0
      common/src/main/java/com/jpsoft/education/netty/MyClientNetty2.java
  3. 75 0
      common/src/main/java/com/jpsoft/education/netty/NettySingleClient.java
  4. 11 0
      common/src/main/java/com/jpsoft/education/netty/hander/ClientHandler.java
  5. 1 1
      common/src/main/java/com/jpsoft/education/netty/hander/MyClientHandler.java
  6. 40 2
      common/src/main/java/com/jpsoft/education/netty/hander/MyServerHandler.java
  7. 1 1
      common/src/main/java/com/jpsoft/education/netty/hander/NettyServerChannelInitializer.java
  8. 7 15
      common/src/main/java/com/jpsoft/education/netty/hander/NettyServerHandler.java
  9. 58 0
      common/src/main/java/com/jpsoft/education/netty/socket/TCPClient.java
  10. 4 1
      common/src/main/java/com/jpsoft/education/netty/util/DtuManage.java
  11. 1 1
      common/src/main/java/com/jpsoft/education/netty/util/MyDecoder.java
  12. 16 0
      common/src/main/java/com/jpsoft/education/task/ClientMessageTask.java
  13. 110 0
      common/src/main/java/com/jpsoft/education/task/HeartTask.java
  14. 99 0
      common/src/main/java/com/jpsoft/education/task/HeartTask50188.java
  15. 188 0
      common/src/main/java/com/jpsoft/education/task/HeartTaskDiagram.java
  16. 187 0
      common/src/main/java/com/jpsoft/education/task/HeartTaskDiagram2.java
  17. 17 0
      common/src/main/java/com/jpsoft/education/task/MainT.java
  18. 146 0
      common/src/main/java/com/jpsoft/education/task/MultiFutureThread.java
  19. 5 4
      common/src/main/resources/mapper/fee/FeeInfo.xml
  20. 11 1
      web/src/main/java/com/jpsoft/education/EducationServerApplication.java
  21. 1 1
      web/src/main/resources/application-dev.yml
  22. 1 1
      web/src/main/resources/application.yml
  23. 3 2
      web/src/main/resources/logback-spring.xml

+ 27 - 27
common/src/main/java/com/jpsoft/education/netty/MyClientNetty.java

@@ -12,8 +12,8 @@ import java.io.UnsupportedEncodingException;
 import java.util.concurrent.CountDownLatch;
 
 public class MyClientNetty {
-    public static CountDownLatch countDownLatch = new CountDownLatch(1);
-    public static CountDownLatch countDownLatch2 = new CountDownLatch(1);
+    //public static CountDownLatch countDownLatch = new CountDownLatch(1);
+   // public static CountDownLatch countDownLatch2 = new CountDownLatch(1);
     private String ip;
     private int port;
     private static ChannelFuture cf;
@@ -24,20 +24,21 @@ public class MyClientNetty {
         this.port = port;
     }
 
-    public String sendRecv(String msg){
+    public void sendRecv(String msg){
         try {
-            cf.channel().writeAndFlush(Unpooled.copiedBuffer(msg.getBytes()));
-            MyClientNetty.countDownLatch.await();
-            return MyClientHandler.message;
+            //cf.channel().writeAndFlush(Unpooled.copiedBuffer(hexString2Bytes(msg)));
+            cf.channel().writeAndFlush(hexString2Bytes(msg));
+            //MyClientNetty.countDownLatch.await();
+           // return MyClientHandler.message;
         } catch (Exception e) {
             e.printStackTrace();
-            return null;
+           // return null;
         }
     }
 
     public void connect() throws UnsupportedEncodingException, InterruptedException {
         this.action();
-        countDownLatch2.await();
+        //countDownLatch2.await();
     }
 
     public void close() throws InterruptedException {
@@ -54,31 +55,30 @@ public class MyClientNetty {
                 socketChannel.pipeline().addLast(new ChannelHandler[]{new MyClientHandler()});
             }
         });
+        MyClientNetty.cf = bs.connect(MyClientNetty.this.ip, MyClientNetty.this.port).sync();
+        System.out.println("1:"+MyClientNetty.cf);
 
-        (new Thread(new Runnable() {
-            public void run() {
-                try {
-                    MyClientNetty.cf = bs.connect(MyClientNetty.this.ip, MyClientNetty.this.port).sync();
-                    MyClientNetty.countDownLatch2.countDown();
-                } catch (InterruptedException e) {
-                    e.printStackTrace();
-                }
-
-            }
-        })).start();
+    }
+    public static byte[] hexString2Bytes(String src) {
+        int l = src.length() / 2;
+        byte[] ret = new byte[l];
+        for (int i = 0; i < l; i++) {
+            ret[i] = (byte) Integer.valueOf(src.substring(i * 2, i * 2 + 2), 16).byteValue();
+        }
+        return ret;
     }
     public static void main(String[] args) {
         try {
-            MyClientNetty myClientNetty = new MyClientNetty("127.0.0.1",9999);
+            MyClientNetty myClientNetty = new MyClientNetty("127.0.0.1",9610);
             myClientNetty.connect();
-            String sendStr ="01 03 01 2c 00 0a";
+            String sendStr ="C40B";
             System.out.println("客户端发送数据:"+sendStr);
-            String result = myClientNetty.sendRecv(sendStr);
-            System.out.println("客户端获取返回数据:"+result);
-            if(result.contains(" ")){
-                result=result.replace(" ","");
-                System.out.println("客户端获取返回处理:"+result);
-            }
+            myClientNetty.sendRecv(sendStr);
+           // System.out.println("客户端获取返回数据:"+result);
+//            if(result.contains(" ")){
+//                result=result.replace(" ","");
+//                System.out.println("客户端获取返回处理:"+result);
+//            }
             myClientNetty.close();
         } catch (UnsupportedEncodingException e) {
             e.printStackTrace();

+ 98 - 0
common/src/main/java/com/jpsoft/education/netty/MyClientNetty2.java

@@ -0,0 +1,98 @@
+package com.jpsoft.education.netty;
+
+import com.jpsoft.education.netty.hander.MyClientHandler;
+import io.netty.bootstrap.Bootstrap;
+import io.netty.buffer.Unpooled;
+import io.netty.channel.*;
+import io.netty.channel.nio.NioEventLoopGroup;
+import io.netty.channel.socket.SocketChannel;
+import io.netty.channel.socket.nio.NioSocketChannel;
+
+import java.io.UnsupportedEncodingException;
+import java.util.concurrent.CountDownLatch;
+
+public class MyClientNetty2 {
+    //public static CountDownLatch countDownLatch = new CountDownLatch(1);
+    public static CountDownLatch countDownLatch2 = new CountDownLatch(1);
+    private String ip;
+    private int port;
+    private static ChannelFuture cf;
+    private static EventLoopGroup bossGroup;
+
+    public MyClientNetty2(String ip, int port) {
+        this.ip = ip;
+        this.port = port;
+    }
+
+    public String sendRecv(String msg){
+        try {
+            cf.channel().writeAndFlush(Unpooled.copiedBuffer(hexString2Bytes(msg)));
+            //MyClientNetty.countDownLatch.await();
+            return MyClientHandler.message;
+        } catch (Exception e) {
+            e.printStackTrace();
+            return null;
+        }
+    }
+
+    public void connect() throws UnsupportedEncodingException, InterruptedException {
+        this.action();
+        countDownLatch2.await();
+    }
+
+    public void close() throws InterruptedException {
+        cf.channel().closeFuture().sync();
+        bossGroup.shutdownGracefully();
+    }
+
+    public void action() throws InterruptedException, UnsupportedEncodingException {
+        bossGroup = new NioEventLoopGroup();
+        final Bootstrap bs = new Bootstrap();
+
+        ((Bootstrap)((Bootstrap)((Bootstrap)((Bootstrap)bs.group(bossGroup)).channel(NioSocketChannel.class)).option(ChannelOption.SO_KEEPALIVE, true)).option(ChannelOption.RCVBUF_ALLOCATOR, new FixedRecvByteBufAllocator(65535))).handler(new ChannelInitializer<SocketChannel>() {
+            protected void initChannel(SocketChannel socketChannel) throws Exception {
+                socketChannel.pipeline().addLast(new ChannelHandler[]{new MyClientHandler()});
+            }
+        });
+
+        (new Thread(new Runnable() {
+            public void run() {
+                try {
+                    MyClientNetty2.cf = bs.connect(MyClientNetty2.this.ip, MyClientNetty2.this.port).sync();
+                    MyClientNetty2.countDownLatch2.countDown();
+                } catch (InterruptedException e) {
+                    e.printStackTrace();
+                }
+
+            }
+        })).start();
+    }
+    public static byte[] hexString2Bytes(String src) {
+        int l = src.length() / 2;
+        byte[] ret = new byte[l];
+        for (int i = 0; i < l; i++) {
+            ret[i] = (byte) Integer.valueOf(src.substring(i * 2, i * 2 + 2), 16).byteValue();
+        }
+        return ret;
+    }
+    public static void main(String[] args) {
+        try {
+            MyClientNetty2 myClientNetty = new MyClientNetty2("127.0.0.1",9610);
+            myClientNetty.connect();
+            String sendStr ="C40A";
+            System.out.println("客户端发送数据:"+sendStr);
+            String result = myClientNetty.sendRecv(sendStr);
+            System.out.println("客户端获取返回数据:"+result);
+//            if(result.contains(" ")){
+//                result=result.replace(" ","");
+//                System.out.println("客户端获取返回处理:"+result);
+//            }
+            myClientNetty.close();
+        } catch (UnsupportedEncodingException e) {
+            e.printStackTrace();
+        } catch (InterruptedException e) {
+            e.printStackTrace();
+        }
+
+    }
+}

+ 75 - 0
common/src/main/java/com/jpsoft/education/netty/NettySingleClient.java

@@ -0,0 +1,75 @@
+package com.jpsoft.education.netty;
+
+import com.jpsoft.education.netty.hander.ClientHandler;
+import io.netty.bootstrap.Bootstrap;
+import io.netty.channel.*;
+import io.netty.channel.nio.NioEventLoopGroup;
+import io.netty.channel.socket.nio.NioSocketChannel;
+import io.netty.handler.codec.string.StringDecoder;
+import io.netty.handler.codec.string.StringEncoder;
+
+import java.io.BufferedReader;
+import java.io.InputStreamReader;
+
+/**
+ * netty客户端
+ */
+public class NettySingleClient {
+
+    public static void main(String[] args) {
+        startClient();
+    }
+    public static byte[] hexString2Bytes(String src) {
+        int l = src.length() / 2;
+        byte[] ret = new byte[l];
+        for (int i = 0; i < l; i++) {
+            ret[i] = (byte) Integer.valueOf(src.substring(i * 2, i * 2 + 2), 16).byteValue();
+        }
+        return ret;
+    }
+    public static void startClient(){
+        //1.定义服务类
+        Bootstrap clientBootstap = new Bootstrap();
+
+        //2.定义执行线程组
+        EventLoopGroup worker = new NioEventLoopGroup();
+
+        //3.设置线程池
+        clientBootstap.group(worker);
+
+        //4.设置通道
+        clientBootstap.channel(NioSocketChannel.class);
+
+        //5.添加Handler
+        clientBootstap.handler(new ChannelInitializer<Channel>() {
+            @Override
+            protected void initChannel(Channel channel) throws Exception {
+                System.out.println("client channel init!");
+                ChannelPipeline pipeline = channel.pipeline();
+                pipeline.addLast("StringDecoder",new StringDecoder());
+                pipeline.addLast("StringEncoder",new StringEncoder());
+                pipeline.addLast("ClientHandler",new ClientHandler());
+            }
+        });
+
+        //6.建立连接
+        ChannelFuture channelFuture = clientBootstap.connect("0.0.0.0",9610);
+        try {
+            //7.测试输入
+           /* BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(System.in));
+            while(true){
+
+                String msg = bufferedReader.readLine();
+                channelFuture.channel().writeAndFlush(msg);
+            }*/
+            byte[] msg= hexString2Bytes("C40A");
+            //String msg = "";
+            channelFuture.channel().writeAndFlush(msg);
+        } catch (Exception e) {
+            e.printStackTrace();
+        }finally {
+            //8.关闭连接
+            worker.shutdownGracefully();
+        }
+    }
+}

+ 11 - 0
common/src/main/java/com/jpsoft/education/netty/hander/ClientHandler.java

@@ -0,0 +1,11 @@
+package com.jpsoft.education.netty.hander;
+
+import io.netty.channel.ChannelHandlerContext;
+import io.netty.channel.ChannelInboundHandlerAdapter;
+
+public class ClientHandler extends ChannelInboundHandlerAdapter {
+    @Override
+    public void channelRead(ChannelHandlerContext ctx, Object msg) throws Exception {
+        System.out.println("client receive msg:"+msg.toString());
+    }
+}

+ 1 - 1
common/src/main/java/com/jpsoft/education/netty/hander/MyClientHandler.java

@@ -21,7 +21,7 @@ public class MyClientHandler extends ChannelInboundHandlerAdapter {
             byte[] bytes = new byte[byteBuf.readableBytes()];
             byteBuf.readBytes(bytes);
             message = new String(bytes);
-            MyClientNetty.countDownLatch.countDown();
+           // MyClientNetty.countDownLatch.countDown();
         } finally {
             ReferenceCountUtil.release(msg);
         }

+ 40 - 2
common/src/main/java/com/jpsoft/education/netty/hander/MyServerHandler.java

@@ -17,11 +17,49 @@ public class MyServerHandler extends ChannelInboundHandlerAdapter {
         byteBuf.readBytes(bytes);
         String msg_str = new String(bytes,"UTF-8");
         String retStr ="";
-        if("hello world".equals(msg_str)){
+        switch(msg_str)
+        {
+            //1这条指令可以一次读取到油压、套压、回压、井口温度、载荷这些数据
+            case "01 03 01 2c 00 0a":
+                retStr ="01 03 14 3F 3C 26 E9 3F C1 00 00 00 00 1E B8 41 D7 CC CD 42 0B 00 00 C3 5F";
+                break;
+            case "0103012c000a0103012c000a":
+                retStr ="01 03 14 3F 3C 26 E9 3F C1 00 00 00 00 1E B8 41 D7 CC CD 42 0B 00 00 C3 5F";
+                break;
+                //2这条指令可以读取第6项到第17项的数据
+            case "01 03 01 5f 00 18":
+                retStr ="01 03 30 41 E9 C0 00 41 E7 00 00 3D 00 28 00 43 65 08 00 43 66 70 00 43 65 35 88 48 35 8F 85 48 EE A8 88 40 83 CD F5 41 45 00 00 00 00 85 37 3E 99 00 00 C6 3A";
+                break;
+            case "0103015f0018":
+                retStr ="01 03 30 41 E9 C0 00 41 E7 00 00 3D 00 28 00 43 65 08 00 43 66 70 00 43 65 35 88 48 35 8F 85 48 EE A8 88 40 83 CD F5 41 45 00 00 00 00 85 37 3E 99 00 00 C6 3A";
+                break;
+                //3这条指令可以读取冲次和冲程的数据
+            case "01 03 01 a4 00 04":
+                retStr ="01 03 08 40 9B 85 1F 40 3B 00 00 55 74";
+                break;
+            case "010301a40004":
+                retStr ="01 03 08 40 9B 85 1F 40 3B 00 00 55 74";
+                break;
+                //4位移数据分3次读取,01 03 03 e8 00 64
+            case "01 03 03 e8 00 64":
+                retStr ="01 03 08 40 9B 85 1F 40 3B 00 00 55 74";
+                break;
+            case "010303e80064":
+                retStr ="01 03 08 40 9B 85 1F 40 3B 00 00 55 74";
+                break;
+
+
+
+            default:
+                retStr ="01 03 FF FF FF FF FF";
+                break;
+        }
+
+          /*  if("01 03 01 2c 00 0a".equals(msg_str)||"0103012c000a0103012c000a".equals(msg_str)){
             retStr ="01 03 14 3F 3C 26 E9 3F C1 00 00 00 00 1E B8 41 D7 CC CD 42 0B 00 00 C3 5F";
         }else{
             retStr ="01 03 FF FF FF FF FF";
-        }
+        }*/
         System.out.println("===========>接收客户端消息:"+msg_str);
         System.out.println("===========>向客户端发送消息:"+msg_str);
         ctx.writeAndFlush(Unpooled.copiedBuffer(retStr.getBytes()));

+ 1 - 1
common/src/main/java/com/jpsoft/education/netty/hander/NettyServerChannelInitializer.java

@@ -27,7 +27,7 @@ public class NettyServerChannelInitializer extends ChannelInitializer<SocketChan
 
         //针对客户端,如果在1分钟时没有想服务端发送写心跳(ALL),则主动断开
         //如果是读空闲或者写空闲,不处理,这里根据自己业务考虑使用
-        //pipeline.addLast(new IdleStateHandler(600,0,0, TimeUnit.SECONDS));
+       // pipeline.addLast(new IdleStateHandler(600,0,0, TimeUnit.SECONDS));
         //自定义的空闲检测
         pipeline.addLast(new NettyServerHandler());
     }

+ 7 - 15
common/src/main/java/com/jpsoft/education/netty/hander/NettyServerHandler.java

@@ -14,16 +14,12 @@ import java.net.InetSocketAddress;
 /**
  * 功能描述: netty服务端处理类
  *
- * @Author keLe
- * @Date 2022/8/26
  */
 @Slf4j
 public class NettyServerHandler extends ChannelInboundHandlerAdapter {
 
     /**
      * 功能描述: 有客户端连接服务器会触发此函数
-     * @Author keLe
-     * @Date 2022/8/26
      * @param  ctx 通道
      * @return void
      */
@@ -47,8 +43,6 @@ public class NettyServerHandler extends ChannelInboundHandlerAdapter {
 
     /**
      * 功能描述: 有客户端终止连接服务器会触发此函数
-     * @Author keLe
-     * @Date 2022/8/26
      * @param  ctx 通道处理程序上下文
      * @return void
      */
@@ -68,8 +62,6 @@ public class NettyServerHandler extends ChannelInboundHandlerAdapter {
 
     /**
      * 功能描述: 有客户端发消息会触发此函数
-     * @Author keLe
-     * @Date 2022/8/26
      * @param  ctx 通道处理程序上下文
      * @param  msg 客户端发送的消息
      * @return void
@@ -78,10 +70,14 @@ public class NettyServerHandler extends ChannelInboundHandlerAdapter {
     public void channelRead(ChannelHandlerContext ctx, Object msg) throws Exception {
         log.info("加载客户端报文,客户端id:{},客户端消息:{}",ctx.channel().id(), msg);
         String data = String.valueOf(msg);
-        Integer water = Integer.parseInt(data.substring(6,10),16);
-        log.info("当前水位:{}cm",water);
+        if(data.contains(" ")){
+            data =data.replace(" ","");
+        }
+        log.info("寄存器地址:{}",data.substring(4,8));
+        Integer water = Integer.parseInt(data.substring(4,8),16);
+        log.info("寄存器地址:{}",water);
         //响应客户端
-        //this.channelWrite(ctx.channel().id(), msg);
+        this.channelWrite(ctx.channel().id(), msg);
     }
 
    /* @Override
@@ -92,8 +88,6 @@ public class NettyServerHandler extends ChannelInboundHandlerAdapter {
 
     /**
      * 功能描述: 服务端给客户端发送消息
-     * @Author keLe
-     * @Date 2022/8/26
      * @param  channelId 连接通道唯一id
      * @param  msg 需要发送的消息内容
      * @return void
@@ -143,8 +137,6 @@ public class NettyServerHandler extends ChannelInboundHandlerAdapter {
 
     /**
      * 功能描述: 发生异常会触发此函数
-     * @Author keLe
-     * @Date 2022/8/26
      * @param  ctx 通道处理程序上下文
      * @param  cause 异常
      * @return void

+ 58 - 0
common/src/main/java/com/jpsoft/education/netty/socket/TCPClient.java

@@ -0,0 +1,58 @@
+package com.jpsoft.education.netty.socket;
+
+import java.io.IOException;
+import java.io.OutputStream;
+import java.net.InetAddress;
+import java.net.Socket;
+
+public class TCPClient {
+    public static byte[] hexString2Bytes(String src) {
+        int l = src.length() / 2;
+        byte[] ret = new byte[l];
+        for (int i = 0; i < l; i++) {
+            ret[i] = (byte) Integer.valueOf(src.substring(i * 2, i * 2 + 2), 16).byteValue();
+        }
+        return ret;
+    }
+    public static void main(String[] args){
+        //socket对象初始化
+        Socket socket = null;
+        //输出流 os对象初始化
+        OutputStream os = null;
+        try {
+
+            //1、创建Socket对象,它的第一个参数需要的是服务端的IP,第二个参数是服务端的端口
+            InetAddress inet = InetAddress.getByName("127.0.0.1");
+           // InetAddress inet = InetAddress.getByName("42.56.120.92");
+            socket = new Socket(inet,9610);//inet是服务端ip
+
+            //2、获取一个输出流,用于写出要发送的数据
+            os = socket.getOutputStream();
+
+            //3、写出数据
+           // os.write("999888777".getBytes());
+            os.write(hexString2Bytes("C40B"));
+
+        } catch (IOException e) {
+            e.printStackTrace();
+        } finally {
+            //4、释放资源,别忘了哦!!!!
+            if(socket!=null){
+                try {
+                    socket.close();//关闭
+                } catch (IOException e) {
+                    e.printStackTrace();
+                }
+            }
+            if(os!=null){
+                try {
+                    os.close();//关闭
+                } catch (IOException e) {
+                    e.printStackTrace();
+                }
+            }
+        }
+    }
+
+
+}

+ 4 - 1
common/src/main/java/com/jpsoft/education/netty/util/DtuManage.java

@@ -25,7 +25,10 @@ import java.util.concurrent.ConcurrentHashMap;
 public class DtuManage {
 
 
-    public void sendMsg(){
+    public static void main(String[] args) {
+        sendMsg();
+    }
+    public static void sendMsg(){
         ConcurrentHashMap<ChannelId, Channel> channelMap = ChannelMap.getChannelMap();
         if(CollectionUtils.isEmpty(channelMap)){
             return;

+ 1 - 1
common/src/main/java/com/jpsoft/education/netty/util/MyDecoder.java

@@ -22,7 +22,7 @@ public class MyDecoder extends ByteToMessageDecoder {
         byteBuf.readBytes(b);
         //字节数组转字符串
         String str = new String(b);
-
+        //list.add(str);
         list.add(bytesToHexString(b));
     }
 

+ 16 - 0
common/src/main/java/com/jpsoft/education/task/ClientMessageTask.java

@@ -0,0 +1,16 @@
+package com.jpsoft.education.task;
+
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.scheduling.annotation.Scheduled;
+import org.springframework.stereotype.Component;
+//*/5 * * * * ?  每五秒一次
+//0 */5 * * * ?  每五分一次
+@Slf4j
+@Component
+public class ClientMessageTask {
+    @Scheduled(cron ="*/50 * * * * ?")
+    public void task(){
+
+        System.out.println("22222222222222--ClientMessageTask--2222222222222");
+    }
+}

+ 110 - 0
common/src/main/java/com/jpsoft/education/task/HeartTask.java

@@ -0,0 +1,110 @@
+package com.jpsoft.education.task;
+
+import cn.hutool.core.date.DateUtil;
+import cn.hutool.core.thread.ThreadUtil;
+import cn.hutool.core.util.IdUtil;
+import com.jpsoft.education.netty.MyClientNetty;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.scheduling.annotation.Async;
+import org.springframework.scheduling.annotation.Scheduled;
+import org.springframework.stereotype.Component;
+
+import java.io.IOException;
+import java.io.OutputStream;
+import java.io.UnsupportedEncodingException;
+import java.net.InetAddress;
+import java.net.Socket;
+import java.util.Locale;
+import java.util.concurrent.ExecutorService;
+
+//*/5 * * * * ?  每五秒一次
+//0 */5 * * * ?  每五分一次
+@Slf4j
+@Component
+public class HeartTask {
+    // @Scheduled(cron ="*/29 * * * * ?")
+   // @Scheduled(cron ="0 */1 * * * ?")
+    public void task(){
+
+         System.out.println("1111111111---HeartTask---111111111111");
+
+         int pos =50188;
+         ExecutorService executor = ThreadUtil.newExecutor(1000);
+         for(int i=1;i<200;i++){
+             String heartStr = Integer.toHexString(i + pos);
+             heartStr = heartStr.toUpperCase(Locale.ROOT);
+             System.out.println("i:" + i + "---" + heartStr);
+             log.info("i:" + i + "---" + "客户端发送数据:" + heartStr + "-----" + DateUtil.now());
+             String finalHeartStr = heartStr;
+             executor.execute(() -> {
+                 send(finalHeartStr);
+             });
+         }
+
+    }
+    public static byte[] hexString2Bytes(String src) {
+        int l = src.length() / 2;
+        byte[] ret = new byte[l];
+        for (int i = 0; i < l; i++) {
+            ret[i] = (byte) Integer.valueOf(src.substring(i * 2, i * 2 + 2), 16).byteValue();
+        }
+        return ret;
+    }
+    @Async
+     void send(String heartStr) {
+        System.out.println("客户端发送数据:"+ heartStr+"-----"+ DateUtil.now());
+        log.warn("客户端发送数据:"+ heartStr+"-----"+ DateUtil.now());
+        Socket socket = null;
+        OutputStream os = null;
+        try {
+            InetAddress inet = InetAddress.getByName("127.0.0.1");
+            // InetAddress inet = InetAddress.getByName("42.56.120.92");
+            socket = new Socket(inet,9610);//inet是服务端ip
+            os = socket.getOutputStream();
+            try {
+                Thread.sleep(3*1000);
+            } catch (InterruptedException e) {
+                e.printStackTrace();
+            }
+            os.write(hexString2Bytes(heartStr));
+            try {
+                Thread.sleep(8*1000);
+            } catch (InterruptedException e) {
+                e.printStackTrace();
+            }
+            os.write(hexString2Bytes( "0103143F3C26E93FC1000000001EB841D7CCCD420B0000C35F"));
+            try {
+                Thread.sleep(16*1000);
+            } catch (InterruptedException e) {
+                e.printStackTrace();
+            }
+            os.write(hexString2Bytes( "01033041E9C00041E700003D00280043650800436670004365358848358F8548EEA8884083CDF541450000000085373E990000C63A"));
+           // os.write(hexString2Bytes( "01033041E9C00041E700003D0028"));
+
+            try {
+                Thread.sleep(24*1000);
+            } catch (InterruptedException e) {
+                e.printStackTrace();
+            }
+            //os.write(hexString2Bytes( "0043650800436670004365358848358F8548EEA8884083CDF541450000000085373E990000C63A"));
+            os.write(hexString2Bytes( "010308409B851F403B00005574"));
+        } catch (IOException e) {
+            e.printStackTrace();
+        } finally {
+            if(socket!=null){
+                try {
+                    socket.close();//关闭
+                } catch (IOException e) {
+                    e.printStackTrace();
+                }
+            }
+            if(os!=null){
+                try {
+                    os.close();//关闭
+                } catch (IOException e) {
+                    e.printStackTrace();
+                }
+            }
+        }
+    }
+}

+ 99 - 0
common/src/main/java/com/jpsoft/education/task/HeartTask50188.java

@@ -0,0 +1,99 @@
+package com.jpsoft.education.task;
+
+import cn.hutool.core.date.DateUtil;
+import cn.hutool.core.thread.ThreadUtil;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.scheduling.annotation.Async;
+import org.springframework.scheduling.annotation.Scheduled;
+import org.springframework.stereotype.Component;
+
+import java.io.IOException;
+import java.io.OutputStream;
+import java.net.InetAddress;
+import java.net.Socket;
+import java.util.Locale;
+import java.util.concurrent.ExecutorService;
+
+//*/5 * * * * ?  每五秒一次
+//0 */5 * * * ?  每五分一次
+@Slf4j
+@Component
+public class HeartTask50188 {
+    // @Scheduled(cron ="*/29 * * * * ?")
+    //@Scheduled(cron ="0 */1 * * * ?")
+    public void task(){
+
+         System.out.println("1111111111---HeartTask---111111111111");
+
+         int pos =50188;
+        String heartStr = Integer.toHexString( pos);
+        heartStr = heartStr.toUpperCase(Locale.ROOT);
+        send(heartStr);
+
+    }
+    public static byte[] hexString2Bytes(String src) {
+        int l = src.length() / 2;
+        byte[] ret = new byte[l];
+        for (int i = 0; i < l; i++) {
+            ret[i] = (byte) Integer.valueOf(src.substring(i * 2, i * 2 + 2), 16).byteValue();
+        }
+        return ret;
+    }
+    @Async
+     void send(String heartStr) {
+        System.out.println("客户端发送数据:"+ heartStr+"-----"+ DateUtil.now());
+        log.warn("客户端发送数据:"+ heartStr+"-----"+ DateUtil.now());
+        Socket socket = null;
+        OutputStream os = null;
+        try {
+            InetAddress inet = InetAddress.getByName("127.0.0.1");
+            // InetAddress inet = InetAddress.getByName("42.56.120.92");
+            socket = new Socket(inet,9610);//inet是服务端ip
+            os = socket.getOutputStream();
+            try {
+                Thread.sleep(3*1000);
+            } catch (InterruptedException e) {
+                e.printStackTrace();
+            }
+            os.write(hexString2Bytes(heartStr));
+            try {
+                Thread.sleep(8*1000);
+            } catch (InterruptedException e) {
+                e.printStackTrace();
+            }
+            os.write(hexString2Bytes( "0103143F3C26E93FC1000000001EB841D7CCCD420B0000C35F"));
+            try {
+                Thread.sleep(16*1000);
+            } catch (InterruptedException e) {
+                e.printStackTrace();
+            }
+            os.write(hexString2Bytes( "01033041E9C00041E700003D00280043650800436670004365358848358F8548EEA8884083CDF541450000000085373E990000C63A"));
+           // os.write(hexString2Bytes( "01033041E9C00041E700003D0028"));
+
+            try {
+                Thread.sleep(24*1000);
+            } catch (InterruptedException e) {
+                e.printStackTrace();
+            }
+            //os.write(hexString2Bytes( "0043650800436670004365358848358F8548EEA8884083CDF541450000000085373E990000C63A"));
+            os.write(hexString2Bytes( "010308409B851F403B00005574"));
+        } catch (IOException e) {
+            e.printStackTrace();
+        } finally {
+            if(socket!=null){
+                try {
+                    socket.close();//关闭
+                } catch (IOException e) {
+                    e.printStackTrace();
+                }
+            }
+            if(os!=null){
+                try {
+                    os.close();//关闭
+                } catch (IOException e) {
+                    e.printStackTrace();
+                }
+            }
+        }
+    }
+}

+ 188 - 0
common/src/main/java/com/jpsoft/education/task/HeartTaskDiagram.java

@@ -0,0 +1,188 @@
+package com.jpsoft.education.task;
+
+import cn.hutool.core.date.DateUtil;
+import cn.hutool.core.thread.ThreadUtil;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.scheduling.annotation.Async;
+import org.springframework.scheduling.annotation.Scheduled;
+import org.springframework.stereotype.Component;
+
+import java.io.IOException;
+import java.io.OutputStream;
+import java.net.InetAddress;
+import java.net.Socket;
+import java.util.Locale;
+import java.util.concurrent.ExecutorService;
+
+//*/5 * * * * ?  每五秒一次
+//0 */5 * * * ?  每五分一次
+@Slf4j
+@Component
+public class HeartTaskDiagram {
+    // @Scheduled(cron ="*/29 * * * * ?")
+   @Scheduled(cron ="0 */10 * * * ?")
+   //@Scheduled(cron ="0 */4 * * * ?")
+    public void task(){
+
+         System.out.println("1111111111---HeartTaskDiagram---111111111111");
+
+         int pos =50188;
+         ExecutorService executor = ThreadUtil.newExecutor(1000);
+         for(int i=1;i<100;i++){
+             String heartStr = Integer.toHexString(i + pos);
+             heartStr = heartStr.toUpperCase(Locale.ROOT);
+             System.out.println("i:" + i + "---" + heartStr);
+             log.info("i:" + i + "---" + "客户端发送数据:" + heartStr + "-----" + DateUtil.now());
+             String finalHeartStr = heartStr;
+             executor.execute(() -> {
+                 send(finalHeartStr);
+             });
+         }
+
+    }
+    public static byte[] hexString2Bytes(String src) {
+        int l = src.length() / 2;
+        byte[] ret = new byte[l];
+        for (int i = 0; i < l; i++) {
+            ret[i] = (byte) Integer.valueOf(src.substring(i * 2, i * 2 + 2), 16).byteValue();
+        }
+        return ret;
+    }
+    @Async
+     void send(String heartStr) {
+        System.out.println("客户端发送数据:"+ heartStr+"-----"+ DateUtil.now());
+        log.warn("客户端发送数据:"+ heartStr+"-----"+ DateUtil.now());
+        Socket socket = null;
+        OutputStream os = null;
+        try {
+            InetAddress inet = InetAddress.getByName("127.0.0.1");
+            // InetAddress inet = InetAddress.getByName("42.56.120.92");
+            socket = new Socket(inet,9610);//inet是服务端ip
+            os = socket.getOutputStream();
+            try {
+                Thread.sleep(6*1000);
+                os.write(hexString2Bytes(heartStr));
+            } catch (InterruptedException e) {
+                e.printStackTrace();
+            }
+
+            try {
+                Thread.sleep(6*1000);
+                //位移值250点第1段数据为
+                os.write(hexString2Bytes( "0103C400000000000100030006000B00100017001F00270031003C00480054006200710080009000A100B300C600DA00EE01080118012F0146015D0176018F01A801C201DC01F70213022F024B0268028502A302C102DF02FE031D033D035C037C039C03BD03DD03FD041E043F0460048104A204C304E40505052605460567058805A805C905E90609062906490668068806A706C606E407030721073F075C0779079607B207CE07E90804081F08390853086C0885089D08B508CC08E308F9090E09230938094BF60C"));
+            } catch (InterruptedException e) {
+                e.printStackTrace();
+            }
+
+            try {
+                Thread.sleep(6*1000);
+                //位移值250点第2段数据为
+                os.write(hexString2Bytes( "0103C0095E09700982099309A309B209C109CF09DD09E909F50A010A0B0A150A1E0A270A2F0A360A3C0A420A470A4B0A4F0A520A550A560A570A580A580A580A560A550A520A500A4C0A480A440A3F0A390A330A2C0A250A1D0A150A0C0A0309FA09EF09E509D909CE09C209B509A8099A098C097E096F095F094F093F092F091D090C08F908E708D408C008AD08980883086E08580842082B081407FC07E407CB07B20799077F07640749072E071206F506D906BB069E0680066106420622060305E2F957"));
+            } catch (InterruptedException e) {
+                e.printStackTrace();
+            }
+            try {
+                Thread.sleep(6*1000);
+                //示功图-位移值250点第3段数据为
+                os.write(hexString2Bytes( "01037005C105A0057F055D053B051804F604D204AF048C04680444042003FC03D703B3038F036B03470323030002DC02BA0297027502530231021001F001D001B1019301750159013D0123010900F100DA00C400AF009B00890077006700570049003C00310027001D0015000F000900050000C46B"));
+            } catch (InterruptedException e) {
+                e.printStackTrace();
+            }
+            try {
+                Thread.sleep(6*1000);
+                //示功图-载荷值250点第1段数据为
+                os.write(hexString2Bytes( "0103BC0F510F450F5D0F600F1D0F360F5B0F7D0F910FAA0FAE0FD2102A1056108310AF10DB1100112E118011F412471276128E129F12DA13081347139113BB13E91408141F144F14721485148C148F1478145D1440141E140013E313CF13CC13AD139C1393138D139313A713BC13C513EA13FA140B142814331440144714461448144414371420141713F513D613C413AB138E13711358135013451342134713471342133E133C133C13371337133B1338133013231314130C12FF12F212EB4C25"));
+            } catch (InterruptedException e) {
+                e.printStackTrace();
+            }
+            try {
+                Thread.sleep(6*1000);
+                //示功图-载荷值250点第2段数据为
+                os.write(hexString2Bytes( "0103B812EE12DC12BA1294127512721267125912491253124F123E122211F711D411A7116A112A10FC10D610B210A91085105E103D100C0FE00FB00F780F400F0F0EDA0EA10E690E480E2C0E0F0DE80D950D4F0D1C0CFD0CB90C700C2F0C030BDE0BBF0BA60B920B710B480B320B4E0B6A0B8F0BBC0BEE0C0F0C250C320C380C380C3F0C460C450C3A0C200BFF0BDA0BA50B7F0B650B550B460B3F0B350B270B270B240B2E0B460B570B780B910B9E0BA60BA50B9F0B9B0BA60B9AFF5C"));
+            } catch (InterruptedException e) {
+                e.printStackTrace();
+            }
+            try {
+                Thread.sleep(6*1000);
+                //示功图-载荷值250点第3段数据为
+                os.write(hexString2Bytes( "0103800B8E0B820B6E0B500B360B200B0A0B030B040B080B060B070B110B1E0B270B290B330B470B650B7F0B900B990B9A0BAD0BBC0BC50BC50BCD0BD40BDD0BE90BE70BF50C090C1A0C200C2F0C380C3B0C420C680C9A0CCA0CD40CDB0CD70CCF0CCF0C220B260A450A420A870ACB0B4D0C7F0D550DDC0E2C0E6A0E0C0E1C0E8B0F3E1EBC"));
+            } catch (InterruptedException e) {
+                e.printStackTrace();
+            }
+
+
+
+
+
+
+
+
+
+
+           /* try {
+                Thread.sleep(6*1000);
+                //示功图-电流值250点第1段数据为
+                os.write(hexString2Bytes( "0103B40D9C0DA30DAA0DA40D9E0D920D870D5A0D2D0D080CE30CD40CC60CB30CA00C9A0C940C900C8D0C7A0C670C670C680C650C620C560C4B0C440C3D0C350C2E0C1B0C090BFF0BF50BEF0BE90BE40BE00BDF0BDE0BDE0BDE0BD90BD50BDF0BE90BEA0BEC0BE20BD90BDD0BE10BE60BEB0BE50BDF0BDF0BE00BE60BED0BEC0BEC0BF40BFC0BFC0BFC0BF10BE60BE10BDC0BDA0BD90BD70BD50BD80BDC0BDE0BE00C0A0C350C4C0C630C730C830C8D0C980C950C920CA48579"));
+            } catch (InterruptedException e) {
+                e.printStackTrace();
+            }
+            try {
+                Thread.sleep(6*1000);
+                //示功图-电流值250点第2段数据为
+                os.write(hexString2Bytes( "0103B00CB60CD50CF50D140D330D4C0D660D780D8B0D8B0D8B0DAF0DD40DEF0E0B0E270E430E790EAF0ED00EF20EF40EF70F220F4E0F5D0F6C0F780F840F870F8B0F6A0F490F2A0F0B0F200F350F2A0F1F0F1D0F1B0F140F0E0EEF0ED10EB60E9B0E900E860E5B0E310E140DF80DD90DBB0D7D0D400D130CE70CD20CBD0CA30C890C740C5F0C500C420C200BFE0BF60BEF0BE90BE40BE70BEA0C000C170C0A0BFD0BF00BE30BE80BEE0BE60BDF0BE00BE10BDFFB90"));
+            } catch (InterruptedException e) {
+                e.printStackTrace();
+            }
+            try {
+                Thread.sleep(6*1000);
+                //示功图-电流值250点第3段数据为
+                os.write(hexString2Bytes( "0103900BDE0BD80BD30BD30BD40BE50BF60C040C120C060BFB0BFC0BFE0C060C0E0C120C160C1B0C210C260C2C0C2A0C280C340C400C510C620C6B0C740C8D0CA70CB10CBB0CB60CB20CC20CD20CEC0D060D170D280D430D5F0D5D0D5B0D630D6B0C6A0C750C7D0C7F0C8E0CAD0CBD0CC10CD70CDA0CE70D060D390D3E0D420D490D490D520D680D7F0D7F0D990DA40DAF0DD2AD81"));
+            } catch (InterruptedException e) {
+                e.printStackTrace();
+            }
+
+
+
+
+
+            try {
+                Thread.sleep(6*1000);
+                //示功图-功率值250点第1段数据为
+                os.write(hexString2Bytes( "0103AC1B451B491B4D1B491B461B3F1B391B1F1B051AF01ADC1AD31ACB1AC01AB51AB41AB31AB11AAF1AA41A991A9A1A9C1A9A1A981A911A8B1A871A831A7F1A7B1A701A661A611A5C1A581A551A521A501A501A511A511A511A4E1A4C1A521A591A5A1A5B1A551A501A521A551A581A5C1A581A551A551A561A5A1A5E1A5D1A5D1A621A671A671A681A611A5B1A581A561A551A541A531A521A541A561A561A571A6F1A881A951AA21AAA1AB21AB8FC31"));
+            } catch (InterruptedException e) {
+                e.printStackTrace();
+            }
+            try {
+                Thread.sleep(6*1000);
+                //示功图-功率值250点第2段数据为
+                os.write(hexString2Bytes( "0103A81ABE1ABC1ABB1AC31ACB1ADD1AEF1B011B131B201B2D1B381B431B431B431B561B691B781B881B981BA81BC61BE41BF71C0A1C0B1C0D1C261C3F1C461C4D1C531C5A1C5C1C5E1C491C351C231C121C1E1C2A1C231C1D1C1C1C1B1C171C131C021BF21BE31BD41BCE1BC81BB01B981B871B771B661B551B331B111AF81ADF1AD31AC71ABB1AAF1AA31A971A8E1A861A711A5D1A591A551A541A531A541A561A631A701A691A631A5BC081"));
+            } catch (InterruptedException e) {
+                e.printStackTrace();
+            }
+            try {
+                Thread.sleep(6*1000);
+                //示功图-功率值250点第3段数据为
+                os.write(hexString2Bytes( "0103A01A541A571A5B1A581A551A561A571A561A551A511A4E1A4E1A4E1A581A621A6A1A721A6B1A651A651A661A691A6D1A6F1A711A741A781A7A1A7C1A7B1A7A1A811A881A911A9A1A9F1AA41AB21AC11AC51ACA1AC71AC51ACE1AD71AE61AF51AFD1B061B151B251B241B231B261B291A7F1A851A8A1A8B1A931AA51AAE1AB01ABC1ABE1AC51AD71AF31AF61AF91AFE1AFE1B021B0F1B1C1B1C1B301B381B3E1B52D8D9"));
+            } catch (InterruptedException e) {
+                e.printStackTrace();
+            }*/
+        } catch (IOException e) {
+            e.printStackTrace();
+        } finally {
+            if(socket!=null){
+                try {
+                    socket.close();//关闭
+                } catch (IOException e) {
+                    e.printStackTrace();
+                }
+            }
+            if(os!=null){
+                try {
+                    os.close();//关闭
+                } catch (IOException e) {
+                    e.printStackTrace();
+                }
+            }
+        }
+    }
+}

+ 187 - 0
common/src/main/java/com/jpsoft/education/task/HeartTaskDiagram2.java

@@ -0,0 +1,187 @@
+package com.jpsoft.education.task;
+
+import cn.hutool.core.date.DateUtil;
+import cn.hutool.core.thread.ThreadUtil;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.scheduling.annotation.Async;
+import org.springframework.scheduling.annotation.Scheduled;
+import org.springframework.stereotype.Component;
+
+import java.io.IOException;
+import java.io.OutputStream;
+import java.net.InetAddress;
+import java.net.Socket;
+import java.util.Locale;
+import java.util.concurrent.ExecutorService;
+
+//*/5 * * * * ?  每五秒一次
+//0 */5 * * * ?  每五分一次
+@Slf4j
+@Component
+public class HeartTaskDiagram2 {
+    // @Scheduled(cron ="*/29 * * * * ?")
+    //@Scheduled(cron ="0 */10 * * * ?")
+    public void task(){
+
+         System.out.println("1111111111---HeartTaskDiagram---111111111111");
+
+         int pos =50188;
+         ExecutorService executor = ThreadUtil.newExecutor(1000);
+         for(int i=1;i<10;i++){
+             String heartStr = Integer.toHexString(i + pos);
+             heartStr = heartStr.toUpperCase(Locale.ROOT);
+             System.out.println("i:" + i + "---" + heartStr);
+             log.info("i:" + i + "---" + "客户端发送数据:" + heartStr + "-----" + DateUtil.now());
+             String finalHeartStr = heartStr;
+             executor.execute(() -> {
+                 send(finalHeartStr);
+             });
+         }
+
+    }
+    public static byte[] hexString2Bytes(String src) {
+        int l = src.length() / 2;
+        byte[] ret = new byte[l];
+        for (int i = 0; i < l; i++) {
+            ret[i] = (byte) Integer.valueOf(src.substring(i * 2, i * 2 + 2), 16).byteValue();
+        }
+        return ret;
+    }
+    @Async
+     void send(String heartStr) {
+        System.out.println("客户端发送数据:"+ heartStr+"-----"+ DateUtil.now());
+        log.warn("客户端发送数据:"+ heartStr+"-----"+ DateUtil.now());
+        Socket socket = null;
+        OutputStream os = null;
+        try {
+            InetAddress inet = InetAddress.getByName("127.0.0.1");
+            // InetAddress inet = InetAddress.getByName("42.56.120.92");
+            socket = new Socket(inet,9610);//inet是服务端ip
+            os = socket.getOutputStream();
+            try {
+                Thread.sleep(6*1000);
+                os.write(hexString2Bytes(heartStr));
+            } catch (InterruptedException e) {
+                e.printStackTrace();
+            }
+
+            try {
+                Thread.sleep(12*1000);
+                //位移值250点第1段数据为
+                os.write(hexString2Bytes( "0103C400000000000100030006000B00100017001F00270031003C00480054006200710080009000A100B300C600DA00EE01080118012F0146015D0176018F01A801C201DC01F70213022F024B0268028502A302C102DF02FE031D033D035C037C039C03BD03DD03FD041E043F0460048104A204C304E40505052605460567058805A805C905E90609062906490668068806A706C606E407030721073F075C0779079607B207CE07E90804081F08390853086C0885089D08B508CC08E308F9090E09230938094BF60C"));
+            } catch (InterruptedException e) {
+                e.printStackTrace();
+            }
+
+            try {
+                Thread.sleep(18*1000);
+                //位移值250点第2段数据为
+                os.write(hexString2Bytes( "0103C0095E09700982099309A309B209C109CF09DD09E909F50A010A0B0A150A1E0A270A2F0A360A3C0A420A470A4B0A4F0A520A550A560A570A580A580A580A560A550A520A500A4C0A480A440A3F0A390A330A2C0A250A1D0A150A0C0A0309FA09EF09E509D909CE09C209B509A8099A098C097E096F095F094F093F092F091D090C08F908E708D408C008AD08980883086E08580842082B081407FC07E407CB07B20799077F07640749072E071206F506D906BB069E0680066106420622060305E2F957"));
+            } catch (InterruptedException e) {
+                e.printStackTrace();
+            }
+            try {
+                Thread.sleep(24*1000);
+                //示功图-位移值250点第3段数据为
+                os.write(hexString2Bytes( "01037005C105A0057F055D053B051804F604D204AF048C04680444042003FC03D703B3038F036B03470323030002DC02BA0297027502530231021001F001D001B1019301750159013D0123010900F100DA00C400AF009B00890077006700570049003C00310027001D0015000F000900050000C46B"));
+            } catch (InterruptedException e) {
+                e.printStackTrace();
+            }
+            try {
+                Thread.sleep(30*1000);
+                //示功图-载荷值250点第1段数据为
+                os.write(hexString2Bytes( "0103BC0F510F450F5D0F600F1D0F360F5B0F7D0F910FAA0FAE0FD2102A1056108310AF10DB1100112E118011F412471276128E129F12DA13081347139113BB13E91408141F144F14721485148C148F1478145D1440141E140013E313CF13CC13AD139C1393138D139313A713BC13C513EA13FA140B142814331440144714461448144414371420141713F513D613C413AB138E13711358135013451342134713471342133E133C133C13371337133B1338133013231314130C12FF12F212EB4C25"));
+            } catch (InterruptedException e) {
+                e.printStackTrace();
+            }
+            try {
+                Thread.sleep(36*1000);
+                //示功图-载荷值250点第2段数据为
+                os.write(hexString2Bytes( "0103B812EE12DC12BA1294127512721267125912491253124F123E122211F711D411A7116A112A10FC10D610B210A91085105E103D100C0FE00FB00F780F400F0F0EDA0EA10E690E480E2C0E0F0DE80D950D4F0D1C0CFD0CB90C700C2F0C030BDE0BBF0BA60B920B710B480B320B4E0B6A0B8F0BBC0BEE0C0F0C250C320C380C380C3F0C460C450C3A0C200BFF0BDA0BA50B7F0B650B550B460B3F0B350B270B270B240B2E0B460B570B780B910B9E0BA60BA50B9F0B9B0BA60B9AFF5C"));
+            } catch (InterruptedException e) {
+                e.printStackTrace();
+            }
+            try {
+                Thread.sleep(42*1000);
+                //示功图-载荷值250点第3段数据为
+                os.write(hexString2Bytes( "0103800B8E0B820B6E0B500B360B200B0A0B030B040B080B060B070B110B1E0B270B290B330B470B650B7F0B900B990B9A0BAD0BBC0BC50BC50BCD0BD40BDD0BE90BE70BF50C090C1A0C200C2F0C380C3B0C420C680C9A0CCA0CD40CDB0CD70CCF0CCF0C220B260A450A420A870ACB0B4D0C7F0D550DDC0E2C0E6A0E0C0E1C0E8B0F3E1EBC"));
+            } catch (InterruptedException e) {
+                e.printStackTrace();
+            }
+
+
+
+
+
+
+
+
+
+
+            try {
+                Thread.sleep(48*1000);
+                //示功图-电流值250点第1段数据为
+                os.write(hexString2Bytes( "0103B40D9C0DA30DAA0DA40D9E0D920D870D5A0D2D0D080CE30CD40CC60CB30CA00C9A0C940C900C8D0C7A0C670C670C680C650C620C560C4B0C440C3D0C350C2E0C1B0C090BFF0BF50BEF0BE90BE40BE00BDF0BDE0BDE0BDE0BD90BD50BDF0BE90BEA0BEC0BE20BD90BDD0BE10BE60BEB0BE50BDF0BDF0BE00BE60BED0BEC0BEC0BF40BFC0BFC0BFC0BF10BE60BE10BDC0BDA0BD90BD70BD50BD80BDC0BDE0BE00C0A0C350C4C0C630C730C830C8D0C980C950C920CA48579"));
+            } catch (InterruptedException e) {
+                e.printStackTrace();
+            }
+            try {
+                Thread.sleep(54*1000);
+                //示功图-电流值250点第2段数据为
+                os.write(hexString2Bytes( "0103B00CB60CD50CF50D140D330D4C0D660D780D8B0D8B0D8B0DAF0DD40DEF0E0B0E270E430E790EAF0ED00EF20EF40EF70F220F4E0F5D0F6C0F780F840F870F8B0F6A0F490F2A0F0B0F200F350F2A0F1F0F1D0F1B0F140F0E0EEF0ED10EB60E9B0E900E860E5B0E310E140DF80DD90DBB0D7D0D400D130CE70CD20CBD0CA30C890C740C5F0C500C420C200BFE0BF60BEF0BE90BE40BE70BEA0C000C170C0A0BFD0BF00BE30BE80BEE0BE60BDF0BE00BE10BDFFB90"));
+            } catch (InterruptedException e) {
+                e.printStackTrace();
+            }
+            try {
+                Thread.sleep(60*1000);
+                //示功图-电流值250点第3段数据为
+                os.write(hexString2Bytes( "0103900BDE0BD80BD30BD30BD40BE50BF60C040C120C060BFB0BFC0BFE0C060C0E0C120C160C1B0C210C260C2C0C2A0C280C340C400C510C620C6B0C740C8D0CA70CB10CBB0CB60CB20CC20CD20CEC0D060D170D280D430D5F0D5D0D5B0D630D6B0C6A0C750C7D0C7F0C8E0CAD0CBD0CC10CD70CDA0CE70D060D390D3E0D420D490D490D520D680D7F0D7F0D990DA40DAF0DD2AD81"));
+            } catch (InterruptedException e) {
+                e.printStackTrace();
+            }
+
+
+
+
+
+            try {
+                Thread.sleep(66*1000);
+                //示功图-功率值250点第1段数据为
+                os.write(hexString2Bytes( "0103AC1B451B491B4D1B491B461B3F1B391B1F1B051AF01ADC1AD31ACB1AC01AB51AB41AB31AB11AAF1AA41A991A9A1A9C1A9A1A981A911A8B1A871A831A7F1A7B1A701A661A611A5C1A581A551A521A501A501A511A511A511A4E1A4C1A521A591A5A1A5B1A551A501A521A551A581A5C1A581A551A551A561A5A1A5E1A5D1A5D1A621A671A671A681A611A5B1A581A561A551A541A531A521A541A561A561A571A6F1A881A951AA21AAA1AB21AB8FC31"));
+            } catch (InterruptedException e) {
+                e.printStackTrace();
+            }
+            try {
+                Thread.sleep(72*1000);
+                //示功图-功率值250点第2段数据为
+                os.write(hexString2Bytes( "0103A81ABE1ABC1ABB1AC31ACB1ADD1AEF1B011B131B201B2D1B381B431B431B431B561B691B781B881B981BA81BC61BE41BF71C0A1C0B1C0D1C261C3F1C461C4D1C531C5A1C5C1C5E1C491C351C231C121C1E1C2A1C231C1D1C1C1C1B1C171C131C021BF21BE31BD41BCE1BC81BB01B981B871B771B661B551B331B111AF81ADF1AD31AC71ABB1AAF1AA31A971A8E1A861A711A5D1A591A551A541A531A541A561A631A701A691A631A5BC081"));
+            } catch (InterruptedException e) {
+                e.printStackTrace();
+            }
+            try {
+                Thread.sleep(78*1000);
+                //示功图-功率值250点第3段数据为
+                os.write(hexString2Bytes( "0103A01A541A571A5B1A581A551A561A571A561A551A511A4E1A4E1A4E1A581A621A6A1A721A6B1A651A651A661A691A6D1A6F1A711A741A781A7A1A7C1A7B1A7A1A811A881A911A9A1A9F1AA41AB21AC11AC51ACA1AC71AC51ACE1AD71AE61AF51AFD1B061B151B251B241B231B261B291A7F1A851A8A1A8B1A931AA51AAE1AB01ABC1ABE1AC51AD71AF31AF61AF91AFE1AFE1B021B0F1B1C1B1C1B301B381B3E1B52D8D9"));
+            } catch (InterruptedException e) {
+                e.printStackTrace();
+            }
+        } catch (IOException e) {
+            e.printStackTrace();
+        } finally {
+            if(socket!=null){
+                try {
+                    socket.close();//关闭
+                } catch (IOException e) {
+                    e.printStackTrace();
+                }
+            }
+            if(os!=null){
+                try {
+                    os.close();//关闭
+                } catch (IOException e) {
+                    e.printStackTrace();
+                }
+            }
+        }
+    }
+}

+ 17 - 0
common/src/main/java/com/jpsoft/education/task/MainT.java

@@ -0,0 +1,17 @@
+package com.jpsoft.education.task;
+
+import java.util.Locale;
+
+public class MainT {
+    public static void main(String[] args) {
+        int pos =50188;
+        for(int i=1;i<1001;i++){
+
+            String r =Integer.toHexString(i+pos);
+            r =r.toUpperCase(Locale.ROOT);
+            System.out.println("i:"+i+"---"+r);
+
+        }
+
+    }
+}

+ 146 - 0
common/src/main/java/com/jpsoft/education/task/MultiFutureThread.java

@@ -0,0 +1,146 @@
+package com.jpsoft.education.task;
+
+import com.google.common.collect.Lists;
+import lombok.extern.slf4j.Slf4j;
+
+import java.util.ArrayList;
+import java.util.Iterator;
+import java.util.List;
+import java.util.Random;
+import java.util.concurrent.*;
+
+/**
+ * 多线程执行结果汇总工具
+ */
+@Slf4j
+public class MultiFutureThread<T> {
+
+    // 总线程数量
+    private int threadSize;
+    // 单次执行多少次线程
+    private int singleSize;
+
+    private List<Callable<T>> callableList = Lists.newArrayList();
+
+    /**
+     * 多线程执行结果汇总工具 构造方法
+     * @param threadSize  总线程数量
+     * @param singleSize  单次执行多少次线程
+     */
+    public MultiFutureThread(int threadSize, int singleSize) {
+        super();
+        this.threadSize = threadSize;
+        this.singleSize = singleSize < 1 ? threadSize : singleSize;
+    }
+
+    /**
+     * 设计要执行的程序段
+     *
+     * @Title: setCallable
+     * @param @param callable
+     * @param @return 参数
+     * @return MultiFutureThread<T> 返回类型
+     * @throws
+     */
+    public MultiFutureThread<T> setCallable(Callable<T> callable) {
+        if (callable != null) {
+            callableList.add(callable);
+        }
+        return this;
+    }
+
+    /**
+     * 运行线程
+     *
+     * @Title: exec
+     * @param @return 参数
+     * @return List<T> 返回类型
+     * @throws
+     */
+    public List<T> exec() {
+
+        // 如果开启的线程数量为1时,刚不开启线程
+        List<T> list = Lists.newArrayList();
+        if (singleSize <= 1) {
+            callableList.forEach(e -> {
+                try {
+                    T dataList = e.call();
+                    list.add(dataList);
+                } catch (Exception e1) {
+                }
+            });
+            return list;
+        }
+
+//        ExecutorService executor = Executors.newFixedThreadPool(singleSize);
+        ExecutorService executor = Executors.newCachedThreadPool();
+        List<Future<T>> pointTaskFutureList = new ArrayList<>(singleSize);
+        int total = threadSize; // 总计算结果
+        int done = 0; //完成任务的数量
+        try {
+            int count = (total / singleSize) + 1;
+            for(int j = 0; j < count; j++) {
+                int index = j * singleSize;
+                int endIndex = index + singleSize;
+                int runSize = callableList.size() > endIndex ? endIndex : callableList.size();
+                for (int i = index; i < runSize; i++) {
+                    // 提交任务,任务的执行由线程池去调用执行并管理。
+                    // 这里获取结果任务的Future,并放到list中,供所有任务提交完后,通过每个任务的Future判断执行状态和结果。
+                    Future<T> future = executor.submit(callableList.get(i));
+                    pointTaskFutureList.add(future);
+                }
+
+                while (!pointTaskFutureList.isEmpty()) {
+                    Iterator<Future<T>> iter = pointTaskFutureList.iterator();
+                    while (iter.hasNext()) {
+                        Future<T> next = iter.next();
+                        if (next.isDone()) {
+                            done++;
+                            T dataList = next.get();
+                            list.add(dataList);
+                            iter.remove();
+                        }
+                    }
+                    log.info("总任务量:{},已完成任务量:{}", total, done);
+                    // 停留一会,避免一直循环。
+                    Thread.sleep(10);
+                }
+            }
+            log.info("总任务量:{},完成任务量:{}", total, done);
+        } catch (InterruptedException | ExecutionException e) {
+            throw new RuntimeException(e);
+        } finally {
+            executor.shutdown();
+            try {
+                executor.awaitTermination(1, TimeUnit.MINUTES);
+            } catch (InterruptedException e) {
+                log.error("线程超时,中断异常{}", e);
+            }
+        }
+
+        return list;
+    }
+
+    /**
+     * 测试
+     * @Title: main
+     * @param @param args
+     * @param @throws Exception 参数
+     * @return void 返回类型
+     * @throws
+     */
+    public static void main(String[] args) throws Exception {
+        MultiFutureThread<Integer> thread = new MultiFutureThread<Integer>(10, 10);
+        for (int i = 0; i < 10; i++) {
+            thread.setCallable(() -> {
+                for(int j=0;j<5;j++) {
+                    System.out.println("原始数据:"+new Random().nextInt() + "----------");
+                }
+                return new Random().nextInt();
+            });
+        }
+        List<Integer> list = thread.exec();
+        System.out.println(">>>>>>>>返回数据>>>>>>>>");
+        list.forEach(System.out::println);
+    }
+}

+ 5 - 4
common/src/main/resources/mapper/fee/FeeInfo.xml

@@ -2,8 +2,8 @@
 <!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" 
 "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
 <!-- namespace必须指向DAO接口 -->
-<mapper namespace="com.jpsoft.education.fee.dao.FeeInfoDAO">
-	<resultMap id="FeeInfoMap" type="com.jpsoft.education.fee.entity.FeeInfo">
+<mapper namespace="com.jpsoft.education.modules.fee.dao.FeeInfoDAO">
+	<resultMap id="FeeInfoMap" type="com.jpsoft.education.modules.fee.entity.FeeInfo">
 		<id property="id" column="id_" />
 			<result property="feeName" column="fee_name" />
 			<result property="createTime" column="create_time" />
@@ -12,7 +12,7 @@
 			<result property="modifyBy" column="modify_by" />
 			<result property="delIf" column="del_if" />
 			</resultMap>
-	<insert id="insert" parameterType="com.jpsoft.education.fee.entity.FeeInfo">
+	<insert id="insert" parameterType="com.jpsoft.education.modules.fee.entity.FeeInfo">
 	<!--
 	<selectKey resultType="java.lang.String" order="BEFORE" keyProperty="id">
 		select sys_guid() from dual
@@ -36,7 +36,7 @@
 	<delete id="delete" parameterType="string">
 		delete from t_fee_info where id_=#{id,jdbcType=VARCHAR}
 	</delete>
-	<update id="update" parameterType="com.jpsoft.education.fee.entity.FeeInfo">
+	<update id="update" parameterType="com.jpsoft.education.modules.fee.entity.FeeInfo">
 		update t_fee_info
 		<set>
 				<if test="feeName!=null">
@@ -75,6 +75,7 @@ id_,fee_name,create_time,modify_time,create_by,modify_by,del_if		from t_fee_info
 			select * from t_fee_info
 		]]>
 		<where>
+			del_if = FALSE
 			<if test="searchParams.id != null">
 				and ID_ like #{searchParams.id}
 			</if>

+ 11 - 1
web/src/main/java/com/jpsoft/education/EducationServerApplication.java

@@ -1,13 +1,15 @@
 package com.jpsoft.education;
 
+import cn.hutool.cron.CronUtil;
 import org.mybatis.spring.annotation.MapperScan;
 import org.springframework.boot.SpringApplication;
 import org.springframework.boot.autoconfigure.SpringBootApplication;
 import org.springframework.boot.builder.SpringApplicationBuilder;
 import org.springframework.boot.web.servlet.support.SpringBootServletInitializer;
 import org.springframework.scheduling.annotation.EnableAsync;
+import org.springframework.scheduling.annotation.EnableScheduling;
 import org.springframework.transaction.annotation.EnableTransactionManagement;
-
+@EnableScheduling
 @SpringBootApplication
 @EnableTransactionManagement
 @EnableAsync
@@ -22,4 +24,12 @@ public class EducationServerApplication extends SpringBootServletInitializer {
 	protected SpringApplicationBuilder configure(SpringApplicationBuilder builder) {
 		return builder.sources(EducationServerApplication.class);
 	}
+	private  void TaskRunner() {
+		/**
+		 * 任务队列启动
+		 */
+		CronUtil.setMatchSecond(true);
+		CronUtil.start();
+	}
+
 }

+ 1 - 1
web/src/main/resources/application-dev.yml

@@ -20,7 +20,7 @@ mybatis:
     call-setters-on-nulls: true
 
 logger:
-  level: WARN
+  level: INFO
   dir: D:\Logs\education-training-server
 
 electricity:

+ 1 - 1
web/src/main/resources/application.yml

@@ -56,7 +56,7 @@ spring:
     restart:
       enabled: true
   profiles:
-    active: @active.profile@
+    active: dev
   redis:
     # Redis数据库索引(默认为0)
     database: 5

+ 3 - 2
web/src/main/resources/logback-spring.xml

@@ -30,9 +30,10 @@
     <springProfile name="dev">
         <root level="INFO">
             <appender-ref ref="STDOUT"/>
+            <appender-ref ref="FILE" />
         </root>
         <!--root的level不能用变量-->
-        <logger name="jdbc" level="WARN" additivity="false">
+       <!-- <logger name="jdbc" level="WARN" additivity="false">
             <appender-ref ref="STDOUT" />
         </logger>
         <logger name="jdbc.sqltiming" level="ON" additivity="false">
@@ -40,7 +41,7 @@
         </logger>
         <logger name="com.jpsoft" level="${loggerLevel}" additivity="false" >
             <appender-ref ref="STDOUT" />
-        </logger>
+        </logger>-->
     </springProfile>
     <springProfile name="test">
         <root level="WARN">