From 23416fa69f8f79ae220688001bb34f27d61b1232 Mon Sep 17 00:00:00 2001 From: kaizhi.wu Date: Mon, 5 Apr 2021 22:27:33 +0800 Subject: [PATCH] feat: refactor the client and the step iterations; --- src/main/java/com/example/mina/client/base/AbstractClientFactory.java | 9 ++++++--- src/main/java/com/example/mina/client/base/AbstractMatrixIoHandler.java | 16 +++++++++------- src/main/java/com/example/mina/client/base/Experiment.java | 2 +- src/main/java/com/example/mina/client/base/ExperimentOptions.java | 19 ++++++++++++++----- src/main/java/com/example/mina/client/base/MatrixClient.java | 26 ++++++++++++++++---------- src/main/java/com/example/mina/client/base/MatrixConstants.java | 2 ++ src/main/java/com/example/mina/client/base/MatrixDataProxy.java | 25 ++++++------------------- src/main/java/com/example/mina/client/base/Mimo.java | 8 ++++++++ src/main/java/com/example/mina/client/base/SendMessage.java | 19 ------------------- src/main/java/com/example/mina/client/base/StationPair.java | 3 +++ src/main/java/com/example/mina/client/box/aeroflex/AeroflexClientIoHandler.java | 8 -------- src/main/java/com/example/mina/client/box/lte3000/Lte3000ClientIoHandler.java | 4 ---- src/main/java/com/example/mina/client/box/qrb3000/Qrb3000ClientIoHandler.java | 9 --------- src/main/java/com/example/mina/client/box/rbm3000/Rbm3000ClientIoHandler.java | 9 --------- src/main/java/com/example/mina/client/box/rec6000/REC6000ClientIoHandler.java | 9 --------- src/main/java/com/example/mina/client/experiment/HandOverExperimentOptions.java | 17 +++++++++++++++++ src/main/java/com/example/mina/client/experiment/HandoverExperiment.java | 18 +++++++----------- src/main/java/com/example/mina/client/experiment/StepIterator.java | 75 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 18 files changed, 164 insertions(+), 114 deletions(-) create mode 100644 src/main/java/com/example/mina/client/base/Mimo.java delete mode 100644 src/main/java/com/example/mina/client/base/SendMessage.java create mode 100644 src/main/java/com/example/mina/client/experiment/StepIterator.java diff --git a/src/main/java/com/example/mina/client/base/AbstractClientFactory.java b/src/main/java/com/example/mina/client/base/AbstractClientFactory.java index 61a7a24..df31aad 100644 --- a/src/main/java/com/example/mina/client/base/AbstractClientFactory.java +++ b/src/main/java/com/example/mina/client/base/AbstractClientFactory.java @@ -15,8 +15,10 @@ public abstract class AbstractClientFactory { abstract public AbstractMatrixIoHandler getClientHandler(); - public void buildFilterChain(IoFilterChain ioFilterChain){ + public void buildFilterChain(IoFilterChain ioFilterChain) throws Exception{ + ioFilterChain.addLast("codec", new ProtocolCodecFilter(new ByteProtocolFactory())); + } public MatrixClient createClient(MatrixConnectConfig connectConfig){ @@ -27,9 +29,10 @@ public abstract class AbstractClientFactory { MatrixClient client = new MatrixClient(connectConfig); client.setClientHandler(getClientHandler()); - //TODO initiate the client - buildFilterChain(client.getFilterChain()); + client.setMatrixDataProxy(matrixDataProxy); + client.connect(); + buildFilterChain(client.getFilterChain()); return client; }catch (Exception e) { log.error("Can not create the client, error: ", e); diff --git a/src/main/java/com/example/mina/client/base/AbstractMatrixIoHandler.java b/src/main/java/com/example/mina/client/base/AbstractMatrixIoHandler.java index 732b628..66f54ff 100644 --- a/src/main/java/com/example/mina/client/base/AbstractMatrixIoHandler.java +++ b/src/main/java/com/example/mina/client/base/AbstractMatrixIoHandler.java @@ -3,7 +3,6 @@ package com.example.mina.client.base; import lombok.Data; import lombok.extern.slf4j.Slf4j; -import org.apache.mina.core.buffer.IoBuffer; import org.apache.mina.core.service.IoHandlerAdapter; import org.apache.mina.core.session.IdleStatus; import org.apache.mina.core.session.IoSession; @@ -15,12 +14,6 @@ import org.apache.mina.core.session.IoSession; @Slf4j public abstract class AbstractMatrixIoHandler extends IoHandlerAdapter { - protected MatrixDataProxy matrixDataProxy; - - public AbstractMatrixIoHandler(MatrixDataProxy matrixDataProxy) { - this.matrixDataProxy = matrixDataProxy; - } - protected MatrixConnectConfig getConnectConfig(IoSession session) { Object boxConnectConfig = session.getAttribute(MatrixConstants.SESSION_CONFIG_NAME); @@ -30,6 +23,15 @@ public abstract class AbstractMatrixIoHandler extends IoHandlerAdapter { return null; } + protected MatrixDataProxy getMatrixDataProxy(IoSession session) { + Object matrixDataProxy = session.getAttribute(MatrixConstants.SESSION_DATA_PROXY_NAME); + + if( matrixDataProxy instanceof MatrixDataProxy) { + return (MatrixDataProxy) matrixDataProxy; + } + return null; + } + @Override public void exceptionCaught(IoSession session, Throwable throwable) { } diff --git a/src/main/java/com/example/mina/client/base/Experiment.java b/src/main/java/com/example/mina/client/base/Experiment.java index aca7e1a..8a337d1 100644 --- a/src/main/java/com/example/mina/client/base/Experiment.java +++ b/src/main/java/com/example/mina/client/base/Experiment.java @@ -53,7 +53,7 @@ public abstract class Experiment pairs; - protected abstract boolean checkOptions(); + protected boolean checkOptions(){ + if(startAttn<0 || endAttn<0 || startAttn>endAttn || step<=0 + || pause<0 || period<=0 || iterations<=0 || finishAt==null || + finishAt.isBefore(ZonedDateTime.now())) { + return false; + } + return true; + } } diff --git a/src/main/java/com/example/mina/client/base/MatrixClient.java b/src/main/java/com/example/mina/client/base/MatrixClient.java index 3eb33ba..834fc30 100644 --- a/src/main/java/com/example/mina/client/base/MatrixClient.java +++ b/src/main/java/com/example/mina/client/base/MatrixClient.java @@ -1,19 +1,16 @@ package com.example.mina.client.base; import lombok.extern.slf4j.Slf4j; -import org.apache.mina.core.filterchain.DefaultIoFilterChainBuilder; import org.apache.mina.core.filterchain.IoFilterChain; import org.apache.mina.core.future.ConnectFuture; import org.apache.mina.core.future.WriteFuture; import org.apache.mina.core.service.IoConnector; import org.apache.mina.core.session.IoSession; -import org.apache.mina.filter.codec.ProtocolCodecFilter; import org.apache.mina.transport.socket.nio.NioSocketConnector; import org.springframework.util.Assert; import java.net.InetSocketAddress; import java.util.concurrent.LinkedBlockingQueue; -import java.util.concurrent.TimeUnit; /** * @author dy @@ -32,6 +29,11 @@ public class MatrixClient { */ protected LinkedBlockingQueue requestsPool; + /** + * the data proxy + */ + private MatrixDataProxy matrixDataProxy; + protected AbstractMatrixIoHandler clientHandler; protected IoSession ioSession; @@ -42,8 +44,6 @@ public class MatrixClient { this.matrixConnectConfig = connectConfig; this.requestsPool = new LinkedBlockingQueue<>(); this.sender = new CommandSender(this, this.requestsPool); - - this.sender.start(); } /** @@ -75,16 +75,22 @@ public class MatrixClient { this.clientHandler = clientHandler; } + /** + * get the io filter chain + */ + public IoFilterChain getFilterChain() { + return ioSession.getFilterChain(); + } /** - * 返回该盒子的编解码器,默认为tcp的协议,如果是其它协议,可以在自类中重写改方法 + * Set the data proxy * @return */ - protected void setFilterChain(DefaultIoFilterChainBuilder filterChainBuilder) { - filterChainBuilder.addLast("codec", new ProtocolCodecFilter(new ByteProtocolFactory())); + public void setMatrixDataProxy(MatrixDataProxy matrixDataProxy) { + this.matrixDataProxy = matrixDataProxy; } - public IoFilterChain getFilterChain() { + public void connect() { //1、创建客户端IoService IoConnector connector = new NioSocketConnector(); //客户端链接超时时间 @@ -103,8 +109,8 @@ public class MatrixClient { // 获取连接会话 this.ioSession = connectFuture.getSession(); this.ioSession.setAttribute(MatrixConstants.SESSION_CONFIG_NAME, matrixConnectConfig); + this.ioSession.setAttribute(MatrixConstants.SESSION_DATA_PROXY_NAME, matrixDataProxy); - return ioSession.getFilterChain(); } public void start() { diff --git a/src/main/java/com/example/mina/client/base/MatrixConstants.java b/src/main/java/com/example/mina/client/base/MatrixConstants.java index 1b1944e..035146f 100644 --- a/src/main/java/com/example/mina/client/base/MatrixConstants.java +++ b/src/main/java/com/example/mina/client/base/MatrixConstants.java @@ -4,6 +4,8 @@ public class MatrixConstants { public static final String SESSION_CONFIG_NAME = "SESSION_CONFIG"; + public static final String SESSION_DATA_PROXY_NAME = "DATA_PROXY"; + public static final String MATRIX_TYPE_AERO = "AEROFLEX"; public static final String MATRIX_TYPE_LTE3000 = "LTE3000"; diff --git a/src/main/java/com/example/mina/client/base/MatrixDataProxy.java b/src/main/java/com/example/mina/client/base/MatrixDataProxy.java index 1f50f03..897bfab 100644 --- a/src/main/java/com/example/mina/client/base/MatrixDataProxy.java +++ b/src/main/java/com/example/mina/client/base/MatrixDataProxy.java @@ -1,33 +1,20 @@ package com.example.mina.client.base; -public class MatrixDataProxy { +public interface MatrixDataProxy { /** * 当从设备端将数据同步到客户端的时候,将数据直接存入数据中, * 该类会在ioHandler及其子类中被调用 * 设置attenuation的值,并将其存储到matrix_data的数据表中 */ - public void setAttenuation(String deviceId, int row, int col, int val) { - //TODO 实现将数据写入到数据库的逻辑 - } + void setAttenuation(String deviceId, int row, int col, int val); - public int getAttenuation(String deviceId, int row, int col) { - return -1; - } + int getAttenuation(String deviceId, int row, int col); - public void setOffset(int row, int val) { + void setOffset(int row, int val); - } + void resetAttenuation(); - public int getOffset(int row) { - return -1; - } + int getOffset(int row); - public void resetAttenuation() { - - } - - private String getCurrentThreadId() { - return Thread.currentThread().getName(); - } } diff --git a/src/main/java/com/example/mina/client/base/Mimo.java b/src/main/java/com/example/mina/client/base/Mimo.java new file mode 100644 index 0000000..cc5059f --- /dev/null +++ b/src/main/java/com/example/mina/client/base/Mimo.java @@ -0,0 +1,8 @@ +package com.example.mina.client.base; + +public enum Mimo { + + NO, + M2X2, + M4X4 +} diff --git a/src/main/java/com/example/mina/client/base/SendMessage.java b/src/main/java/com/example/mina/client/base/SendMessage.java deleted file mode 100644 index efba25e..0000000 --- a/src/main/java/com/example/mina/client/base/SendMessage.java +++ /dev/null @@ -1,19 +0,0 @@ -package com.example.mina.client.base; - -import lombok.AllArgsConstructor; -import lombok.Data; -import lombok.NoArgsConstructor; -import lombok.experimental.SuperBuilder; - -/** - * @author dy - * @date 2021/3/12 - */ -@SuperBuilder -@Data -@AllArgsConstructor -@NoArgsConstructor -public class SendMessage { - - private byte[] sendMessage; -} diff --git a/src/main/java/com/example/mina/client/base/StationPair.java b/src/main/java/com/example/mina/client/base/StationPair.java index b1659ed..e75da73 100644 --- a/src/main/java/com/example/mina/client/base/StationPair.java +++ b/src/main/java/com/example/mina/client/base/StationPair.java @@ -1,6 +1,8 @@ package com.example.mina.client.base; import java.util.List; + +import lombok.Builder; import lombok.Data; /** @@ -9,6 +11,7 @@ import lombok.Data; * @date 2021/4/2 */ @Data +@Builder public class StationPair { /** * 输出端口 diff --git a/src/main/java/com/example/mina/client/box/aeroflex/AeroflexClientIoHandler.java b/src/main/java/com/example/mina/client/box/aeroflex/AeroflexClientIoHandler.java index e28ff58..3f039dc 100644 --- a/src/main/java/com/example/mina/client/box/aeroflex/AeroflexClientIoHandler.java +++ b/src/main/java/com/example/mina/client/box/aeroflex/AeroflexClientIoHandler.java @@ -13,14 +13,6 @@ import org.apache.mina.core.session.IoSession; @Slf4j public class AeroflexClientIoHandler extends AbstractMatrixIoHandler { - //public AeroflexClientIoHandler(MatrixDataProxy matrixDataProxy) { - // super(matrixDataProxy); - // } - - public AeroflexClientIoHandler() { - super(new MatrixDataProxy()); - } - @Override public boolean handleCommandResponse(MatrixResponse matrixResponse) { diff --git a/src/main/java/com/example/mina/client/box/lte3000/Lte3000ClientIoHandler.java b/src/main/java/com/example/mina/client/box/lte3000/Lte3000ClientIoHandler.java index 5a0d521..bdf85de 100644 --- a/src/main/java/com/example/mina/client/box/lte3000/Lte3000ClientIoHandler.java +++ b/src/main/java/com/example/mina/client/box/lte3000/Lte3000ClientIoHandler.java @@ -14,10 +14,6 @@ import org.apache.mina.core.session.IoSession; @Slf4j public class Lte3000ClientIoHandler extends AbstractMatrixIoHandler { - public Lte3000ClientIoHandler() { - super(new MatrixDataProxy()); - } - protected boolean isSameValue(byte value, int expect) { return ((0xFF & value) == expect); } diff --git a/src/main/java/com/example/mina/client/box/qrb3000/Qrb3000ClientIoHandler.java b/src/main/java/com/example/mina/client/box/qrb3000/Qrb3000ClientIoHandler.java index 9ad07ef..da92f9e 100644 --- a/src/main/java/com/example/mina/client/box/qrb3000/Qrb3000ClientIoHandler.java +++ b/src/main/java/com/example/mina/client/box/qrb3000/Qrb3000ClientIoHandler.java @@ -13,15 +13,6 @@ import org.apache.mina.core.session.IoSession; @Slf4j public class Qrb3000ClientIoHandler extends AbstractMatrixIoHandler { - //public AeroflexClientIoHandler(MatrixDataProxy matrixDataProxy) { - // super(matrixDataProxy); - // } - - public Qrb3000ClientIoHandler() { - super(new MatrixDataProxy()); - } - - @Override public boolean handleCommandResponse(MatrixResponse matrixResponse) { log.info("------Qrb3000ClientIoHandler-----{}",matrixResponse); diff --git a/src/main/java/com/example/mina/client/box/rbm3000/Rbm3000ClientIoHandler.java b/src/main/java/com/example/mina/client/box/rbm3000/Rbm3000ClientIoHandler.java index 14cce72..4e1621a 100644 --- a/src/main/java/com/example/mina/client/box/rbm3000/Rbm3000ClientIoHandler.java +++ b/src/main/java/com/example/mina/client/box/rbm3000/Rbm3000ClientIoHandler.java @@ -13,15 +13,6 @@ import org.apache.mina.core.session.IoSession; @Slf4j public class Rbm3000ClientIoHandler extends AbstractMatrixIoHandler { - //public AeroflexClientIoHandler(MatrixDataProxy matrixDataProxy) { - // super(matrixDataProxy); - // } - - public Rbm3000ClientIoHandler() { - super(new MatrixDataProxy()); - } - - @Override public boolean handleCommandResponse(MatrixResponse matrixResponse) { log.info("------Rbm3000ClientIoHandler-----{}",matrixResponse); diff --git a/src/main/java/com/example/mina/client/box/rec6000/REC6000ClientIoHandler.java b/src/main/java/com/example/mina/client/box/rec6000/REC6000ClientIoHandler.java index 63d0fe5..3336cda 100644 --- a/src/main/java/com/example/mina/client/box/rec6000/REC6000ClientIoHandler.java +++ b/src/main/java/com/example/mina/client/box/rec6000/REC6000ClientIoHandler.java @@ -13,15 +13,6 @@ import org.apache.mina.core.session.IoSession; @Slf4j public class REC6000ClientIoHandler extends AbstractMatrixIoHandler { - //public AeroflexClientIoHandler(MatrixDataProxy matrixDataProxy) { - // super(matrixDataProxy); - // } - - public REC6000ClientIoHandler() { - super(new MatrixDataProxy()); - } - - @Override public boolean handleCommandResponse(MatrixResponse matrixResponse) { log.info("------REC3000ClientIoHandler-----{}",matrixResponse); diff --git a/src/main/java/com/example/mina/client/experiment/HandOverExperimentOptions.java b/src/main/java/com/example/mina/client/experiment/HandOverExperimentOptions.java index fa1c621..6c1866d 100644 --- a/src/main/java/com/example/mina/client/experiment/HandOverExperimentOptions.java +++ b/src/main/java/com/example/mina/client/experiment/HandOverExperimentOptions.java @@ -1,18 +1,35 @@ package com.example.mina.client.experiment; import com.example.mina.client.base.ExperimentOptions; +import com.example.mina.client.base.Mimo; +import com.example.mina.client.base.StationPair; import lombok.Data; import lombok.EqualsAndHashCode; import lombok.ToString; +import java.util.List; + @Data @EqualsAndHashCode(callSuper = true) @ToString(callSuper = true) public class HandOverExperimentOptions extends ExperimentOptions { + private Mimo mimo; + + protected List pairs; + @Override protected boolean checkOptions() { + + if(!super.checkOptions()) { + return false; + } + + if(pairs.size()<=2) { + return false; + } + return true; } } diff --git a/src/main/java/com/example/mina/client/experiment/HandoverExperiment.java b/src/main/java/com/example/mina/client/experiment/HandoverExperiment.java index 43a8348..678f3e5 100644 --- a/src/main/java/com/example/mina/client/experiment/HandoverExperiment.java +++ b/src/main/java/com/example/mina/client/experiment/HandoverExperiment.java @@ -1,18 +1,14 @@ package com.example.mina.client.experiment; -import com.example.mina.client.base.Experiment; -import com.example.mina.client.base.ExperimentOptions; -import com.example.mina.client.base.MatrixClient; -import com.example.mina.client.base.MatrixCommand; -import com.example.mina.client.base.MatrixConstants; -import com.example.mina.client.base.StationPair; +import com.example.mina.client.base.*; +import org.springframework.util.CollectionUtils; + import java.util.ArrayList; import java.util.List; -import org.springframework.util.CollectionUtils; -public class HandoverExperiment extends Experiment { +public class HandoverExperiment extends Experiment { - public HandoverExperiment(MatrixClient client, ExperimentOptions options) { + public HandoverExperiment(MatrixClient client, HandOverExperimentOptions options) { super(client, options); } @@ -37,12 +33,12 @@ public class HandoverExperiment extends Experiment { return; } // circle count - Integer count = options.getMaxIterCount(); + Integer count = options.getIterations(); if (count == null || count < 1) { return; } Integer step = options.getStep(); - Integer endAttenuation = options.getEndAttenuation(); + Integer endAttenuation = options.getEndAttn(); if (step == null || step <= 0) { return; } diff --git a/src/main/java/com/example/mina/client/experiment/StepIterator.java b/src/main/java/com/example/mina/client/experiment/StepIterator.java new file mode 100644 index 0000000..02b8458 --- /dev/null +++ b/src/main/java/com/example/mina/client/experiment/StepIterator.java @@ -0,0 +1,75 @@ +package com.example.mina.client.experiment; + +import com.example.mina.client.base.MatrixCommand; +import com.example.mina.client.base.StationPair; + +import java.util.Iterator; + +/** + * This is used for handover iterations + * Usage: + * StationPair stationPair = StationPair.builder().out(5).inList(Arrays.asList(1,2,3)).build(); + * StepIterator stepIterator = new StepIterator(stationPair, 3, 43, 10); + * + * + * while (stepIterator.hasNext()) { + * MatrixCommand[] cmds = stepIterator.next(); + * System.out.println(cmds[0] + "----------"+ cmds[1]); + * } + * + */ + +public class StepIterator implements Iterator{ + + private StationPair stationPair; + private int minAttn; + private int maxAttn; + private int step; + + private int curInputIndex; + private int nextInputIndex; + + private int curAttn1; + private int curAttn2; + + public StepIterator(StationPair station, int min, int max, int step) { + this.stationPair = station; + this.minAttn = min; + this.maxAttn = max; + this.step = step; + + curInputIndex = 0; + nextInputIndex = curInputIndex + 1; + curAttn1 = minAttn; + curAttn2 = maxAttn; + } + + @Override + public boolean hasNext() { + return curInputIndex= maxAttn) { + cmds[0].setAttn(maxAttn); + cmds[1].setAttn(minAttn); + curInputIndex++; + nextInputIndex = (curInputIndex + 1) % stationPair.getInList().size(); + + curAttn1 = minAttn; + curAttn2 = maxAttn; + }else{ + curAttn1 = curAttn1 + step; + curAttn2 = curAttn2 - step; + } + + return cmds; + } +} -- libgit2 0.21.2