Kaynağa Gözat

104解码时对报文长度进行是否足够读取的校验

xiuwei 4 yıl önce
ebeveyn
işleme
0d494d3244
22 değiştirilmiş dosya ile 122 ekleme ve 57 silme
  1. 3 3
      pom.xml
  2. 1 1
      protocol-all/pom.xml
  3. 1 1
      protocol-cdt/pom.xml
  4. 1 1
      protocol-core/pom.xml
  5. 1 1
      protocol-iec104/pom.xml
  6. 13 7
      protocol-iec104/src/main/java/wei/yigulu/iec104/asdudataframe/BooleanType.java
  7. 15 9
      protocol-iec104/src/main/java/wei/yigulu/iec104/asdudataframe/NoQualityNormalizedIntegerType.java
  8. 5 0
      protocol-iec104/src/main/java/wei/yigulu/iec104/asdudataframe/NormalizedIntegerType.java
  9. 9 2
      protocol-iec104/src/main/java/wei/yigulu/iec104/asdudataframe/ProofreadTimeType.java
  10. 15 9
      protocol-iec104/src/main/java/wei/yigulu/iec104/asdudataframe/ShortFloatType.java
  11. 15 9
      protocol-iec104/src/main/java/wei/yigulu/iec104/asdudataframe/ShortIntegerType.java
  12. 9 2
      protocol-iec104/src/main/java/wei/yigulu/iec104/asdudataframe/TotalSummonType.java
  13. 5 1
      protocol-iec104/src/main/java/wei/yigulu/iec104/asdudataframe/qualitydescription/IeAbstractQuality.java
  14. 2 1
      protocol-iec104/src/main/java/wei/yigulu/iec104/asdudataframe/qualitydescription/IeMeasuredQuality.java
  15. 2 1
      protocol-iec104/src/main/java/wei/yigulu/iec104/asdudataframe/typemodel/IeBoolean.java
  16. 6 2
      protocol-iec104/src/main/java/wei/yigulu/iec104/asdudataframe/typemodel/IeProofreadTime.java
  17. 5 1
      protocol-iec104/src/main/java/wei/yigulu/iec104/asdudataframe/typemodel/IeShortFloat.java
  18. 6 1
      protocol-iec104/src/main/java/wei/yigulu/iec104/asdudataframe/typemodel/IeShortInteger.java
  19. 5 1
      protocol-iec104/src/main/java/wei/yigulu/iec104/asdudataframe/typemodel/InformationBodyAddress.java
  20. 2 1
      protocol-iec104/src/main/java/wei/yigulu/iec104/exception/Iec104Exception.java
  21. 0 2
      protocol-iec104/src/main/java/wei/yigulu/iec104/nettyconfig/Iec104MasterBuilder.java
  22. 1 1
      protocol-modbus/pom.xml

+ 3 - 3
pom.xml

@@ -6,7 +6,7 @@
 
     <groupId>wei.yigulu</groupId>
     <artifactId>protocol</artifactId>
-    <version>1.1.7</version>
+    <version>1.1.8</version>
     <packaging>pom</packaging>
     <modules>
         <module>protocol-core</module>
@@ -32,8 +32,8 @@
         <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
         <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
         <java.version>1.8</java.version>
-        <protocol.version>1.1.7</protocol.version>
-        <iec104.version>1.4.12</iec104.version>
+        <protocol.version>1.1.8</protocol.version>
+        <iec104.version>1.4.13</iec104.version>
         <modbus.version>1.2.4</modbus.version>
         <cdt.version>1.0.0</cdt.version>
     </properties>

+ 1 - 1
protocol-all/pom.xml

@@ -6,7 +6,7 @@
     <parent>
         <artifactId>protocol</artifactId>
         <groupId>wei.yigulu</groupId>
-        <version>1.1.7</version>
+        <version>1.1.8</version>
     </parent>
 
 

+ 1 - 1
protocol-cdt/pom.xml

@@ -5,7 +5,7 @@
     <parent>
         <artifactId>protocol</artifactId>
         <groupId>wei.yigulu</groupId>
-        <version>1.1.7</version>
+        <version>1.1.8</version>
     </parent>
     <modelVersion>4.0.0</modelVersion>
 

+ 1 - 1
protocol-core/pom.xml

@@ -5,7 +5,7 @@
     <parent>
         <artifactId>protocol</artifactId>
         <groupId>wei.yigulu</groupId>
-        <version>1.1.7</version>
+        <version>1.1.8</version>
     </parent>
     <modelVersion>4.0.0</modelVersion>
 

+ 1 - 1
protocol-iec104/pom.xml

@@ -5,7 +5,7 @@
     <parent>
         <artifactId>protocol</artifactId>
         <groupId>wei.yigulu</groupId>
-        <version>1.1.7</version>
+        <version>1.1.8</version>
     </parent>
     <modelVersion>4.0.0</modelVersion>
 

+ 13 - 7
protocol-iec104/src/main/java/wei/yigulu/iec104/asdudataframe/BooleanType.java

@@ -137,15 +137,21 @@ public class BooleanType extends AbstractDataFrameType {
 
 	@Override
 	public void loadByteBuf(ByteBuf is, Vsq vsq) {
-		if (vsq.getSq() == 0) {
-			for (int i = 0; i < vsq.getNum(); i++) {
+		try {
+			if (vsq.getSq() == 0) {
+				for (int i = 0; i < vsq.getNum(); i++) {
+					addresses.add(new InformationBodyAddress(is));
+					datas.add(new IeBoolean(is));
+				}
+			} else {
 				addresses.add(new InformationBodyAddress(is));
-				datas.add(new IeBoolean(is));
+				for (int i = 0; i < vsq.getNum(); i++) {
+					datas.add(new IeBoolean(is));
+				}
 			}
-		} else {
-			addresses.add(new InformationBodyAddress(is));
-			for (int i = 0; i < vsq.getNum(); i++) {
-				datas.add(new IeBoolean(is));
+		}catch (Iec104Exception e){
+			if(e.getCode()==3301){
+				return;
 			}
 		}
 	}

+ 15 - 9
protocol-iec104/src/main/java/wei/yigulu/iec104/asdudataframe/NoQualityNormalizedIntegerType.java

@@ -53,17 +53,23 @@ public class NoQualityNormalizedIntegerType extends AbstractDataFrameType {
 	@Override
 	public void loadByteBuf(ByteBuf is, Vsq vsq) {
 		Integer f;
-		if (vsq.getSq() == 0) {
-			for (int i = 0; i < vsq.getNum(); i++) {
+		try {
+			if (vsq.getSq() == 0) {
+				for (int i = 0; i < vsq.getNum(); i++) {
+					addresses.add(new InformationBodyAddress(is));
+					f = new IeShortInteger(is).getValue();
+					datas.add(f);
+				}
+			} else {
 				addresses.add(new InformationBodyAddress(is));
-				f = new IeShortInteger(is).getValue();
-				datas.add(f);
+				for (int i = 0; i < vsq.getNum(); i++) {
+					f = new IeShortInteger(is).getValue();
+					datas.add(f);
+				}
 			}
-		} else {
-			addresses.add(new InformationBodyAddress(is));
-			for (int i = 0; i < vsq.getNum(); i++) {
-				f = new IeShortInteger(is).getValue();
-				datas.add(f);
+		}catch (Iec104Exception e){
+			if(e.getCode()==3301){
+				return;
 			}
 		}
 	}

+ 5 - 0
protocol-iec104/src/main/java/wei/yigulu/iec104/asdudataframe/NormalizedIntegerType.java

@@ -56,6 +56,7 @@ public class NormalizedIntegerType extends AbstractDataFrameType {
 	@Override
 	public void loadByteBuf(ByteBuf is, Vsq vsq) {
 		Integer f;
+		try{
 		if (vsq.getSq() == 0) {
 			for (int i = 0; i < vsq.getNum(); i++) {
 				addresses.add(new InformationBodyAddress(is));
@@ -68,6 +69,10 @@ public class NormalizedIntegerType extends AbstractDataFrameType {
 				f = new IeShortInteger(is).getValue();
 				datas.put(new IeMeasuredQuality(is), f);
 			}
+		}}catch (Iec104Exception e){
+			if(e.getCode()==3301){
+				return;
+			}
 		}
 	}
 

+ 9 - 2
protocol-iec104/src/main/java/wei/yigulu/iec104/asdudataframe/ProofreadTimeType.java

@@ -10,6 +10,7 @@ import wei.yigulu.iec104.apdumodel.Asdu;
 import wei.yigulu.iec104.apdumodel.Vsq;
 import wei.yigulu.iec104.asdudataframe.typemodel.IeProofreadTime;
 import wei.yigulu.iec104.asdudataframe.typemodel.InformationBodyAddress;
+import wei.yigulu.iec104.exception.Iec104Exception;
 import wei.yigulu.iec104.nettyconfig.TechnicalTerm;
 
 import java.util.List;
@@ -57,8 +58,14 @@ public class ProofreadTimeType extends AbstractDataFrameType {
 
 	@Override
 	public void loadByteBuf(ByteBuf is, Vsq vsq) {
-		address = new InformationBodyAddress(is);
-		ieProofreadTime = new IeProofreadTime(is);
+		try {
+			address = new InformationBodyAddress(is);
+			ieProofreadTime = new IeProofreadTime(is);
+		}catch (Iec104Exception e){
+			if(e.getCode()==3301){
+				return;
+			}
+		}
 	}
 
 	@Override

+ 15 - 9
protocol-iec104/src/main/java/wei/yigulu/iec104/asdudataframe/ShortFloatType.java

@@ -162,17 +162,23 @@ public class ShortFloatType extends AbstractDataFrameType {
 	@Override
 	public void loadByteBuf(ByteBuf is, Vsq vsq) {
 		float f;
-		if (vsq.getSq() == 0) {
-			for (int i = 0; i < vsq.getNum(); i++) {
+		try {
+			if (vsq.getSq() == 0) {
+				for (int i = 0; i < vsq.getNum(); i++) {
+					addresses.add(new InformationBodyAddress(is));
+					f = new IeShortFloat(is).getValue();
+					datas.put(new IeMeasuredQuality(is), f);
+				}
+			} else {
 				addresses.add(new InformationBodyAddress(is));
-				f = new IeShortFloat(is).getValue();
-				datas.put(new IeMeasuredQuality(is), f);
+				for (int i = 0; i < vsq.getNum(); i++) {
+					f = new IeShortFloat(is).getValue();
+					datas.put(new IeMeasuredQuality(is), f);
+				}
 			}
-		} else {
-			addresses.add(new InformationBodyAddress(is));
-			for (int i = 0; i < vsq.getNum(); i++) {
-				f = new IeShortFloat(is).getValue();
-				datas.put(new IeMeasuredQuality(is), f);
+		}catch (Iec104Exception e){
+			if(e.getCode()==3301){
+				return;
 			}
 		}
 	}

+ 15 - 9
protocol-iec104/src/main/java/wei/yigulu/iec104/asdudataframe/ShortIntegerType.java

@@ -56,17 +56,23 @@ public class ShortIntegerType extends AbstractDataFrameType {
 	@Override
 	public void loadByteBuf(ByteBuf is, Vsq vsq) {
 		Integer f;
-		if (vsq.getSq() == 0) {
-			for (int i = 0; i < vsq.getNum(); i++) {
+		try {
+			if (vsq.getSq() == 0) {
+				for (int i = 0; i < vsq.getNum(); i++) {
+					addresses.add(new InformationBodyAddress(is));
+					f = new IeShortInteger(is).getValue();
+					datas.put(new IeMeasuredQuality(is), f);
+				}
+			} else {
 				addresses.add(new InformationBodyAddress(is));
-				f = new IeShortInteger(is).getValue();
-				datas.put(new IeMeasuredQuality(is), f);
+				for (int i = 0; i < vsq.getNum(); i++) {
+					f = new IeShortInteger(is).getValue();
+					datas.put(new IeMeasuredQuality(is), f);
+				}
 			}
-		} else {
-			addresses.add(new InformationBodyAddress(is));
-			for (int i = 0; i < vsq.getNum(); i++) {
-				f = new IeShortInteger(is).getValue();
-				datas.put(new IeMeasuredQuality(is), f);
+		}catch (Iec104Exception e){
+			if(e.getCode()==3301){
+				return;
 			}
 		}
 	}

+ 9 - 2
protocol-iec104/src/main/java/wei/yigulu/iec104/asdudataframe/TotalSummonType.java

@@ -9,6 +9,7 @@ import wei.yigulu.iec104.apdumodel.Apdu;
 import wei.yigulu.iec104.apdumodel.Asdu;
 import wei.yigulu.iec104.apdumodel.Vsq;
 import wei.yigulu.iec104.asdudataframe.typemodel.InformationBodyAddress;
+import wei.yigulu.iec104.exception.Iec104Exception;
 import wei.yigulu.iec104.nettyconfig.TechnicalTerm;
 
 import java.util.List;
@@ -56,8 +57,14 @@ public class TotalSummonType extends AbstractDataFrameType {
 
 	@Override
 	public void loadByteBuf(ByteBuf is, Vsq vsq) {
-		this.address = new InformationBodyAddress(is);
-		this.value = (is.readByte() & 0xff);
+		try {
+			this.address = new InformationBodyAddress(is);
+			this.value = (is.readByte() & 0xff);
+		}catch (Iec104Exception e){
+			if(e.getCode()==3301){
+				return;
+			}
+		}
 	}
 
 	@Override

+ 5 - 1
protocol-iec104/src/main/java/wei/yigulu/iec104/asdudataframe/qualitydescription/IeAbstractQuality.java

@@ -4,6 +4,7 @@ import io.netty.buffer.ByteBuf;
 import lombok.AllArgsConstructor;
 import lombok.Data;
 import lombok.NoArgsConstructor;
+import wei.yigulu.iec104.exception.Iec104Exception;
 
 
 /**
@@ -50,7 +51,10 @@ public class IeAbstractQuality {
 	 *
 	 * @param is is
 	 */
-	public IeAbstractQuality(ByteBuf is) {
+	public IeAbstractQuality(ByteBuf is) throws Iec104Exception {
+		if(is.readableBytes()<OCCUPYBYTES){
+			throw new Iec104Exception(3301,"可用字节不足,不能进行读取");
+		}
 		this.value = (is.readByte() & 0xff);
 		this.blocked = (value & 0x10) == 0x10;
 		this.substituted = (value & 0x20) == 0x20;

+ 2 - 1
protocol-iec104/src/main/java/wei/yigulu/iec104/asdudataframe/qualitydescription/IeMeasuredQuality.java

@@ -5,6 +5,7 @@ import lombok.AllArgsConstructor;
 import lombok.Data;
 import lombok.EqualsAndHashCode;
 import lombok.NoArgsConstructor;
+import wei.yigulu.iec104.exception.Iec104Exception;
 
 /**
  * 测量值品质描述
@@ -30,7 +31,7 @@ public class IeMeasuredQuality extends IeAbstractQuality {
 	 *
 	 * @param is is
 	 */
-	public IeMeasuredQuality(ByteBuf is) {
+	public IeMeasuredQuality(ByteBuf is) throws Iec104Exception {
 		super(is);
 		this.overflow = (value & 0x01) == 0x01;
 	}

+ 2 - 1
protocol-iec104/src/main/java/wei/yigulu/iec104/asdudataframe/typemodel/IeBoolean.java

@@ -6,6 +6,7 @@ import lombok.AllArgsConstructor;
 import lombok.Data;
 import lombok.NoArgsConstructor;
 import wei.yigulu.iec104.asdudataframe.qualitydescription.IeAbstractQuality;
+import wei.yigulu.iec104.exception.Iec104Exception;
 
 
 /**
@@ -31,7 +32,7 @@ public class IeBoolean extends IeAbstractQuality {
 	 *
 	 * @param is is
 	 */
-	public IeBoolean(ByteBuf is) {
+	public IeBoolean(ByteBuf is) throws Iec104Exception {
 		super(is);
 		this.on = (value & 0x01) == 0x01;
 	}

+ 6 - 2
protocol-iec104/src/main/java/wei/yigulu/iec104/asdudataframe/typemodel/IeProofreadTime.java

@@ -7,6 +7,7 @@ import lombok.NoArgsConstructor;
 import org.joda.time.DateTime;
 import org.joda.time.format.DateTimeFormat;
 import org.joda.time.format.DateTimeFormatter;
+import wei.yigulu.iec104.exception.Iec104Exception;
 
 import java.util.List;
 
@@ -20,7 +21,7 @@ import java.util.List;
 @AllArgsConstructor
 @Data
 public class IeProofreadTime {
-	public static final int  OCCUPYBYTES=8;
+	public static final int  OCCUPYBYTES=7;
 
 	private DateTime time = new DateTime();
 
@@ -31,7 +32,10 @@ public class IeProofreadTime {
 	 *
 	 * @param is is
 	 */
-	public IeProofreadTime(ByteBuf is) {
+	public IeProofreadTime(ByteBuf is) throws Iec104Exception {
+		if(is.readableBytes()<OCCUPYBYTES){
+			throw new Iec104Exception(3301,"可用字节不足,不能进行读取");
+		}
 		byte[] btime = new byte[7];
 		is.readBytes(btime);
 		int milliSecond = (btime[0] & 0xff) + ((btime[1] & 0xff) << 8);

+ 5 - 1
protocol-iec104/src/main/java/wei/yigulu/iec104/asdudataframe/typemodel/IeShortFloat.java

@@ -4,6 +4,7 @@ import io.netty.buffer.ByteBuf;
 import lombok.AllArgsConstructor;
 import lombok.Data;
 import lombok.NoArgsConstructor;
+import wei.yigulu.iec104.exception.Iec104Exception;
 
 import java.util.List;
 
@@ -27,7 +28,10 @@ public class IeShortFloat {
 	 *
 	 * @param is is
 	 */
-	public IeShortFloat(ByteBuf is) {
+	public IeShortFloat(ByteBuf is) throws Iec104Exception {
+		if(is.readableBytes()<OCCUPYBYTES){
+			throw new Iec104Exception(3301,"可用字节不足,不能进行读取");
+		}
 		value = Float.intBitsToFloat((is.readByte() & 0xff) | ((is.readByte() & 0xff) << 8)
 				| ((is.readByte() & 0xff) << 16) | ((is.readByte() & 0xff) << 24));
 	}

+ 6 - 1
protocol-iec104/src/main/java/wei/yigulu/iec104/asdudataframe/typemodel/IeShortInteger.java

@@ -4,6 +4,8 @@ import io.netty.buffer.ByteBuf;
 import lombok.AllArgsConstructor;
 import lombok.Data;
 import lombok.NoArgsConstructor;
+import wei.yigulu.iec104.exception.Iec104Exception;
+
 import java.util.List;
 
 /**
@@ -26,7 +28,10 @@ public class IeShortInteger {
 	 *
 	 * @param is is
 	 */
-	public IeShortInteger(ByteBuf is) {
+	public IeShortInteger(ByteBuf is) throws Iec104Exception {
+		if(is.readableBytes()<OCCUPYBYTES){
+			throw new Iec104Exception(3301,"可用字节不足,不能进行读取");
+		}
 		value =((short) ((is.readByte() & 0xff) | ((is.readByte() & 0xff) << 8)))+0;
 	}
 

+ 5 - 1
protocol-iec104/src/main/java/wei/yigulu/iec104/asdudataframe/typemodel/InformationBodyAddress.java

@@ -4,6 +4,7 @@ import io.netty.buffer.ByteBuf;
 import lombok.AllArgsConstructor;
 import lombok.Data;
 import lombok.NoArgsConstructor;
+import wei.yigulu.iec104.exception.Iec104Exception;
 
 import java.util.List;
 
@@ -44,7 +45,10 @@ public class InformationBodyAddress {
 	 *
 	 * @param is is
 	 */
-	public InformationBodyAddress(ByteBuf is) {
+	public InformationBodyAddress(ByteBuf is) throws Iec104Exception {
+		if(is.readableBytes()<OCCUPYBYTES){
+			throw new Iec104Exception(3301,"可用字节不足,不能进行读取");
+		}
 		this.address = (is.readByte() & 0xff) | ((is.readByte() & 0xff) << 8) | ((is.readByte() & 0xff) << 16);
 	}
 

+ 2 - 1
protocol-iec104/src/main/java/wei/yigulu/iec104/exception/Iec104Exception.java

@@ -24,7 +24,8 @@ public class Iec104Exception extends Exception {
 		this.msg = msg;
 	}
 
-	private String msg;
+
 	private int code;
+	private String msg;
 
 }

+ 0 - 2
protocol-iec104/src/main/java/wei/yigulu/iec104/nettyconfig/Iec104MasterBuilder.java

@@ -57,6 +57,4 @@ public class Iec104MasterBuilder extends AbstractTcpMasterBuilder {
 			}
 		};
 	}
-
-
 }

+ 1 - 1
protocol-modbus/pom.xml

@@ -5,7 +5,7 @@
     <parent>
         <artifactId>protocol</artifactId>
         <groupId>wei.yigulu</groupId>
-        <version>1.1.7</version>
+        <version>1.1.8</version>
     </parent>
     <modelVersion>4.0.0</modelVersion>
     <version>${modbus.version}</version>