浏览代码

ice104 module-增加
1:服务端未启动,保持一直重连
2:连接过冲中,中断,保持一直重连
3:优化单例工厂,确保每次线程启动的是同一个连接线路。否则多个线程开启的是多个连接线路,无法监控

hfxc226 2 年之前
父节点
当前提交
ed6051e841

+ 3 - 4
platform-iec/src/main/java/com/platform/iec/master/MasterSysDataHandler.java

@@ -15,7 +15,7 @@ import lombok.extern.slf4j.Slf4j;
 public class MasterSysDataHandler implements DataHandler {
 
 	@Override
-	public void handlerAdded(ChannelHandler ctx) throws Exception {
+	public void handlerAdded(ChannelHandler ctx) {
 		Runnable runnable = () -> {
 			try {
 				Thread.sleep(5000L);
@@ -54,11 +54,11 @@ public class MasterSysDataHandler implements DataHandler {
 				log.info(i + "-数据:" + ByteUtil.byteArrayToHexString(messageInfo.getMessageInfos()));
 			}
 		}
-	/*	try {
+		try {
 			log.info("是否有消息元素:" + ruleDetail104.getQualifiersType().getValue());
 		}catch (Exception e){
 			e.printStackTrace();
-		}*/
+		}
 		if(ruleDetail104.getQualifiersType() != null){
 			log.info("限定词:" + ruleDetail104.getQualifiersType().getValue());
 		}else{
@@ -66,7 +66,6 @@ public class MasterSysDataHandler implements DataHandler {
 		}
 		log.info("时标:" + ruleDetail104.getTimeScale());
 		log.info("限定词:" + ruleDetail104.getHexString());
-
 		System.out.println(ruleDetail104);
 		System.err.print("收到消息");
 	}

+ 9 - 5
platform-iec/src/main/java/com/ydl/iec/iec104/common/BasicInstruction104.java

@@ -162,11 +162,15 @@ public class BasicInstruction104 {
 		// 老板限定词
 		QualifiersEnum qualifiers = QualifiersEnum.generalCallGroupingQualifiers;
 		List<MessageInfo> messages = new ArrayList<>();
-//		MessageInfo message = new MessageInfo();
-//		message.setQualifiersType(qualifiers);
-//		message.setMessageInfos(new byte[] {});
-//
-//		messages.add(message);
+		MessageInfo message = new MessageInfo();
+		message.setMessageAddress(2);
+		message.setMessageInfos(new byte[] {0x12, 0x34});
+		messages.add(message);
+		MessageInfo message2 = new MessageInfo();
+		message.setMessageAddress(3);
+		message2.setMessageInfos(new byte[] {0x56, 0x78});
+		messages.add(message2);
+
 		MessageDetail ruleDetail104 = new MessageDetail(control, typeIdentifierEnum, isContinuous, isTest, isPN, transferReason,
 				terminalAddress, messageAddress, messages, null, qualifiers);
 		return ruleDetail104;

+ 19 - 24
platform-iec/src/main/java/com/ydl/iec/iec104/core/ScheduledTaskPool.java

@@ -62,7 +62,7 @@ public class ScheduledTaskPool {
 	* @Title: sendStatrFrame
 	* @Description: 发送启动帧
 	 */
-	public void sendStatrFrame() {
+	public void sendStartFrame() {
 		synchronized (sendStatrStatus) {
 			if (sendStatrThread != null) {
 				sendStatrStatus = true;
@@ -112,18 +112,15 @@ public class ScheduledTaskPool {
 				sendTestThread.start();
 			} else if (sendTestThread == null) {
 				sendTestStatus = true;
-				sendTestThread = new Thread(new Runnable() {
-					@Override
-					public void run() {
-						while (sendTestStatus) {
-							try {
-								LOGGER.info("发送测试链路指令");
-								ctx.channel().writeAndFlush(BasicInstruction104.TESTFR);
-								sendTestNum++;
-								Thread.sleep(5000);
-							} catch (Exception e) {
-								e.printStackTrace();
-							}
+				sendTestThread = new Thread(() -> {
+					while (sendTestStatus) {
+						try {
+							LOGGER.info("发送测试链路指令,次数:" + sendTestNum);
+							ctx.channel().writeAndFlush(BasicInstruction104.TESTFR);
+							sendTestNum++;
+							Thread.sleep(5000);
+						} catch (Exception e) {
+							e.printStackTrace();
 						}
 					}
 				});
@@ -139,6 +136,7 @@ public class ScheduledTaskPool {
 	 */
 	public void stopSendTestFrame() {
 		if (sendTestThread != null) {
+			LOGGER.info("停止发送测试帧");
 			sendTestStatus = false;
 			sendTestNum = 0;
 		}
@@ -156,17 +154,14 @@ public class ScheduledTaskPool {
 				generalCallTThread.start();
 			} else if (generalCallTThread == null) {
 				senGeneralCallStatus = true;
-				generalCallTThread = new Thread(new Runnable() {
-					@Override
-					public void run() {
-						while (sendTestStatus) {
-							try {
-								LOGGER.info("发送总召唤指令");
-								ctx.channel().writeAndFlush(BasicInstruction104.getGeneralCallRuleDetail104());
-								Thread.sleep(1000 * 60 * 3);
-							} catch (Exception e) {
-								e.printStackTrace();
-							}
+				generalCallTThread = new Thread(() -> {
+					while (sendTestStatus) {
+						try {
+							LOGGER.info("发送总召唤指令");
+							ctx.channel().writeAndFlush(BasicInstruction104.getGeneralCallRuleDetail104());
+							Thread.sleep(1000 * 60 * 3);
+						} catch (Exception e) {
+							e.printStackTrace();
 						}
 					}
 				});

+ 3 - 0
platform-iec/src/main/java/com/ydl/iec/iec104/server/Iec104MasterFactory.java

@@ -1,6 +1,7 @@
 package com.ydl.iec.iec104.server;
 
 import com.ydl.iec.iec104.server.master.Iec104TcpClientMaster;
+import lombok.extern.slf4j.Slf4j;
 
 /**
  * 主站 工厂类:确保单例模式,否则新线程启动新的
@@ -10,6 +11,7 @@ import com.ydl.iec.iec104.server.master.Iec104TcpClientMaster;
  * @author: YDL
  * @date: 2020年5月19日 上午10:22:59
  */
+@Slf4j
 public class Iec104MasterFactory {
 
     private static Iec104Master iec104Master = null;
@@ -23,6 +25,7 @@ public class Iec104MasterFactory {
      */
     public static Iec104Master createTcpClientMaster(String host, int port) {
         if(iec104Master == null){
+            log.info("0----------------------------创建Iec104TcpClientMaster--------------");
             iec104Master = new Iec104TcpClientMaster(host, port);
         }
         return iec104Master;

+ 1 - 2
platform-iec/src/main/java/com/ydl/iec/iec104/server/master/ConnectionListener.java

@@ -16,8 +16,7 @@ public class ConnectionListener implements ChannelFutureListener {
     public void operationComplete(ChannelFuture channelFuture) {
         if (!channelFuture.isSuccess()) {
             log.error("服务端链接不上,开始重连操作...");
-            final EventLoop loop = channelFuture.channel().eventLoop();
-            loop.schedule(() -> {
+           channelFuture.channel().eventLoop().schedule(() -> {
                 log.error("服务端链接不上,开始重连操作...");
                 Iec104MasterFactory.createTcpClientMaster(Iec104Util.host, Iec104Util.port).run();
             }, 5, TimeUnit.SECONDS);

+ 1 - 0
platform-iec/src/main/java/com/ydl/iec/iec104/server/master/Iec104TcpClientMaster.java

@@ -2,6 +2,7 @@ package com.ydl.iec.iec104.server.master;
 
 
 import com.ydl.iec.iec104.config.Iec104Config;
+import com.ydl.iec.iec104.core.Iec104ThreadLocal;
 import com.ydl.iec.iec104.server.Iec104Master;
 import com.ydl.iec.iec104.server.handler.DataHandler;
 import io.netty.bootstrap.Bootstrap;

+ 8 - 3
platform-iec/src/main/java/com/ydl/iec/iec104/server/master/handler/Iec104ClientHandler.java

@@ -13,10 +13,12 @@ import com.ydl.iec.util.Iec104Util;
 import io.netty.channel.ChannelHandlerContext;
 import io.netty.channel.EventLoop;
 import io.netty.channel.SimpleChannelInboundHandler;
+import lombok.extern.slf4j.Slf4j;
 
 import java.io.IOException;
 import java.util.concurrent.TimeUnit;
 
+@Slf4j
 public class Iec104ClientHandler extends SimpleChannelInboundHandler<MessageDetail> {
 
 	private DataHandler dataHandler;
@@ -30,7 +32,7 @@ public class Iec104ClientHandler extends SimpleChannelInboundHandler<MessageDeta
 	public void channelActive(ChannelHandlerContext ctx)  {
 		// 启动成功后一直发启动链路命令
 		Iec104ThreadLocal.setScheduledTaskPool(new ScheduledTaskPool(ctx));
-		Iec104ThreadLocal.getScheduledTaskPool().sendStatrFrame();
+		Iec104ThreadLocal.getScheduledTaskPool().sendStartFrame();
 		Iec104ThreadLocal.setControlPool(new ControlManageUtil(ctx).setFrameAmountMax(Iec104ThreadLocal.getIec104Conig().getFrameAmountMax()));
 		Iec104ThreadLocal.getControlPool().startSendFrameTask();
 
@@ -61,12 +63,15 @@ public class Iec104ClientHandler extends SimpleChannelInboundHandler<MessageDeta
 
 	@Override
 	public void channelInactive(ChannelHandlerContext ctx) throws Exception {
-		System.err.println("掉线了...");
+		super.channelInactive(ctx);
+		log.error("掉线了...,正在尝试重连,并停止发送测试帧");
+		// 连接失败后,停止发送测试帧
+		Iec104ThreadLocal.getScheduledTaskPool().stopSendTestFrame();
 		//使用过程中断线重连
 		final EventLoop eventLoop = ctx.channel().eventLoop();
 		eventLoop.schedule((Runnable) () -> {
 			Iec104MasterFactory.createTcpClientMaster(Iec104Util.host, Iec104Util.port).run();
 		}, 5L, TimeUnit.SECONDS);
-		super.channelInactive(ctx);
+
 	}
 }

+ 1 - 0
platform-iec/src/main/java/com/ydl/iec/iec104/server/master/handler/SysUframeClientHandler.java

@@ -33,6 +33,7 @@ public class SysUframeClientHandler extends ChannelInboundHandlerAdapter {
 		if (isSysInstruction(bytes)) {
 			UControlEnum uControlEnum = Iec104Util.getUcontrol(ByteUtil.getByte(bytes, 2, 4));
 			if (uControlEnum != null) {
+
 				uInstructionHandler(ctx, result, uControlEnum);
 				return;
 			}

+ 76 - 5
platform-iec/src/main/java/com/ydl/iec/util/MySqlUtil.java

@@ -7,11 +7,10 @@ import com.platform.common.util.IdGeneratorUtils;
 import com.platform.common.util.StringUtils;
 import lombok.extern.slf4j.Slf4j;
 
-import java.sql.Connection;
-import java.sql.DriverManager;
-import java.sql.SQLException;
-import java.sql.Statement;
+import java.sql.*;
 import java.time.LocalDateTime;
+import java.util.HashMap;
+import java.util.Map;
 
 @Slf4j
 public class MySqlUtil {
@@ -25,7 +24,12 @@ public class MySqlUtil {
     public static String mysql_password = "mysql?MYSQLmoniu123";//admindljjk
     //驱动名称
     public static String mysql_driver = "com.mysql.cj.jdbc.Driver";
-
+    // 采集数据,结构:遥测最低,遥测最高;电度最低,电度最高
+    public static String remote_config = "REMOTE_CONFIG";
+    public static int remote_config_measure_min = 11;
+    public static int remote_config_measure_max = 11;
+    public static int remote_config_degree_min = 11;
+    public static int remote_config_degree_max = 11;
     private static Connection conn = null;
 
     public static Connection getConnection() {
@@ -51,6 +55,11 @@ public class MySqlUtil {
         }
     }
 
+    /**
+     * 更新遥测数据
+     * @param positionNum
+     * @param result
+     */
     public static void updateRemoteMeasureByPositionNum(Integer positionNum, String result) {
         Statement stmt = null;
         StringBuffer updateSql = new StringBuffer("update " + "t_remote_measure" + " set " +
@@ -85,6 +94,12 @@ public class MySqlUtil {
         }
     }
 
+    /**
+     * 记录电度数据-每一条新增保存
+     * @param positionNum
+     * @param result
+     * @param time
+     */
     public static void addRemoteDegreeByPositionNum(Integer positionNum, String result, String time) {
         Statement stmt = null;
         try {
@@ -116,4 +131,60 @@ public class MySqlUtil {
         }
     }
 
+    /**
+     * 查询遥测最高最低点位
+     * 查询电度最高最低点位
+     * @param type 1 遥测
+     *             2 电度
+     */
+    public static Map<String, Integer> selectRemotePositionMap(int type) {
+        Statement stmt = null;
+        ResultSet rs = null;
+        Map<String, Integer> map= new HashMap<>();
+        if(type==1){
+            map.put("low", remote_config_measure_min);
+            map.put("max", remote_config_measure_max);
+        }else{
+            map.put("low", remote_config_degree_min);
+            map.put("max", remote_config_degree_max);
+        }
+        try {
+            StringBuffer sql = new StringBuffer("select content");
+            sql.append(" from t_sys_config where ");
+            sql.append(" code = '" + remote_config + "' ");
+            log.info("----------" + sql.toString());
+            conn = getConnection();
+            stmt = conn.createStatement();
+            rs = stmt.executeQuery(sql.toString());
+            rs.next();
+            String content = rs.getString(1);
+            if(StringUtils.isBlank(content)){
+                log.error("点位最低最高未配置,将使用默认配置,请联系管理员配置,结构:遥测最低,遥测最高;电度最低,电度最高");
+                return map;
+            }
+            String[] arr = content.split(";");
+            if(type==1){
+                map.put("min", Integer.valueOf(arr[0].split(",")[0]));
+                map.put("max", Integer.valueOf(arr[0].split(",")[1]));
+            }else{
+                map.put("min", Integer.valueOf(arr[1].split(",")[0]));
+                map.put("max", Integer.valueOf(arr[1].split(",")[1]));
+            }
+        } catch (Exception e) {
+            e.printStackTrace();
+        } finally {
+            try {
+                stmt.close();
+                rs.close();
+                closeConn();
+            } catch (Exception e1) {
+                e1.printStackTrace();
+            }
+        }
+        return map;
+    }
+
+    public static void handler(){
+
+    }
 }

+ 0 - 3
platform-iec/src/test/java/com/ydl/iec/iec104/core/Decoder104Test.java

@@ -9,9 +9,6 @@ import java.io.IOException;
 
 public class Decoder104Test {
 
-
-
-
     @Test
     public  void tetsSoe() throws IOException {
         MessageDetail messageDetail = Encoder104UtilTest.customInfo();

+ 28 - 28
platform-iec/src/test/java/com/ydl/iec/iec104/server/slave/SysDataHandler.java

@@ -18,34 +18,34 @@ public class SysDataHandler implements DataHandler {
 	@Override
 	public void channelRead(ChannelHandler ctx, MessageDetail ruleDetail104) throws Exception {
 		log.info("启动字符:" + ruleDetail104.getStart());
-//		log.info("字节长度:" + ruleDetail104.getApuuLength());
-//		log.info("控制域:" + ruleDetail104.getControl());
-//		log.info("类型标识:" + ruleDetail104.getTypeIdentifier().getValue());
-//		log.info("可变结构限定词:" + ruleDetail104.isContinuous());
-//		log.info("数据长度:" + ruleDetail104.getMeasgLength());
-//		log.info("传输原因:" + ruleDetail104.getTransferReason());
-//		log.info("终端地址:" + ruleDetail104.getTerminalAddress());
-//		log.info("消息地址:" + ruleDetail104.getMessageAddress());
-//		log.info("消息结构:" + ruleDetail104.getMessages());
-//		log.info("是否有消息元素:" + ruleDetail104.isMessage());
-//		log.info("判断是否有限定词:" + ruleDetail104.getQualifiersType());
-//		log.info("判断是否有时标:" + ruleDetail104.isTimeScaleExit());
-//		log.info("判断消息是否连续:" + ruleDetail104.isContinuous());
-//		if(ruleDetail104.getMeasgLength()>0){
-//			for (int i = 0; i<ruleDetail104.getMeasgLength();i++) {
-//				log.info(String.valueOf(ruleDetail104.getMessages().get(i)));
-//			}
-//		}
-//		try {
-//			log.info("是否有消息元素:" + ruleDetail104.getQualifiersType().getValue());
-//		}catch (Exception e){}
-//
-//		log.info("限定词:" + ruleDetail104.getQualifiersType().getValue());
-//		log.info("时标:" + ruleDetail104.getTimeScale());
-//		log.info("限定词:" + ruleDetail104.getHexString());
-//
-//		System.out.println(ruleDetail104);
-//		System.err.print("收到消息");
+		log.info("字节长度:" + ruleDetail104.getApuuLength());
+		log.info("控制域:" + ruleDetail104.getControl());
+		log.info("类型标识:" + ruleDetail104.getTypeIdentifier().getValue());
+		log.info("可变结构限定词:" + ruleDetail104.isContinuous());
+		log.info("数据长度:" + ruleDetail104.getMeasgLength());
+		log.info("传输原因:" + ruleDetail104.getTransferReason());
+		log.info("终端地址:" + ruleDetail104.getTerminalAddress());
+		log.info("消息地址:" + ruleDetail104.getMessageAddress());
+		log.info("消息结构:" + ruleDetail104.getMessages());
+		log.info("是否有消息元素:" + ruleDetail104.isMessage());
+		log.info("判断是否有限定词:" + ruleDetail104.getQualifiersType());
+		log.info("判断是否有时标:" + ruleDetail104.isTimeScaleExit());
+		log.info("判断消息是否连续:" + ruleDetail104.isContinuous());
+		if(ruleDetail104.getMeasgLength()>0){
+			for (int i = 0; i<ruleDetail104.getMeasgLength();i++) {
+				log.info(String.valueOf(ruleDetail104.getMessages().get(i)));
+			}
+		}
+		try {
+			log.info("是否有消息元素:" + ruleDetail104.getQualifiersType().getValue());
+		}catch (Exception e){}
+
+		log.info("限定词:" + ruleDetail104.getQualifiersType().getValue());
+		log.info("时标:" + ruleDetail104.getTimeScale());
+		log.info("限定词:" + ruleDetail104.getHexString());
+
+		System.out.println(ruleDetail104);
+		System.err.print("收到消息");
 	}
 
 }