From 24aee0286dfc227c7ee260153913ac058a0edf86 Mon Sep 17 00:00:00 2001 From: 杜云山 <870666625@qq.com> Date: Tue, 9 Mar 2021 11:31:28 +0800 Subject: [PATCH] feat: 修改message的解析放DeCoder中 --- src/main/java/com/example/mina/base/BaseRequestMessage.java | 2 ++ src/main/java/com/example/mina/base/BaseResponseMessage.java | 4 ++++ src/main/java/com/example/mina/box/aeroflex/AeroflexCodecFactory.java | 60 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++-- src/main/java/com/example/mina/box/aeroflex/AeroflexRequestMessage.java | 22 ++++++++++++++++++++++ src/main/java/com/example/mina/box/aeroflex/AeroflexResponseMessage.java | 1 + src/main/java/com/example/mina/box/aeroflex/AeroflexVirtualBoxHandler.java | 85 +++++++++++++++++++++++++++++++------------------------------------------------------ 6 files changed, 118 insertions(+), 56 deletions(-) diff --git a/src/main/java/com/example/mina/base/BaseRequestMessage.java b/src/main/java/com/example/mina/base/BaseRequestMessage.java index ff52769..644ea57 100644 --- a/src/main/java/com/example/mina/base/BaseRequestMessage.java +++ b/src/main/java/com/example/mina/base/BaseRequestMessage.java @@ -21,4 +21,6 @@ public abstract class BaseRequestMessage { protected int out; + protected boolean hasError; + } diff --git a/src/main/java/com/example/mina/base/BaseResponseMessage.java b/src/main/java/com/example/mina/base/BaseResponseMessage.java index 42b6517..ca1fd86 100644 --- a/src/main/java/com/example/mina/base/BaseResponseMessage.java +++ b/src/main/java/com/example/mina/base/BaseResponseMessage.java @@ -15,6 +15,10 @@ import lombok.experimental.SuperBuilder; @NoArgsConstructor public abstract class BaseResponseMessage { + public static final byte[] ERROR = "ERROR".getBytes(); + + public static final byte[] NONE = "OK".getBytes(); + protected byte[] result; protected int in; diff --git a/src/main/java/com/example/mina/box/aeroflex/AeroflexCodecFactory.java b/src/main/java/com/example/mina/box/aeroflex/AeroflexCodecFactory.java index 8192378..d0b795d 100644 --- a/src/main/java/com/example/mina/box/aeroflex/AeroflexCodecFactory.java +++ b/src/main/java/com/example/mina/box/aeroflex/AeroflexCodecFactory.java @@ -1,5 +1,6 @@ package com.example.mina.box.aeroflex; +import com.example.mina.util.StrUtil; import org.apache.mina.core.buffer.IoBuffer; import org.apache.mina.core.session.IoSession; import org.apache.mina.filter.codec.*; @@ -46,11 +47,66 @@ public class AeroflexCodecFactory implements ProtocolCodecFactory { byte[] bytes = new byte[in.limit()]; in.get(bytes); + AeroflexRequestMessage requestMessage = getAeroflexRequestMessage(bytes); + out.write(requestMessage); + } + + private AeroflexRequestMessage getAeroflexRequestMessage(byte[] bytes) { + + String cmd = new String(bytes).trim(); + AeroflexRequestMessage requestMessage = AeroflexRequestMessage.builder() - .cmd(new String(bytes)) + .cmd(cmd) .build(); - out.write(requestMessage); + // eg: "ATTN ALL MAX" + if (cmd.startsWith(AeroflexRequestMessage.SET_ALL)) { + requestMessage.setRequestSetAllMax(true); + return requestMessage; + } + + // eg: "ATTN? 1" + if (cmd.startsWith(AeroflexRequestMessage.GET_ONE)) { + + // eg: ["ATTN?", "1"] + String[] sss = cmd.split(AeroflexRequestMessage.SPACE_SPLIT); + + if (sss.length < 2) { + requestMessage.setHasError(true); + return requestMessage; + } + + int row = StrUtil.toInt(sss[1]); + requestMessage.setRequestGetOne(true); + requestMessage.setRequestGetOneRow(row); + return requestMessage; + + } + + // eg: "ATTN 2 3;" + if (cmd.startsWith(AeroflexRequestMessage.SET_ONE)) { + + // eg: ["ATTN 2 3"] + String[] aa = cmd.split(AeroflexRequestMessage.SEMICOLON_SPLIT); + + // eg: ["ATTN", "2", "3"] + String[] sss = aa[0].split(AeroflexRequestMessage.SPACE_SPLIT); + + if (sss.length < 3) { + requestMessage.setHasError(true); + return requestMessage; + } + + int row = StrUtil.toInt(sss[1]); + int val = StrUtil.toInt(sss[2]); + requestMessage.setRequestSetOne(true); + requestMessage.setRequestSetOneRow(row); + requestMessage.setRequestSetOneValue(val); + return requestMessage; + } + + requestMessage.setHasError(true); + return requestMessage; } @Override diff --git a/src/main/java/com/example/mina/box/aeroflex/AeroflexRequestMessage.java b/src/main/java/com/example/mina/box/aeroflex/AeroflexRequestMessage.java index fd361d4..fc99f80 100644 --- a/src/main/java/com/example/mina/box/aeroflex/AeroflexRequestMessage.java +++ b/src/main/java/com/example/mina/box/aeroflex/AeroflexRequestMessage.java @@ -16,4 +16,26 @@ import lombok.experimental.SuperBuilder; @AllArgsConstructor public class AeroflexRequestMessage extends BaseRequestMessage { + public static final String SET_ALL = "ATTN ALL MAX"; + + public static final String SET_ONE = "ATTN"; + + public static final String GET_ONE = "ATTN?"; + + public static final String SPACE_SPLIT = " "; + + public static final String SEMICOLON_SPLIT = ";"; + + private boolean requestSetAllMax; + + private boolean requestSetOne; + + private int requestSetOneRow; + + private int requestSetOneValue; + + private boolean requestGetOne; + + private int requestGetOneRow; + } diff --git a/src/main/java/com/example/mina/box/aeroflex/AeroflexResponseMessage.java b/src/main/java/com/example/mina/box/aeroflex/AeroflexResponseMessage.java index 08709c7..64e6f9c 100644 --- a/src/main/java/com/example/mina/box/aeroflex/AeroflexResponseMessage.java +++ b/src/main/java/com/example/mina/box/aeroflex/AeroflexResponseMessage.java @@ -16,4 +16,5 @@ import lombok.experimental.SuperBuilder; @AllArgsConstructor public class AeroflexResponseMessage extends BaseResponseMessage { + } diff --git a/src/main/java/com/example/mina/box/aeroflex/AeroflexVirtualBoxHandler.java b/src/main/java/com/example/mina/box/aeroflex/AeroflexVirtualBoxHandler.java index d4fb79c..246150a 100644 --- a/src/main/java/com/example/mina/box/aeroflex/AeroflexVirtualBoxHandler.java +++ b/src/main/java/com/example/mina/box/aeroflex/AeroflexVirtualBoxHandler.java @@ -2,7 +2,6 @@ package com.example.mina.box.aeroflex; import com.example.mina.base.AbstractVirtualBoxHandler; import com.example.mina.entity.AeroflexDataBuffer; -import com.example.mina.util.StrUtil; import lombok.extern.slf4j.Slf4j; import org.apache.mina.core.session.IoSession; @@ -14,20 +13,6 @@ import org.apache.mina.core.session.IoSession; public class AeroflexVirtualBoxHandler extends AbstractVirtualBoxHandler { - private static final byte[] ERROR = "ERROR".getBytes(); - - private static final byte[] NONE = "OK".getBytes(); - - private static final String SET_ALL = "ATTN ALL MAX"; - - private static final String SET_ONE = "ATTN"; - - private static final String GET_ONE = "ATTN?"; - - private static final String SPACE_SPLIT = " "; - - private static final String SEMICOLON_SPLIT = ";"; - private AeroflexDataBuffer dataBuffer; @Override @@ -40,61 +25,53 @@ public class AeroflexVirtualBoxHandler dataBuffer = new AeroflexDataBuffer(row, maxAttenuate); } - @Override - protected AeroflexResponseMessage handleMessage(AeroflexRequestMessage message) { - String command = message.getCmd().trim(); + protected AeroflexResponseMessage handleMessage(AeroflexRequestMessage requestMessage) { - log.info("aeroflexVirtualBoxHandler receive: {}", command); + log.info("aeroflexVirtualBoxHandler receive: {}", requestMessage.getCmd()); - if (command.startsWith(SET_ALL)) { - //set all to max + if (requestMessage.isHasError()) { + return AeroflexResponseMessage.builder().result(AeroflexResponseMessage.ERROR).build(); + } + + // set all to max + if (requestMessage.isRequestSetAllMax()) { for (int i = 1; i < dataBuffer.getMaxRow(); i++) { dataBuffer.setOffset(i, dataBuffer.getMaxAttenuate()); } + return AeroflexResponseMessage.builder().result(AeroflexResponseMessage.NONE).build(); + } - return AeroflexResponseMessage.builder().result(NONE).build(); - } else if (command.startsWith(GET_ONE)) { - //get - String[] sss = command.split(SPACE_SPLIT); - if (sss.length >= 2) { - - int row = StrUtil.toInt(sss[1]); - if (row >= 0 && row <= dataBuffer.getMaxRow()) { - String str = String.valueOf(dataBuffer.getOffset(row)); - log.info("aeroflexVirtualBoxHandler return: {}", str); - return AeroflexResponseMessage.builder().result(str.getBytes()).build(); - } + // get one + if (requestMessage.isRequestGetOne()) { + int row = requestMessage.getRequestGetOneRow(); + if (row >= 0 && row <= dataBuffer.getMaxRow()) { + String str = String.valueOf(dataBuffer.getOffset(row)); + log.info("aeroflexVirtualBoxHandler return: {}", str); + return AeroflexResponseMessage.builder().result(str.getBytes()).build(); } - return AeroflexResponseMessage.builder().result(ERROR).build(); - - } else if (command.startsWith(SET_ONE)) { - //Set, Follow by ATTN? - String[] aa = command.split(SEMICOLON_SPLIT); + return AeroflexResponseMessage.builder().result(AeroflexResponseMessage.NONE).build(); - String[] sss = aa[0].split(SPACE_SPLIT); - - if (sss.length >= 3) { + } - int row = StrUtil.toInt(sss[1]); - int val = StrUtil.toInt(sss[2]); + // Set, Follow by ATTN? + if (requestMessage.isRequestSetOne()) { - if (row >= 0 && row <= dataBuffer.getMaxRow()) { - if (val >= 0 && val <= dataBuffer.getMaxAttenuate()) { - dataBuffer.setOffset(row, val); + int row = requestMessage.getRequestSetOneRow(); + int val = requestMessage.getRequestSetOneValue(); - String str = String.valueOf(dataBuffer.getOffset(row)); - log.info("aeroflexVirtualBoxHandler return =====> {}", str); - return AeroflexResponseMessage.builder().result(str.getBytes()).build(); - } + if (row >= 0 && row <= dataBuffer.getMaxRow()) { + if (val >= 0 && val <= dataBuffer.getMaxAttenuate()) { + dataBuffer.setOffset(row, val); + String str = String.valueOf(dataBuffer.getOffset(row)); + log.info("aeroflexVirtualBoxHandler return =====> {}", str); + return AeroflexResponseMessage.builder().result(str.getBytes()).build(); } } - return AeroflexResponseMessage.builder().result(ERROR).build(); - - } else { - return AeroflexResponseMessage.builder().result(ERROR).build(); + return AeroflexResponseMessage.builder().result(AeroflexResponseMessage.ERROR).build(); } + return AeroflexResponseMessage.builder().result(AeroflexResponseMessage.ERROR).build(); } @Override -- libgit2 0.21.2