From d031a58b8d8e019700170bfd2cd63fd96bcd636a Mon Sep 17 00:00:00 2001 From: 杜云山 <870666625@qq.com> Date: Mon, 8 Mar 2021 11:11:34 +0800 Subject: [PATCH] feat: 增加解码编码器, 增加message --- src/main/java/com/example/mina/base/AbstractVirtualBoxHandler.java | 8 ++++---- src/main/java/com/example/mina/base/AbstractVirtualBoxServer.java | 62 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ src/main/java/com/example/mina/base/BaseRequestMessage.java | 24 ++++++++++++++++++++++++ src/main/java/com/example/mina/base/BaseResponseMessage.java | 24 ++++++++++++++++++++++++ src/main/java/com/example/mina/base/CommandHelper.java | 33 --------------------------------- src/main/java/com/example/mina/box/aeroflex/AeroflexCodecFactory.java | 68 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ src/main/java/com/example/mina/box/aeroflex/AeroflexRequestMessage.java | 19 +++++++++++++++++++ src/main/java/com/example/mina/box/aeroflex/AeroflexResponseMessage.java | 19 +++++++++++++++++++ src/main/java/com/example/mina/box/aeroflex/AeroflexVirtualBoxHandler.java | 137 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ src/main/java/com/example/mina/box/aeroflex/AeroflexVirtualBoxServer.java | 20 ++++++++++++++++++++ src/main/java/com/example/mina/box/rbm3000/Rbm3000CodecFactory.java | 62 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ src/main/java/com/example/mina/box/rbm3000/Rbm3000VirtualBoxHander.java | 176 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ src/main/java/com/example/mina/box/rbm3000/Rbm3000VirtualBoxServer.java | 20 ++++++++++++++++++++ src/main/java/com/example/mina/boxhandler/AeroflexVirtualBoxHandler.java | 139 ------------------------------------------------------------------------------------------------------------------------------------------- src/main/java/com/example/mina/boxhandler/Rbm3000VirtualBoxHander.java | 176 -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- src/main/java/com/example/mina/boxserver/AbstractVirtualBoxServer.java | 56 -------------------------------------------------------- src/main/java/com/example/mina/boxserver/AeroflexVirtualBoxServer.java | 20 -------------------- src/main/java/com/example/mina/boxserver/Rbm3000VirtualBoxServer.java | 20 -------------------- src/main/java/com/example/mina/util/CommandHelper.java | 33 +++++++++++++++++++++++++++++++++ 19 files changed, 668 insertions(+), 448 deletions(-) create mode 100644 src/main/java/com/example/mina/base/AbstractVirtualBoxServer.java create mode 100644 src/main/java/com/example/mina/base/BaseRequestMessage.java create mode 100644 src/main/java/com/example/mina/base/BaseResponseMessage.java delete mode 100644 src/main/java/com/example/mina/base/CommandHelper.java create mode 100644 src/main/java/com/example/mina/box/aeroflex/AeroflexCodecFactory.java create mode 100644 src/main/java/com/example/mina/box/aeroflex/AeroflexRequestMessage.java create mode 100644 src/main/java/com/example/mina/box/aeroflex/AeroflexResponseMessage.java create mode 100644 src/main/java/com/example/mina/box/aeroflex/AeroflexVirtualBoxHandler.java create mode 100644 src/main/java/com/example/mina/box/aeroflex/AeroflexVirtualBoxServer.java create mode 100644 src/main/java/com/example/mina/box/rbm3000/Rbm3000CodecFactory.java create mode 100644 src/main/java/com/example/mina/box/rbm3000/Rbm3000VirtualBoxHander.java create mode 100644 src/main/java/com/example/mina/box/rbm3000/Rbm3000VirtualBoxServer.java delete mode 100644 src/main/java/com/example/mina/boxhandler/AeroflexVirtualBoxHandler.java delete mode 100644 src/main/java/com/example/mina/boxhandler/Rbm3000VirtualBoxHander.java delete mode 100644 src/main/java/com/example/mina/boxserver/AbstractVirtualBoxServer.java delete mode 100644 src/main/java/com/example/mina/boxserver/AeroflexVirtualBoxServer.java delete mode 100644 src/main/java/com/example/mina/boxserver/Rbm3000VirtualBoxServer.java create mode 100644 src/main/java/com/example/mina/util/CommandHelper.java diff --git a/src/main/java/com/example/mina/base/AbstractVirtualBoxHandler.java b/src/main/java/com/example/mina/base/AbstractVirtualBoxHandler.java index f4fbe3a..4457765 100644 --- a/src/main/java/com/example/mina/base/AbstractVirtualBoxHandler.java +++ b/src/main/java/com/example/mina/base/AbstractVirtualBoxHandler.java @@ -6,7 +6,8 @@ import org.apache.mina.core.service.IoHandlerAdapter; * @author 杜云山 * @date 21/03/05 */ -public abstract class AbstractVirtualBoxHandler extends IoHandlerAdapter { +public abstract class AbstractVirtualBoxHandler + extends IoHandlerAdapter { /** * 初始化矩阵以及该设备的一些参数 @@ -16,10 +17,9 @@ public abstract class AbstractVirtualBoxHandler extends IoHandlerAdapter { /** * 处理消息 * - * @param cmd 指令数据 - * @param len 数据长度 + * @param requestMessage 请求 * @return 返回消息 */ - protected abstract byte[] handleMessage(byte[] cmd, int len); + protected abstract RESPONSE handleMessage(REQUEST requestMessage); } diff --git a/src/main/java/com/example/mina/base/AbstractVirtualBoxServer.java b/src/main/java/com/example/mina/base/AbstractVirtualBoxServer.java new file mode 100644 index 0000000..0c2fb80 --- /dev/null +++ b/src/main/java/com/example/mina/base/AbstractVirtualBoxServer.java @@ -0,0 +1,62 @@ +package com.example.mina.base; + +import com.example.mina.property.AbstractVirtualBoxProperties; +import lombok.extern.slf4j.Slf4j; +import org.apache.mina.filter.codec.ProtocolCodecFactory; +import org.apache.mina.filter.codec.ProtocolCodecFilter; +import org.apache.mina.transport.socket.nio.NioSocketAcceptor; +import org.springframework.boot.ApplicationArguments; +import org.springframework.boot.ApplicationRunner; + +import java.net.InetSocketAddress; + +/** + * @author 杜云山 + * @date 21/03/05 + */ +@Slf4j +public class AbstractVirtualBoxServer implements ApplicationRunner { + + private final AbstractVirtualBoxProperties abstractVirtualBoxProperties; + + private final AbstractVirtualBoxHandler abstractVirtualBoxHandler; + + private final ProtocolCodecFactory protocolCodecFactory; + + public AbstractVirtualBoxServer(AbstractVirtualBoxProperties abstractVirtualBoxProperties, + AbstractVirtualBoxHandler abstractVirtualBoxHandler, + ProtocolCodecFactory protocolCodecFactory) { + this.abstractVirtualBoxProperties = abstractVirtualBoxProperties; + this.abstractVirtualBoxHandler = abstractVirtualBoxHandler; + this.protocolCodecFactory = protocolCodecFactory; + } + + @Override + public void run(ApplicationArguments args) { + + String name = abstractVirtualBoxProperties.getName(); + Integer port = abstractVirtualBoxProperties.getPort(); + + if (!abstractVirtualBoxProperties.getEnable()) { + log.info("{}服务端 配置未开启", name); + return; + } + + if (port == null) { + log.info("{}服务端 端口未配置", name); + return; + } + + try { + NioSocketAcceptor acceptor = new NioSocketAcceptor(); + acceptor.getFilterChain().addLast("codec", new ProtocolCodecFilter(protocolCodecFactory)); + acceptor.setHandler(abstractVirtualBoxHandler); + acceptor.setReuseAddress(true); + acceptor.bind(new InetSocketAddress(port)); + log.info("{}服务端已经启动,监听端口: {}", name, port); + } catch (Exception e) { + log.error("无法启动{}服务端, {}", name, e.getMessage(), e); + } + } + +} diff --git a/src/main/java/com/example/mina/base/BaseRequestMessage.java b/src/main/java/com/example/mina/base/BaseRequestMessage.java new file mode 100644 index 0000000..ff52769 --- /dev/null +++ b/src/main/java/com/example/mina/base/BaseRequestMessage.java @@ -0,0 +1,24 @@ +package com.example.mina.base; + +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.NoArgsConstructor; +import lombok.experimental.SuperBuilder; + +/** + * @author 杜云山 + * @date 21/03/08 + */ +@SuperBuilder +@Data +@AllArgsConstructor +@NoArgsConstructor +public abstract class BaseRequestMessage { + + protected String cmd; + + protected int in; + + protected int out; + +} diff --git a/src/main/java/com/example/mina/base/BaseResponseMessage.java b/src/main/java/com/example/mina/base/BaseResponseMessage.java new file mode 100644 index 0000000..42b6517 --- /dev/null +++ b/src/main/java/com/example/mina/base/BaseResponseMessage.java @@ -0,0 +1,24 @@ +package com.example.mina.base; + +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.NoArgsConstructor; +import lombok.experimental.SuperBuilder; + +/** + * @author 杜云山 + * @date 21/03/08 + */ +@SuperBuilder +@Data +@AllArgsConstructor +@NoArgsConstructor +public abstract class BaseResponseMessage { + + protected byte[] result; + + protected int in; + + protected int out; + +} diff --git a/src/main/java/com/example/mina/base/CommandHelper.java b/src/main/java/com/example/mina/base/CommandHelper.java deleted file mode 100644 index 37ee482..0000000 --- a/src/main/java/com/example/mina/base/CommandHelper.java +++ /dev/null @@ -1,33 +0,0 @@ -package com.example.mina.base; - -public class CommandHelper { - public static final byte[] BCD = new byte[]{ - 0x00,0x01,0x02,0x03,0x04,0x05,0x06,0x07,0x08,0x09, - 0x10,0x11,0x12,0x13,0x14,0x15,0x16,0x17,0x18,0x19, - 0x20,0x21,0x22,0x23,0x24,0x25,0x26,0x27,0x28,0x29, - 0x30,0x31,0x32,0x33,0x34,0x35,0x36,0x37,0x38,0x39, - 0x40,0x41,0x42,0x43,0x44,0x45,0x46,0x47,0x48,0x49, - 0x50,0x51,0x52,0x53,0x54,0x55,0x56,0x57,0x58,0x59, - 0x60,0x61,0x62,0x63,0x64,0x65,0x66,0x67,0x68,0x69, - 0x70,0x71,0x72,0x73,0x74,0x75,0x76,0x77,0x78,0x79, - (byte)0x80,(byte)0x81,(byte)0x82,(byte)0x83,(byte)0x84,(byte)0x85,(byte)0x86,(byte)0x87,(byte)0x88,(byte)0x89, - (byte)0x90,(byte)0x91,(byte)0x92,(byte)0x93,(byte)0x94,(byte)0x95,(byte)0x96,(byte)0x97,(byte)0x98,(byte)0x99 - }; - - public static final int[] BCD_REV = new int[]{ - 0,1,2,3,4,5,6,7,8,9,-1,-1,-1,-1,-1,-1, - 10,11,12,13,14,15,16,17,18,19,-1,-1,-1,-1,-1,-1, - 20,21,22,23,24,25,26,27,28,29,-1,-1,-1,-1,-1,-1, - 30,31,32,33,34,35,36,37,38,39,-1,-1,-1,-1,-1,-1, - 40,41,42,43,44,45,46,47,48,49,-1,-1,-1,-1,-1,-1, - 50,51,52,53,54,55,56,57,58,59,-1,-1,-1,-1,-1,-1, - 60,61,62,63,64,65,66,67,68,69,-1,-1,-1,-1,-1,-1, - 70,71,72,73,74,75,76,77,78,79,-1,-1,-1,-1,-1,-1, - 80,81,82,83,84,85,86,87,88,89,-1,-1,-1,-1,-1,-1, - 90,91,92,93,94,95,96,97,98,99,-1,-1,-1,-1,-1,-1, - }; - - - - -} diff --git a/src/main/java/com/example/mina/box/aeroflex/AeroflexCodecFactory.java b/src/main/java/com/example/mina/box/aeroflex/AeroflexCodecFactory.java new file mode 100644 index 0000000..8192378 --- /dev/null +++ b/src/main/java/com/example/mina/box/aeroflex/AeroflexCodecFactory.java @@ -0,0 +1,68 @@ +package com.example.mina.box.aeroflex; + +import org.apache.mina.core.buffer.IoBuffer; +import org.apache.mina.core.session.IoSession; +import org.apache.mina.filter.codec.*; + +/** + * @author 杜云山 + * @date 20/07/07 + */ +public class AeroflexCodecFactory implements ProtocolCodecFactory { + + @Override + public ProtocolEncoder getEncoder(IoSession session) { + return new AeroflexMessageEncoder(); + } + + @Override + public ProtocolDecoder getDecoder(IoSession session) { + return new AeroflexMessageDecoder(); + } + + static class AeroflexMessageEncoder implements ProtocolEncoder { + + @Override + public void encode(IoSession session, Object message, ProtocolEncoderOutput out) { + + if (message instanceof AeroflexResponseMessage) { + + byte[] result = ((AeroflexResponseMessage) message).getResult(); + session.write(IoBuffer.wrap(result)); + } + } + + @Override + public void dispose(IoSession session) { + } + + } + + static class AeroflexMessageDecoder implements ProtocolDecoder { + + @Override + public void decode(IoSession session, IoBuffer in, ProtocolDecoderOutput out) throws Exception { + + byte[] bytes = new byte[in.limit()]; + in.get(bytes); + + AeroflexRequestMessage requestMessage = AeroflexRequestMessage.builder() + .cmd(new String(bytes)) + .build(); + + out.write(requestMessage); + } + + @Override + public void finishDecode(IoSession session, ProtocolDecoderOutput out) throws Exception { + + } + + @Override + public void dispose(IoSession session) throws Exception { + + } + + } + +} diff --git a/src/main/java/com/example/mina/box/aeroflex/AeroflexRequestMessage.java b/src/main/java/com/example/mina/box/aeroflex/AeroflexRequestMessage.java new file mode 100644 index 0000000..fd361d4 --- /dev/null +++ b/src/main/java/com/example/mina/box/aeroflex/AeroflexRequestMessage.java @@ -0,0 +1,19 @@ +package com.example.mina.box.aeroflex; + +import com.example.mina.base.BaseRequestMessage; +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.EqualsAndHashCode; +import lombok.experimental.SuperBuilder; + +/** + * @author 杜云山 + * @date 21/03/08 + */ +@EqualsAndHashCode(callSuper = true) +@SuperBuilder +@Data +@AllArgsConstructor +public class AeroflexRequestMessage extends BaseRequestMessage { + +} diff --git a/src/main/java/com/example/mina/box/aeroflex/AeroflexResponseMessage.java b/src/main/java/com/example/mina/box/aeroflex/AeroflexResponseMessage.java new file mode 100644 index 0000000..08709c7 --- /dev/null +++ b/src/main/java/com/example/mina/box/aeroflex/AeroflexResponseMessage.java @@ -0,0 +1,19 @@ +package com.example.mina.box.aeroflex; + +import com.example.mina.base.BaseResponseMessage; +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.EqualsAndHashCode; +import lombok.experimental.SuperBuilder; + +/** + * @author 杜云山 + * @date 21/03/08 + */ +@EqualsAndHashCode(callSuper = true) +@SuperBuilder +@Data +@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 new file mode 100644 index 0000000..f78a5a8 --- /dev/null +++ b/src/main/java/com/example/mina/box/aeroflex/AeroflexVirtualBoxHandler.java @@ -0,0 +1,137 @@ +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; + +/** + * @author 杜云山 + * @date 21/03/05 + */ +@Slf4j +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; + + public AeroflexVirtualBoxHandler() { + this.initMatrix(); + } + + @Override + protected void initMatrix() { + + int row = 10; + int col = 1; + int maxAttenuate = 888; + + dataBuffer = new AeroflexDataBuffer(row, maxAttenuate); + } + + @Override + public void messageReceived(IoSession session, Object message) { + + if (message instanceof AeroflexRequestMessage) { + + AeroflexResponseMessage responseMessage = handleMessage((AeroflexRequestMessage) message); + session.write(responseMessage); + } + } + + @Override + protected AeroflexResponseMessage handleMessage(AeroflexRequestMessage message) { + String command = message.getCmd().trim(); + + log.info("aeroflexVirtualBoxHandler receive: {}", command); + + if (command.startsWith(SET_ALL)) { + //set all to max + for (int i = 1; i < dataBuffer.getMaxRow(); i++) { + dataBuffer.setOffset(i, dataBuffer.getMaxAttenuate()); + } + + 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(); + } + } + return AeroflexResponseMessage.builder().result(ERROR).build(); + + } else if (command.startsWith(SET_ONE)) { + //Set, Follow by ATTN? + String[] aa = command.split(SEMICOLON_SPLIT); + + String[] sss = aa[0].split(SPACE_SPLIT); + + if (sss.length >= 3) { + + int row = StrUtil.toInt(sss[1]); + int val = StrUtil.toInt(sss[2]); + + 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(); + } + + } + + @Override + public void sessionCreated(IoSession session) { + + log.info("--- abstractVirtual server session created"); + } + + @Override + public void sessionOpened(IoSession session) { + + log.info("--- abstractVirtual server session Opened"); + } + + @Override + public void sessionClosed(IoSession session) { + + log.info("--- abstractVirtual server session Closed"); + } + + @Override + public void messageSent(IoSession session, Object message) { + + log.info("--- abstractVirtual 发送数据成功!{}", message); + } + +} diff --git a/src/main/java/com/example/mina/box/aeroflex/AeroflexVirtualBoxServer.java b/src/main/java/com/example/mina/box/aeroflex/AeroflexVirtualBoxServer.java new file mode 100644 index 0000000..f2b436e --- /dev/null +++ b/src/main/java/com/example/mina/box/aeroflex/AeroflexVirtualBoxServer.java @@ -0,0 +1,20 @@ +package com.example.mina.box.aeroflex; + +import com.example.mina.base.AbstractVirtualBoxServer; +import com.example.mina.property.AeroflexVirtualBoxProperties; +import lombok.extern.slf4j.Slf4j; +import org.springframework.context.annotation.Configuration; + +/** + * @author 杜云山 + * @date 21/03/05 + */ +@Slf4j +@Configuration(proxyBeanMethods = false) +public class AeroflexVirtualBoxServer extends AbstractVirtualBoxServer { + + public AeroflexVirtualBoxServer(AeroflexVirtualBoxProperties aeroflexVirtualBoxProperties) { + super(aeroflexVirtualBoxProperties, new AeroflexVirtualBoxHandler(), new AeroflexCodecFactory()); + } + +} diff --git a/src/main/java/com/example/mina/box/rbm3000/Rbm3000CodecFactory.java b/src/main/java/com/example/mina/box/rbm3000/Rbm3000CodecFactory.java new file mode 100644 index 0000000..2798db0 --- /dev/null +++ b/src/main/java/com/example/mina/box/rbm3000/Rbm3000CodecFactory.java @@ -0,0 +1,62 @@ +package com.example.mina.box.rbm3000; + +import org.apache.mina.core.buffer.IoBuffer; +import org.apache.mina.core.session.IoSession; +import org.apache.mina.filter.codec.*; + +/** + * @author 杜云山 + * @date 20/07/07 + */ +public class Rbm3000CodecFactory implements ProtocolCodecFactory { + + @Override + public ProtocolEncoder getEncoder(IoSession session) { + return new AeroflexMessageEncoder(); + } + + @Override + public ProtocolDecoder getDecoder(IoSession session) { + return new AeroflexMessageDecoder(); + } + + static class AeroflexMessageEncoder implements ProtocolEncoder { + + @Override + public void encode(IoSession session, Object message, ProtocolEncoderOutput out) { + if (message instanceof IoBuffer) { + session.write(message); + } + } + + @Override + public void dispose(IoSession session) { + } + + } + + static class AeroflexMessageDecoder implements ProtocolDecoder { + +// private final CharsetDecoder decoder = StandardCharsets.UTF_8.newDecoder(); + + @Override + public void decode(IoSession session, IoBuffer in, ProtocolDecoderOutput out) throws Exception { + +// String string = in.getString(decoder); + +// out.write(string); + } + + @Override + public void finishDecode(IoSession session, ProtocolDecoderOutput out) throws Exception { + + } + + @Override + public void dispose(IoSession session) throws Exception { + + } + + } + +} diff --git a/src/main/java/com/example/mina/box/rbm3000/Rbm3000VirtualBoxHander.java b/src/main/java/com/example/mina/box/rbm3000/Rbm3000VirtualBoxHander.java new file mode 100644 index 0000000..fe23077 --- /dev/null +++ b/src/main/java/com/example/mina/box/rbm3000/Rbm3000VirtualBoxHander.java @@ -0,0 +1,176 @@ +//package com.example.mina.box.rbm3000; +// +//import com.example.mina.base.AbstractVirtualBoxHandler; +//import com.example.mina.util.CommandHelper; +//import com.example.mina.entity.AeroflexDataBuffer; +//import com.example.mina.entity.Entry; +//import lombok.extern.slf4j.Slf4j; +//import org.apache.mina.core.buffer.IoBuffer; +//import org.apache.mina.core.session.IoSession; +// +///** +// * @author dy +// * @date 2021/3/5 +// */ +//@Slf4j +//public class Rbm3000VirtualBoxHander extends AbstractVirtualBoxHandler { +// +// private AeroflexDataBuffer dataBuffer; +// +// public Rbm3000VirtualBoxHander() { +// this.initMatrix(); +// } +// +// @Override +// protected void initMatrix() { +// +// int row = 6; +// int col = 8; +// int maxAtten = 222; +// +// dataBuffer = new AeroflexDataBuffer(row, maxAtten); +// } +// +// @Override +// protected byte[] handleMessage(byte[] cmd, int len) { +// return new byte[0]; +// } +// +// @Override +// public void messageReceived(IoSession session, Object message) { +// +// IoBuffer ioBuffer = (IoBuffer) message; +// byte[] bytes = new byte[ioBuffer.limit()]; +// ioBuffer.get(bytes, ioBuffer.position(), ioBuffer.limit()); +// +// byte[] result = handleCommand(bytes, bytes.length); +// +// session.write(IoBuffer.wrap(result)); +// } +// +// @Override +// public void sessionCreated(IoSession session) { +// +// log.info("---server session created"); +// } +// +// @Override +// public void sessionOpened(IoSession session) { +// +// log.info("---server session Opened"); +// } +// +// @Override +// public void sessionClosed(IoSession session) { +// +// log.info("---server session Closed"); +// } +// +// @Override +// public void messageSent(IoSession session, Object message) { +// +// log.info("---发送数据成功了。。。{}", message); +// } +// +// protected byte[] handleCommand(byte[] cmd, int len) { +// +// byte[] buffer; +// Entry[][] entries = dataBuffer.getMatrixData(); +// +// if (len == 8) { +// switch (cmd[0]) { +// case 0x30: +// int row = CommandHelper.BCD_REV[cmd[3]]; +// int col = CommandHelper.BCD_REV[cmd[4]]; +// +// int rowCol = 0; +// int colRow = 0; +// +// for (int i = 0; i < dataBuffer.getMaxCol(); i++) { +// if (entries[row - 1][i].getValue() == 1) { +// rowCol = i + 1; +// break; +// } +// } +// for (int i = 0; i < dataBuffer.getMaxRow(); i++) { +// if (entries[i][col - 1].getValue() == 1) { +// colRow = i + 1; +// } +// } +// +// dataBuffer.setAttenuation(row, rowCol, 0); +// dataBuffer.setAttenuation(row, col, 1); +// dataBuffer.setAttenuation(colRow, col, 0); +// dataBuffer.setAttenuation(colRow, rowCol, 1); +// +// buffer = new byte[8]; +// buffer[0] = cmd[0]; +// buffer[1] = cmd[1]; +// buffer[2] = cmd[2]; +// buffer[3] = cmd[3]; +// buffer[4] = cmd[4]; +// buffer[5] = CommandHelper.BCD[colRow]; +// buffer[6] = CommandHelper.BCD[rowCol]; +// buffer[7] = (byte) 0x03; +// +// return buffer; +// case 0x68: +// boolean isA = (cmd[3] == (byte) 0x0A); +// int callPort = CommandHelper.BCD_REV[cmd[4]]; +// int returnPort = 0; +// +// if (isA) { +// for (int i = 0; i < dataBuffer.getMaxCol(); i++) { +// if (entries[callPort - 1][i].getValue() == 1) { +// returnPort = i + 1; +// break; +// } +// } +// } else { +// for (int i = 0; i < dataBuffer.getMaxRow(); i++) { +// if (entries[i][callPort - 1].getValue() == 1) { +// returnPort = i + 1; +// } +// } +// } +// +// buffer = new byte[8]; +// buffer[0] = cmd[0]; +// buffer[1] = cmd[1]; +// buffer[2] = cmd[2]; +// if (isA) { +// buffer[3] = 0x0B; +// } else { +// buffer[3] = 0x0A; +// } +// buffer[4] = CommandHelper.BCD[returnPort]; +// buffer[5] = 0x00; +// buffer[6] = 0x06; +// buffer[7] = (byte) 0x03; +// +// return buffer; +// case 0x62: +// buffer = new byte[8]; +// buffer[0] = cmd[0]; +// buffer[1] = cmd[1]; +// buffer[2] = cmd[2]; +// buffer[3] = cmd[3]; +// buffer[4] = cmd[4]; +// buffer[5] = cmd[5]; +// buffer[6] = cmd[6]; +// buffer[7] = (byte) 0x03; +// +// return buffer; +// default: +// break; +// } +// } +// +// buffer = new byte[len + 2]; +// buffer[0] = (byte) 0xFE; +// buffer[1] = (byte) 0xFE; +// System.arraycopy(cmd, 0, buffer, 2, len); +// +// return buffer; +// } +//} diff --git a/src/main/java/com/example/mina/box/rbm3000/Rbm3000VirtualBoxServer.java b/src/main/java/com/example/mina/box/rbm3000/Rbm3000VirtualBoxServer.java new file mode 100644 index 0000000..626231b --- /dev/null +++ b/src/main/java/com/example/mina/box/rbm3000/Rbm3000VirtualBoxServer.java @@ -0,0 +1,20 @@ +//package com.example.mina.box.rbm3000; +// +//import com.example.mina.base.AbstractVirtualBoxServer; +//import com.example.mina.property.Rbm3000VitualBoxProperties; +//import lombok.extern.slf4j.Slf4j; +//import org.springframework.context.annotation.Configuration; +// +///** +// * @author 杜云山 +// * @date 21/03/05 +// */ +//@Slf4j +//@Configuration(proxyBeanMethods = false) +//public class Rbm3000VirtualBoxServer extends AbstractVirtualBoxServer { +// +// public Rbm3000VirtualBoxServer(Rbm3000VitualBoxProperties rbm3000VitualBoxProperties) { +// super(rbm3000VitualBoxProperties, new Rbm3000VirtualBoxHander(), new Rbm3000CodecFactory()); +// } +// +//} diff --git a/src/main/java/com/example/mina/boxhandler/AeroflexVirtualBoxHandler.java b/src/main/java/com/example/mina/boxhandler/AeroflexVirtualBoxHandler.java deleted file mode 100644 index 24de7df..0000000 --- a/src/main/java/com/example/mina/boxhandler/AeroflexVirtualBoxHandler.java +++ /dev/null @@ -1,139 +0,0 @@ -package com.example.mina.boxhandler; - -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.buffer.IoBuffer; -import org.apache.mina.core.session.IoSession; - -/** - * @author 杜云山 - * @date 21/03/05 - */ -@Slf4j -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; - - public AeroflexVirtualBoxHandler() { - this.initMatrix(); - } - - @Override - protected void initMatrix() { - - int row = 10; - int col = 1; - int maxAttenuate = 888; - - dataBuffer = new AeroflexDataBuffer(row, maxAttenuate); - } - - @Override - public void messageReceived(IoSession session, Object message) { - - IoBuffer ioBuffer = (IoBuffer) message; - byte[] bytes = ioBuffer.array(); - - byte[] result = handleMessage(bytes, bytes.length); - - session.write(IoBuffer.wrap(result)); - } - - @Override - protected byte[] handleMessage(byte[] cmd, int len) { - String command = new String(cmd).trim(); - - log.info("aeroflexVirtualBoxHandler receive: {}", command); - - if (command.startsWith(SET_ALL)) { - //set all to max - for (int i = 1; i < dataBuffer.getMaxRow(); i++) { - dataBuffer.setOffset(i, dataBuffer.getMaxAttenuate()); - } - - return NONE; - } 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 str.getBytes(); - } - } - return ERROR; - - } else if (command.startsWith(SET_ONE)) { - //Set, Follow by ATTN? - String[] aa = command.split(SEMICOLON_SPLIT); - - String[] sss = aa[0].split(SPACE_SPLIT); - - if (sss.length >= 3) { - - int row = StrUtil.toInt(sss[1]); - int val = StrUtil.toInt(sss[2]); - - 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 str.getBytes(); - } - } - } - - return ERROR; - - } else { - return ERROR; - } - - } - - @Override - public void sessionCreated(IoSession session) { - - log.info("--- abstractVirtual server session created"); - } - - @Override - public void sessionOpened(IoSession session) { - - log.info("--- abstractVirtual server session Opened"); - } - - @Override - public void sessionClosed(IoSession session) { - - log.info("--- abstractVirtual server session Closed"); - } - - @Override - public void messageSent(IoSession session, Object message) { - - log.info("--- abstractVirtual 发送数据成功!{}", message); - } - -} diff --git a/src/main/java/com/example/mina/boxhandler/Rbm3000VirtualBoxHander.java b/src/main/java/com/example/mina/boxhandler/Rbm3000VirtualBoxHander.java deleted file mode 100644 index 3cbfe3c..0000000 --- a/src/main/java/com/example/mina/boxhandler/Rbm3000VirtualBoxHander.java +++ /dev/null @@ -1,176 +0,0 @@ -package com.example.mina.boxhandler; - -import com.example.mina.base.AbstractVirtualBoxHandler; -import com.example.mina.base.CommandHelper; -import com.example.mina.entity.AeroflexDataBuffer; -import com.example.mina.entity.Entry; -import lombok.extern.slf4j.Slf4j; -import org.apache.mina.core.buffer.IoBuffer; -import org.apache.mina.core.session.IoSession; - -/** - * @author dy - * @date 2021/3/5 - */ -@Slf4j -public class Rbm3000VirtualBoxHander extends AbstractVirtualBoxHandler { - - private AeroflexDataBuffer dataBuffer; - - public Rbm3000VirtualBoxHander() { - this.initMatrix(); - } - - @Override - protected void initMatrix() { - - int row = 6; - int col = 8; - int maxAtten = 222; - - dataBuffer = new AeroflexDataBuffer(row, maxAtten); - } - - @Override - protected byte[] handleMessage(byte[] cmd, int len) { - return new byte[0]; - } - - @Override - public void messageReceived(IoSession session, Object message) { - - IoBuffer ioBuffer = (IoBuffer) message; - byte[] bytes = new byte[ioBuffer.limit()]; - ioBuffer.get(bytes, ioBuffer.position(), ioBuffer.limit()); - - byte[] result = handleCommand(bytes, bytes.length); - - session.write(IoBuffer.wrap(result)); - } - - @Override - public void sessionCreated(IoSession session) { - - log.info("---server session created"); - } - - @Override - public void sessionOpened(IoSession session) { - - log.info("---server session Opened"); - } - - @Override - public void sessionClosed(IoSession session) { - - log.info("---server session Closed"); - } - - @Override - public void messageSent(IoSession session, Object message) { - - log.info("---发送数据成功了。。。{}", message); - } - - protected byte[] handleCommand(byte[] cmd, int len) { - - byte[] buffer; - Entry[][] entries = dataBuffer.getMatrixData(); - - if (len == 8) { - switch (cmd[0]) { - case 0x30: - int row = CommandHelper.BCD_REV[cmd[3]]; - int col = CommandHelper.BCD_REV[cmd[4]]; - - int rowCol = 0; - int colRow = 0; - - for (int i = 0; i < dataBuffer.getMaxCol(); i++) { - if (entries[row - 1][i].getValue() == 1) { - rowCol = i + 1; - break; - } - } - for (int i = 0; i < dataBuffer.getMaxRow(); i++) { - if (entries[i][col - 1].getValue() == 1) { - colRow = i + 1; - } - } - - dataBuffer.setAttenuation(row, rowCol, 0); - dataBuffer.setAttenuation(row, col, 1); - dataBuffer.setAttenuation(colRow, col, 0); - dataBuffer.setAttenuation(colRow, rowCol, 1); - - buffer = new byte[8]; - buffer[0] = cmd[0]; - buffer[1] = cmd[1]; - buffer[2] = cmd[2]; - buffer[3] = cmd[3]; - buffer[4] = cmd[4]; - buffer[5] = CommandHelper.BCD[colRow]; - buffer[6] = CommandHelper.BCD[rowCol]; - buffer[7] = (byte) 0x03; - - return buffer; - case 0x68: - boolean isA = (cmd[3] == (byte) 0x0A); - int callPort = CommandHelper.BCD_REV[cmd[4]]; - int returnPort = 0; - - if (isA) { - for (int i = 0; i < dataBuffer.getMaxCol(); i++) { - if (entries[callPort - 1][i].getValue() == 1) { - returnPort = i + 1; - break; - } - } - } else { - for (int i = 0; i < dataBuffer.getMaxRow(); i++) { - if (entries[i][callPort - 1].getValue() == 1) { - returnPort = i + 1; - } - } - } - - buffer = new byte[8]; - buffer[0] = cmd[0]; - buffer[1] = cmd[1]; - buffer[2] = cmd[2]; - if (isA) { - buffer[3] = 0x0B; - } else { - buffer[3] = 0x0A; - } - buffer[4] = CommandHelper.BCD[returnPort]; - buffer[5] = 0x00; - buffer[6] = 0x06; - buffer[7] = (byte) 0x03; - - return buffer; - case 0x62: - buffer = new byte[8]; - buffer[0] = cmd[0]; - buffer[1] = cmd[1]; - buffer[2] = cmd[2]; - buffer[3] = cmd[3]; - buffer[4] = cmd[4]; - buffer[5] = cmd[5]; - buffer[6] = cmd[6]; - buffer[7] = (byte) 0x03; - - return buffer; - default: - break; - } - } - - buffer = new byte[len + 2]; - buffer[0] = (byte) 0xFE; - buffer[1] = (byte) 0xFE; - System.arraycopy(cmd, 0, buffer, 2, len); - - return buffer; - } -} diff --git a/src/main/java/com/example/mina/boxserver/AbstractVirtualBoxServer.java b/src/main/java/com/example/mina/boxserver/AbstractVirtualBoxServer.java deleted file mode 100644 index a48d021..0000000 --- a/src/main/java/com/example/mina/boxserver/AbstractVirtualBoxServer.java +++ /dev/null @@ -1,56 +0,0 @@ -package com.example.mina.boxserver; - -import com.example.mina.base.AbstractVirtualBoxHandler; -import com.example.mina.property.AbstractVirtualBoxProperties; -import lombok.extern.slf4j.Slf4j; -import org.apache.mina.transport.socket.nio.NioSocketAcceptor; -import org.springframework.boot.ApplicationArguments; -import org.springframework.boot.ApplicationRunner; - -import java.net.InetSocketAddress; - -/** - * @author 杜云山 - * @date 21/03/05 - */ -@Slf4j -public class AbstractVirtualBoxServer implements ApplicationRunner { - - private final AbstractVirtualBoxProperties abstractVirtualBoxProperties; - - private final AbstractVirtualBoxHandler abstractVirtualBoxHandler; - - public AbstractVirtualBoxServer(AbstractVirtualBoxProperties abstractVirtualBoxProperties, - AbstractVirtualBoxHandler abstractVirtualBoxHandler) { - this.abstractVirtualBoxProperties = abstractVirtualBoxProperties; - this.abstractVirtualBoxHandler = abstractVirtualBoxHandler; - } - - @Override - public void run(ApplicationArguments args) { - - String name = abstractVirtualBoxProperties.getName(); - Integer port = abstractVirtualBoxProperties.getPort(); - - if (!abstractVirtualBoxProperties.getEnable()) { - log.info("{}服务端 配置未开启", name); - return; - } - - if (port == null) { - log.info("{}服务端 端口未配置", name); - return; - } - - try { - NioSocketAcceptor acceptor = new NioSocketAcceptor(); - acceptor.setHandler(abstractVirtualBoxHandler); - acceptor.setReuseAddress(true); - acceptor.bind(new InetSocketAddress(port)); - log.info("{}服务端已经启动,监听端口: {}", name, port); - } catch (Exception e) { - log.error("无法启动{}服务端, {}", name, e.getMessage(), e); - } - } - -} diff --git a/src/main/java/com/example/mina/boxserver/AeroflexVirtualBoxServer.java b/src/main/java/com/example/mina/boxserver/AeroflexVirtualBoxServer.java deleted file mode 100644 index bb074f6..0000000 --- a/src/main/java/com/example/mina/boxserver/AeroflexVirtualBoxServer.java +++ /dev/null @@ -1,20 +0,0 @@ -package com.example.mina.boxserver; - -import com.example.mina.boxhandler.AeroflexVirtualBoxHandler; -import com.example.mina.property.AeroflexVirtualBoxProperties; -import lombok.extern.slf4j.Slf4j; -import org.springframework.context.annotation.Configuration; - -/** - * @author 杜云山 - * @date 21/03/05 - */ -@Slf4j -@Configuration(proxyBeanMethods = false) -public class AeroflexVirtualBoxServer extends AbstractVirtualBoxServer { - - public AeroflexVirtualBoxServer(AeroflexVirtualBoxProperties aeroflexVirtualBoxProperties) { - super(aeroflexVirtualBoxProperties, new AeroflexVirtualBoxHandler()); - } - -} diff --git a/src/main/java/com/example/mina/boxserver/Rbm3000VirtualBoxServer.java b/src/main/java/com/example/mina/boxserver/Rbm3000VirtualBoxServer.java deleted file mode 100644 index ccf2dfd..0000000 --- a/src/main/java/com/example/mina/boxserver/Rbm3000VirtualBoxServer.java +++ /dev/null @@ -1,20 +0,0 @@ -package com.example.mina.boxserver; - -import com.example.mina.boxhandler.Rbm3000VirtualBoxHander; -import com.example.mina.property.Rbm3000VitualBoxProperties; -import lombok.extern.slf4j.Slf4j; -import org.springframework.context.annotation.Configuration; - -/** - * @author 杜云山 - * @date 21/03/05 - */ -@Slf4j -@Configuration(proxyBeanMethods = false) -public class Rbm3000VirtualBoxServer extends AbstractVirtualBoxServer { - - public Rbm3000VirtualBoxServer(Rbm3000VitualBoxProperties rbm3000VitualBoxProperties) { - super(rbm3000VitualBoxProperties, new Rbm3000VirtualBoxHander()); - } - -} diff --git a/src/main/java/com/example/mina/util/CommandHelper.java b/src/main/java/com/example/mina/util/CommandHelper.java new file mode 100644 index 0000000..3d7a342 --- /dev/null +++ b/src/main/java/com/example/mina/util/CommandHelper.java @@ -0,0 +1,33 @@ +package com.example.mina.util; + +public class CommandHelper { + public static final byte[] BCD = new byte[]{ + 0x00,0x01,0x02,0x03,0x04,0x05,0x06,0x07,0x08,0x09, + 0x10,0x11,0x12,0x13,0x14,0x15,0x16,0x17,0x18,0x19, + 0x20,0x21,0x22,0x23,0x24,0x25,0x26,0x27,0x28,0x29, + 0x30,0x31,0x32,0x33,0x34,0x35,0x36,0x37,0x38,0x39, + 0x40,0x41,0x42,0x43,0x44,0x45,0x46,0x47,0x48,0x49, + 0x50,0x51,0x52,0x53,0x54,0x55,0x56,0x57,0x58,0x59, + 0x60,0x61,0x62,0x63,0x64,0x65,0x66,0x67,0x68,0x69, + 0x70,0x71,0x72,0x73,0x74,0x75,0x76,0x77,0x78,0x79, + (byte)0x80,(byte)0x81,(byte)0x82,(byte)0x83,(byte)0x84,(byte)0x85,(byte)0x86,(byte)0x87,(byte)0x88,(byte)0x89, + (byte)0x90,(byte)0x91,(byte)0x92,(byte)0x93,(byte)0x94,(byte)0x95,(byte)0x96,(byte)0x97,(byte)0x98,(byte)0x99 + }; + + public static final int[] BCD_REV = new int[]{ + 0,1,2,3,4,5,6,7,8,9,-1,-1,-1,-1,-1,-1, + 10,11,12,13,14,15,16,17,18,19,-1,-1,-1,-1,-1,-1, + 20,21,22,23,24,25,26,27,28,29,-1,-1,-1,-1,-1,-1, + 30,31,32,33,34,35,36,37,38,39,-1,-1,-1,-1,-1,-1, + 40,41,42,43,44,45,46,47,48,49,-1,-1,-1,-1,-1,-1, + 50,51,52,53,54,55,56,57,58,59,-1,-1,-1,-1,-1,-1, + 60,61,62,63,64,65,66,67,68,69,-1,-1,-1,-1,-1,-1, + 70,71,72,73,74,75,76,77,78,79,-1,-1,-1,-1,-1,-1, + 80,81,82,83,84,85,86,87,88,89,-1,-1,-1,-1,-1,-1, + 90,91,92,93,94,95,96,97,98,99,-1,-1,-1,-1,-1,-1, + }; + + + + +} -- libgit2 0.21.2