Browse Source

Merge branch 'demo_' of http://123.60.19.203:8088/hitch/hitch-sb into demo_

guarantee-lsq 2 years ago
parent
commit
9a7e319a8f
19 changed files with 218 additions and 103 deletions
  1. 8 0
      platform-dao/src/main/java/com/platform/dao/dto/remote/RemoteDegreeLogDTO.java
  2. 4 0
      platform-dao/src/main/java/com/platform/dao/dto/remote/RemoteMeasureDTO.java
  3. 4 1
      platform-dao/src/main/java/com/platform/dao/entity/remote/RemoteDegreeLog.java
  4. 4 0
      platform-dao/src/main/java/com/platform/dao/entity/remote/RemoteMeasure.java
  5. 8 0
      platform-dao/src/main/java/com/platform/dao/vo/query/remote/RemoteDegreeLogVO.java
  6. 33 29
      platform-dao/src/main/java/com/platform/dao/vo/query/remote/RemoteMeasureVO.java
  7. 15 2
      platform-dao/src/main/resources/mapper/remote/RemoteDegreeLogMapper.xml
  8. 2 0
      platform-dao/src/main/resources/mapper/remote/RemoteMeasureMapper.xml
  9. 2 2
      platform-iec/src/main/java/com/platform/iec/IecApplication.java
  10. 13 8
      platform-iec/src/main/java/com/platform/iec/master/MasterSysDataHandler.java
  11. 1 1
      platform-iec/src/main/java/com/ydl/iec/iec104/common/BasicInstruction104.java
  12. 31 29
      platform-iec/src/main/java/com/ydl/iec/iec104/core/Decoder104.java
  13. 35 10
      platform-iec/src/main/java/com/ydl/iec/iec104/core/ScheduledTaskPool.java
  14. 13 2
      platform-iec/src/main/java/com/ydl/iec/iec104/enums/TypeIdentifierEnum.java
  15. 0 3
      platform-iec/src/main/java/com/ydl/iec/iec104/server/handler/DataDecoder.java
  16. 2 2
      platform-iec/src/main/java/com/ydl/iec/iec104/server/handler/Unpack104Handler.java
  17. 3 1
      platform-iec/src/main/java/com/ydl/iec/iec104/server/master/handler/SysUframeClientHandler.java
  18. 12 6
      platform-iec/src/main/java/com/ydl/iec/util/Iec104Util.java
  19. 28 7
      platform-iec/src/main/java/com/ydl/iec/util/MySqlUtil.java

+ 8 - 0
platform-dao/src/main/java/com/platform/dao/dto/remote/RemoteDegreeLogDTO.java

@@ -24,6 +24,10 @@ import java.math.BigDecimal;
 @EqualsAndHashCode(callSuper = true)
 public class RemoteDegreeLogDTO extends BaseDTO implements Serializable {
 
+    /**
+     * json数据
+     */
+    private String info;
     /**
      * id
      */
@@ -57,6 +61,10 @@ public class RemoteDegreeLogDTO extends BaseDTO implements Serializable {
      * 时
      */
     private Integer hour;
+    /**
+     * 分
+     */
+    private Integer minute;
     /**
      * 类型
      */

+ 4 - 0
platform-dao/src/main/java/com/platform/dao/dto/remote/RemoteMeasureDTO.java

@@ -23,6 +23,10 @@ import java.math.BigDecimal;
 @EqualsAndHashCode(callSuper = true)
 public class RemoteMeasureDTO extends BaseDTO implements Serializable {
 
+    /**
+     * json数据
+     */
+    private String info;
     /**
      * id
      */

+ 4 - 1
platform-dao/src/main/java/com/platform/dao/entity/remote/RemoteDegreeLog.java

@@ -102,7 +102,10 @@ public class RemoteDegreeLog implements Serializable {
      * 更新日期
      */
     private LocalDateTime updateTime;
-
+    /**
+     * json数据
+     */
+    private String info;
     /**
      * 数据权限
      */

+ 4 - 0
platform-dao/src/main/java/com/platform/dao/entity/remote/RemoteMeasure.java

@@ -25,6 +25,10 @@ import java.math.BigDecimal;
 @Table(name = "t_remote_measure")
 public class RemoteMeasure implements Serializable {
 
+    /**
+     * json数据
+     */
+    private String info;
     /**
      * id
      */

+ 8 - 0
platform-dao/src/main/java/com/platform/dao/vo/query/remote/RemoteDegreeLogVO.java

@@ -20,6 +20,10 @@ import java.math.BigDecimal;
 @EqualsAndHashCode(callSuper = true)
 public class RemoteDegreeLogVO extends BaseVO implements Serializable {
 
+    /**
+     * json数据
+     */
+    private String info;
     /**
      * id
      */
@@ -68,6 +72,10 @@ public class RemoteDegreeLogVO extends BaseVO implements Serializable {
      * 时
      */
     private Integer hour;
+    /**
+     * 分
+     */
+    private Integer minute;
     /**
      * 系数
      */

+ 33 - 29
platform-dao/src/main/java/com/platform/dao/vo/query/remote/RemoteMeasureVO.java

@@ -6,6 +6,7 @@ import com.platform.common.bean.BaseDTO;
 import lombok.Data;
 import lombok.EqualsAndHashCode;
 import lombok.experimental.Accessors;
+
 import javax.validation.constraints.*;
 import java.io.Serializable;
 import java.time.LocalDateTime;
@@ -21,65 +22,68 @@ import java.math.BigDecimal;
 @Data
 @Accessors(chain = true)
 @EqualsAndHashCode(callSuper = true)
-public class RemoteMeasureVO extends BaseVO implements Serializable{
+public class RemoteMeasureVO extends BaseVO implements Serializable {
 
+    /**
+     * json数据
+     */
+    private String info;
     /**
      * id
      */
-        private String id;
-        /**
+    private String id;
+    /**
      * 设备id
      */
-        private String sbId;
-        /**
+    private String sbId;
+    /**
      * 设备名称
      */
-        private String sbName;
-        /**
+    private String sbName;
+    /**
      * 点位
      */
-        private Integer positionNum;
-        /**
+    private Integer positionNum;
+    /**
      * 类型
      */
-        private Integer type;
-        /**
+    private Integer type;
+    /**
      * 描述
      */
-        private String description;
-        /**
+    private String description;
+    /**
      * 实时数值
      */
-        private String result;
-        /**
+    private String result;
+    /**
      * 系数
      */
-        private BigDecimal ratio;
-        /**
+    private BigDecimal ratio;
+    /**
      * 单位
      */
-        private String unit;
-        /**
+    private String unit;
+    /**
      * 备注
      */
-        private String remark;
-        /**
+    private String remark;
+    /**
      * 创建人
      */
-        private String createdUserId;
-        /**
+    private String createdUserId;
+    /**
      * 更新人
      */
-        private String updateUserId;
-        /**
+    private String updateUserId;
+    /**
      * 创建日期
      */
-        private LocalDateTime createdTime;
-        /**
+    private LocalDateTime createdTime;
+    /**
      * 更新日期
      */
-        private LocalDateTime updateTime;
-    
+    private LocalDateTime updateTime;
 
 
 }

+ 15 - 2
platform-dao/src/main/resources/mapper/remote/RemoteDegreeLogMapper.xml

@@ -2,7 +2,10 @@
 <!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
 <mapper namespace="com.platform.dao.mapper.remote.RemoteDegreeLogMapper">
     <sql id="Base_Column_List">
-        degree_log.id,
+        degree_log
+        .
+        id
+        ,
                                      degree_log.sb_id,
                                      degree_log.sb_name,
                                      degree_log.position_num,
@@ -16,13 +19,18 @@
                                      degree_log.month,
                                      degree_log.day,
                                      degree_log.hour,
+                                     degree_log.minute,
+                                     degree_log.info,
                                      degree_log.created_user_id,
                                      degree_log.update_user_id,
                                      degree_log.created_time,
                                      degree_log.update_time
     </sql>
     <sql id="Ref_Column_List">
-        degree_log.sb_id,
+        degree_log
+        .
+        sb_id
+        ,
                                      degree_log.sb_name,
                                      degree_log.position_num,
                                      degree_log.type,
@@ -32,6 +40,8 @@
                                      degree_log.month,
                                      degree_log.day,
                                      degree_log.hour,
+                                     degree_log.minute,
+                                     degree_log.info,
                                      degree_log.ratio,
                                      degree_log.unit,
                                      degree_log.remark,
@@ -55,6 +65,9 @@
         <if test="hour != null">
             and degree_log.hour = #{hour}
         </if>
+        <if test="minute != null">
+            and degree_log.minute = #{minute}
+        </if>
         <if test="sbName != null and sbName != ''">
             and degree_log.sb_name = #{sbName}
         </if>

+ 2 - 0
platform-dao/src/main/resources/mapper/remote/RemoteMeasureMapper.xml

@@ -14,6 +14,7 @@
                                      measure.result,
                                      measure.ratio,
                                      measure.unit,
+                                     measure.info,
                                      measure.remark,
                                      measure.created_user_id,
                                      measure.update_user_id,
@@ -28,6 +29,7 @@
                                      measure.sb_name,
                                      measure.position_num,
                                      measure.type,
+                                     measure.info,
                                      measure.description,
                                      measure.result,
                                      measure.ratio,

+ 2 - 2
platform-iec/src/main/java/com/platform/iec/IecApplication.java

@@ -33,9 +33,9 @@ public class IecApplication implements CommandLineRunner {
     @Override
     public void run(String... args) throws Exception {
         log.info("启动主服务,监听iec……………………………………");
-        Iec104Config iec104Config  = new Iec104Config();
+        Iec104Config iec104Config = new Iec104Config();
         iec104Config.setFrameAmountMax((short) 1);
-        iec104Config.setTerminnalAddress((short) 1);
+        iec104Config.setTerminnalAddress((short) 2);
         Iec104MasterFactory.createTcpClientMaster(Iec104Util.host, Iec104Util.port).setDataHandler(new MasterSysDataHandler()).setConfig(iec104Config).run();
         Thread.sleep(1000000);
     }

+ 13 - 8
platform-iec/src/main/java/com/platform/iec/master/MasterSysDataHandler.java

@@ -3,6 +3,7 @@ package com.platform.iec.master;
 import com.alibaba.fastjson.JSON;
 import com.ydl.iec.iec104.common.BasicInstruction104;
 import com.ydl.iec.iec104.core.CachedThreadPool;
+import com.ydl.iec.iec104.enums.QualifiersEnum;
 import com.ydl.iec.iec104.message.MessageDetail;
 import com.ydl.iec.iec104.server.handler.ChannelHandler;
 import com.ydl.iec.iec104.server.handler.DataHandler;
@@ -34,6 +35,7 @@ public class MasterSysDataHandler implements DataHandler {
 	@Override
 	public void channelRead(ChannelHandler ctx, MessageDetail ruleDetail104) throws Exception {
 		log.info("接收数据:");
+
 		/*log.info("启动字符:" + ruleDetail104.getStart());
 		log.info("字节长度:" + ruleDetail104.getApuuLength());
 		byte[] control  = ruleDetail104.getControl();
@@ -51,18 +53,21 @@ public class MasterSysDataHandler implements DataHandler {
 		log.info("判断是否有时标:" + ruleDetail104.isTimeScaleExit());
 		log.info("判断消息是否连续:" + ruleDetail104.isContinuous());*/
 		// log.info(JSON.toJSONString(ruleDetail104));
-		if(ruleDetail104.getMeasgLength()>0){
-			MySqlUtil.dealMessage(ruleDetail104);
-		}
-		/*if(ruleDetail104.getQualifiersType() != null){
+		/*log.info("时标:" + ruleDetail104.getTimeScale());
+		log.info("限定词:" + ruleDetail104.getHexString());
+		System.out.println(ruleDetail104);
+		System.err.print("收到消息");*/
+		if(ruleDetail104.getQualifiersType() != null){
 			log.info("限定词:" + ruleDetail104.getQualifiersType().getValue());
+			if(ruleDetail104.getQualifiersType().getValue() == QualifiersEnum.generalCallGroupingQualifiersDegree.getValue()){
+				log.info(JSON.toJSONString(ruleDetail104));
+			}
 		}else{
 			log.info("限定词: 无");
 		}
-		log.info("时标:" + ruleDetail104.getTimeScale());
-		log.info("限定词:" + ruleDetail104.getHexString());
-		System.out.println(ruleDetail104);
-		System.err.print("收到消息");*/
+		if(ruleDetail104.getMeasgLength()>0){
+			MySqlUtil.dealMessage(ruleDetail104);
+		}
 	}
 
 	public static void main(String[] args) {

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

@@ -202,7 +202,7 @@ public class BasicInstruction104 {
 		boolean isTest = false;
 		boolean isPn = true;
 		// 终端地址 实际发生的时候会被替换
-		short terminalAddress = 1;
+		short terminalAddress = 2;
 		// 消息地址 总召唤地址为0
 		int messageAddress = 0;
 		QualifiersEnum qualifiers = QualifiersEnum.generalCallGroupingQualifiersDegree;

+ 31 - 29
platform-iec/src/main/java/com/ydl/iec/iec104/core/Decoder104.java

@@ -13,10 +13,10 @@ import java.util.ArrayList;
 import java.util.List;
 
 /**
- * 
+ *
 * @ClassName: Decoder104
-* @Description: 104 协议转码工具 
-* @author YDL 
+* @Description: 104 协议转码工具
+* @author YDL
 * @date 2020年5月13日
  */
 @Slf4j
@@ -28,6 +28,7 @@ public class Decoder104 {
 	 * @return
 	 */
 	public static MessageDetail encoder(byte[] bytes) {
+		log.info("解码器: " + ByteUtil.byteArrayToHexString(bytes));
 		MessageDetail ruleDetail104 = new MessageDetail();
 		int index = 0;
 		ruleDetail104.setStart(bytes[index++]);
@@ -38,14 +39,14 @@ public class Decoder104 {
 			ruleDetail104.setMessages(new ArrayList<>());
 			// 如果只有APCI 就此返回
 			return ruleDetail104;
-		} 
+		}
 		// 下面是返回ASDU的结构
 		ruleDetail104.setTypeIdentifier(TypeIdentifierEnum.getTypeIdentifierEnum(bytes[index++]));
 		// 添加可变结构限定词
 		Iec104Util.setChanged(ruleDetail104, bytes[index++]);
 		ruleDetail104.setTransferReason(ByteUtil.byteArrayToShort(ByteUtil.getByte(bytes, index, 2)));
 		index += 2;
-		// 
+		//
 		ruleDetail104.setTerminalAddress(Iec104Util.getTerminalAddressShort(ByteUtil.getByte(bytes, index, 2)));
 		index += 2;
 		Iec104Util.setMeaageAttribute(ruleDetail104);
@@ -54,13 +55,13 @@ public class Decoder104 {
 	}
 
 	/**
-	 * 
-	* @Title: setMessage  
-	* @Description: 对消息进行编码  
+	 *
+	* @Title: setMessage
+	* @Description: 对消息进行编码
 	* @param @param ruleDetail104
 	* @param @param bytes
-	* @param @param index 
-	* @return void   
+	* @param @param index
+	* @return void
 	* @throws
 	 */
 	public static void setMessage(MessageDetail ruleDetail104, byte[] bytes, int index) {
@@ -70,23 +71,23 @@ public class Decoder104 {
 		}  else {
 			setNoContinuoustMessage(ruleDetail104, bytes, mesageIndex);
 		}
-	} 
-	
-	
+	}
+
+
 	/**
-	 * 
-	* @Title: setContinuoustMessage  
-	* @Description: 设置连续地址的消息 
+	 *
+	* @Title: setContinuoustMessage
+	* @Description: 设置连续地址的消息
 	* @param ruleDetail104
 	* @param bytes
-	* @param index 
-	* @return void   
+	* @param index
+	* @return void
 	* @throws
 	 */
 	public static void setContinuoustMessage(MessageDetail ruleDetail104, byte[] bytes, int index) {
 		List<MessageInfo> messages = new ArrayList<>();
 		int mesageIndex = index;
-		// 连续的 前三个字节是地址 
+		// 连续的 前三个字节是地址
 		// 如果是地址联系的只需要设置一个初始地址就可以了
 		// TODO 此处不处理地址
 		int messageAddress = Iec104Util.messageAddressToInt(ByteUtil.getByte(bytes, mesageIndex, 3));
@@ -128,17 +129,17 @@ public class Decoder104 {
 			ruleDetail104.setTimeScale(ByteUtil.byte2Hdate(ByteUtil.getByte(bytes, mesageIndex, 7)));
 		}
 		ruleDetail104.setMessages(messages);
-	} 
-	
-	
+	}
+
+
 	/**
-	 * 
-	* @Title: setNoContinuoustMessage  
-	* @Description: 设置不连续地址的消息 
+	 *
+	* @Title: setNoContinuoustMessage
+	* @Description: 设置不连续地址的消息
 	* @param ruleDetail104
 	* @param bytes
-	* @param index 
-	* @return void   
+	* @param index
+	* @return void
 	* @throws
 	 */
 	public static void setNoContinuoustMessage(MessageDetail ruleDetail104, byte[] bytes, int index) {
@@ -152,7 +153,7 @@ public class Decoder104 {
 			// 消息地址
 			messageObj.setMessageAddress(Iec104Util.messageAddressToInt(ByteUtil.getByte(bytes, mesageIndex, 3)));
 			mesageIndex += 3;
-			
+
 			if (ruleDetail104.isMessage()) {
 				// 消息集合
 				byte[] messageInfos = ByteUtil.getByte(bytes, mesageIndex, messageLength);
@@ -220,7 +221,8 @@ public class Decoder104 {
 	 * 根据类型标识返回消息长度
 	 */
 	private static int getMessageLength(MessageDetail ruleDetail104) {
-		log.info(JSON.toJSONString(ruleDetail104));
+		//log.info("根据类型标识返回消息长度: " + JSON.toJSONString(ruleDetail104));
+		log.info("返回消息长度: " + ruleDetail104.getTypeIdentifier().getMessageLength());
 		return ruleDetail104.getTypeIdentifier().getMessageLength();
 //		int messageLength = 0;
 //		switch (ruleDetail104.getTypeIdentifier().getValue()) {

+ 35 - 10
platform-iec/src/main/java/com/ydl/iec/iec104/core/ScheduledTaskPool.java

@@ -11,6 +11,8 @@ import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 import org.springframework.scheduling.annotation.Scheduled;
 
+import java.time.LocalTime;
+
 
 /**
  *  这是一个定时任务管理池
@@ -134,7 +136,7 @@ public class ScheduledTaskPool {
 				sendTestThread = new Thread(() -> {
 					while (sendTestStatus) {
 						try {
-							// LOGGER.info("发送测试链路指令,次数:" + sendTestNum);
+							LOGGER.info("发送测试链路指令,次数:" + sendTestNum);
 							ctx.channel().writeAndFlush(BasicInstruction104.TESTFR);
 							sendTestNum++;
 							Thread.sleep(5000);
@@ -175,15 +177,22 @@ public class ScheduledTaskPool {
 				senGeneralCallStatus = true;
 				generalCallTThread = new Thread(() -> {
 					LOGGER.info("sendTestStatus: " + sendTestStatus);
+					// 每次启动发起一次总召唤,后面不发了,后面只发电度的
+					LOGGER.info("总召唤指令" );
+					if(sendTestNum == 1){// 第一次发生总召唤
+						ctx.channel().writeAndFlush(BasicInstruction104.getGeneralCallRuleDetail104());
+					}
 					while (sendTestStatus) {
 						try {
-							LOGGER.info("总召唤指令" );
-							// ctx.channel().writeAndFlush(BasicInstruction104.CALL_ALL);
-							ctx.channel().writeAndFlush(BasicInstruction104.getGeneralCallRuleDetail104());
-							Thread.sleep(1000 * 60 * 1);// 15分钟
-							LOGGER.info("电度召唤指令" );
-							ctx.channel().writeAndFlush(BasicInstruction104.getGeneralCallRuleDetail104Degree());
-							Thread.sleep(1000 * 60 * 1);// 15分钟
+							// ctx.channel().writeAndFlush(BasicInstruction104.getGeneralCallRuleDetail104());
+							Thread.sleep(1000 * 60 * 2);// 2分钟判断一次是否发送一次电度总召唤
+							// 判断是否需要发送电度
+							//if(isNeedSendDegree()){
+							if(sendTestNum > 1){
+								LOGGER.info("电度召唤指令" );
+								ctx.channel().writeAndFlush(BasicInstruction104.getGeneralCallRuleDetail104Degree());
+							}
+							//}
 						} catch (Exception e) {
 							e.printStackTrace();
 						}
@@ -194,9 +203,25 @@ public class ScheduledTaskPool {
 		}
 	}
 
+	/**
+	 * 判断是否需要发送电度召唤
+	 * 每两分钟发起一次,判断时间是否在0,3分内,在此期间内,必然发起一次
+	 * @return
+	 */
+	private static boolean isNeedSendDegree() {
+		LocalTime time = LocalTime.now();
+		int minute = time.getMinute();
+		System.out.println(minute);
+		if(minute>=0 && minute<=3){
+			return true;
+		}
+		return false;
+	}
+
 	public static void main(String[] args) {
-		MessageDetail messageDetail = BasicInstruction104.getGeneralCallRuleDetail104();
-		System.out.println(JSON.toJSONString(messageDetail).getBytes());
+		// MessageDetail messageDetail = BasicInstruction104.getGeneralCallRuleDetail104();
+		// System.out.println(JSON.toJSONString(messageDetail).getBytes());
+		System.out.println(isNeedSendDegree());
 	}
 
 	/**

+ 13 - 2
platform-iec/src/main/java/com/ydl/iec/iec104/enums/TypeIdentifierEnum.java

@@ -9,7 +9,18 @@ import lombok.Getter;
 * @date 2020年5月13日
  */
 public enum TypeIdentifierEnum {
-
+	/**
+	 * 不带时标的电能量,每个电能量占5个字节
+	 */
+	degreeNoTime(0x0f, 1),
+	/**
+	 * 带3个字节短时标的电能量,每个电能量占8个字节
+	 */
+	degreeThreeShortTime(0x10, 1),
+	/**
+	 * 带7个字节短时标的电能量,每个电能量占12个字节
+	 */
+	degreeSevenShortTime(0x25, 1),
 	/**
 	 * 单点摇信
 	 */
@@ -73,7 +84,7 @@ public enum TypeIdentifierEnum {
 	/**
 	 * 电度召唤命令
 	 */
-	generalCallDegree(0x65, 0),
+	generalCallDegree(0x65, 2),
 	/**
 	 * 时钟同步
 	 */

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

@@ -7,10 +7,7 @@ import com.ydl.iec.iec104.message.MessageDetail;
 import com.ydl.iec.util.ByteUtil;
 import io.netty.buffer.ByteBuf;
 import io.netty.channel.ChannelHandlerContext;
-import io.netty.channel.ChannelInboundHandlerAdapter;
 import io.netty.handler.codec.ByteToMessageDecoder;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
 
 import java.util.List;
 

+ 2 - 2
platform-iec/src/main/java/com/ydl/iec/iec104/server/handler/Unpack104Handler.java

@@ -29,7 +29,7 @@ public class Unpack104Handler extends ByteToMessageDecoder {
             // 读到了协议的开始标志,结束while循环  
             if (buffer.readByte() == Iec104Constant.HEAD_DATA) {
             	// 标记当前包为新包
-            	//读取包长度
+            	// 读取包长度
             	byte newDataLengthByte = buffer.readByte();
                 newDataLength = newDataLengthByte & 0xFF;
                 break;
@@ -42,7 +42,7 @@ public class Unpack104Handler extends ByteToMessageDecoder {
             return;
         }
 
-        newDataLength = newDataLength +  2;
+        newDataLength = newDataLength + 2;
         //恢复指针
         buffer.readerIndex(beginReader);
         ByteBuf data = buffer.readBytes(newDataLength);

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

@@ -8,6 +8,7 @@ import com.ydl.iec.util.ByteUtil;
 import io.netty.buffer.ByteBuf;
 import io.netty.channel.ChannelHandlerContext;
 import io.netty.channel.ChannelInboundHandlerAdapter;
+import io.netty.util.ReferenceCountUtil;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
@@ -68,8 +69,9 @@ public class SysUframeClientHandler extends ChannelInboundHandlerAdapter {
 	 */
 	private void uInstructionHandler(ChannelHandlerContext ctx, ByteBuf result, UControlEnum uControlEnum) {
 		result.readBytes(new byte[result.readableBytes()]);
+		ReferenceCountUtil.release(result);
 		if (uControlEnum == UControlEnum.TESTFR_YES) {
-			//LOGGER.info("收到测试确认指令");
+			LOGGER.info("收到测试确认指令");
 			Iec104ThreadLocal.getScheduledTaskPool().sendGeneralCall();
 			// Iec104ThreadLocal.getScheduledTaskPool().sendGeneralCallDegree();
 		} else if (uControlEnum == UControlEnum.STOPDT_YES) {

+ 12 - 6
platform-iec/src/main/java/com/ydl/iec/util/Iec104Util.java

@@ -14,10 +14,10 @@ import com.ydl.iec.iec104.enums.UControlEnum;
 public class Iec104Util {
 
 	private static int controlLength = 4;
-	// public static String host = "192.168.2.21";
-	// public static int port = 8404;
-	public static String host = "127.0.0.1";
-	public static int port = 2404;
+	public static String host = "192.168.2.21";
+	public static int port = 8404;
+	// public static String host = "127.0.0.1";
+	// public static int port = 2404;
 	/**
 	 * I 格式 低位在前
 	 * @param accept 接收序列号
@@ -168,6 +168,7 @@ public class Iec104Util {
 	
 	public static void setMeaageAttribute(MessageDetail ruleDetail104) {
 		boolean isMessage =  !(TypeIdentifierEnum.generalCall.equals(ruleDetail104.getTypeIdentifier())  //总召唤无此项
+				|| TypeIdentifierEnum.generalCallDegree.equals(ruleDetail104.getTypeIdentifier()) // 电度召唤无此项
 				|| TypeIdentifierEnum.timeSynchronization.equals(ruleDetail104.getTypeIdentifier()) // 时钟同步
 				|| TypeIdentifierEnum.resetPprocess.equals(ruleDetail104.getTypeIdentifier()) // 复位进程
 				|| TypeIdentifierEnum.initEnd.equals(ruleDetail104.getTypeIdentifier()));
@@ -177,11 +178,16 @@ public class Iec104Util {
 				|| TypeIdentifierEnum.onePointTeleindication.equals(ruleDetail104.getTypeIdentifier()) //单点摇信
 				|| TypeIdentifierEnum.twoPointTeleindication.equals(ruleDetail104.getTypeIdentifier()) // 双点摇信
 				|| TypeIdentifierEnum.onePointTelecontrol.equals(ruleDetail104.getTypeIdentifier()) // 单命令遥控
-				|| TypeIdentifierEnum.twoPointTelecontrol.equals(ruleDetail104.getTypeIdentifier())); // 双命令遥控
+				|| TypeIdentifierEnum.twoPointTelecontrol.equals(ruleDetail104.getTypeIdentifier()))// 双命令遥控
+				|| TypeIdentifierEnum.degreeNoTime.equals(ruleDetail104.getTypeIdentifier())//不带时标的电能量,每个电能量占5个字节
+				|| TypeIdentifierEnum.degreeThreeShortTime.equals(ruleDetail104.getTypeIdentifier())//电度带时标 3个字节短时标
+				|| TypeIdentifierEnum.degreeSevenShortTime.equals(ruleDetail104.getTypeIdentifier()); //电度带时标 7个字节短时标
 		ruleDetail104.setQualifiers(isQualifiers);
 		boolean isTimeScale = TypeIdentifierEnum.timeSynchronization.equals(ruleDetail104.getTypeIdentifier())  // 时钟同步
 				|| TypeIdentifierEnum.onePointTimeTeleindication.equals(ruleDetail104.getTypeIdentifier()) // 摇信带时标 单点
-				|| TypeIdentifierEnum.twoPointTimeTeleindication.equals(ruleDetail104.getTypeIdentifier()); //摇信带时标 双点
+				|| TypeIdentifierEnum.twoPointTimeTeleindication.equals(ruleDetail104.getTypeIdentifier())//摇信带时标 双点
+				|| TypeIdentifierEnum.degreeThreeShortTime.equals(ruleDetail104.getTypeIdentifier())//电度带时标 3个字节短时标
+				|| TypeIdentifierEnum.degreeSevenShortTime.equals(ruleDetail104.getTypeIdentifier()); //电度带时标 7个字节短时标
 		ruleDetail104.setTimeScaleExit(isTimeScale);
 	}
 	

+ 28 - 7
platform-iec/src/main/java/com/ydl/iec/util/MySqlUtil.java

@@ -79,25 +79,25 @@ public class MySqlUtil {
         List<MessageInfo> updateMessage = new ArrayList<>();
         for (int i = 0; i < ruleDetail104.getMeasgLength(); i++) {
             MessageInfo messageInfo = ruleDetail104.getMessages().get(i);
-
             if (messageInfo.getMessageAddress() >= remote_config_degree_min && messageInfo.getMessageAddress() <= remote_config_degree_max) {
                 log.info("电度点位:" + messageInfo.getMessageAddress());
+                log.info("电度信息:" + JSON.toJSONString(messageInfo));
                 addMessage.add(messageInfo);
             } else if (messageInfo.getMessageAddress() >= remote_config_measure_min && messageInfo.getMessageAddress() <= remote_config_measure_max) {
                 // log.info("遥测点位:" + messageInfo.getMessageAddress());
                 updateMessage.add(messageInfo);
             } else {
-               // log.info("数据点位不在采集范围内,不处理" + messageInfo.getMessageAddress());
+                // log.info("数据点位不在采集范围内,不处理" + messageInfo.getMessageAddress());
             }
         }
         // 新增电度数据
         if (!CollectionUtils.isEmpty(addMessage)) {
-            log.info("新增电度数量:" + addMessage.size());
+            // log.info("新增电度数量:" + addMessage.size());
             addBatch(addMessage, time, year, month, day, hour, minute);
         }
         // 更新遥测数据
         if (!CollectionUtils.isEmpty(updateMessage)) {
-            log.info("更新遥测数量:" + updateMessage.size());
+            // log.info("更新遥测数量:" + updateMessage.size());
             updateBatch(updateMessage, time);
         }
     }
@@ -119,7 +119,7 @@ public class MySqlUtil {
                         "', update_time='" + DateUtils.dateToString(time, DateUtils.PATTERN_YMD_HMS) +
                         "', info='" + JSON.toJSONString(messageInfo) +
                         "' where position_num = " + messageInfo.getMessageAddress();
-               // log.info("updateSql: " + updateSql);
+                // log.info("updateSql: " + updateSql);
                 stmt.addBatch(updateSql);
             }
             // 获取总条数
@@ -130,7 +130,7 @@ public class MySqlUtil {
             } else {
                 // log.info("已更新遥测:" + num.length);
             }
-           // stmt.clearBatch();
+            // stmt.clearBatch();
             stmt.close();
             closeConn();
         } catch (SQLException e1) {
@@ -189,7 +189,7 @@ public class MySqlUtil {
             } else {
                 log.info("已新增:" + num.length);
             }
-           // ps.clearBatch();
+            // ps.clearBatch();
         } catch (Exception e) {
             e.printStackTrace();
         } finally {
@@ -202,6 +202,27 @@ public class MySqlUtil {
         }
     }
 
+    public static void main(String[] args) {
+        LocalDateTime time = LocalDateTime.now();
+        int year = time.getYear();
+        int month = time.getMonthValue();
+        int day = time.getDayOfMonth();
+        int hour = time.getHour();
+        int minute = time.getMinute();
+
+        List<MessageInfo> list = new ArrayList<>();
+        MessageInfo messageInfo = new MessageInfo();
+        messageInfo.setMessageAddress(25601);
+        byte[] bytes = new byte[4];
+        bytes[0] = 0; // 0000 0111
+        bytes[1] = 104;
+        bytes[2] = 0;
+        bytes[3] = 0;
+        messageInfo.setMessageInfos(bytes);
+        list.add(messageInfo);
+        addBatch(list, time, year, month, day, hour, minute);
+    }
+
     /**
      * 查询遥测最高最低点位
      * 查询电度最高最低点位