Procházet zdrojové kódy

格式化了一下代码

xiuwei před 4 roky
rodič
revize
c793941a04
74 změnil soubory, kde provedl 599 přidání a 350 odebrání
  1. 0 1
      protocol-all/pom.xml
  2. 1 2
      protocol-cdt/src/main/java/wei/yigulu/cdt/netty/CDTMaster.java
  3. 8 11
      protocol-core/src/main/java/wei/yigulu/netty/AbstractDelimiterHandler.java
  4. 0 2
      protocol-core/src/main/java/wei/yigulu/netty/AbstractHSTcpMasterBuilder.java
  5. 3 3
      protocol-core/src/main/java/wei/yigulu/netty/AbstractMasterBuilder.java
  6. 5 6
      protocol-core/src/main/java/wei/yigulu/netty/AbstractTcpMasterBuilder.java
  7. 2 2
      protocol-core/src/main/java/wei/yigulu/netty/AbstractTcpSlaverBuilder.java
  8. 7 4
      protocol-core/src/main/java/wei/yigulu/netty/BaseProtocolBuilder.java
  9. 2 2
      protocol-core/src/main/java/wei/yigulu/netty/HSConnectionListener.java
  10. 3 3
      protocol-core/src/main/java/wei/yigulu/netty/SimpleTcpConnectionListener.java
  11. 3 3
      protocol-core/src/main/java/wei/yigulu/utils/DataConvertor.java
  12. 4 5
      protocol-iec104/src/main/java/wei/yigulu/iec104/apdumodel/Asdu.java
  13. 5 5
      protocol-iec104/src/main/java/wei/yigulu/iec104/asdudataframe/BooleanType.java
  14. 3 3
      protocol-iec104/src/main/java/wei/yigulu/iec104/asdudataframe/NoQualityNormalizedIntegerType.java
  15. 17 16
      protocol-iec104/src/main/java/wei/yigulu/iec104/asdudataframe/NormalizedIntegerType.java
  16. 2 2
      protocol-iec104/src/main/java/wei/yigulu/iec104/asdudataframe/ProofreadTimeType.java
  17. 119 1
      protocol-iec104/src/main/java/wei/yigulu/iec104/asdudataframe/ShortFloatCommand.java
  18. 5 5
      protocol-iec104/src/main/java/wei/yigulu/iec104/asdudataframe/ShortFloatType.java
  19. 5 5
      protocol-iec104/src/main/java/wei/yigulu/iec104/asdudataframe/ShortIntegerType.java
  20. 3 3
      protocol-iec104/src/main/java/wei/yigulu/iec104/asdudataframe/TotalSummonType.java
  21. 3 3
      protocol-iec104/src/main/java/wei/yigulu/iec104/asdudataframe/qualitydescription/IeAbstractQuality.java
  22. 1 1
      protocol-iec104/src/main/java/wei/yigulu/iec104/asdudataframe/qualitydescription/IeMeasuredQuality.java
  23. 7 2
      protocol-iec104/src/main/java/wei/yigulu/iec104/asdudataframe/typemodel/IeBoolean.java
  24. 7 1
      protocol-iec104/src/main/java/wei/yigulu/iec104/asdudataframe/typemodel/IeBooleanCommand.java
  25. 6 2
      protocol-iec104/src/main/java/wei/yigulu/iec104/asdudataframe/typemodel/IeFourByteInteger.java
  26. 3 3
      protocol-iec104/src/main/java/wei/yigulu/iec104/asdudataframe/typemodel/IeProofreadTime.java
  27. 9 4
      protocol-iec104/src/main/java/wei/yigulu/iec104/asdudataframe/typemodel/IeShortFloat.java
  28. 9 5
      protocol-iec104/src/main/java/wei/yigulu/iec104/asdudataframe/typemodel/IeShortInteger.java
  29. 10 0
      protocol-iec104/src/main/java/wei/yigulu/iec104/asdudataframe/typemodel/IecDataInterface.java
  30. 3 3
      protocol-iec104/src/main/java/wei/yigulu/iec104/asdudataframe/typemodel/InformationBodyAddress.java
  31. 2 2
      protocol-iec104/src/main/java/wei/yigulu/iec104/container/Iec104Link.java
  32. 5 8
      protocol-iec104/src/main/java/wei/yigulu/iec104/nettyconfig/AllCustomDelimiterHandler.java
  33. 1 0
      protocol-iec104/src/main/java/wei/yigulu/iec104/nettyconfig/Iec104MasterBuilder.java
  34. 5 6
      protocol-iec104/src/main/java/wei/yigulu/iec104/nettyconfig/Iec104SlaverBuilder.java
  35. 2 5
      protocol-iec104/src/main/java/wei/yigulu/iec104/nettyconfig/Master104Handle.java
  36. 2 3
      protocol-iec104/src/main/java/wei/yigulu/iec104/nettyconfig/Slave104Handle.java
  37. 6 0
      protocol-iec104/src/main/java/wei/yigulu/iec104/nettyconfig/TechnicalTerm.java
  38. 83 2
      protocol-iec104/src/main/java/wei/yigulu/iec104/util/CommandWaiter.java
  39. 0 2
      protocol-iec104/src/main/java/wei/yigulu/iec104/util/SendAndReceiveNumUtil.java
  40. 46 0
      protocol-iec104/src/main/java/wei/yigulu/iec104/util/SendCommandHelper.java
  41. 8 6
      protocol-iec104/src/main/java/wei/yigulu/iec104/util/SendDataFrameHelper.java
  42. 3 4
      protocol-iec104/src/test/java/MasterTest.java
  43. 6 9
      protocol-iec104/src/test/java/NettyClient.java
  44. 27 30
      protocol-iec104/src/test/java/ReadFile.java
  45. 6 4
      protocol-iec104/src/test/java/SlaveTest.java
  46. 4 4
      protocol-iec104/src/test/java/TestTotalS.java
  47. 1 1
      protocol-modbus/src/main/java/wei/yigulu/modbus/domain/FunctionCode.java
  48. 9 10
      protocol-modbus/src/main/java/wei/yigulu/modbus/domain/command/AbstractModbusCommand.java
  49. 1 3
      protocol-modbus/src/main/java/wei/yigulu/modbus/domain/command/RtuModbusCommand.java
  50. 11 11
      protocol-modbus/src/main/java/wei/yigulu/modbus/domain/confirm/AbstractModbusConfirm.java
  51. 14 14
      protocol-modbus/src/main/java/wei/yigulu/modbus/domain/datatype/BooleanModbusDataInCoil.java
  52. 2 2
      protocol-modbus/src/main/java/wei/yigulu/modbus/domain/datatype/BooleanModbusDataInRegister.java
  53. 0 2
      protocol-modbus/src/main/java/wei/yigulu/modbus/domain/datatype/NumericModbusData.java
  54. 3 3
      protocol-modbus/src/main/java/wei/yigulu/modbus/domain/datatype/numeric/BADC.java
  55. 1 1
      protocol-modbus/src/main/java/wei/yigulu/modbus/domain/datatype/numeric/CDAB.java
  56. 9 10
      protocol-modbus/src/main/java/wei/yigulu/modbus/domain/datatype/numeric/SingleCommandCoilValue.java
  57. 1 1
      protocol-modbus/src/main/java/wei/yigulu/modbus/domain/request/AbstractModbusRequest.java
  58. 0 1
      protocol-modbus/src/main/java/wei/yigulu/modbus/domain/request/RtuModbusRequest.java
  59. 0 1
      protocol-modbus/src/main/java/wei/yigulu/modbus/domain/request/TcpModbusRequest.java
  60. 3 3
      protocol-modbus/src/main/java/wei/yigulu/modbus/domain/synchronouswaitingroom/TcpSynchronousWaitingRoom.java
  61. 0 1
      protocol-modbus/src/main/java/wei/yigulu/modbus/domain/tcpextracode/TransactionIdentifier.java
  62. 1 1
      protocol-modbus/src/main/java/wei/yigulu/modbus/netty/ModbusRtuMasterDelimiterHandler.java
  63. 2 7
      protocol-modbus/src/main/java/wei/yigulu/modbus/netty/ModbusRtuSlaverDelimiterHandler.java
  64. 7 9
      protocol-modbus/src/main/java/wei/yigulu/modbus/netty/ModbusTcpDelimiterHandler.java
  65. 1 2
      protocol-modbus/src/main/java/wei/yigulu/modbus/netty/ModbusTcpMasterHandler.java
  66. 0 1
      protocol-modbus/src/main/java/wei/yigulu/modbus/netty/ModbusTcpSlaverHandle.java
  67. 41 28
      protocol-modbus/src/main/java/wei/yigulu/modbus/utils/ModbusCommandDataUtils.java
  68. 10 11
      protocol-modbus/src/test/java/Test.java
  69. 6 9
      protocol-modbus/src/test/java/TestMaster.java
  70. 1 1
      protocol-modbus/src/test/java/TestMasterCoil.java
  71. 4 6
      protocol-modbus/src/test/java/TestRtuCommandMaster.java
  72. 2 2
      protocol-modbus/src/test/java/TestRtuMaster.java
  73. 0 1
      protocol-modbus/src/test/java/TestSlaver.java
  74. 8 15
      protocol-modbus/src/test/java/TestTcpCommandMaster.java

+ 0 - 1
protocol-all/pom.xml

@@ -10,7 +10,6 @@
     </parent>
 
 
-
     <packaging>jar</packaging>
     <artifactId>protocol-all</artifactId>
 

+ 1 - 2
protocol-cdt/src/main/java/wei/yigulu/cdt/netty/CDTMaster.java

@@ -4,7 +4,6 @@ package wei.yigulu.cdt.netty;
 import io.netty.buffer.Unpooled;
 import io.netty.handler.codec.DelimiterBasedFrameDecoder;
 import lombok.Getter;
-import lombok.Setter;
 import wei.yigulu.cdt.cdtframe.AbstractCDTDataHandler;
 import wei.yigulu.netty.AbstractRtuModeBuilder;
 import wei.yigulu.netty.ProtocolChannelInitializer;
@@ -20,7 +19,7 @@ public class CDTMaster extends AbstractRtuModeBuilder {
 
 	private static final int MAXLEN = 10240;
 
-	private  final byte[] HEAD = new byte[]{(byte) 0xEB, (byte) 0x90, (byte) 0xEB, (byte) 0x90, (byte) 0xEB, (byte) 0x90};
+	private final byte[] HEAD = new byte[]{(byte) 0xEB, (byte) 0x90, (byte) 0xEB, (byte) 0x90, (byte) 0xEB, (byte) 0x90};
 
 	@Getter
 	private final AbstractCDTDataHandler dataHandler;

+ 8 - 11
protocol-core/src/main/java/wei/yigulu/netty/AbstractDelimiterHandler.java

@@ -43,7 +43,7 @@ public abstract class AbstractDelimiterHandler extends ChannelInboundHandlerAdap
 	@Setter
 	@Getter
 	@Accessors(chain = true)
-	protected  int maxLength = 10240;
+	protected int maxLength = 10240;
 
 
 	/**
@@ -52,16 +52,13 @@ public abstract class AbstractDelimiterHandler extends ChannelInboundHandlerAdap
 	@Setter
 	@Getter
 	@Accessors(chain = true)
-	protected  int maxTimeSpace=200;
-
-
+	protected int maxTimeSpace = 200;
 
 
 	/**
 	 * 拓展寄居 ByteBuf
 	 * 拓展规则是: 初始容量为 两个ByteBuf的长度和,内容是byteBuf1未读部分+ byteBuf2未读部分。
 	 *
-	 *
 	 * @param byteBuf1
 	 * @param byteBuf2
 	 * @return {@link ByteBuf}
@@ -94,7 +91,7 @@ public abstract class AbstractDelimiterHandler extends ChannelInboundHandlerAdap
 	 * @param head    头字节数组
 	 * @return int  头位置
 	 */
-	protected int getHeadIndex(int from, int end, ByteBuf byteBuf,byte[] head) {
+	protected int getHeadIndex(int from, int end, ByteBuf byteBuf, byte[] head) {
 		if (byteBuf.readableBytes() < head.length) {
 			return -1;
 		}
@@ -109,7 +106,7 @@ public abstract class AbstractDelimiterHandler extends ChannelInboundHandlerAdap
 	/**
 	 * 清除寄存ByteBuf的指向和内容
 	 */
-	protected void clearCumulation(){
+	protected void clearCumulation() {
 		while (!cumulation.release()) {
 		}
 		cumulation = null;
@@ -118,7 +115,7 @@ public abstract class AbstractDelimiterHandler extends ChannelInboundHandlerAdap
 	/**
 	 * 清除寄存ByteBuf的指向  并提供新的指向内容重新赋值
 	 */
-	protected void setCumulation(ByteBuf byteBuf){
+	protected void setCumulation(ByteBuf byteBuf) {
 		while (!cumulation.release()) {
 		}
 		cumulation = byteBuf;
@@ -129,7 +126,7 @@ public abstract class AbstractDelimiterHandler extends ChannelInboundHandlerAdap
 	 *
 	 * @param byteBuf 字节缓冲区
 	 */
-	protected void mergeOrFlushByTimeSpan(ByteBuf byteBuf){
+	protected void mergeOrFlushByTimeSpan(ByteBuf byteBuf) {
 		if (timeMark.plusMillis(getMaxTimeSpace()).isBeforeNow()) {
 			log.warn("上一帧数据长度不足,但两帧时间间隔较长上一帧被舍弃 舍弃的数据帧为:" + DataConvertor.ByteBuf2String(cumulation));
 			while (!cumulation.release()) {
@@ -149,14 +146,14 @@ public abstract class AbstractDelimiterHandler extends ChannelInboundHandlerAdap
 	 * @param byteBuf 字节缓冲区
 	 * @return boolean
 	 */
-	protected boolean isOverMaxLength(ByteBuf byteBuf){
+	protected boolean isOverMaxLength(ByteBuf byteBuf) {
 		if (byteBuf.readableBytes() > getMaxLength()) {
 			while (!cumulation.release()) {
 			}
 			cumulation = null;
 			log.warn("报文超长舍弃");
 			return true;
-		}else{
+		} else {
 			if (cumulation == null) {
 				cumulation = byteBuf;
 			} else {

+ 0 - 2
protocol-core/src/main/java/wei/yigulu/netty/AbstractHSTcpMasterBuilder.java

@@ -60,8 +60,6 @@ public abstract class AbstractHSTcpMasterBuilder extends AbstractTcpMasterBuilde
 	private Integer sparePort;
 
 
-
-
 	@Override
 	public ChannelFutureListener getOrCreateConnectionListener() {
 		if (this.connectionListener == null) {

+ 3 - 3
protocol-core/src/main/java/wei/yigulu/netty/AbstractMasterBuilder.java

@@ -59,8 +59,8 @@ public abstract class AbstractMasterBuilder extends BaseProtocolBuilder {
 		if (this.workGroup != null) {
 			this.workGroup.shutdownGracefully();
 		}
-		this.bootstrap=null;
-		this.workGroup=null;
+		this.bootstrap = null;
+		this.workGroup = null;
 	}
 
 
@@ -91,7 +91,7 @@ public abstract class AbstractMasterBuilder extends BaseProtocolBuilder {
 	/**
 	 * 创建Master 连接
 	 */
-	public  abstract void create();
+	public abstract void create();
 
 	/**
 	 * Create by un block

+ 5 - 6
protocol-core/src/main/java/wei/yigulu/netty/AbstractTcpMasterBuilder.java

@@ -78,11 +78,11 @@ public abstract class AbstractTcpMasterBuilder extends AbstractMasterBuilder {
 			}
 			log.debug("创建连接");
 			try {
-				SocketAddress remoteAddress= new InetSocketAddress(getIp(),getPort());
-				if(!StringUtil.isNullOrEmpty(getSelfIp()) && getSelfPort()!=null){
-					SocketAddress localAddress= new InetSocketAddress(getSelfIp(),getSelfPort());
-					future = getOrCreateBootstrap().connect(remoteAddress,localAddress);
-				}else{
+				SocketAddress remoteAddress = new InetSocketAddress(getIp(), getPort());
+				if (!StringUtil.isNullOrEmpty(getSelfIp()) && getSelfPort() != null) {
+					SocketAddress localAddress = new InetSocketAddress(getSelfIp(), getSelfPort());
+					future = getOrCreateBootstrap().connect(remoteAddress, localAddress);
+				} else {
 					future = getOrCreateBootstrap().connect(remoteAddress);
 				}
 				log.debug("为连接添加监听");
@@ -170,5 +170,4 @@ public abstract class AbstractTcpMasterBuilder extends AbstractMasterBuilder {
 	}
 
 
-
 }

+ 2 - 2
protocol-core/src/main/java/wei/yigulu/netty/AbstractTcpSlaverBuilder.java

@@ -81,9 +81,9 @@ public abstract class AbstractTcpSlaverBuilder extends BaseProtocolBuilder {
 		log.info("Slaver端启动成功;端口" + port);
 		// 关闭服务器通道
 		cf.channel().closeFuture().sync();
-	// 释放线程池资源
+		// 释放线程池资源
 		group.shutdownGracefully().sync();
-}
+	}
 
 
 	/**

+ 7 - 4
protocol-core/src/main/java/wei/yigulu/netty/BaseProtocolBuilder.java

@@ -1,6 +1,5 @@
 package wei.yigulu.netty;
 
-import io.netty.util.ResourceLeakDetector;
 import lombok.Getter;
 import lombok.Setter;
 import lombok.experimental.Accessors;
@@ -19,7 +18,7 @@ import java.util.UUID;
  */
 public class BaseProtocolBuilder {
 
-	public  BaseProtocolBuilder(){
+	public BaseProtocolBuilder() {
 		//ResourceLeakDetector.setLevel(ResourceLeakDetector.Level.ADVANCED);
 	}
 
@@ -42,8 +41,12 @@ public class BaseProtocolBuilder {
 
 	@Override
 	public boolean equals(Object o) {
-		if (this == o) {return true;}
-		if (o == null || getClass() != o.getClass()) {return false;}
+		if (this == o) {
+			return true;
+		}
+		if (o == null || getClass() != o.getClass()) {
+			return false;
+		}
 		BaseProtocolBuilder that = (BaseProtocolBuilder) o;
 		return builderId.equals(that.builderId);
 	}

+ 2 - 2
protocol-core/src/main/java/wei/yigulu/netty/HSConnectionListener.java

@@ -42,7 +42,7 @@ public class HSConnectionListener implements ChannelFutureListener {
 		if (channelFuture == null || channelFuture.channel() == null || !channelFuture.channel().isActive()) {
 			this.masterBuilder.getOrCreateWorkGroup().schedule(() -> {
 				try {
-					if(masterBuilder.future==null ||!masterBuilder.future.channel().isActive()) {
+					if (masterBuilder.future == null || !masterBuilder.future.channel().isActive()) {
 						if (this.retryTimes < 10) {
 							log.error("服务端{}:{}链接不上,开始重连操作,第{}次尝试", this.masterBuilder.getIp(), this.masterBuilder.getPort(), retryTimes);
 							masterBuilder.create();
@@ -58,7 +58,7 @@ public class HSConnectionListener implements ChannelFutureListener {
 							masterBuilder.create();
 							log.info("重置重试次数=0");
 						}
-					}else {
+					} else {
 						log.warn("masterBuilder在延迟过程中已由其他线程连接成功,此处略过重连");
 					}
 				} catch (Exception e) {

+ 3 - 3
protocol-core/src/main/java/wei/yigulu/netty/SimpleTcpConnectionListener.java

@@ -40,10 +40,10 @@ public class SimpleTcpConnectionListener implements ChannelFutureListener {
 		if (channelFuture == null || channelFuture.channel() == null || !channelFuture.channel().isActive()) {
 			this.future = this.masterBuilder.getOrCreateWorkGroup().schedule(() -> {
 				try {
-					if(masterBuilder.future==null ||!masterBuilder.future.channel().isActive()) {
+					if (masterBuilder.future == null || !masterBuilder.future.channel().isActive()) {
 						log.error("服务端{}:{}链接不上,开始重连操作", this.masterBuilder.getIp(), this.masterBuilder.getPort());
 						masterBuilder.create();
-					}else{
+					} else {
 						log.warn("masterBuilder在延迟过程中已由其他线程连接成功,此处略过重连");
 					}
 				} catch (Exception e) {
@@ -55,7 +55,7 @@ public class SimpleTcpConnectionListener implements ChannelFutureListener {
 					}
 				}
 			}, 6L, TimeUnit.SECONDS);
-		}else{
+		} else {
 			log.warn("masterBuilder已经连接成功,不进行重连操作");
 		}
 	}

+ 3 - 3
protocol-core/src/main/java/wei/yigulu/utils/DataConvertor.java

@@ -58,7 +58,7 @@ public class DataConvertor {
 		ByteBuf b1 = buf.copy();
 		byte[] bs = new byte[b1.readableBytes()];
 		b1.readBytes(bs);
-		ReferenceCountUtil.release( b1);
+		ReferenceCountUtil.release(b1);
 		return Byte2String(bs);
 	}
 
@@ -70,8 +70,8 @@ public class DataConvertor {
 	 * @return string
 	 */
 	public static String ByteBuf2StringAndRelease(ByteBuf buf) {
-		String s= ByteBuf2String(buf);
-		ReferenceCountUtil.release( buf);
+		String s = ByteBuf2String(buf);
+		ReferenceCountUtil.release(buf);
 		return s;
 
 	}

+ 4 - 5
protocol-iec104/src/main/java/wei/yigulu/iec104/apdumodel/Asdu.java

@@ -12,7 +12,6 @@ import wei.yigulu.iec104.asdudataframe.AbstractDataFrameType;
 import wei.yigulu.iec104.container.AsduTypeAnnotationContainer;
 import wei.yigulu.iec104.container.DataTypeClasses;
 
-import java.io.IOException;
 import java.lang.reflect.Method;
 import java.util.List;
 import java.util.Map;
@@ -26,7 +25,7 @@ import java.util.Map;
 @Data
 @AllArgsConstructor
 @NoArgsConstructor
-public class Asdu {
+public class Asdu<T extends AbstractDataFrameType> {
 
 	@Accessors(chain = true)
 	private Logger log = LoggerFactory.getLogger(this.getClass());
@@ -122,7 +121,7 @@ public class Asdu {
 	 * 数据单元 数据单元的类型是有typeId决定的
 	 * 类型不同里面说承载的数据也不同
 	 */
-	protected AbstractDataFrameType dataFrame;
+	protected T dataFrame;
 
 
 	/**
@@ -151,7 +150,7 @@ public class Asdu {
 		if (typeId < 128) {
 			Map<Integer, DataTypeClasses> map = AsduTypeAnnotationContainer.getInstance().getDataTypes();
 			if (map.containsKey(typeId)) {
-				dataFrame = (AbstractDataFrameType) (map.get(typeId).getTypeClass().newInstance());
+				this.setDataFrame((T) map.get(typeId).getTypeClass().newInstance());
 				Method load = map.get(typeId).getLoad();
 				load.invoke(dataFrame, dataInputStream, this.getVsq());
 			} else {
@@ -160,7 +159,7 @@ public class Asdu {
 				//throw new IOException("无法转换信息对象,由于类型标识未知: " + typeId);
 				log.error("无法转换信息对象,由于类型标识未知: " + typeId);
 			}
-			if(dataFrame!=null) {
+			if (dataFrame != null) {
 				log.debug(dataFrame.toString());
 			}
 			privateInformation = null;

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

@@ -46,10 +46,10 @@ public class BooleanType extends AbstractDataFrameType {
 	 * @throws Iec104Exception iec exception
 	 */
 	public BooleanType(List<InformationBodyAddress> addresses, List<IeBoolean> datas) throws Iec104Exception {
-		if(datas.size()> SendDataFrameHelper.MAXCONTINUITYYXNUM){
+		if (datas.size() > SendDataFrameHelper.MAXCONTINUITYYXNUM) {
 			throw new Iec104Exception("数据个数过多,创建对象失败,请切割数据。");
 		}
-		if ((this.datas.size()*IeBoolean.OCCUPYBYTES + this.addresses.size() * InformationBodyAddress.OCCUPYBYTES) > 240) {
+		if ((this.datas.size() * IeBoolean.OCCUPYBYTES + this.addresses.size() * InformationBodyAddress.OCCUPYBYTES) > 240) {
 			throw new Iec104Exception("长度超长,创建对象失败,请切割数据。");
 		}
 		this.addresses = addresses;
@@ -100,7 +100,7 @@ public class BooleanType extends AbstractDataFrameType {
 	 * @throws Iec104Exception iec exception
 	 */
 	protected void validateLen(int increase) throws Iec104Exception {
-		if(datas.size()> SendDataFrameHelper.MAXCONTINUITYYXNUM){
+		if (datas.size() > SendDataFrameHelper.MAXCONTINUITYYXNUM) {
 			throw new Iec104Exception("数据个数过多,不能再向此对象中添加元素");
 		}
 		if ((this.datas.size() * IeBoolean.OCCUPYBYTES + this.addresses.size() * InformationBodyAddress.OCCUPYBYTES + increase) > 240) {
@@ -149,8 +149,8 @@ public class BooleanType extends AbstractDataFrameType {
 					datas.add(new IeBoolean(is));
 				}
 			}
-		}catch (Iec104Exception e){
-			if(e.getCode()==3301){
+		} catch (Iec104Exception e) {
+			if (e.getCode() == 3301) {
 				return;
 			}
 		}

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

@@ -67,8 +67,8 @@ public class NoQualityNormalizedIntegerType extends AbstractDataFrameType {
 					datas.add(f);
 				}
 			}
-		}catch (Iec104Exception e){
-			if(e.getCode()==3301){
+		} catch (Iec104Exception e) {
+			if (e.getCode() == 3301) {
 				return;
 			}
 		}
@@ -145,7 +145,7 @@ public class NoQualityNormalizedIntegerType extends AbstractDataFrameType {
 	 * @throws Iec104Exception iec exception
 	 */
 	protected void validateLen(int increase) throws Iec104Exception {
-		if ((this.datas.size() * IeShortInteger.OCCUPYBYTES + this.addresses.size() * InformationBodyAddress.OCCUPYBYTES+increase) > 240){
+		if ((this.datas.size() * IeShortInteger.OCCUPYBYTES + this.addresses.size() * InformationBodyAddress.OCCUPYBYTES + increase) > 240) {
 			throw new Iec104Exception("长度超长,不能再向此对象中添加元素");
 		}
 	}

+ 17 - 16
protocol-iec104/src/main/java/wei/yigulu/iec104/asdudataframe/NormalizedIntegerType.java

@@ -45,7 +45,7 @@ public class NormalizedIntegerType extends AbstractDataFrameType {
 	 * @throws Iec104Exception iec exception
 	 */
 	public NormalizedIntegerType(List<InformationBodyAddress> addresses, Map<IeMeasuredQuality, Integer> datas) throws Iec104Exception {
-		if ((this.datas.size() * (IeMeasuredQuality.OCCUPYBYTES+IeShortInteger.OCCUPYBYTES) + this.addresses.size() * InformationBodyAddress.OCCUPYBYTES) > 240) {
+		if ((this.datas.size() * (IeMeasuredQuality.OCCUPYBYTES + IeShortInteger.OCCUPYBYTES) + this.addresses.size() * InformationBodyAddress.OCCUPYBYTES) > 240) {
 			throw new Iec104Exception("长度超长,创建对象失败,请切割数据。");
 		}
 		this.addresses = addresses;
@@ -56,21 +56,22 @@ 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++) {
+		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){
+		} catch (Iec104Exception e) {
+			if (e.getCode() == 3301) {
 				return;
 			}
 		}
@@ -94,7 +95,7 @@ public class NormalizedIntegerType extends AbstractDataFrameType {
 	 * @throws Iec104Exception iec exception
 	 */
 	public void addData(int f, IeMeasuredQuality quality) throws Iec104Exception {
-		validateLen(IeShortInteger.OCCUPYBYTES+IeMeasuredQuality.OCCUPYBYTES);
+		validateLen(IeShortInteger.OCCUPYBYTES + IeMeasuredQuality.OCCUPYBYTES);
 		this.datas.put(quality, f);
 	}
 
@@ -175,7 +176,7 @@ public class NormalizedIntegerType extends AbstractDataFrameType {
 	 * @throws Iec104Exception iec exception
 	 */
 	protected void validateLen(int increase) throws Iec104Exception {
-		if (((this.datas.size() * (IeMeasuredQuality.OCCUPYBYTES+IeShortInteger.OCCUPYBYTES) + this.addresses.size() * InformationBodyAddress.OCCUPYBYTES) + increase) > 240) {
+		if (((this.datas.size() * (IeMeasuredQuality.OCCUPYBYTES + IeShortInteger.OCCUPYBYTES) + this.addresses.size() * InformationBodyAddress.OCCUPYBYTES) + increase) > 240) {
 			throw new Iec104Exception("长度超长,不能再向此对象中添加元素");
 		}
 	}

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

@@ -61,8 +61,8 @@ public class ProofreadTimeType extends AbstractDataFrameType {
 		try {
 			address = new InformationBodyAddress(is);
 			ieProofreadTime = new IeProofreadTime(is);
-		}catch (Iec104Exception e){
-			if(e.getCode()==3301){
+		} catch (Iec104Exception e) {
+			if (e.getCode() == 3301) {
 				return;
 			}
 		}

+ 119 - 1
protocol-iec104/src/main/java/wei/yigulu/iec104/asdudataframe/ShortFloatCommand.java

@@ -1,10 +1,128 @@
 package wei.yigulu.iec104.asdudataframe;
 
+import io.netty.buffer.ByteBuf;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+import wei.yigulu.iec104.apdumodel.Apdu;
+import wei.yigulu.iec104.apdumodel.Asdu;
+import wei.yigulu.iec104.apdumodel.Vsq;
+import wei.yigulu.iec104.asdudataframe.qualitydescription.IeMeasuredQuality;
+import wei.yigulu.iec104.asdudataframe.typemodel.IeShortFloat;
+import wei.yigulu.iec104.asdudataframe.typemodel.InformationBodyAddress;
+import wei.yigulu.iec104.exception.Iec104Exception;
+import wei.yigulu.iec104.nettyconfig.TechnicalTerm;
+import wei.yigulu.iec104.util.CommandWaiter;
+import wei.yigulu.iec104.util.SendAndReceiveNumUtil;
+import wei.yigulu.iec104.util.SendCommandHelper;
+
+import java.util.List;
+
 /**
  * 遥测控制命令
  *
  * @author: xiuwei
  * @version:
  */
-public class ShortFloatCommand {
+@NoArgsConstructor
+@Data
+public class ShortFloatCommand extends AbstractDataFrameType {
+
+	/**
+	 * TYPEID
+	 */
+	public static final int TYPEID = TechnicalTerm.SHORT_FLOAT_COMMAND_TYPE;
+
+	private InformationBodyAddress addresses = new InformationBodyAddress();
+
+	private Float val = new Float(0);
+
+	private IeMeasuredQuality quality = new IeMeasuredQuality();
+
+
+	/**
+	 * 短浮命令
+	 *
+	 * @param address 地址
+	 * @param val     值
+	 * @param quality 质量
+	 */
+	public ShortFloatCommand(Integer address, Float val, IeMeasuredQuality quality) {
+		if (address != null) {
+			this.addresses = new InformationBodyAddress(address);
+		}
+		if (val != null) {
+			this.val = val;
+		}
+		if (quality != null) {
+			this.quality = quality;
+		}
+	}
+
+	/**
+	 * 短浮命令
+	 *
+	 * @param address 地址
+	 * @param val     值
+	 */
+	public ShortFloatCommand(Integer address, Float val) {
+		new ShortFloatCommand(address, val, null);
+	}
+
+
+	@Override
+	public void loadByteBuf(ByteBuf is, Vsq vsq) {
+		try {
+			this.addresses = new InformationBodyAddress(is);
+			this.val = new IeShortFloat(is).getValue();
+			this.quality = new IeMeasuredQuality(is);
+		} catch (Iec104Exception e) {
+			e.printStackTrace();
+		}
+	}
+
+	@Override
+	public void encode(List<Byte> buffer) {
+		this.addresses.encode(buffer);
+		new IeShortFloat(this.val).encode(buffer);
+		buffer.add((byte) this.quality.encode());
+	}
+
+	@Override
+	public Asdu generateBack() {
+		Asdu asdu = new Asdu();
+		asdu.setTypeId(TYPEID);
+		asdu.setDataFrame(this);
+		asdu.getVsq().setSq(0);
+		asdu.getVsq().setNum(1);
+		asdu.setOriginatorAddress(0);
+		asdu.setCommonAddress(1);
+		return asdu;
+	}
+
+	@Override
+	public byte[][] handleAndAnswer(Apdu apdu) throws Exception {
+		if (apdu.getAsdu().getCot().getNot() == 6) {
+			byte[][] bs = new byte[1][];
+			apdu.getAsdu().getCot().setNot(7);
+			SendAndReceiveNumUtil.setSendAndReceiveNum(apdu, apdu.getChannel().id());
+			bs[0] = apdu.encode();
+			return bs;
+		} else {
+			ShortFloatCommand shortFloatCommand = (ShortFloatCommand) apdu.getAsdu().getDataFrame();
+			CommandWaiter commandWaiter = new CommandWaiter(apdu.getChannel().id(), apdu, shortFloatCommand.getAddresses().getAddress());
+			commandWaiter.set(new IeShortFloat(shortFloatCommand.getVal()));
+			SendCommandHelper.setIecValue(commandWaiter);
+			return null;
+		}
+	}
+
+
+	@Override
+	public String toString() {
+		String s = "短浮点控制命令——";
+		s += "地址:" + this.addresses.toString();
+		s += "设定值:" + this.val + ";";
+		s += this.quality.toString();
+		return s;
+	}
 }

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

@@ -46,7 +46,7 @@ public class ShortFloatType extends AbstractDataFrameType {
 	 * @throws Iec104Exception iec exception
 	 */
 	public ShortFloatType(List<InformationBodyAddress> addresses, Map<IeMeasuredQuality, Float> datas) throws Iec104Exception {
-		if ((this.datas.size() * (IeShortFloat.OCCUPYBYTES+IeMeasuredQuality.OCCUPYBYTES) + this.addresses.size() * InformationBodyAddress.OCCUPYBYTES) > 240) {
+		if ((this.datas.size() * (IeShortFloat.OCCUPYBYTES + IeMeasuredQuality.OCCUPYBYTES) + this.addresses.size() * InformationBodyAddress.OCCUPYBYTES) > 240) {
 			throw new Iec104Exception("长度超长,创建对象失败,请切割数据。");
 		}
 		this.addresses = addresses;
@@ -72,7 +72,7 @@ public class ShortFloatType extends AbstractDataFrameType {
 	 * @throws Iec104Exception iec exception
 	 */
 	public void addData(float f, IeMeasuredQuality quality) throws Iec104Exception {
-		validateLen(IeShortFloat.OCCUPYBYTES+IeMeasuredQuality.OCCUPYBYTES);
+		validateLen(IeShortFloat.OCCUPYBYTES + IeMeasuredQuality.OCCUPYBYTES);
 		this.datas.put(quality, f);
 	}
 
@@ -154,7 +154,7 @@ public class ShortFloatType extends AbstractDataFrameType {
 	 * @throws Iec104Exception iec exception
 	 */
 	protected void validateLen(int increase) throws Iec104Exception {
-		if ((this.datas.size() * (IeShortFloat.OCCUPYBYTES+IeMeasuredQuality.OCCUPYBYTES) + this.addresses.size() * InformationBodyAddress.OCCUPYBYTES + increase) > 240) {
+		if ((this.datas.size() * (IeShortFloat.OCCUPYBYTES + IeMeasuredQuality.OCCUPYBYTES) + this.addresses.size() * InformationBodyAddress.OCCUPYBYTES + increase) > 240) {
 			throw new Iec104Exception("长度超长,不能再向此对象中添加元素");
 		}
 	}
@@ -176,8 +176,8 @@ public class ShortFloatType extends AbstractDataFrameType {
 					datas.put(new IeMeasuredQuality(is), f);
 				}
 			}
-		}catch (Iec104Exception e){
-			if(e.getCode()==3301){
+		} catch (Iec104Exception e) {
+			if (e.getCode() == 3301) {
 				return;
 			}
 		}

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

@@ -45,7 +45,7 @@ public class ShortIntegerType extends AbstractDataFrameType {
 	 * @throws Iec104Exception iec exception
 	 */
 	public ShortIntegerType(List<InformationBodyAddress> addresses, Map<IeMeasuredQuality, Integer> datas) throws Iec104Exception {
-		if ((this.datas.size() * (IeShortInteger.OCCUPYBYTES+IeMeasuredQuality.OCCUPYBYTES) + this.addresses.size() * InformationBodyAddress.OCCUPYBYTES) > 240) {
+		if ((this.datas.size() * (IeShortInteger.OCCUPYBYTES + IeMeasuredQuality.OCCUPYBYTES) + this.addresses.size() * InformationBodyAddress.OCCUPYBYTES) > 240) {
 			throw new Iec104Exception("长度超长,创建对象失败,请切割数据。");
 		}
 		this.addresses = addresses;
@@ -70,8 +70,8 @@ public class ShortIntegerType extends AbstractDataFrameType {
 					datas.put(new IeMeasuredQuality(is), f);
 				}
 			}
-		}catch (Iec104Exception e){
-			if(e.getCode()==3301){
+		} catch (Iec104Exception e) {
+			if (e.getCode() == 3301) {
 				return;
 			}
 		}
@@ -95,7 +95,7 @@ public class ShortIntegerType extends AbstractDataFrameType {
 	 * @throws Iec104Exception iec exception
 	 */
 	public void addData(int f, IeMeasuredQuality quality) throws Iec104Exception {
-		validateLen(IeShortInteger.OCCUPYBYTES+IeMeasuredQuality.OCCUPYBYTES);
+		validateLen(IeShortInteger.OCCUPYBYTES + IeMeasuredQuality.OCCUPYBYTES);
 		this.datas.put(quality, f);
 	}
 
@@ -176,7 +176,7 @@ public class ShortIntegerType extends AbstractDataFrameType {
 	 * @throws Iec104Exception iec exception
 	 */
 	protected void validateLen(int increase) throws Iec104Exception {
-		if ((this.datas.size() * (IeShortInteger.OCCUPYBYTES+IeMeasuredQuality.OCCUPYBYTES) + this.addresses.size() * InformationBodyAddress.OCCUPYBYTES+ increase) > 240) {
+		if ((this.datas.size() * (IeShortInteger.OCCUPYBYTES + IeMeasuredQuality.OCCUPYBYTES) + this.addresses.size() * InformationBodyAddress.OCCUPYBYTES + increase) > 240) {
 			throw new Iec104Exception("长度超长,不能再向此对象中添加元素");
 		}
 	}

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

@@ -30,7 +30,7 @@ public class TotalSummonType extends AbstractDataFrameType {
 	 */
 	public static final int TYPEID = TechnicalTerm.TOTAL_SUMMONTYPE_TYPE;
 
-	private InformationBodyAddress address=new InformationBodyAddress(20);
+	private InformationBodyAddress address = new InformationBodyAddress(20);
 
 	private int value;
 
@@ -60,8 +60,8 @@ public class TotalSummonType extends AbstractDataFrameType {
 		try {
 			this.address = new InformationBodyAddress(is);
 			this.value = (is.readByte() & 0xff);
-		}catch (Iec104Exception e){
-			if(e.getCode()==3301){
+		} catch (Iec104Exception e) {
+			if (e.getCode() == 3301) {
 				return;
 			}
 		}

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

@@ -18,7 +18,7 @@ import wei.yigulu.iec104.exception.Iec104Exception;
 @NoArgsConstructor
 public class IeAbstractQuality {
 
-	public static final int  OCCUPYBYTES=1;
+	public static final int OCCUPYBYTES = 1;
 
 	/**
 	 * 品质的值
@@ -52,8 +52,8 @@ public class IeAbstractQuality {
 	 * @param is is
 	 */
 	public IeAbstractQuality(ByteBuf is) throws Iec104Exception {
-		if(is.readableBytes()<OCCUPYBYTES){
-			throw new Iec104Exception(3301,"可用字节不足,不能进行读取");
+		if (is.readableBytes() < OCCUPYBYTES) {
+			throw new Iec104Exception(3301, "可用字节不足,不能进行读取");
 		}
 		this.value = (is.readByte() & 0xff);
 		this.blocked = (value & 0x10) == 0x10;

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

@@ -19,7 +19,7 @@ import wei.yigulu.iec104.exception.Iec104Exception;
 @EqualsAndHashCode
 public class IeMeasuredQuality extends IeAbstractQuality {
 
-	public static final int  OCCUPYBYTES=1;
+	public static final int OCCUPYBYTES = 1;
 
 	/**
 	 * 是否溢出 0 代表未溢出;1 代表溢出

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

@@ -18,9 +18,9 @@ import wei.yigulu.iec104.exception.Iec104Exception;
 @AllArgsConstructor
 @NoArgsConstructor
 @Data
-public class IeBoolean extends IeAbstractQuality {
+public class IeBoolean extends IeAbstractQuality implements IecDataInterface {
 
-	public static final int  OCCUPYBYTES=1;
+	public static final int OCCUPYBYTES = 1;
 
 	/**
 	 * 信息状态,是否开闸 1:合;2:开
@@ -51,4 +51,9 @@ public class IeBoolean extends IeAbstractQuality {
 	public String toString() {
 		return "开关量, 是否开闸: " + isOn() + ", " + super.toString() + ";\n";
 	}
+
+	@Override
+	public Boolean getIecValue() {
+		return this.on;
+	}
 }

+ 7 - 1
protocol-iec104/src/main/java/wei/yigulu/iec104/asdudataframe/typemodel/IeBooleanCommand.java

@@ -6,5 +6,11 @@ package wei.yigulu.iec104.asdudataframe.typemodel;
  * @author: xiuwei
  * @version:
  */
-public class IeBooleanCommand {
+public class IeBooleanCommand implements IecDataInterface {
+
+
+	@Override
+	public Object getIecValue() {
+		return null;
+	}
 }

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

@@ -16,9 +16,9 @@ import java.util.List;
 @Data
 @AllArgsConstructor
 @NoArgsConstructor
-public class IeFourByteInteger {
+public class IeFourByteInteger implements IecDataInterface {
 
-	public static final int  OCCUPYBYTES=4;
+	public static final int OCCUPYBYTES = 4;
 
 	private Integer value;
 
@@ -44,4 +44,8 @@ public class IeFourByteInteger {
 		buffer.add((byte) (tempVal >> 24));
 	}
 
+	@Override
+	public Integer getIecValue() {
+		return this.value;
+	}
 }

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

@@ -21,7 +21,7 @@ import java.util.List;
 @AllArgsConstructor
 @Data
 public class IeProofreadTime {
-	public static final int  OCCUPYBYTES=7;
+	public static final int OCCUPYBYTES = 7;
 
 	private DateTime time = new DateTime();
 
@@ -33,8 +33,8 @@ public class IeProofreadTime {
 	 * @param is is
 	 */
 	public IeProofreadTime(ByteBuf is) throws Iec104Exception {
-		if(is.readableBytes()<OCCUPYBYTES){
-			throw new Iec104Exception(3301,"可用字节不足,不能进行读取");
+		if (is.readableBytes() < OCCUPYBYTES) {
+			throw new Iec104Exception(3301, "可用字节不足,不能进行读取");
 		}
 		byte[] btime = new byte[7];
 		is.readBytes(btime);

+ 9 - 4
protocol-iec104/src/main/java/wei/yigulu/iec104/asdudataframe/typemodel/IeShortFloat.java

@@ -17,9 +17,9 @@ import java.util.List;
 @Data
 @AllArgsConstructor
 @NoArgsConstructor
-public class IeShortFloat {
+public class IeShortFloat implements IecDataInterface {
 
-	public static final int  OCCUPYBYTES=4;
+	public static final int OCCUPYBYTES = 4;
 
 	private float value;
 
@@ -29,8 +29,8 @@ public class IeShortFloat {
 	 * @param is is
 	 */
 	public IeShortFloat(ByteBuf is) throws Iec104Exception {
-		if(is.readableBytes()<OCCUPYBYTES){
-			throw new Iec104Exception(3301,"可用字节不足,不能进行读取");
+		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));
@@ -55,4 +55,9 @@ public class IeShortFloat {
 	public String toString() {
 		return "短浮点数值: " + value;
 	}
+
+	@Override
+	public Float getIecValue() {
+		return this.value;
+	}
 }

+ 9 - 5
protocol-iec104/src/main/java/wei/yigulu/iec104/asdudataframe/typemodel/IeShortInteger.java

@@ -17,9 +17,9 @@ import java.util.List;
 @Data
 @AllArgsConstructor
 @NoArgsConstructor
-public class IeShortInteger {
+public class IeShortInteger implements IecDataInterface {
 
-	public static final int  OCCUPYBYTES=2;
+	public static final int OCCUPYBYTES = 2;
 
 	private Integer value;
 
@@ -29,10 +29,10 @@ public class IeShortInteger {
 	 * @param is is
 	 */
 	public IeShortInteger(ByteBuf is) throws Iec104Exception {
-		if(is.readableBytes()<OCCUPYBYTES){
-			throw new Iec104Exception(3301,"可用字节不足,不能进行读取");
+		if (is.readableBytes() < OCCUPYBYTES) {
+			throw new Iec104Exception(3301, "可用字节不足,不能进行读取");
 		}
-		value =((short) ((is.readByte() & 0xff) | ((is.readByte() & 0xff) << 8)))+0;
+		value = ((short) ((is.readByte() & 0xff) | ((is.readByte() & 0xff) << 8))) + 0;
 	}
 
 	/**
@@ -46,4 +46,8 @@ public class IeShortInteger {
 		buffer.add((byte) (tempVal >> 8));
 	}
 
+	@Override
+	public Integer getIecValue() {
+		return this.value;
+	}
 }

+ 10 - 0
protocol-iec104/src/main/java/wei/yigulu/iec104/asdudataframe/typemodel/IecDataInterface.java

@@ -7,4 +7,14 @@ package wei.yigulu.iec104.asdudataframe.typemodel;
  * @create: 2021-05-10 15:07
  */
 public interface IecDataInterface {
+
+
+	/**
+	 * 获取代表值
+	 *
+	 * @return {@link Object}
+	 */
+	Object getIecValue();
+
+
 }

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

@@ -19,7 +19,7 @@ import java.util.List;
 @AllArgsConstructor
 public class InformationBodyAddress {
 
-	public static final int  OCCUPYBYTES=3;
+	public static final int OCCUPYBYTES = 3;
 
 	/**
 	 * 信息体地址
@@ -46,8 +46,8 @@ public class InformationBodyAddress {
 	 * @param is is
 	 */
 	public InformationBodyAddress(ByteBuf is) throws Iec104Exception {
-		if(is.readableBytes()<OCCUPYBYTES){
-			throw new Iec104Exception(3301,"可用字节不足,不能进行读取");
+		if (is.readableBytes() < OCCUPYBYTES) {
+			throw new Iec104Exception(3301, "可用字节不足,不能进行读取");
 		}
 		this.address = (is.readByte() & 0xff) | ((is.readByte() & 0xff) << 8) | ((is.readByte() & 0xff) << 16);
 	}

+ 2 - 2
protocol-iec104/src/main/java/wei/yigulu/iec104/container/Iec104Link.java

@@ -25,12 +25,12 @@ public class Iec104Link {
 	 * @param port         port
 	 * @param oppositeRole opposite role
 	 */
-	public Iec104Link(Channel channel, String ip, Integer port, Role oppositeRole,Logger logger) {
+	public Iec104Link(Channel channel, String ip, Integer port, Role oppositeRole, Logger logger) {
 		this.channel = channel;
 		this.oppositeIp = ip;
 		this.oppositePort = port;
 		this.oppositeRole = oppositeRole;
-		this.log=logger;
+		this.log = logger;
 		iReceive = 0;
 		iSend = 0;
 	}

+ 5 - 8
protocol-iec104/src/main/java/wei/yigulu/iec104/nettyconfig/AllCustomDelimiterHandler.java

@@ -2,14 +2,11 @@ package wei.yigulu.iec104.nettyconfig;
 
 
 import io.netty.buffer.ByteBuf;
-import io.netty.buffer.ByteBufUtil;
 import io.netty.channel.ChannelHandlerContext;
 import org.joda.time.DateTime;
 import wei.yigulu.netty.AbstractDelimiterHandler;
 import wei.yigulu.utils.DataConvertor;
 
-import java.util.HashMap;
-
 
 /**
  * 未继承netty的数据帧处理拆包类
@@ -24,15 +21,15 @@ public class AllCustomDelimiterHandler extends AbstractDelimiterHandler {
 	private static final byte[] HEAD = new byte[]{0x68};
 
 
-	public AllCustomDelimiterHandler(){
-		super.maxTimeSpace=100;
-		super.maxLength=10240;
+	public AllCustomDelimiterHandler() {
+		super.maxTimeSpace = 100;
+		super.maxLength = 10240;
 	}
 
 
 	@Override
 	public void channelRead(ChannelHandlerContext ctx, Object msg) throws Exception {
-		if(isOverMaxLength((ByteBuf) msg)){
+		if (isOverMaxLength((ByteBuf) msg)) {
 			return;
 		}
 		int len;
@@ -61,7 +58,7 @@ public class AllCustomDelimiterHandler extends AbstractDelimiterHandler {
 				//如果数据帧长度足够 将规定长度的直接加入out 队列
 				ctx.fireChannelRead(cumulation.readBytes(len + 2));
 				//查看后续的字节里面头字节的位置
-				headIndex = getHeadIndex(cumulation.readerIndex(), cumulation.writerIndex(), cumulation,HEAD);
+				headIndex = getHeadIndex(cumulation.readerIndex(), cumulation.writerIndex(), cumulation, HEAD);
 			}
 		}
 		if (cumulation.readableBytes() != 0 && headIndex >= cumulation.readerIndex()) {

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

@@ -29,6 +29,7 @@ public class Iec104MasterBuilder extends AbstractTcpMasterBuilder {
 
 	private static final int HEARTBEAT = PropertiesReader.getInstance().getIntProp(HEARTBEATPROPNAME, HEARTBEATDEFVAL);
 
+
 	/**
 	 * Simple master builder
 	 *

+ 5 - 6
protocol-iec104/src/main/java/wei/yigulu/iec104/nettyconfig/Iec104SlaverBuilder.java

@@ -20,7 +20,6 @@ import wei.yigulu.netty.ProtocolChannelInitializer;
 public class Iec104SlaverBuilder extends AbstractTcpSlaverBuilder {
 
 
-
 	public Iec104SlaverBuilder(int port) {
 		super(port);
 	}
@@ -28,11 +27,11 @@ public class Iec104SlaverBuilder extends AbstractTcpSlaverBuilder {
 	@Override
 	protected ProtocolChannelInitializer getOrCreateChannelInitializer() {
 		return new ProtocolChannelInitializer<SocketChannel>(this) {
-				@Override
-				protected void initChannel(SocketChannel ch) throws Exception {
-					ch.pipeline().addLast(new AllCustomDelimiterHandler());
-					ch.pipeline().addLast(new Slave104Handle((Iec104SlaverBuilder) builder));
-				}
+			@Override
+			protected void initChannel(SocketChannel ch) throws Exception {
+				ch.pipeline().addLast(new AllCustomDelimiterHandler());
+				ch.pipeline().addLast(new Slave104Handle((Iec104SlaverBuilder) builder));
+			}
 
 		};
 	}

+ 2 - 5
protocol-iec104/src/main/java/wei/yigulu/iec104/nettyconfig/Master104Handle.java

@@ -4,10 +4,8 @@ package wei.yigulu.iec104.nettyconfig;
 import io.netty.buffer.ByteBuf;
 import io.netty.buffer.Unpooled;
 import io.netty.channel.ChannelHandlerContext;
-import io.netty.channel.ChannelInboundHandlerAdapter;
 import io.netty.channel.SimpleChannelInboundHandler;
 import io.netty.handler.timeout.IdleStateEvent;
-import io.netty.util.ReferenceCountUtil;
 import lombok.NoArgsConstructor;
 import org.slf4j.Logger;
 import wei.yigulu.iec104.apdumodel.Apdu;
@@ -59,12 +57,11 @@ public class Master104Handle extends SimpleChannelInboundHandler<ByteBuf> {
 	private Class<? extends Apdu> apduClass = Apdu.class;
 
 
-
 	@Override
 	public void channelRead0(ChannelHandlerContext ctx, ByteBuf msg) throws Exception {
 		//收数据
 		log.debug("----------------------------------------------------------------------------------");
-		log.debug("re <= "+DataConvertor.ByteBuf2String(msg));
+		log.debug("re <= " + DataConvertor.ByteBuf2String(msg));
 		Apdu apdu = apduClass.newInstance().setChannel(ctx.channel()).setIec104Builder(masterBuilder).setLog(log).loadByteBuf(msg);
 		if (apdu.getApciType() == Apdu.ApciType.I_FORMAT) {
 			this.testNum = 0;
@@ -95,7 +92,7 @@ public class Master104Handle extends SimpleChannelInboundHandler<ByteBuf> {
 		String clientIp = ipSocket.getAddress().getHostAddress();
 		Integer clientPort = ipSocket.getPort();
 		log.info("连接" + clientIp + ":" + clientPort + "服务端成功");
-		LinkContainer.getInstance().getLinks().put(ctx.channel().id(), new Iec104Link(ctx.channel(), clientIp, clientPort, Iec104Link.Role.SLAVER,masterBuilder.getLog()));
+		LinkContainer.getInstance().getLinks().put(ctx.channel().id(), new Iec104Link(ctx.channel(), clientIp, clientPort, Iec104Link.Role.SLAVER, masterBuilder.getLog()));
 		ctx.writeAndFlush(Unpooled.copiedBuffer(TechnicalTerm.START));
 		this.masterBuilder.connected();
 	}

+ 2 - 3
protocol-iec104/src/main/java/wei/yigulu/iec104/nettyconfig/Slave104Handle.java

@@ -4,7 +4,6 @@ package wei.yigulu.iec104.nettyconfig;
 import io.netty.buffer.ByteBuf;
 import io.netty.buffer.Unpooled;
 import io.netty.channel.ChannelHandlerContext;
-import io.netty.channel.ChannelInboundHandlerAdapter;
 import io.netty.channel.SimpleChannelInboundHandler;
 import lombok.NoArgsConstructor;
 import org.slf4j.Logger;
@@ -57,7 +56,7 @@ public class Slave104Handle extends SimpleChannelInboundHandler<ByteBuf> {
 	public void channelRead0(ChannelHandlerContext ctx, ByteBuf msg) throws Exception {
 		//收数据
 		log.debug("----------------------------------------------------------------------------------");
-		log.debug("re <= "+DataConvertor.ByteBuf2String( msg));
+		log.debug("re <= " + DataConvertor.ByteBuf2String(msg));
 		Apdu apdu = apduClass.newInstance().setChannel(ctx.channel()).setIec104Builder(slaverBuilder).setLog(slaverBuilder.getLog()).loadByteBuf(msg);
 		apdu.answer();
 	}
@@ -81,7 +80,7 @@ public class Slave104Handle extends SimpleChannelInboundHandler<ByteBuf> {
 			return;
 		}
 		log.info(clientIp + ":" + clientPort + "客户端连接");
-		LinkContainer.getInstance().getLinks().put(ctx.channel().id(), new Iec104Link(ctx.channel(), clientIp, clientPort, Iec104Link.Role.MASTER,slaverBuilder.getLog()));
+		LinkContainer.getInstance().getLinks().put(ctx.channel().id(), new Iec104Link(ctx.channel(), clientIp, clientPort, Iec104Link.Role.MASTER, slaverBuilder.getLog()));
 		this.slaverBuilder.connected(ipSocket);
 		this.slaverBuilder.getChannels().add(ctx.channel());
 		if (STARTASK) {

+ 6 - 0
protocol-iec104/src/main/java/wei/yigulu/iec104/nettyconfig/TechnicalTerm.java

@@ -113,6 +113,12 @@ public class TechnicalTerm {
 
 
 	/**
+	 * 设置短浮点命令
+	 */
+	public static final Integer SHORT_FLOAT_COMMAND_TYPE = 0x32;
+
+
+	/**
 	 * 对时帧
 	 */
 	public static final Integer DATESYNCHRONIZATION_TYPE = 0x67;

+ 83 - 2
protocol-iec104/src/main/java/wei/yigulu/iec104/util/CommandWaiter.java

@@ -1,8 +1,89 @@
 package wei.yigulu.iec104.util;
 
+import io.netty.channel.ChannelId;
+import lombok.Data;
+import wei.yigulu.iec104.apdumodel.Apdu;
+import wei.yigulu.iec104.asdudataframe.typemodel.IecDataInterface;
+
 /**
- * @author: xiuwei
- * @version:
+ * 命令等待者
+ *
+ * @author xiuwei
+ * @date 2021/05/11
  */
+@Data
 public class CommandWaiter {
+
+	/**
+	 * 通道Id
+	 */
+	ChannelId channelId;
+	/**
+	 * 源地址
+	 */
+	Integer sourceAddress;
+	/**
+	 * 公共地址
+	 */
+	Integer commonAddress;
+	/**
+	 * 报文类型
+	 */
+	Integer typeId;
+	/**
+	 * 数据地址位   在设计上暂时未考虑136类型的多点同时控制的情况
+	 */
+	Integer dataAddress;
+
+	IecDataInterface data = null;
+
+	public CommandWaiter(ChannelId channelId, Apdu apdu, Integer dataAddress) {
+		this.channelId = channelId;
+		this.commonAddress = apdu.getAsdu().getCommonAddress();
+		this.sourceAddress = apdu.getAsdu().getOriginatorAddress();
+		this.commonAddress = apdu.getAsdu().getCommonAddress();
+		this.typeId = apdu.getAsdu().getTypeId();
+		this.dataAddress = dataAddress;
+	}
+
+	public synchronized IecDataInterface get() {
+		if (this.data == null) {
+			try {
+				this.wait(5000);
+			} catch (InterruptedException e) {
+				e.printStackTrace();
+			}
+		}
+		return this.data;
+	}
+
+	public synchronized void set(IecDataInterface data) {
+		this.data = data;
+		this.notifyAll();
+	}
+
+
+	@Override
+	public boolean equals(Object o) {
+		if (this == o) return true;
+		if (o == null || getClass() != o.getClass()) return false;
+
+		CommandWaiter that = (CommandWaiter) o;
+
+		if (!channelId.equals(that.channelId)) return false;
+		if (!sourceAddress.equals(that.sourceAddress)) return false;
+		if (!commonAddress.equals(that.commonAddress)) return false;
+		if (!typeId.equals(that.typeId)) return false;
+		return dataAddress.equals(that.dataAddress);
+	}
+
+	@Override
+	public int hashCode() {
+		int result = channelId.hashCode();
+		result = 31 * result + sourceAddress.hashCode();
+		result = 31 * result + commonAddress.hashCode();
+		result = 31 * result + typeId.hashCode();
+		result = 31 * result + dataAddress.hashCode();
+		return result;
+	}
 }

+ 0 - 2
protocol-iec104/src/main/java/wei/yigulu/iec104/util/SendAndReceiveNumUtil.java

@@ -56,7 +56,6 @@ public class SendAndReceiveNumUtil {
 	public static void sendIFrame(Apdu apdu, Channel channel) throws Exception {
 		setSendAndReceiveNum(apdu, channel.id());
 		byte[] bb = apdu.encode();
-		//TODO  改变日志模式
 		log.debug("向104对端发出数据帧:" + DataConvertor.Byte2String(bb));
 		channel.writeAndFlush(Unpooled.copiedBuffer(bb));
 	}
@@ -72,7 +71,6 @@ public class SendAndReceiveNumUtil {
 	public static void sendIFrame(Apdu apdu, Channel channel, Logger log) throws Exception {
 		setSendAndReceiveNum(apdu, channel.id());
 		byte[] bb = apdu.encode();
-		//TODO  改变日志模式
 		if (log != null) {
 			log.debug("向104对端发出数据帧:" + DataConvertor.Byte2String(bb));
 		} else {

+ 46 - 0
protocol-iec104/src/main/java/wei/yigulu/iec104/util/SendCommandHelper.java

@@ -1,10 +1,56 @@
 package wei.yigulu.iec104.util;
 
+import lombok.extern.slf4j.Slf4j;
+import wei.yigulu.iec104.apdumodel.Apdu;
+import wei.yigulu.iec104.apdumodel.Asdu;
+import wei.yigulu.iec104.asdudataframe.ShortFloatCommand;
+import wei.yigulu.iec104.asdudataframe.typemodel.IecDataInterface;
+import wei.yigulu.netty.AbstractMasterBuilder;
+
+import java.util.ArrayList;
+import java.util.Collections;
+import java.util.List;
+
 /**
  * 发送控制命令的工具类
  *
  * @author: xiuwei
  * @version:
  */
+@Slf4j
 public class SendCommandHelper {
+
+	private static List<CommandWaiter> commandWaiters = Collections.synchronizedList(new ArrayList());
+
+
+	public static boolean sendShortCommand(AbstractMasterBuilder masterBuilder, Integer sourceAddress, Integer commonAddress, Integer dataAddress, Float value) throws Exception {
+		ShortFloatCommand command = new ShortFloatCommand(dataAddress, value);
+		Apdu apdu = new Apdu();
+		Asdu asdu = command.generateBack();
+		asdu.setCommonAddress(commonAddress);
+		asdu.setOriginatorAddress(sourceAddress);
+		asdu.getCot().setNot(6);
+		apdu.setAsdu(asdu);
+		SendAndReceiveNumUtil.sendIFrame(apdu, masterBuilder.getFuture().channel(), masterBuilder.getLog());
+		CommandWaiter commandWaiter = new CommandWaiter(masterBuilder.getFuture().channel().id(), apdu, 0);
+		commandWaiters.add(commandWaiter);
+		IecDataInterface data = commandWaiter.get();
+		if (value.equals(data.getIecValue())) {
+			return true;
+		} else {
+			return false;
+		}
+	}
+
+
+	public static void setIecValue(CommandWaiter commandWaiter) {
+		int i = commandWaiters.indexOf(commandWaiter);
+		System.out.println(i);
+		if (i != -1) {
+			commandWaiters.get(i).set(commandWaiter.getData());
+		} else {
+
+		}
+	}
 }
+

+ 8 - 6
protocol-iec104/src/main/java/wei/yigulu/iec104/util/SendDataFrameHelper.java

@@ -23,22 +23,22 @@ public class SendDataFrameHelper {
 	/**
 	 * 单帧最长连续遥信个数
 	 */
-	public static final int MAXCONTINUITYYXNUM=127;
+	public static final int MAXCONTINUITYYXNUM = 127;
 
 	/**
 	 * 单帧最长单点遥信个数
 	 */
-	public static final int MAXDISCONTINUITYYXNUM=49;
+	public static final int MAXDISCONTINUITYYXNUM = 49;
 
 	/**
 	 * 单帧最长连续遥测个数
 	 */
-	public static final int MAXCONTINUITYYCNUM=45;
+	public static final int MAXCONTINUITYYCNUM = 45;
 
 	/**
 	 * 单帧最长单点遥测个数
 	 */
-	public static final int MAXDISCONTINUITYYCNUM=25;
+	public static final int MAXDISCONTINUITYYCNUM = 25;
 
 
 	/**
@@ -257,10 +257,10 @@ public class SendDataFrameHelper {
 		return list;
 	}
 
-
 	/**
 	 * 进行拆分并排序 主要是排序map 中的keyset 对keyset的int型进行排序
-	 * 	 *
+	 * *
+	 *
 	 * @param set    要排序的set
 	 * @param maxLen 设定的最长长度
 	 * @return 拆分后的集合 的集合
@@ -288,4 +288,6 @@ public class SendDataFrameHelper {
 		list.add(transfer);
 		return list;
 	}
+
+
 }

+ 3 - 4
protocol-iec104/src/test/java/MasterTest.java

@@ -1,9 +1,6 @@
 import io.netty.util.ResourceLeakDetector;
-import wei.yigulu.iec104.apdumodel.Apdu;
-import wei.yigulu.iec104.apdumodel.Asdu;
-import wei.yigulu.iec104.asdudataframe.TotalSummonType;
 import wei.yigulu.iec104.nettyconfig.Iec104HSMasterBuilder;
-import wei.yigulu.iec104.nettyconfig.Iec104MasterBuilder;
+import wei.yigulu.iec104.util.SendCommandHelper;
 
 /**
  * dad
@@ -19,6 +16,8 @@ public class MasterTest {
 		Iec104HSMasterBuilder masterBuilder = new Iec104HSMasterBuilder("127.0.0.1", 2404);
 
 		masterBuilder.createByUnBlock();
+		Thread.sleep(3000L);
+		SendCommandHelper.sendShortCommand(masterBuilder, 0, 1, 16385, 0.452f);
 
 	/*	//创建总召唤类型I帧
 		TotalSummonType totalSummonType = new TotalSummonType();

+ 6 - 9
protocol-iec104/src/test/java/NettyClient.java

@@ -1,9 +1,6 @@
 import io.netty.bootstrap.Bootstrap;
-import io.netty.bootstrap.ServerBootstrap;
 import io.netty.channel.*;
 import io.netty.channel.nio.NioEventLoopGroup;
-import io.netty.channel.socket.SocketChannel;
-import io.netty.channel.socket.nio.NioServerSocketChannel;
 import io.netty.channel.socket.nio.NioSocketChannel;
 import io.netty.handler.codec.string.StringDecoder;
 import io.netty.handler.codec.string.StringEncoder;
@@ -37,20 +34,20 @@ public class NettyClient {
 						}
 					});
 			// 服务器异步创建绑定
-			ChannelFuture cf = sb.bind("127.0.0.1",2404);
-			System.out.println("1"+cf.isSuccess());
+			ChannelFuture cf = sb.bind("127.0.0.1", 2404);
+			System.out.println("1" + cf.isSuccess());
 			cf.sync();
-			System.out.println("2"+cf.isSuccess());
+			System.out.println("2" + cf.isSuccess());
 
-			System.out.println("4"+cf.isDone());
+			System.out.println("4" + cf.isDone());
 			System.out.println(cf.getClass().getSimpleName());
 			// 关闭服务器通道
 			ChannelFuture ff = cf.channel().closeFuture();
 			System.out.println(ff.getClass().getSimpleName());
 			System.out.println(ff.sync());
-			System.out.println("is=="+ (cf==ff));
+			System.out.println("is==" + (cf == ff));
 			System.out.println(cf.isDone());
-			System.out.println("3"+cf.isSuccess());
+			System.out.println("3" + cf.isSuccess());
 
 		} catch (InterruptedException e) {
 			e.printStackTrace();

+ 27 - 30
protocol-iec104/src/test/java/ReadFile.java

@@ -1,4 +1,3 @@
-import ch.qos.logback.core.Appender;
 import io.netty.buffer.Unpooled;
 import wei.yigulu.iec104.apdumodel.Apdu;
 import wei.yigulu.iec104.apdumodel.Asdu;
@@ -6,7 +5,6 @@ import wei.yigulu.iec104.asdudataframe.ShortFloatType;
 import wei.yigulu.iec104.asdudataframe.qualitydescription.IeMeasuredQuality;
 
 import java.io.*;
-import java.time.LocalTime;
 import java.util.Map;
 
 /**
@@ -25,28 +23,28 @@ public class ReadFile {
 		BufferedReader bReader = new BufferedReader(reader);//new一个BufferedReader对象,将文件内容读取到缓存
 		StringBuilder sb = new StringBuilder();//定义一个字符串缓存,将字符串存放缓存中
 		String s = "";
-		while ((s =bReader.readLine()) != null) {//逐行读取文件内容,不读取换行符和末尾的空格
-			if(s.contains("recv :")&&!s.contains("-")){
-				String f="";
-				f+=s.substring(0,15)+"\r";
-				Apdu a=new Apdu().loadByteBuf(Unpooled.copiedBuffer(Hex2Bytes(s.substring(23).replaceAll(" ",""))));
-				Asdu asdu=a.getAsdu();
-				if(asdu!=null && asdu.getDataFrame() instanceof ShortFloatType){
-					ShortFloatType ss=(ShortFloatType)asdu.getDataFrame();
+		while ((s = bReader.readLine()) != null) {//逐行读取文件内容,不读取换行符和末尾的空格
+			if (s.contains("recv :") && !s.contains("-")) {
+				String f = "";
+				f += s.substring(0, 15) + "\r";
+				Apdu a = new Apdu().loadByteBuf(Unpooled.copiedBuffer(Hex2Bytes(s.substring(23).replaceAll(" ", ""))));
+				Asdu asdu = a.getAsdu();
+				if (asdu != null && asdu.getDataFrame() instanceof ShortFloatType) {
+					ShortFloatType ss = (ShortFloatType) asdu.getDataFrame();
 					if (ss.getAddresses().size() == 1) {
-						int j=0;
+						int j = 0;
 						for (Map.Entry<IeMeasuredQuality, Float> e : ss.getDatas().entrySet()) {
-							f+=dayin(ss.getAddresses().get(0).getAddress()+j,e.getValue());
+							f += dayin(ss.getAddresses().get(0).getAddress() + j, e.getValue());
 							j++;
 						}
 					} else {
 						int f1 = 0;
 						for (Map.Entry<IeMeasuredQuality, Float> i : ss.getDatas().entrySet()) {
-							f+=dayin( ss.getAddresses().get(f1++).getAddress(),i.getValue());
+							f += dayin(ss.getAddresses().get(f1++).getAddress(), i.getValue());
 						}
 					}
 				}
-				if(f.length()>16){
+				if (f.length() > 16) {
 					System.out.println(f);
 					out.write(f);
 				}
@@ -55,39 +53,38 @@ public class ReadFile {
 		bReader.close();
 		out.close();
 		String str = sb.toString();
-		System.out.println(str );
-
+		System.out.println(str);
 
 
 	}
 
 
-	public static byte[] Hex2Bytes(String hexString){
+	public static byte[] Hex2Bytes(String hexString) {
 		byte[] arrB = hexString.getBytes();
 		int iLen = arrB.length;
 		byte[] arrOut = new byte[iLen / 2];
 		String strTmp = null;
-		for (int i = 0; i < iLen; i += 2)
-		{
+		for (int i = 0; i < iLen; i += 2) {
 			strTmp = new String(arrB, i, 2);
-			arrOut[(i / 2)] = ((byte)Integer.parseInt(strTmp, 16));
+			arrOut[(i / 2)] = ((byte) Integer.parseInt(strTmp, 16));
 		}
 		return arrOut;
 	}
 
 
-
-	public static String dayin(int key, Float value){
-		String s="";
+	public static String dayin(int key, Float value) {
+		String s = "";
 		int i;
-		if(key==16385){
-			s+="                  实际功率 : "+value+"\r";
+		if (key == 16385) {
+			s += "                  实际功率 : " + value + "\r";
 		}
-		if(key>16421&&key<16921 && (key-16422)%6==0){
-			i=(key-16422)/6+1;
-			if(i==9||i==16||i==31||i==44||i==48||i==59){
-				s+="                  样"+i+" : "+value+"\r";
-			}else{s+="                  "+i+" : "+value+"\r";}
+		if (key > 16421 && key < 16921 && (key - 16422) % 6 == 0) {
+			i = (key - 16422) / 6 + 1;
+			if (i == 9 || i == 16 || i == 31 || i == 44 || i == 48 || i == 59) {
+				s += "                  样" + i + " : " + value + "\r";
+			} else {
+				s += "                  " + i + " : " + value + "\r";
+			}
 
 		}
 		return s;

+ 6 - 4
protocol-iec104/src/test/java/SlaveTest.java

@@ -10,16 +10,18 @@ public class SlaveTest {
 
 	public static void main(String[] args) throws Exception {
 		Iec104SlaverBuilder slaverBuilder = new Iec104SlaverBuilder(2404);
-		slaverBuilder.getConnectFilterManager().appendFilter((c)->{
-			if(slaverBuilder.getChannels().size()>=1){
+		slaverBuilder.getConnectFilterManager().appendFilter((c) -> {
+			if (slaverBuilder.getChannels().size() >= 1) {
 				return -1;
 			}
 			InetSocketAddress ipSocket = (InetSocketAddress) c.remoteAddress();
 			String clientIp = ipSocket.getAddress().getHostAddress();
 			Integer clientPort = ipSocket.getPort();
-			if(clientPort>30000){
+			if (clientPort > 30000) {
 				return -1;
-			}else {return 1;}
+			} else {
+				return 1;
+			}
 		});
 		slaverBuilder.create();
 	}

+ 4 - 4
protocol-iec104/src/test/java/TestTotalS.java

@@ -16,11 +16,11 @@ public class TestTotalS extends TotalSummonType {
 
 	@Override
 	public byte[][] handleAndAnswer(Apdu apdu) throws Exception {
-		Map<Integer,Boolean> booleans=new HashMap<>();
-		for(int i =0 ;i<100;i++){
-			booleans.put(i,true);
+		Map<Integer, Boolean> booleans = new HashMap<>();
+		for (int i = 0; i < 100; i++) {
+			booleans.put(i, true);
 		}
-		SendDataFrameHelper.sendYxDataFrame(apdu.getChannel(),booleans,1,20,null);
+		SendDataFrameHelper.sendYxDataFrame(apdu.getChannel(), booleans, 1, 20, null);
 		return null;
 	}
 

+ 1 - 1
protocol-modbus/src/main/java/wei/yigulu/modbus/domain/FunctionCode.java

@@ -118,7 +118,7 @@ public enum FunctionCode {
 			case 0x90:
 				return WRITE_REGISTERS_ERROR;
 			default:
-				throw new IllegalArgumentException("异常传参 : "+code);
+				throw new IllegalArgumentException("异常传参 : " + code);
 		}
 
 	}

+ 9 - 10
protocol-modbus/src/main/java/wei/yigulu/modbus/domain/command/AbstractModbusCommand.java

@@ -27,9 +27,9 @@ import java.util.List;
 public abstract class AbstractModbusCommand implements ModbusPacketInterface {
 
 
-	public static final int R_MAX_NUM=120;
+	public static final int R_MAX_NUM = 120;
 
-	public static final int C_MAX_NUM=1968;
+	public static final int C_MAX_NUM = 1968;
 
 	/**
 	 * 客户端地址 一字节
@@ -68,14 +68,13 @@ public abstract class AbstractModbusCommand implements ModbusPacketInterface {
 	protected byte[] dataBytes;
 
 
-
-	public Integer getLength(){
-		if(functionCode==FunctionCode.WRITE_COIL){
+	public Integer getLength() {
+		if (functionCode == FunctionCode.WRITE_COIL) {
 			return 6;
-		}else if(functionCode==FunctionCode.WRITE_REGISTER){
+		} else if (functionCode == FunctionCode.WRITE_REGISTER) {
 			return 6;
-		}else {
-			return 7+dataBytes.length;
+		} else {
+			return 7 + dataBytes.length;
 		}
 	}
 
@@ -89,7 +88,7 @@ public abstract class AbstractModbusCommand implements ModbusPacketInterface {
 		for (RegisterValue rv : values) {
 			registers.addAll(rv.getRegisters());
 		}
-		if(registers.size()>R_MAX_NUM){
+		if (registers.size() > R_MAX_NUM) {
 			throw new RuntimeException("传入寄存器的数量超过120个");
 		}
 		if (registers.size() > 1) {
@@ -117,7 +116,7 @@ public abstract class AbstractModbusCommand implements ModbusPacketInterface {
 		if (values.size() == 0) {
 			throw new RuntimeException("未传入具体的控制值");
 		}
-		if(values.size()>C_MAX_NUM){
+		if (values.size() > C_MAX_NUM) {
 			throw new RuntimeException("传入线圈的数量超过1968个");
 		}
 		this.startAddress = startAddress;

+ 1 - 3
protocol-modbus/src/main/java/wei/yigulu/modbus/domain/command/RtuModbusCommand.java

@@ -1,9 +1,7 @@
 package wei.yigulu.modbus.domain.command;
 
 import com.google.common.primitives.Bytes;
-import wei.yigulu.modbus.domain.ModbusPacketInterface;
 import wei.yigulu.modbus.domain.datatype.numeric.P_BA;
-import wei.yigulu.modbus.domain.request.RtuModbusRequest;
 import wei.yigulu.modbus.exceptiom.ModbusException;
 import wei.yigulu.utils.CrcUtils;
 
@@ -17,7 +15,7 @@ import java.util.List;
  * @author: xiuwei
  * @version:
  */
-public class RtuModbusCommand extends AbstractModbusCommand{
+public class RtuModbusCommand extends AbstractModbusCommand {
 
 	/**
 	 * crc 校验  两位 除去本两位 其余所有字节的校验位

+ 11 - 11
protocol-modbus/src/main/java/wei/yigulu/modbus/domain/confirm/AbstractModbusConfirm.java

@@ -50,7 +50,7 @@ public abstract class AbstractModbusConfirm implements ModbusPacketInterface {
 	 * 输出数据 (5,6)  两字节
 	 */
 	@Getter
-	protected  byte[] b2;
+	protected byte[] b2;
 
 
 	public Integer getLength() {
@@ -76,11 +76,11 @@ public abstract class AbstractModbusConfirm implements ModbusPacketInterface {
 	 */
 	@Override
 	public AbstractModbusConfirm decode(ByteBuffer byteBuf) throws ModbusException {
-		slaveId=byteBuf.get()&0xff;
-		functionCode=FunctionCode.valueOf(byteBuf.get()&0xff);
-		if(functionCode.getCode()>0x80){
-			int i=byteBuf.get()&0xff;
-			if(functionCode.getCode().equals(0x89)||functionCode.getCode().equals(0x90)){
+		slaveId = byteBuf.get() & 0xff;
+		functionCode = FunctionCode.valueOf(byteBuf.get() & 0xff);
+		if (functionCode.getCode() > 0x80) {
+			int i = byteBuf.get() & 0xff;
+			if (functionCode.getCode().equals(0x89) || functionCode.getCode().equals(0x90)) {
 				switch (i) {
 					case 1:
 						throw new ModbusException("功能码异常");
@@ -91,7 +91,7 @@ public abstract class AbstractModbusConfirm implements ModbusPacketInterface {
 					case 4:
 						throw new ModbusException("写入过程异常");
 				}
-			}else {
+			} else {
 
 				switch (i) {
 					case 1:
@@ -105,11 +105,11 @@ public abstract class AbstractModbusConfirm implements ModbusPacketInterface {
 				}
 			}
 		}
-		startAddress=new P_AB().decode(byteBuf).getValue().intValue();
-		if(functionCode==FunctionCode.WRITE_COIL || functionCode==FunctionCode.WRITE_REGISTER){
-			b2=new byte[2];
+		startAddress = new P_AB().decode(byteBuf).getValue().intValue();
+		if (functionCode == FunctionCode.WRITE_COIL || functionCode == FunctionCode.WRITE_REGISTER) {
+			b2 = new byte[2];
 			byteBuf.get(b2);
-		}else {
+		} else {
 			quantity = new P_AB().decode(byteBuf).getValue().intValue();
 		}
 		return this;

+ 14 - 14
protocol-modbus/src/main/java/wei/yigulu/modbus/domain/datatype/BooleanModbusDataInCoil.java

@@ -13,7 +13,7 @@ import java.util.List;
  */
 public class BooleanModbusDataInCoil extends CoilValue {
 
-	public static final int BIT_NUM =8;
+	public static final int BIT_NUM = 8;
 
 	/**
 	 * 八个布尔 对应一字节 八比特
@@ -34,10 +34,10 @@ public class BooleanModbusDataInCoil extends CoilValue {
 
 	@Override
 	public BooleanModbusDataInCoil encode(List<Byte> bytes) {
-		byte b=0;
-		for (int i = 0; i <values.length ; i++) {
-			if(this.values[i]){
-				b=(byte)(b|0x01>>i);
+		byte b = 0;
+		for (int i = 0; i < values.length; i++) {
+			if (this.values[i]) {
+				b = (byte) (b | 0x01 >> i);
 			}
 		}
 		bytes.add(b);
@@ -74,18 +74,18 @@ public class BooleanModbusDataInCoil extends CoilValue {
 	 * @param booleanValues 布尔值
 	 * @return {@link List<BooleanModbusDataInCoil>}
 	 */
-	public static List<BooleanModbusDataInCoil> getFormBooleanList(List<Boolean> booleanValues){
-		int size= Double.valueOf(Math.ceil(booleanValues.size()/BIT_NUM)).intValue();
-		List<BooleanModbusDataInCoil> booleanModbusDataInCoils=new ArrayList<>();
+	public static List<BooleanModbusDataInCoil> getFormBooleanList(List<Boolean> booleanValues) {
+		int size = Double.valueOf(Math.ceil(booleanValues.size() / BIT_NUM)).intValue();
+		List<BooleanModbusDataInCoil> booleanModbusDataInCoils = new ArrayList<>();
 		BooleanModbusDataInCoil booleanModbusDataInCoil;
 		int index;
 		for (int i = 0; i < size; i++) {
-			booleanModbusDataInCoil=new BooleanModbusDataInCoil();
-			for (int j = 0; j <BIT_NUM; j++) {
-				index=BIT_NUM*i+j;
-				if (booleanValues.size()>index){
-					booleanModbusDataInCoil.setValue(j,booleanValues.get(index));
-				}else{
+			booleanModbusDataInCoil = new BooleanModbusDataInCoil();
+			for (int j = 0; j < BIT_NUM; j++) {
+				index = BIT_NUM * i + j;
+				if (booleanValues.size() > index) {
+					booleanModbusDataInCoil.setValue(j, booleanValues.get(index));
+				} else {
 					booleanModbusDataInCoils.add(booleanModbusDataInCoil);
 					break;
 				}

+ 2 - 2
protocol-modbus/src/main/java/wei/yigulu/modbus/domain/datatype/BooleanModbusDataInRegister.java

@@ -80,9 +80,9 @@ public class BooleanModbusDataInRegister extends RegisterValue {
 		}
 	}
 
-	public void setValue(int index,boolean value) {
+	public void setValue(int index, boolean value) {
 		if (index < values.length) {
-			this.values[index]=value;
+			this.values[index] = value;
 		} else {
 			throw new IllegalArgumentException();
 		}

+ 0 - 2
protocol-modbus/src/main/java/wei/yigulu/modbus/domain/datatype/NumericModbusData.java

@@ -6,7 +6,6 @@ import lombok.Setter;
 import lombok.experimental.Accessors;
 
 import java.math.BigDecimal;
-import java.util.List;
 
 /**
  * 数字的类型
@@ -27,5 +26,4 @@ public abstract class NumericModbusData extends RegisterValue {
 	protected BigDecimal value;
 
 
-
 }

+ 3 - 3
protocol-modbus/src/main/java/wei/yigulu/modbus/domain/datatype/numeric/BADC.java

@@ -29,15 +29,15 @@ public class BADC extends NumericModbusData {
 
 	@Override
 	public BADC decode(byte[] bytes, int offset) {
-		this.value =new BigDecimal(Float.toString(Float.intBitsToFloat( ((bytes[offset * 2 + 0] & 0xff) << 16) | ((bytes[offset * 2 + 1] & 0xff) << 24)|(bytes[offset * 2+2] & 0xff) | ((bytes[offset * 2 + 3] & 0xff) << 8)
-				)));
+		this.value = new BigDecimal(Float.toString(Float.intBitsToFloat(((bytes[offset * 2 + 0] & 0xff) << 16) | ((bytes[offset * 2 + 1] & 0xff) << 24) | (bytes[offset * 2 + 2] & 0xff) | ((bytes[offset * 2 + 3] & 0xff) << 8)
+		)));
 		return this;
 	}
 
 	@Override
 	public BADC decode(ByteBuffer byteBuf) {
 		this.value = new BigDecimal(Float.toString(Float.intBitsToFloat(
-				((byteBuf.get() & 0xff) << 16) | ((byteBuf.get() & 0xff) << 24)|(byteBuf.get() & 0xff) | ((byteBuf.get() & 0xff) << 8))));
+				((byteBuf.get() & 0xff) << 16) | ((byteBuf.get() & 0xff) << 24) | (byteBuf.get() & 0xff) | ((byteBuf.get() & 0xff) << 8))));
 		return this;
 	}
 

+ 1 - 1
protocol-modbus/src/main/java/wei/yigulu/modbus/domain/datatype/numeric/CDAB.java

@@ -29,7 +29,7 @@ public class CDAB extends NumericModbusData {
 
 	@Override
 	public CDAB decode(byte[] bytes, int offset) {
-		this.value =new BigDecimal(Float.toString(Float.intBitsToFloat((bytes[offset * 2] & 0xff) << 8 | ((bytes[offset * 2 + 1] & 0xff))
+		this.value = new BigDecimal(Float.toString(Float.intBitsToFloat((bytes[offset * 2] & 0xff) << 8 | ((bytes[offset * 2 + 1] & 0xff))
 				| ((bytes[offset * 2 + 2] & 0xff) << 24) | ((bytes[offset * 2 + 3] & 0xff) << 16))));
 		return this;
 	}

+ 9 - 10
protocol-modbus/src/main/java/wei/yigulu/modbus/domain/datatype/numeric/SingleCommandCoilValue.java

@@ -2,7 +2,6 @@ package wei.yigulu.modbus.domain.datatype.numeric;
 
 import lombok.AllArgsConstructor;
 import lombok.NoArgsConstructor;
-import org.checkerframework.checker.units.qual.C;
 import wei.yigulu.modbus.domain.datatype.CoilValue;
 import wei.yigulu.modbus.domain.datatype.IModbusDataType;
 
@@ -34,24 +33,24 @@ public class SingleCommandCoilValue extends CoilValue {
 
 	@Override
 	public IModbusDataType encode(List<Byte> bytes) {
-		if(bValue) {
-			bytes.add ((byte) 0xff);
-		}else{
-			bytes.add ((byte) 0x00);
+		if (bValue) {
+			bytes.add((byte) 0xff);
+		} else {
+			bytes.add((byte) 0x00);
 		}
-		bytes.add ((byte) 0x00);
+		bytes.add((byte) 0x00);
 		return this;
 	}
 
 
 	public byte[] encode() {
-		byte[] bs=new byte[2];
-		if(bValue) {
+		byte[] bs = new byte[2];
+		if (bValue) {
 			bs[0] = (byte) 0xff;
-		}else{
+		} else {
 			bs[0] = (byte) 0x00;
 		}
-		bs[1] = (byte)0x00;
+		bs[1] = (byte) 0x00;
 		return bs;
 	}
 }

+ 1 - 1
protocol-modbus/src/main/java/wei/yigulu/modbus/domain/request/AbstractModbusRequest.java

@@ -20,7 +20,7 @@ import java.util.List;
  */
 @Data
 @Accessors(chain = true)
-public class AbstractModbusRequest  implements ModbusPacketInterface {
+public class AbstractModbusRequest implements ModbusPacketInterface {
 
 
 	/**

+ 0 - 1
protocol-modbus/src/main/java/wei/yigulu/modbus/domain/request/RtuModbusRequest.java

@@ -1,7 +1,6 @@
 package wei.yigulu.modbus.domain.request;
 
 import com.google.common.primitives.Bytes;
-import wei.yigulu.modbus.domain.ModbusPacketInterface;
 import wei.yigulu.modbus.domain.datatype.numeric.P_BA;
 import wei.yigulu.modbus.exceptiom.ModbusException;
 import wei.yigulu.utils.CrcUtils;

+ 0 - 1
protocol-modbus/src/main/java/wei/yigulu/modbus/domain/request/TcpModbusRequest.java

@@ -4,7 +4,6 @@ package wei.yigulu.modbus.domain.request;
 import lombok.Data;
 import lombok.Setter;
 import lombok.experimental.Accessors;
-import wei.yigulu.modbus.domain.ModbusPacketInterface;
 import wei.yigulu.modbus.domain.datatype.numeric.P_AB;
 import wei.yigulu.modbus.domain.tcpextracode.TcpExtraCode;
 import wei.yigulu.modbus.domain.tcpextracode.TransactionIdentifier;

+ 3 - 3
protocol-modbus/src/main/java/wei/yigulu/modbus/domain/synchronouswaitingroom/TcpSynchronousWaitingRoom.java

@@ -32,7 +32,7 @@ public class TcpSynchronousWaitingRoom implements SynchronousWaitingRoom {
 		try {
 			byteBuffer = guest.getData();
 		} catch (InterruptedException e) {
-			log.trace("响应超时,事务识别码为:"+key);
+			log.trace("响应超时,事务识别码为:" + key);
 		}
 		this.guestMap.remove(key);
 		return byteBuffer;
@@ -46,8 +46,8 @@ public class TcpSynchronousWaitingRoom implements SynchronousWaitingRoom {
 			bytes.reset();
 			if (this.guestMap.containsKey(key)) {
 				this.guestMap.get(key).setData(bytes);
-			}else{
-				log.trace("置入响应数据时,未发现等待者:"+key);
+			} else {
+				log.trace("置入响应数据时,未发现等待者:" + key);
 			}
 		}
 	}

+ 0 - 1
protocol-modbus/src/main/java/wei/yigulu/modbus/domain/tcpextracode/TransactionIdentifier.java

@@ -1,6 +1,5 @@
 package wei.yigulu.modbus.domain.tcpextracode;
 
-import com.alibaba.fastjson.JSON;
 import lombok.Getter;
 import lombok.Setter;
 import lombok.experimental.Accessors;

+ 1 - 1
protocol-modbus/src/main/java/wei/yigulu/modbus/netty/ModbusRtuMasterDelimiterHandler.java

@@ -113,7 +113,7 @@ public class ModbusRtuMasterDelimiterHandler extends AbstractDelimiterHandler {
 					cumulation.resetReaderIndex();
 					ctx.fireChannelRead(cumulation.readBytes(8));
 				}
-			}else{
+			} else {
 				log.error("不支持该种类型报文解析");
 				clearCumulation();
 			}

+ 2 - 7
protocol-modbus/src/main/java/wei/yigulu/modbus/netty/ModbusRtuSlaverDelimiterHandler.java

@@ -3,12 +3,7 @@ package wei.yigulu.modbus.netty;
 
 import io.netty.buffer.ByteBuf;
 import io.netty.channel.ChannelHandlerContext;
-import io.netty.channel.ChannelInboundHandlerAdapter;
-import lombok.Setter;
-import lombok.experimental.Accessors;
 import org.joda.time.DateTime;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
 import wei.yigulu.modbus.domain.datatype.numeric.P_BA;
 import wei.yigulu.netty.AbstractDelimiterHandler;
 import wei.yigulu.utils.CrcUtils;
@@ -61,8 +56,8 @@ public class ModbusRtuSlaverDelimiterHandler extends AbstractDelimiterHandler {
 		}
 		if (cumulation.readableBytes() == 0) {
 			clearCumulation();
-		}else{
-			timeMark=DateTime.now();
+		} else {
+			timeMark = DateTime.now();
 		}
 	}
 

+ 7 - 9
protocol-modbus/src/main/java/wei/yigulu/modbus/netty/ModbusTcpDelimiterHandler.java

@@ -2,11 +2,9 @@ package wei.yigulu.modbus.netty;
 
 
 import io.netty.buffer.ByteBuf;
-import io.netty.buffer.Unpooled;
 import io.netty.channel.ChannelHandlerContext;
 import org.joda.time.DateTime;
 import wei.yigulu.netty.AbstractDelimiterHandler;
-import wei.yigulu.utils.DataConvertor;
 
 
 /**
@@ -21,7 +19,7 @@ public class ModbusTcpDelimiterHandler extends AbstractDelimiterHandler {
 	/**
 	 * 最短帧为错误帧 9为   4位事务+2位长度+1位slaveID+1位functionCode+1位exceptionCode
 	 */
-	private static final int MINLENGTH=9;
+	private static final int MINLENGTH = 9;
 
 	@Override
 	public void channelRead(ChannelHandlerContext ctx, Object msg) throws Exception {
@@ -31,7 +29,7 @@ public class ModbusTcpDelimiterHandler extends AbstractDelimiterHandler {
 		}
 		//数据帧长度不足 记录时间 等待下一帧进入
 		int length;
-		while(cumulation.readableBytes()>=MINLENGTH){
+		while (cumulation.readableBytes() >= MINLENGTH) {
 			cumulation.markReaderIndex();
 			//去掉四位事务帧
 			cumulation.readBytes(4).release();
@@ -46,14 +44,14 @@ public class ModbusTcpDelimiterHandler extends AbstractDelimiterHandler {
 				timeMark = DateTime.now();
 				cumulation.resetReaderIndex();
 				return;
-			} else  {
+			} else {
 				cumulation.resetReaderIndex();
-				ctx.fireChannelRead(cumulation.readBytes(length+6));
+				ctx.fireChannelRead(cumulation.readBytes(length + 6));
 			}
 		}
-		if(cumulation.readableBytes()!=0){
-			this.timeMark=DateTime.now();
-		}else{
+		if (cumulation.readableBytes() != 0) {
+			this.timeMark = DateTime.now();
+		} else {
 			clearCumulation();
 		}
 	}

+ 1 - 2
protocol-modbus/src/main/java/wei/yigulu/modbus/netty/ModbusTcpMasterHandler.java

@@ -3,7 +3,6 @@ package wei.yigulu.modbus.netty;
 
 import io.netty.buffer.ByteBuf;
 import io.netty.channel.ChannelHandlerContext;
-import io.netty.channel.ChannelInboundHandlerAdapter;
 import io.netty.channel.SimpleChannelInboundHandler;
 import org.slf4j.Logger;
 import wei.yigulu.netty.AbstractTcpMasterBuilder;
@@ -38,7 +37,7 @@ public class ModbusTcpMasterHandler extends SimpleChannelInboundHandler<ByteBuf>
 	}
 
 	@Override
-	public void channelRead0(ChannelHandlerContext ctx, ByteBuf byteBuf ) throws Exception {
+	public void channelRead0(ChannelHandlerContext ctx, ByteBuf byteBuf) throws Exception {
 		//收数据
 		log.debug("re <== " + DataConvertor.ByteBuf2String(byteBuf));
 		((ModbusMasterBuilderInterface) this.masterBuilder).getOrCreateSynchronousWaitingRoom().setData(byteBuf.nioBuffer());

+ 0 - 1
protocol-modbus/src/main/java/wei/yigulu/modbus/netty/ModbusTcpSlaverHandle.java

@@ -4,7 +4,6 @@ package wei.yigulu.modbus.netty;
 import io.netty.buffer.ByteBuf;
 import io.netty.buffer.Unpooled;
 import io.netty.channel.ChannelHandlerContext;
-import io.netty.channel.ChannelInboundHandlerAdapter;
 import io.netty.channel.SimpleChannelInboundHandler;
 import lombok.NoArgsConstructor;
 import org.slf4j.Logger;

+ 41 - 28
protocol-modbus/src/main/java/wei/yigulu/modbus/utils/ModbusCommandDataUtils.java

@@ -1,7 +1,6 @@
 package wei.yigulu.modbus.utils;
 
 import com.google.common.primitives.Bytes;
-import io.netty.buffer.Unpooled;
 import lombok.extern.slf4j.Slf4j;
 import wei.yigulu.modbus.domain.FunctionCode;
 import wei.yigulu.modbus.domain.command.AbstractModbusCommand;
@@ -17,7 +16,6 @@ import wei.yigulu.modbus.netty.ModbusMasterBuilderInterface;
 import wei.yigulu.modbus.netty.ModbusRtuMasterBuilder;
 import wei.yigulu.netty.AbstractMasterBuilder;
 import wei.yigulu.netty.AbstractTcpMasterBuilder;
-import wei.yigulu.utils.DataConvertor;
 
 import java.nio.ByteBuffer;
 import java.util.ArrayList;
@@ -48,38 +46,39 @@ public class ModbusCommandDataUtils {
 		AbstractModbusCommand modbusCommand;
 		ByteBuffer buffer;
 		AbstractModbusConfirm confirm;
-		try{
-		if (masterBuilder instanceof ModbusRtuMasterBuilder) {
-			modbusCommand = new RtuModbusCommand();
-			modbusCommand.setSlaveId(slaveId).setRegisters(address, values);
-			modbusCommand.encode(bs);
-			masterBuilder.sendFrameToOpposite(Bytes.toArray(bs));
-			buffer = ((ModbusMasterBuilderInterface) masterBuilder).getOrCreateSynchronousWaitingRoom().getData(0);
-			confirm = new RtuModbusConfirm().decode(buffer);
-		} else {
-			modbusCommand= new TcpModbusCommand();
-			((TcpModbusCommand)modbusCommand).setTransactionIdentifier(TransactionIdentifier.getInstance((AbstractTcpMasterBuilder) masterBuilder));
-			modbusCommand.setSlaveId(slaveId).setRegisters(address, values);
-			modbusCommand.encode(bs);
-			masterBuilder.sendFrameToOpposite(Bytes.toArray(bs));
-			buffer = ((ModbusMasterBuilderInterface) masterBuilder).getOrCreateSynchronousWaitingRoom().getData(((TcpModbusCommand)modbusCommand).getTcpExtraCode().getTransactionIdentifier().getSeq());
-			confirm = new TcpModbusConfirm().decode(buffer);
-		}}catch (ModbusException e){
-			log.error("控制命令执行失败:"+e.getMsg());
+		try {
+			if (masterBuilder instanceof ModbusRtuMasterBuilder) {
+				modbusCommand = new RtuModbusCommand();
+				modbusCommand.setSlaveId(slaveId).setRegisters(address, values);
+				modbusCommand.encode(bs);
+				masterBuilder.sendFrameToOpposite(Bytes.toArray(bs));
+				buffer = ((ModbusMasterBuilderInterface) masterBuilder).getOrCreateSynchronousWaitingRoom().getData(0);
+				confirm = new RtuModbusConfirm().decode(buffer);
+			} else {
+				modbusCommand = new TcpModbusCommand();
+				((TcpModbusCommand) modbusCommand).setTransactionIdentifier(TransactionIdentifier.getInstance((AbstractTcpMasterBuilder) masterBuilder));
+				modbusCommand.setSlaveId(slaveId).setRegisters(address, values);
+				modbusCommand.encode(bs);
+				masterBuilder.sendFrameToOpposite(Bytes.toArray(bs));
+				buffer = ((ModbusMasterBuilderInterface) masterBuilder).getOrCreateSynchronousWaitingRoom().getData(((TcpModbusCommand) modbusCommand).getTcpExtraCode().getTransactionIdentifier().getSeq());
+				confirm = new TcpModbusConfirm().decode(buffer);
+			}
+		} catch (ModbusException e) {
+			log.error("控制命令执行失败:" + e.getMsg());
 			return false;
 		}
-		if(address.equals(confirm.getStartAddress())){
-			if(confirm.getFunctionCode()==modbusCommand.getFunctionCode()){
-				if(confirm.getFunctionCode()== FunctionCode.WRITE_COIL ||confirm.getFunctionCode()== FunctionCode.WRITE_REGISTER ){
-					if(Bytes.indexOf(confirm.getB2(),modbusCommand.getDataBytes())==0){
+		if (address.equals(confirm.getStartAddress())) {
+			if (confirm.getFunctionCode() == modbusCommand.getFunctionCode()) {
+				if (confirm.getFunctionCode() == FunctionCode.WRITE_COIL || confirm.getFunctionCode() == FunctionCode.WRITE_REGISTER) {
+					if (Bytes.indexOf(confirm.getB2(), modbusCommand.getDataBytes()) == 0) {
 						return true;
-					}else{
+					} else {
 						log.warn("返回的确认值和输出值不同");
 					}
-				}else{
-					if (confirm.getQuantity().equals(modbusCommand.getQuantity())){
+				} else {
+					if (confirm.getQuantity().equals(modbusCommand.getQuantity())) {
 						return true;
-					}else{
+					} else {
 						log.warn("返回的值数量和输出数量不同");
 					}
 				}
@@ -87,4 +86,18 @@ public class ModbusCommandDataUtils {
 		}
 		return false;
 	}
+
+
+	/**
+	 * 下达寄存器控制命令
+	 *
+	 * @param masterBuilder 主站对象
+	 * @param address       起始地址
+	 * @param value         命令值
+	 */
+	public static boolean commandRegister(AbstractMasterBuilder masterBuilder, Integer slaveId, Integer address, RegisterValue value) throws ModbusException {
+		List<RegisterValue> list = new ArrayList<>();
+		list.add(value);
+		return commandRegister(masterBuilder, slaveId, address, list);
+	}
 }

+ 10 - 11
protocol-modbus/src/test/java/Test.java

@@ -1,5 +1,4 @@
 import wei.yigulu.modbus.domain.datatype.numeric.*;
-import wei.yigulu.modbus.netty.ModbusTcpMasterBuilder;
 
 /**
  * @author: xiuwei
@@ -13,16 +12,16 @@ public class Test {
 		System.out.println("重启");
 		master.stop();
 		master.createByUnBlock();*/
-	//43 b0 ca ed
-		byte[] bs=new byte[]{(byte)0x00,(byte)0x30,(byte)0x00,(byte)0x18};
-		System.out.println("ABCD:"+new ABCD().decode(bs,0).getValue());
-		System.out.println("CDAB:"+new CDAB().decode(bs,0).getValue());
-		System.out.println("DCBA:"+new DCBA().decode(bs,0).getValue());
-		System.out.println("BADC:"+new BADC().decode(bs,0).getValue());
-		System.out.println("P_ABCD:"+new P_ABCD().decode(bs,0).getValue());
-		System.out.println("P_CDAB:"+new P_CDAB().decode(bs,0).getValue());
-		System.out.println("AB:"+new PM_AB().decode(bs,1).getValue());
-		System.out.println("BA:"+new PM_BA().decode(bs,1).getValue());
+		//43 b0 ca ed
+		byte[] bs = new byte[]{(byte) 0x00, (byte) 0x30, (byte) 0x00, (byte) 0x18};
+		System.out.println("ABCD:" + new ABCD().decode(bs, 0).getValue());
+		System.out.println("CDAB:" + new CDAB().decode(bs, 0).getValue());
+		System.out.println("DCBA:" + new DCBA().decode(bs, 0).getValue());
+		System.out.println("BADC:" + new BADC().decode(bs, 0).getValue());
+		System.out.println("P_ABCD:" + new P_ABCD().decode(bs, 0).getValue());
+		System.out.println("P_CDAB:" + new P_CDAB().decode(bs, 0).getValue());
+		System.out.println("AB:" + new PM_AB().decode(bs, 1).getValue());
+		System.out.println("BA:" + new PM_BA().decode(bs, 1).getValue());
 
 
 	}

+ 6 - 9
protocol-modbus/src/test/java/TestMaster.java

@@ -1,12 +1,9 @@
-import com.alibaba.fastjson.JSON;
 import lombok.extern.slf4j.Slf4j;
 import wei.yigulu.modbus.domain.FunctionCode;
 import wei.yigulu.modbus.domain.Obj4RequestRegister;
-import wei.yigulu.modbus.domain.datatype.BooleanModbusDataInRegister;
 import wei.yigulu.modbus.domain.datatype.IModbusDataType;
 import wei.yigulu.modbus.domain.datatype.ModbusDataTypeEnum;
 import wei.yigulu.modbus.domain.datatype.NumericModbusData;
-import wei.yigulu.modbus.domain.synchronouswaitingroom.SynchronousWaitingRoom;
 import wei.yigulu.modbus.domain.synchronouswaitingroom.TcpSynchronousWaitingRoom;
 import wei.yigulu.modbus.exceptiom.ModbusException;
 import wei.yigulu.modbus.netty.ModbusTcpMasterBuilder;
@@ -23,11 +20,11 @@ public class TestMaster {
 	public static void main(String[] args) throws InterruptedException, ModbusException {
 		ModbusTcpMasterBuilder master = new ModbusTcpMasterBuilder("127.0.0.1", 5001);
 		master.createByUnBlock();
-		TcpSynchronousWaitingRoom.waitTime=5000L;
+		TcpSynchronousWaitingRoom.waitTime = 5000L;
 		Thread.sleep(3000L);
 		Map<Integer, ModbusDataTypeEnum> map = new HashMap<>();
 		for (int i = 0; i <= 90; i++) {
-			map.put(i , ModbusDataTypeEnum.P_AB);
+			map.put(i, ModbusDataTypeEnum.P_AB);
 		}
 		List<Obj4RequestRegister> ll = ModbusRequestDataUtils.splitModbusRequest(map, 1, FunctionCode.READ_HOLDING_REGISTERS);
 
@@ -37,11 +34,11 @@ public class TestMaster {
 				ArrayList<Integer> lll = new ArrayList<Integer>(map1.keySet());
 				Collections.sort(lll);
 				for (Integer i : lll) {
-					if(map1.get(i) instanceof  NumericModbusData) {
-					//System.out.println(i + " ============ " + ((NumericModbusData) map1.get(i)).getValue());
-					}else {
+					if (map1.get(i) instanceof NumericModbusData) {
+						//System.out.println(i + " ============ " + ((NumericModbusData) map1.get(i)).getValue());
+					} else {
 						//System.out.println(i + " ============ " + JSON.toJSONString(((BooleanModbusDataInRegister) map1.get(i)).getValues()));
-				}
+					}
 				}
 			} catch (Exception e) {
 				e.printStackTrace();

+ 1 - 1
protocol-modbus/src/test/java/TestMasterCoil.java

@@ -24,7 +24,7 @@ public class TestMasterCoil {
 		Thread.sleep(3000L);
 		List<Integer> list = new ArrayList<>();
 		for (int i = 0; i <= 7; i++) {
-			list.add(i );
+			list.add(i);
 		}
 		list.add(30);
 		List<Obj4RequestCoil> ll = ModbusRequestDataUtils.splitModbusRequest(list, 1, FunctionCode.READ_COILS);

+ 4 - 6
protocol-modbus/src/test/java/TestRtuCommandMaster.java

@@ -1,11 +1,9 @@
 import lombok.extern.slf4j.Slf4j;
 import wei.yigulu.modbus.domain.datatype.RegisterValue;
-import wei.yigulu.modbus.domain.datatype.numeric.ABCD;
 import wei.yigulu.modbus.domain.datatype.numeric.P_AB;
 import wei.yigulu.modbus.domain.synchronouswaitingroom.TcpSynchronousWaitingRoom;
 import wei.yigulu.modbus.exceptiom.ModbusException;
 import wei.yigulu.modbus.netty.ModbusRtuMasterBuilder;
-import wei.yigulu.modbus.netty.ModbusTcpMasterBuilder;
 import wei.yigulu.modbus.utils.ModbusCommandDataUtils;
 
 import java.math.BigDecimal;
@@ -28,12 +26,12 @@ public class TestRtuCommandMaster {
 		BigDecimal val;
 		BigDecimal val1;
 		for (; ; ) {
-			val=BigDecimal.valueOf(random.nextInt(100));
-			System.out.println("数据个数:"+val);
+			val = BigDecimal.valueOf(random.nextInt(100));
+			System.out.println("数据个数:" + val);
 			List<RegisterValue> list = new ArrayList<>();
 			for (int i = 0; i <= val.intValue(); i++) {
-				val1=BigDecimal.valueOf(random.nextInt(11));
-				System.out.println("数据值:"+val1);
+				val1 = BigDecimal.valueOf(random.nextInt(11));
+				System.out.println("数据值:" + val1);
 				list.add(new P_AB().setValue(val1));
 			}
 			System.out.println(ModbusCommandDataUtils.commandRegister(master, 1, 0, list));

+ 2 - 2
protocol-modbus/src/test/java/TestRtuMaster.java

@@ -31,8 +31,8 @@ public class TestRtuMaster {
 		master3.createByUnBlock();*/
 		Thread.sleep(5000L);
 		Map<Integer, ModbusDataTypeEnum> map = new HashMap<>();
-		for (int i = 0; i < 60; i+=2) {
-			map.put(i , ModbusDataTypeEnum.CDAB);
+		for (int i = 0; i < 60; i += 2) {
+			map.put(i, ModbusDataTypeEnum.CDAB);
 		}
 		List<Obj4RequestRegister> ll = ModbusRequestDataUtils.splitModbusRequest(map, 1, FunctionCode.READ_HOLDING_REGISTERS);
 

+ 0 - 1
protocol-modbus/src/test/java/TestSlaver.java

@@ -1,4 +1,3 @@
-import wei.yigulu.modbus.domain.datatype.numeric.ABCD;
 import wei.yigulu.modbus.domain.datatype.numeric.BADC;
 import wei.yigulu.modbus.netty.ModbusTcpSlaverBuilder;
 

+ 8 - 15
protocol-modbus/src/test/java/TestTcpCommandMaster.java

@@ -1,21 +1,15 @@
 import lombok.extern.slf4j.Slf4j;
-import wei.yigulu.modbus.domain.FunctionCode;
-import wei.yigulu.modbus.domain.Obj4RequestRegister;
-import wei.yigulu.modbus.domain.datatype.IModbusDataType;
-import wei.yigulu.modbus.domain.datatype.ModbusDataTypeEnum;
-import wei.yigulu.modbus.domain.datatype.NumericModbusData;
 import wei.yigulu.modbus.domain.datatype.RegisterValue;
-import wei.yigulu.modbus.domain.datatype.numeric.ABCD;
 import wei.yigulu.modbus.domain.datatype.numeric.P_AB;
 import wei.yigulu.modbus.domain.synchronouswaitingroom.TcpSynchronousWaitingRoom;
 import wei.yigulu.modbus.exceptiom.ModbusException;
-import wei.yigulu.modbus.netty.ModbusRtuMasterBuilder;
 import wei.yigulu.modbus.netty.ModbusTcpMasterBuilder;
 import wei.yigulu.modbus.utils.ModbusCommandDataUtils;
-import wei.yigulu.modbus.utils.ModbusRequestDataUtils;
 
 import java.math.BigDecimal;
-import java.util.*;
+import java.util.ArrayList;
+import java.util.List;
+import java.util.Random;
 
 /**
  * @author: xiuwei
@@ -24,7 +18,7 @@ import java.util.*;
 @Slf4j
 public class TestTcpCommandMaster {
 	public static void main(String[] args) throws InterruptedException, ModbusException {
-		ModbusTcpMasterBuilder master = new ModbusTcpMasterBuilder("127.0.0.1",5002);
+		ModbusTcpMasterBuilder master = new ModbusTcpMasterBuilder("127.0.0.1", 5002);
 		master.createByUnBlock();
 		TcpSynchronousWaitingRoom.waitTime = 5000L;
 		Thread.sleep(3000L);
@@ -32,12 +26,12 @@ public class TestTcpCommandMaster {
 		BigDecimal val;
 		BigDecimal val1;
 		for (; ; ) {
-			val=BigDecimal.valueOf(random.nextInt(100));
-			System.out.println("数据个数:"+val);
+			val = BigDecimal.valueOf(random.nextInt(100));
+			System.out.println("数据个数:" + val);
 			List<RegisterValue> list = new ArrayList<>();
 			for (int i = 0; i <= val.intValue(); i++) {
-				val1=BigDecimal.valueOf(random.nextInt(11));
-				System.out.println("数据值:"+val1);
+				val1 = BigDecimal.valueOf(random.nextInt(11));
+				System.out.println("数据值:" + val1);
 				list.add(new P_AB().setValue(val1));
 			}
 			System.out.println(ModbusCommandDataUtils.commandRegister(master, 1, 0, list));
@@ -46,5 +40,4 @@ public class TestTcpCommandMaster {
 	}
 
 
-
 }