Bläddra i källkod

完善遥测功能:4个字节

hfxc226 2 år sedan
förälder
incheckning
c84f20a272

+ 5 - 6
platform-iec/src/main/java/com/platform/iec/master/MasterSysDataHandler.java

@@ -8,6 +8,7 @@ import com.ydl.iec.iec104.message.MessageDetail;
 import com.ydl.iec.iec104.server.handler.ChannelHandler;
 import com.ydl.iec.iec104.server.handler.DataHandler;
 import com.ydl.iec.util.ByteUtil;
+import com.ydl.iec.util.Iec104Util;
 import com.ydl.iec.util.MySqlUtil;
 import lombok.extern.slf4j.Slf4j;
 
@@ -36,7 +37,7 @@ public class MasterSysDataHandler implements DataHandler {
 	public void channelRead(ChannelHandler ctx, MessageDetail ruleDetail104) throws Exception {
 		log.info("接收数据:");
 
-		/*log.info("启动字符:" + ruleDetail104.getStart());
+		log.info("启动字符:" + ruleDetail104.getStart());
 		log.info("字节长度:" + ruleDetail104.getApuuLength());
 		byte[] control  = ruleDetail104.getControl();
 		log.info("控制域:Accept" + Iec104Util.getAccept(control));
@@ -51,12 +52,10 @@ public class MasterSysDataHandler implements DataHandler {
 		log.info("是否有消息元素:" + ruleDetail104.isMessage());
 		log.info("判断是否有限定词:" + ruleDetail104.getQualifiersType());
 		log.info("判断是否有时标:" + ruleDetail104.isTimeScaleExit());
-		log.info("判断消息是否连续:" + ruleDetail104.isContinuous());*/
-		// log.info(JSON.toJSONString(ruleDetail104));
-		/*log.info("时标:" + ruleDetail104.getTimeScale());
+		log.info("判断消息是否连续:" + ruleDetail104.isContinuous());
+		log.info(JSON.toJSONString(ruleDetail104));
+		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()){

+ 195 - 186
platform-iec/src/main/java/com/ydl/iec/iec104/core/Decoder104.java

@@ -9,221 +9,230 @@ import com.ydl.iec.iec104.enums.TypeIdentifierEnum;
 import com.ydl.iec.util.ByteUtil;
 import lombok.extern.slf4j.Slf4j;
 
+import java.math.BigInteger;
+import java.text.DecimalFormat;
 import java.util.ArrayList;
 import java.util.List;
 
 /**
- *
-* @ClassName: Decoder104
-* @Description: 104 协议转码工具
-* @author YDL
-* @date 2020年5月13日
+ * @author YDL
+ * @ClassName: Decoder104
+ * @Description: 104 协议转码工具
+ * @date 2020年5月13日
  */
 @Slf4j
 public class Decoder104 {
 
-	/**
-	 * 将bytes 转换成指定的数据结构
-	 * @param bytes
-	 * @return
-	 */
-	public static MessageDetail encoder(byte[] bytes) {
-		log.info("解码器: " + ByteUtil.byteArrayToHexString(bytes));
-		MessageDetail ruleDetail104 = new MessageDetail();
-		int index = 0;
-		ruleDetail104.setStart(bytes[index++]);
-		ruleDetail104.setApuuLength(bytes[index++] & 0xFF);
-		ruleDetail104.setControl(ByteUtil.getByte(bytes, index, 4));
-		index += 4;
-		if (ruleDetail104.getApuuLength() <= 4) {
-			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);
-		setMessage(ruleDetail104, bytes, index);
-		return ruleDetail104;
-	}
+    private static DecimalFormat decimalFormat = new DecimalFormat("##0.00");
+    /**
+     * 将bytes 转换成指定的数据结构
+     *
+     * @param bytes
+     * @return
+     */
+    public static MessageDetail encoder(byte[] bytes) {
+        log.info("解码器: " + ByteUtil.byteArrayToHexString(bytes));
+        log.info("解码器完善: " + ByteUtil.testStr(ByteUtil.byteArrayToHexString(bytes)));
+        MessageDetail ruleDetail104 = new MessageDetail();
+        int index = 0;
+        ruleDetail104.setStart(bytes[index++]);
+        ruleDetail104.setApuuLength(bytes[index++] & 0xFF);
+        ruleDetail104.setControl(ByteUtil.getByte(bytes, index, 4));
+        index += 4;
+        if (ruleDetail104.getApuuLength() <= 4) {
+            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);
+        setMessage(ruleDetail104, bytes, index);
+        return ruleDetail104;
+    }
 
-	/**
-	 *
-	* @Title: setMessage
-	* @Description: 对消息进行编码
-	* @param @param ruleDetail104
-	* @param @param bytes
-	* @param @param index
-	* @return void
-	* @throws
-	 */
-	public static void setMessage(MessageDetail ruleDetail104, byte[] bytes, int index) {
-		int mesageIndex = index;
-		if (ruleDetail104.isContinuous()) {
-			setContinuoustMessage(ruleDetail104, bytes, mesageIndex);
-		}  else {
-			setNoContinuoustMessage(ruleDetail104, bytes, mesageIndex);
-		}
-	}
+    /**
+     * @param @param ruleDetail104
+     * @param @param bytes
+     * @param @param index
+     * @return void
+     * @throws
+     * @Title: setMessage
+     * @Description: 对消息进行编码
+     */
+    public static void setMessage(MessageDetail ruleDetail104, byte[] bytes, int index) {
+        int mesageIndex = index;
+        if (ruleDetail104.isContinuous()) {
+            setContinuoustMessage(ruleDetail104, bytes, mesageIndex);
+        } else {
+            setNoContinuoustMessage(ruleDetail104, bytes, mesageIndex);
+        }
+    }
 
 
-	/**
-	 *
-	* @Title: setContinuoustMessage
-	* @Description: 设置连续地址的消息
-	* @param ruleDetail104
-	* @param bytes
-	* @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));
-		ruleDetail104.setMessageAddress(messageAddress);
-		mesageIndex += 3;
-		if (ruleDetail104.isMessage()) {
-			// 获取每个消息的长度
-			int messageLength = getMessageLength(ruleDetail104);
-			int messageSize = 0;
-			while (messageSize < ruleDetail104.getMeasgLength()) {
-				MessageInfo messageObj = new MessageInfo();
-				messageObj.setMessageAddress(messageAddress);
-				byte[] messageInfos = ByteUtil.getByte(bytes, mesageIndex, messageLength);
-				mesageIndex += messageLength;
-				messageObj.setMessageInfos(messageInfos);
-				//对数据的值进行解析
-				setMessageValue(ruleDetail104, messageObj);
+    /**
+     * @param ruleDetail104
+     * @param bytes
+     * @param index
+     * @return void
+     * @throws
+     * @Title: setContinuoustMessage
+     * @Description: 设置连续地址的消息
+     */
+    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));
+        ruleDetail104.setMessageAddress(messageAddress);
+        mesageIndex += 3;
+        if (ruleDetail104.isMessage()) {
+            // 获取每个消息的长度
+            int messageLength = getMessageLength(ruleDetail104);
+            int messageSize = 0;
+            while (messageSize < ruleDetail104.getMeasgLength()) {
+                MessageInfo messageObj = new MessageInfo();
+                messageObj.setMessageAddress(messageAddress);
+                byte[] messageInfos = ByteUtil.getByte(bytes, mesageIndex, messageLength);
+                mesageIndex += messageLength;
+                messageObj.setMessageInfos(messageInfos);
+                messageObj.setByteHex(ByteUtil.byteArrayToHexString(messageInfos));
+                //对数据的值进行解析
+                setMessageValue(ruleDetail104, messageObj);
 
-				if (ruleDetail104.isQualifiers() && TypeIdentifierEnum.isTelemetry(ruleDetail104.getTypeIdentifier())) {
-					// 判断是否有限定词
-					// 0(每个信息元素后缀1个字节)
-					ruleDetail104.setQualifiersType(QualifiersEnum.getQualifiersEnum(ruleDetail104.getTypeIdentifier(), bytes[mesageIndex++]));
-				}
+                if (ruleDetail104.isQualifiers() && TypeIdentifierEnum.isTelemetry(ruleDetail104.getTypeIdentifier())) {
+                    // 判断是否有限定词
+                    // 0(每个信息元素后缀1个字节)
+                    ruleDetail104.setQualifiersType(QualifiersEnum.getQualifiersEnum(ruleDetail104.getTypeIdentifier(), bytes[mesageIndex++]));
+                }
 
-				messageSize++;
-				messageAddress++;
-				messages.add(messageObj);
-			}
-		}
+                messageSize++;
+                messageAddress++;
+                messages.add(messageObj);
+            }
+        }
 
 
-		if (ruleDetail104.isQualifiers() &&  !TypeIdentifierEnum.isTelemetry(ruleDetail104.getTypeIdentifier())) {
-			// 判断是否有限定词
-			ruleDetail104.setQualifiersType(QualifiersEnum.getQualifiersEnum(ruleDetail104.getTypeIdentifier(), bytes[mesageIndex++]));
-		}
+        if (ruleDetail104.isQualifiers() && !TypeIdentifierEnum.isTelemetry(ruleDetail104.getTypeIdentifier())) {
+            // 判断是否有限定词
+            ruleDetail104.setQualifiersType(QualifiersEnum.getQualifiersEnum(ruleDetail104.getTypeIdentifier(), bytes[mesageIndex++]));
+        }
 
 
-		if (ruleDetail104.isTimeScaleExit()) {
-			ruleDetail104.setTimeScale(ByteUtil.byte2Hdate(ByteUtil.getByte(bytes, mesageIndex, 7)));
-		}
-		ruleDetail104.setMessages(messages);
-	}
+        if (ruleDetail104.isTimeScaleExit()) {
+            ruleDetail104.setTimeScale(ByteUtil.byte2Hdate(ByteUtil.getByte(bytes, mesageIndex, 7)));
+        }
+        ruleDetail104.setMessages(messages);
+    }
 
 
-	/**
-	 *
-	* @Title: setNoContinuoustMessage
-	* @Description: 设置不连续地址的消息
-	* @param ruleDetail104
-	* @param bytes
-	* @param index
-	* @return void
-	* @throws
-	 */
-	public static void setNoContinuoustMessage(MessageDetail ruleDetail104, byte[] bytes, int index) {
-		List<MessageInfo> messages = new ArrayList<>();
-		int mesageIndex = index;
-		// 获取每个消息的长度
-		int messageLength = getMessageLength(ruleDetail104);
-		int messageSize = 0;
-		while (messageSize < ruleDetail104.getMeasgLength()) {
-			MessageInfo messageObj = new MessageInfo();
-			// 消息地址
-			messageObj.setMessageAddress(Iec104Util.messageAddressToInt(ByteUtil.getByte(bytes, mesageIndex, 3)));
-			mesageIndex += 3;
+    /**
+     * @param ruleDetail104
+     * @param bytes
+     * @param index
+     * @return void
+     * @throws
+     * @Title: setNoContinuoustMessage
+     * @Description: 设置不连续地址的消息
+     */
+    public static void setNoContinuoustMessage(MessageDetail ruleDetail104, byte[] bytes, int index) {
+        List<MessageInfo> messages = new ArrayList<>();
+        int mesageIndex = index;
+        // 获取每个消息的长度
+        int messageLength = getMessageLength(ruleDetail104);
+        int messageSize = 0;
+        while (messageSize < ruleDetail104.getMeasgLength()) {
+            MessageInfo messageObj = new MessageInfo();
+            // 消息地址
+            messageObj.setMessageAddress(Iec104Util.messageAddressToInt(ByteUtil.getByte(bytes, mesageIndex, 3)));
+            mesageIndex += 3;
 
-			if (ruleDetail104.isMessage()) {
-				// 消息集合
-				byte[] messageInfos = ByteUtil.getByte(bytes, mesageIndex, messageLength);
-				mesageIndex += messageLength;
-				messageObj.setMessageInfos(messageInfos);
-				//对数据的值进行解析
-				setMessageValue(ruleDetail104, messageObj);
-			} else {
-				messageObj.setMessageInfos(new byte[] {});
-			}
+            if (ruleDetail104.isMessage()) {
+                // 消息集合
+                byte[] messageInfos = ByteUtil.getByte(bytes, mesageIndex, messageLength);
+                mesageIndex += messageLength;
+                messageObj.setMessageInfos(messageInfos);
+                messageObj.setByteHex(ByteUtil.byteArrayToHexString(messageInfos));
+                //对数据的值进行解析
+                setMessageValue(ruleDetail104, messageObj);
+            } else {
+                messageObj.setMessageInfos(new byte[]{});
+            }
 
-			if (ruleDetail104.isQualifiers() &&  TypeIdentifierEnum.isTelemetry(ruleDetail104.getTypeIdentifier())) {
-				// 判断是否有限定词
-				// 0(每个信息元素后缀1个字节)
-				ruleDetail104.setQualifiersType(QualifiersEnum.getQualifiersEnum(ruleDetail104.getTypeIdentifier(), bytes[mesageIndex++]));
-			}
+            if (ruleDetail104.isQualifiers() && TypeIdentifierEnum.isTelemetry(ruleDetail104.getTypeIdentifier())) {
+                // 判断是否有限定词
+                // 0(每个信息元素后缀1个字节)
+                ruleDetail104.setQualifiersType(QualifiersEnum.getQualifiersEnum(ruleDetail104.getTypeIdentifier(), bytes[mesageIndex++]));
+            }
 
-			messageSize++;
-			messages.add(messageObj);
-		}
+            messageSize++;
+            messages.add(messageObj);
+        }
 
 
-		if (ruleDetail104.isQualifiers() && !TypeIdentifierEnum.isTelemetry(ruleDetail104.getTypeIdentifier())) {
-			// 判断是否有限定词
-			ruleDetail104.setQualifiersType(QualifiersEnum.getQualifiersEnum(ruleDetail104.getTypeIdentifier(), bytes[mesageIndex++]));
-		}
+        if (ruleDetail104.isQualifiers() && !TypeIdentifierEnum.isTelemetry(ruleDetail104.getTypeIdentifier())) {
+            // 判断是否有限定词
+            ruleDetail104.setQualifiersType(QualifiersEnum.getQualifiersEnum(ruleDetail104.getTypeIdentifier(), bytes[mesageIndex++]));
+        }
 
 
-		if (ruleDetail104.isTimeScaleExit()) {
-			ruleDetail104.setTimeScale(ByteUtil.byte2Hdate(ByteUtil.getByte(bytes, mesageIndex, 7)));
-		}
+        if (ruleDetail104.isTimeScaleExit()) {
+            ruleDetail104.setTimeScale(ByteUtil.byte2Hdate(ByteUtil.getByte(bytes, mesageIndex, 7)));
+        }
 
-		ruleDetail104.setMessages(messages);
-	}
+        ruleDetail104.setMessages(messages);
+    }
 
-	/**
-	 * 根据类型对数据的值进行解析
-	 * */
-	private static void setMessageValue(MessageDetail ruleDetail104, MessageInfo messageObj) {
-		switch (ruleDetail104.getTypeIdentifier().getValue()) {
-			case  0x09:
-				// 遥测 测量值 归一化值 遥测
-				break;
-			case  0x0B:
-				// 遥测 测量值  标度化值 遥测
-				break;
-			case  0x66:
-				// 读单个参数
-				break;
-			case (byte) 0x84:
-				//  读多个参数
-				break;
-			case  0x30:
-				// 预置单个参数命令
-				break;
-			case (byte) 0x88:
-				// 预置多个个参数
-				break;
-			default :
-		}
-	}
+    /**
+     * 根据类型对数据的值进行解析
+     */
+    private static void setMessageValue(MessageDetail ruleDetail104, MessageInfo messageObj) {
+        switch (ruleDetail104.getTypeIdentifier().getValue()) {
+            case 0x09:
+                // 遥测 测量值 归一化值 遥测
+            case 0x0B:
+                // 遥测 测量值  标度化值 遥测
+            case 0x0D:
+                // 遥测 测量值  标度化值 遥测, 4个字节转换
+                messageObj.setValue(ByteUtil.byteToFloatValue(messageObj.getMessageInfos()));
+                break;
+            case 0x66:
+                // 读单个参数
+                break;
+            case (byte) 0x84:
+                //  读多个参数
+                break;
+            case 0x30:
+                // 预置单个参数命令
+                break;
+            case (byte) 0x88:
+                // 预置多个个参数
+                break;
+            default:
+        }
+    }
 
 
-	/**
-	 * 根据类型标识返回消息长度
-	 */
-	private static int getMessageLength(MessageDetail ruleDetail104) {
-		//log.info("根据类型标识返回消息长度: " + JSON.toJSONString(ruleDetail104));
-		log.info("返回消息长度: " + ruleDetail104.getTypeIdentifier().getMessageLength());
-		return ruleDetail104.getTypeIdentifier().getMessageLength();
+    /**
+     * 根据类型标识返回消息长度
+     */
+    private static int getMessageLength(MessageDetail ruleDetail104) {
+        //log.info("根据类型标识返回消息长度: " + JSON.toJSONString(ruleDetail104));
+        log.info("返回消息长度: " + ruleDetail104.getMeasgLength());
+        if (ruleDetail104.getMessages() != null) {
+            log.info("返回message size: " + ruleDetail104.getMessages().size());
+        }
+        log.info("返回消息byte长度: " + ruleDetail104.getTypeIdentifier().getMessageLength());
+        return ruleDetail104.getTypeIdentifier().getMessageLength();
 //		int messageLength = 0;
 //		switch (ruleDetail104.getTypeIdentifier().getValue()) {
 //			case  0x01:
@@ -270,5 +279,5 @@ public class Decoder104 {
 //				messageLength = 0;
 //		}
 //		return messageLength;
-	}
+    }
 }

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

@@ -181,14 +181,14 @@ public class ScheduledTaskPool {
                     while (sendTestStatus) {
                         try {
                             // ctx.channel().writeAndFlush(BasicInstruction104.getGeneralCallRuleDetail104());
-                            Thread.sleep(1000 * 60 * 2);// 2分钟判断一次是否发送一次电度总召唤
+                            Thread.sleep(1000 * 60 * 5);// 2分钟判断一次是否发送一次电度总召唤
                             // 判断是否需要发送电度
-                            if (isNeedSendDegree()) {
+                            //if (isNeedSendDegree()) {
                                 if (sendTestNum > 1) {
                                     LOGGER.info("电度召唤指令");
                                     ctx.channel().writeAndFlush(BasicInstruction104.getGeneralCallRuleDetail104Degree());
                                 }
-                            }
+                            //}
                         } catch (Exception e) {
                             e.printStackTrace();
                         }

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

@@ -12,7 +12,7 @@ public enum TypeIdentifierEnum {
 	/**
 	 * 不带时标的电能量,每个电能量占5个字节
 	 */
-	degreeNoTime(0x0f, 1),
+	degreeNoTime(0x0f, 5),
 	/**
 	 * 带3个字节短时标的电能量,每个电能量占8个字节
 	 */
@@ -40,7 +40,7 @@ public enum TypeIdentifierEnum {
 	/**
 	 * 测量值 短浮点数 遥测   Short floating point
 	 */
-	shortFloatingPointTelemetry(0x0D, 2),
+	shortFloatingPointTelemetry(0x0D, 4),
 	/**
 	 * 摇信带时标 单点
 	 */

+ 0 - 2
platform-iec/src/main/java/com/ydl/iec/iec104/message/MessageDetail.java

@@ -69,8 +69,6 @@ public class MessageDetail {
 	 * 消息结构
 	 */
 	private List<MessageInfo> messages;
-	
-	
 	/**
 	 * 判断是否有消息元素
 	 */

+ 12 - 1
platform-iec/src/main/java/com/ydl/iec/iec104/message/MessageInfo.java

@@ -34,5 +34,16 @@ public class MessageInfo {
 	 * 消息详情
 	 */
 	private int messageInfoLength;
-
+	/**
+	 * 消息值
+	 */
+	private String value;
+	/**
+	 * byte 16进制 old
+	 */
+	private String byteHex;
+	/**
+	 * byte 16进制 高低位转换后的
+	 */
+	private String byteHexReal;
 }

+ 163 - 101
platform-iec/src/main/java/com/ydl/iec/util/ByteUtil.java

@@ -1,28 +1,29 @@
 package com.ydl.iec.util;
 
 import java.io.ByteArrayOutputStream;
+import java.math.BigDecimal;
+import java.math.BigInteger;
+import java.text.DecimalFormat;
 import java.util.Calendar;
 import java.util.Date;
 
 /**
- * 
-* @ClassName: ByteUtil  
-* @Description: byte 工具类 
-* @author YDL 
-* @date 2020年5月13日
+ * @author YDL
+ * @ClassName: ByteUtil
+ * @Description: byte 工具类
+ * @date 2020年5月13日
  */
 public class ByteUtil {
-	
-	/**
-	 * 
-	* @Title: intToByteArray  
-	* @Description: int 转换成 byte数组 
-	* @param @param i
-	* @param @return 
-	* @return byte[]   
-	* @throws
-	 */
-	public static byte[] intToByteArray(int i) {
+
+    /**
+     * @param @param  i
+     * @param @return
+     * @return byte[]
+     * @throws
+     * @Title: intToByteArray
+     * @Description: int 转换成 byte数组
+     */
+    public static byte[] intToByteArray(int i) {
         byte[] result = new byte[4];
         result[0] = (byte) ((i >> 24) & 0xFF);
         result[1] = (byte) ((i >> 16) & 0xFF);
@@ -30,32 +31,31 @@ public class ByteUtil {
         result[3] = (byte) (i & 0xFF);
         return result;
     }
-	
-	/**
-	* @Title: shortToByteArray  
-	* @Description: short 转换成 byte[] 
-	* @param @param val
-	* @param @return 
-	* @return byte[]   
-	* @throws
-	 */
-	public static byte[] shortToByteArray(short val) {
-		byte[] b = new byte[2];
-		b[0] = (byte) ((val >> 8) & 0xff);
-		b[1] = (byte) (val & 0xff);
-		return b;
-	}
-	
-	/**
-	 * 
-	* @Title: byteArrayToInt  
-	* @Description: byte[] 转换成 int
-	* @param @param bytes
-	* @param @return 
-	* @return int   
-	* @throws
-	 */
-	public static int byteArrayToInt(byte[] bytes) {
+
+    /**
+     * @param @param  val
+     * @param @return
+     * @return byte[]
+     * @throws
+     * @Title: shortToByteArray
+     * @Description: short 转换成 byte[]
+     */
+    public static byte[] shortToByteArray(short val) {
+        byte[] b = new byte[2];
+        b[0] = (byte) ((val >> 8) & 0xff);
+        b[1] = (byte) (val & 0xff);
+        return b;
+    }
+
+    /**
+     * @param @param  bytes
+     * @param @return
+     * @return int
+     * @throws
+     * @Title: byteArrayToInt
+     * @Description: byte[] 转换成 int
+     */
+    public static int byteArrayToInt(byte[] bytes) {
         int value = 0;
         for (int i = 0; i < 4; i++) {
             int shift = (3 - i) * 8;
@@ -63,17 +63,16 @@ public class ByteUtil {
         }
         return value;
     }
-	
-	/**
-	 * 
-	* @Title: byteArrayToShort  
-	* @Description: byte[] 转换成short 
-	* @param @param bytes
-	* @param @return 
-	* @return short   
-	* @throws
-	 */
-	public static short byteArrayToShort(byte[] bytes) {
+
+    /**
+     * @param @param  bytes
+     * @param @return
+     * @return short
+     * @throws
+     * @Title: byteArrayToShort
+     * @Description: byte[] 转换成short
+     */
+    public static short byteArrayToShort(byte[] bytes) {
         short value = 0;
         for (int i = 0; i < 2; i++) {
             int shift = (1 - i) * 8;
@@ -81,8 +80,8 @@ public class ByteUtil {
         }
         return value;
     }
-	
-	
+
+
 //	/**
 //	 * 
 //	* @Title: listToBytes  
@@ -100,29 +99,28 @@ public class ByteUtil {
 //		}
 //		return bytes;
 //	}
-	
-	/**
-	 * 
-	* @Title: date2HByte  
-	* @Description: 日期转换成 CP56Time2a
-	* @param @param date
-	* @param @return 
-	* @return byte[]   
-	* @throws
-	 */
+
+    /**
+     * @param @param  date
+     * @param @return
+     * @return byte[]
+     * @throws
+     * @Title: date2HByte
+     * @Description: 日期转换成 CP56Time2a
+     */
     public static byte[] date2Hbyte(Date date) {
-    	ByteArrayOutputStream bOutput = new ByteArrayOutputStream();
+        ByteArrayOutputStream bOutput = new ByteArrayOutputStream();
         Calendar calendar = Calendar.getInstance();
         calendar.setTime(date);
         // 毫秒需要转换成两个字节其中 低位在前高位在后 
         // 先转换成short
         int millisecond = calendar.get(Calendar.SECOND) * 1000 + calendar.get(Calendar.MILLISECOND);
-        
+
         // 默认的高位在前
         byte[] millisecondByte = intToByteArray(millisecond);
         bOutput.write((byte) millisecondByte[3]);
         bOutput.write((byte) millisecondByte[2]);
-        
+
         // 分钟 只占6个比特位 需要把前两位置为零 
         bOutput.write((byte) calendar.get(Calendar.MINUTE));
         // 小时需要把前三位置零
@@ -130,10 +128,10 @@ public class ByteUtil {
         // 星期日的时候 week 是0 
         int week = calendar.get(Calendar.DAY_OF_WEEK);
         if (week == Calendar.SUNDAY) {
-        	week = 7;
+            week = 7;
         } else {
-        	week--;
-        } 
+            week--;
+        }
         // 前三个字节是 星期 因此需要将星期向左移5位  后五个字节是日期  需要将两个数字相加 相加之前需要先将前三位置零
         bOutput.write((byte) (week << 5) + (calendar.get(Calendar.DAY_OF_MONTH)));
         // 前四字节置零
@@ -141,18 +139,17 @@ public class ByteUtil {
         bOutput.write((byte) (calendar.get(Calendar.YEAR) - 2000));
         return bOutput.toByteArray();
     }
-    
-    
+
+
     /**
-	 * 
-	* @Title: date2HByte  
-	* @Description:CP56Time2a转换成  时间
-	* @param @param date
-	* @param @return 
-	* @return byte[]   
-	* @throws
-	 */
-    public static Date  byte2Hdate(byte[] dataByte) {
+     * @param @param  date
+     * @param @return
+     * @return byte[]
+     * @throws
+     * @Title: date2HByte
+     * @Description:CP56Time2a转换成 时间
+     */
+    public static Date byte2Hdate(byte[] dataByte) {
         int year = (dataByte[6] & 0x7F) + 2000;
         int month = dataByte[5] & 0x0F;
         int day = dataByte[4] & 0x1F;
@@ -174,29 +171,29 @@ public class ByteUtil {
         return calendar.getTime();
     }
 
-	public static String byteArrayToHexString(byte[] array) {
+    public static String byteArrayToHexString(byte[] array) {
         return byteArray2HexString(array, Integer.MAX_VALUE, false);
     }
 
-	public static String byteArray2HexString(byte[] arrBytes, int count, boolean blank) {
+    public static String byteArray2HexString(byte[] arrBytes, int count, boolean blank) {
         String ret = "";
         if (arrBytes == null || arrBytes.length < 1) {
-        	return ret;
+            return ret;
         }
         if (count > arrBytes.length) {
-        	count = arrBytes.length;
+            count = arrBytes.length;
         }
         StringBuilder builder = new StringBuilder();
 
         for (int i = 0; i < count; i++) {
             ret = Integer.toHexString(arrBytes[i] & 0xFF).toUpperCase();
             if (ret.length() == 1) {
-            	builder.append("0").append(ret);
+                builder.append("0").append(ret);
             } else {
-            	builder.append(ret);
+                builder.append(ret);
             }
             if (blank) {
-            	builder.append(" ");
+                builder.append(" ");
             }
         }
 
@@ -206,27 +203,29 @@ public class ByteUtil {
 
     /**
      * 返回指定位置的数组
+     *
      * @param bytes
-     * @param start 开始位置
-     * @param length  截取长度
+     * @param start  开始位置
+     * @param length 截取长度
      * @return
      */
-	public  static byte[] getByte(byte[] bytes, int start, int length) {
-		byte[] ruleByte = new byte[length];
-		int index = 0;
-		while (index < length) {
-			ruleByte[index++] = bytes[start++];
-		}
-		return ruleByte;
-	}
+    public static byte[] getByte(byte[] bytes, int start, int length) {
+        byte[] ruleByte = new byte[length];
+        int index = 0;
+        while (index < length) {
+            ruleByte[index++] = bytes[start++];
+        }
+        return ruleByte;
+    }
 
 
     /**
      * 十六进制字符串转换成byte数组
+     *
      * @param hexStr
      * @return
      */
-	public static  byte[] hexStringToBytes(String hexStr){
+    public static byte[] hexStringToBytes(String hexStr) {
         hexStr = hexStr.replaceAll(" ", "");
         hexStr = hexStr.toUpperCase();
         int len = (hexStr.length() / 2);
@@ -244,8 +243,71 @@ public class ByteUtil {
         return b;
     }
 
+    /**
+     * 将16进制转换为二进制
+     *
+     * @param hexString
+     * @return
+     */
+    public static String hexString2binaryString(String hexString) {
+        //16进制转10进制
+        BigInteger sint = new BigInteger(hexString, 16);
+        //10进制转2进制
+        String result = sint.toString(2);
+        //字符串反转
+        return new StringBuilder(result).toString();
+    }
+
+    /**
+     * 將byteshuzu 转化为float数据,4个字节的float,适用于
+     * 1:总召遥测的响应
+     * 2:遥测响应
+     * 处理流程:
+     * 1:将低位高位互换
+     * 2:转为float
+     * 3:设置精度
+     * @return
+     */
+    public static String byteToFloatValue(byte[] old){
+        byte[] realByteArray = new byte[]{old[3],old[2],old[1],old[0]};
+        String hexString = ByteUtil.byteArrayToHexString(realByteArray);
+        BigInteger b = new BigInteger(hexString, 16);
+        float value = Float.intBitsToFloat(b.intValue());
+        DecimalFormat fnum = new DecimalFormat("##0.00");
+        return fnum.format(value);
+    }
 
     public static void main(String[] agrwu) {
-            System.out.println(byteArrayToHexString(hexStringToBytes("68 14 8c 00 02 00 1e 01 03 00 01 00 0a 00 00 2d ad 28 0b 1c 09 14")));
+        byte[] test = new byte[]{0x00, 0x00,(byte)0xBA, 0x41};
+        byte[] realByteArray = new byte[]{test[3],test[2],test[1],test[0]};
+        String hexString = ByteUtil.byteArrayToHexString(realByteArray);
+        System.out.println("遥测16进制:" + hexString);
+
+        BigInteger b = new BigInteger(hexString, 16);
+        float value = Float.intBitsToFloat(b.intValue());
+        DecimalFormat fnum = new DecimalFormat("##0.00");
+        String dd = fnum.format(value);
+        System.out.println(value);
+        System.out.println(dd);
+    }
+
+    public static String testStr(String str) {
+        char[] chars = str.toCharArray();
+        String temp = "";
+        StringBuilder result = new StringBuilder();
+        for (int i = 0; i <= chars.length - 1; i++) {
+            temp += chars[i];
+            if (i == chars.length - 1) {
+                result.append(temp);
+                break;
+            }
+            if (temp.length() >= 2) {
+                temp += " ";
+                result.append(temp);
+                temp = "";
+            }
+        }
+        System.out.println(result);
+        return result.toString();
     }
 }

+ 0 - 4
platform-iec/src/main/java/com/ydl/iec/util/Iec104Util.java

@@ -106,10 +106,6 @@ public class Iec104Util {
 		return null;
 	}
 	
-	
-	
-	
-	
 	/**
 	 * 返回消息地址 其中低位在前
 	 * @param i

+ 52 - 19
platform-iec/src/main/java/com/ydl/iec/util/MySqlUtil.java

@@ -10,8 +10,10 @@ import com.platform.common.util.StringUtils;
 import com.ydl.iec.iec104.message.MessageDetail;
 import com.ydl.iec.iec104.message.MessageInfo;
 import lombok.extern.slf4j.Slf4j;
+import org.bouncycastle.cms.bc.BcKEKRecipientInfoGenerator;
 import org.springframework.util.CollectionUtils;
 
+import java.math.BigDecimal;
 import java.sql.*;
 import java.time.LocalDateTime;
 import java.util.ArrayList;
@@ -80,12 +82,10 @@ public class MySqlUtil {
         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);
+                // log.info("电度点位:" + messageInfo.getMessageAddress() + "数值:" + messageInfo.getValue());
+                // addMessage.add(messageInfo);
             } else if (messageInfo.getMessageAddress() >= remote_config_measure_min && messageInfo.getMessageAddress() <= remote_config_measure_max) {
-                log.info("遥测点位:" + messageInfo.getMessageAddress());
-                log.info("遥测信息:" + JSON.toJSONString(messageInfo));
+                log.info("遥测点位:" + messageInfo.getMessageAddress() + "byteHex:" + messageInfo.getByteHex() + "数值:" + messageInfo.getValue());
                 updateMessage.add(messageInfo);
             } else {
                 // log.info("数据点位不在采集范围内,不处理" + messageInfo.getMessageAddress());
@@ -116,7 +116,7 @@ public class MySqlUtil {
             String updateSql = "";
             for (int i = 0; i < list.size(); i++) {
                 MessageInfo messageInfo = list.get(i);
-                updateSql = "update t_remote_measure set result='" + ByteUtil.byteArrayToShort(messageInfo.getMessageInfos()) +
+                updateSql = "update t_remote_measure set result='" + messageInfo.getValue() +
                         "', update_time='" + DateUtils.dateToString(time, DateUtils.PATTERN_YMD_HMS) +
                         "', info='" + JSON.toJSONString(messageInfo) +
                         "' where position_num = " + messageInfo.getMessageAddress();
@@ -177,7 +177,7 @@ public class MySqlUtil {
                 ps.setObject(5, day);
                 ps.setObject(6, hour);
                 ps.setObject(7, minute);
-                ps.setObject(8, ByteUtil.byteArrayToInt(messageInfo.getMessageInfos()) + "");
+                ps.setObject(8, "" + changeMeassInfosToFloat(messageInfo.getMessageInfos()));
                 ps.setObject(9, JSON.toJSONString(messageInfo));
                 ps.setObject(10, DateUtils.dateToString(time, DateUtils.PATTERN_YMD_HMS));
                 ps.setObject(11, "1");
@@ -203,7 +203,9 @@ public class MySqlUtil {
         }
     }
 
-    public static void main(String[] args) {
+
+
+    public static void testAddBatch() {
         LocalDateTime time = LocalDateTime.now();
         int year = time.getYear();
         int month = time.getMonthValue();
@@ -212,18 +214,49 @@ public class MySqlUtil {
         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);
+        for (int i = 0; i < 10; i++) {
+            MessageInfo messageInfo = new MessageInfo();
+            messageInfo.setMessageAddress(25601 + i);
+            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);
+
+    }
+
+    public static void testValue() {
+        String test = "mZk=";
+        byte[] ss = test.getBytes();
+        String string = ByteUtil.byteArrayToHexString(ss);
+        System.out.println("string: " + string);
+        Integer value = Integer.parseInt(string, 16);
+        System.out.println("value: " + value);
+        BigDecimal bigDecimal = new BigDecimal(value).setScale(2, BigDecimal.ROUND_HALF_UP);
+        System.out.println("bigDecimal: " + bigDecimal);
+        float floatValue = bigDecimal.floatValue();
+        System.out.println("floatValue: " + floatValue);
+    }
+
+    public static void main(String[] args) {
+        String str = "68FA020002000D1E140001000140000000000000024000000000000003400000000000000440000000000000054000000000000006400000000000000740000000000000084000000000000009400000000000000A400000000000000B400000000000000C400000000000000D400000000000000E400000000000000F4000000000000010400000000000001140000000000000124000000000000013400000000000001440000000000000154000000000000016400000000000001740000000000000184000000000000019400000000000001A400000000000001B400000000000001C400000000000001D400000000000001E40000000000000";
+        System.out.println(ByteUtil.testStr(str));
+    }
 
-        System.out.println(ByteUtil.byteArrayToInt(messageInfo.getMessageInfos()));
+    private static float changeMeassInfosToFloat(byte[] bytes) {
+        String string = ByteUtil.byteArrayToHexString(bytes);
+        // System.out.println("string: " + string);
+        Integer value = Integer.parseInt(string, 16);
+        // System.out.println("value: " + value);
+        BigDecimal bigDecimal = new BigDecimal(value).setScale(2, BigDecimal.ROUND_HALF_UP);
+        //System.out.println("bigDecimal: " + bigDecimal);
+        float floatValue = bigDecimal.floatValue();
+        //System.out.println("floatValue: " + floatValue);
+        return floatValue;
     }
 
     /**