From 302ac45401144ca65c5ddc62a1a72f811f6755b1 Mon Sep 17 00:00:00 2001 From: huanglang <1037084308@qq.com> Date: Fri, 2 Apr 2021 15:41:03 +0800 Subject: [PATCH] 1、初步完成RBM3000类型设备client端编码 --- pom.xml | 10 +++++++++- src/main/java/com/example/mina/Application.java | 67 ++++++++++++++++++++++++++++++++++++++++++++----------------------- src/main/java/com/example/mina/client/base/MatrixClient.java | 11 +++++++++-- src/main/java/com/example/mina/client/base/MatrixCommand.java | 32 ++++++-------------------------- src/main/java/com/example/mina/client/base/MatrixConstants.java | 2 ++ src/main/java/com/example/mina/client/base/MatrixResponse.java | 4 ++++ src/main/java/com/example/mina/client/box/aeroflex/AeroFlexProtocolFactory.java | 12 ++++++------ src/main/java/com/example/mina/client/box/qrb3000/Qrb3000ProtocolFactory.java | 3 +-- src/main/java/com/example/mina/client/box/rbm3000/Rbm3000ClientFactory.java | 24 ++++++++++++++++++++++++ src/main/java/com/example/mina/client/box/rbm3000/Rbm3000ClientIoHandler.java | 38 ++++++++++++++++++++++++++++++++++++++ src/main/java/com/example/mina/client/box/rbm3000/Rbm3000ProtocolFactory.java | 142 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ src/main/java/com/example/mina/client/box/rec6000/REC6000ProtocolFactory.java | 3 +-- src/main/resources/logback-spring.xml | 8 +++++++- 13 files changed, 293 insertions(+), 63 deletions(-) create mode 100644 src/main/java/com/example/mina/client/box/rbm3000/Rbm3000ClientFactory.java create mode 100644 src/main/java/com/example/mina/client/box/rbm3000/Rbm3000ClientIoHandler.java create mode 100644 src/main/java/com/example/mina/client/box/rbm3000/Rbm3000ProtocolFactory.java diff --git a/pom.xml b/pom.xml index f398a89..21d9399 100644 --- a/pom.xml +++ b/pom.xml @@ -81,7 +81,15 @@ org.springframework.boot spring-boot-starter-web - + + org.springframework.boot + spring-boot-starter-aop + + + com.alibaba + fastjson + 1.2.75 + diff --git a/src/main/java/com/example/mina/Application.java b/src/main/java/com/example/mina/Application.java index 681caa0..336b64a 100644 --- a/src/main/java/com/example/mina/Application.java +++ b/src/main/java/com/example/mina/Application.java @@ -49,44 +49,65 @@ public class Application { MatrixClient REC3000Client = clientManager.getOrCreateClient(REC3000); REC3000Client.setAttenuation(1, 2, 3, null);*/ +// //------------------------------Qrb测试 start-------------------------- +// ConfigurableApplicationContext run = SpringApplication.run(Application.class, args); +// +// ClientManager clientManager = run.getBean(ClientManager.class); +// +// MatrixConnectConfig connectConfig = MatrixConnectConfig.builder() +// .deviceId("15") +// .deviceType(MatrixConstants.MATRIX_TYPE_QRB) +// .host("127.0.0.1") +// .port(9103) +// .build(); +// +// MatrixClient client = clientManager.getOrCreateClient(connectConfig); +// +// +// client.setAttenuation(1,2,3); +//// LockSupport.parkNanos(1000_000_000); +// +//// client.setOffset(1, 2); +//// client.getOffset(2); +// LockSupport.parkNanos(1000_000_000); +// +//// client.setOffset(1,2); +//// LockSupport.parkNanos(1000_000_000); +// +// +//// client.setAttenuation(1,2,3, MatrixCommand.Type.AERO_GET_ATTN); +// //------------------------------Qrb测试 end-------------------------- +// MatrixConnectConfig REC3000 = MatrixConnectConfig.builder() +// .deviceId("158") +// .deviceType(MatrixConstants.MATRIX_TYPE_QRB) +// .host("127.0.0.1") +// .port(9099) +// .build(); +// +// MatrixClient REC3000Client = clientManager.getOrCreateClient(REC3000); +// +// REC3000Client.setAttenuation(1, 2, 3, null); + //------------------------------Qrb测试 start-------------------------- ConfigurableApplicationContext run = SpringApplication.run(Application.class, args); - ClientManager clientManager = run.getBean(ClientManager.class); MatrixConnectConfig connectConfig = MatrixConnectConfig.builder() .deviceId("15") - .deviceType(MatrixConstants.MATRIX_TYPE_QRB) + .deviceType(MatrixConstants.MATRIX_TYPE_RBM3000) .host("127.0.0.1") - .port(9103) + .port(9101) .build(); MatrixClient client = clientManager.getOrCreateClient(connectConfig); - - - client.setAttenuation(1,2,3, null); -// LockSupport.parkNanos(1000_000_000); - -// client.setOffset(1, 2); -// client.getOffset(2); + client.setAttenuation(1,2,3); LockSupport.parkNanos(1000_000_000); -// client.setOffset(1,2); +// client.getAttenuation(3,null); // LockSupport.parkNanos(1000_000_000); -// client.setAttenuation(1,2,3, MatrixCommand.Type.AERO_GET_ATTN); - -// MatrixConnectConfig REC3000 = MatrixConnectConfig.builder() -// .deviceId("158") -// .deviceType(MatrixConstants.MATRIX_TYPE_QRB) -// .host("127.0.0.1") -// .port(9099) -// .build(); -// -// MatrixClient REC3000Client = clientManager.getOrCreateClient(REC3000); -// -// REC3000Client.setAttenuation(1, 2, 3, null); + //------------------------------Qrb测试 end-------------------------- } 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 7a63b1a..df3876e 100644 --- a/src/main/java/com/example/mina/client/base/MatrixClient.java +++ b/src/main/java/com/example/mina/client/base/MatrixClient.java @@ -121,9 +121,16 @@ public class MatrixClient { sendCommand(command); } - public void setAttenuation(int row, int col, int attn, MatrixCommand.Type type) { + public void setAttenuation(int row, int col, int attn) { MatrixCommand command = MatrixCommand.builder().command(MatrixConstants.COMMAND_SET_ATTN) - .col(col).row(row).attn(attn).type(type).build(); + .col(col).row(row).attn(attn).build(); + + sendCommand(command); + } + + public void getAttenuation(Integer row, Integer col) { + MatrixCommand command = MatrixCommand.builder().command(MatrixConstants.COMMAND_GET_ATTN) + .col(col).row(row).build(); sendCommand(command); } diff --git a/src/main/java/com/example/mina/client/base/MatrixCommand.java b/src/main/java/com/example/mina/client/base/MatrixCommand.java index 415a5b4..3f702d6 100644 --- a/src/main/java/com/example/mina/client/base/MatrixCommand.java +++ b/src/main/java/com/example/mina/client/base/MatrixCommand.java @@ -7,55 +7,35 @@ import lombok.Data; @Builder public class MatrixCommand { /** - * 矩阵id + * matrix id */ private String matrixId; /** - * 指令类型,来自MatrixConstants + * command type,come from MatrixConstants */ private Integer command; /** - * 矩阵行坐标 + * matrix row index */ private Integer row; /** - * 矩阵列坐标 + * matrix column index */ private Integer col; /** - * 矩阵指定行列位置的值,如衰减值 + * attenuation */ private Integer attn; /** - * 相位值,偏移量 + * offset */ private Integer offset; - private Type type; - - public enum Type { - - /** - * eg: "ATTN? 1" - */ - AERO_GET_ATTN, - - /** - * ATTN 2 3; - */ - AERO_SET_ATTN, - - /** - * eg: "ATTN ALL MAX" - */ - AERO_ATTN_ALL_MAX, - - } } 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 687c0e3..1b1944e 100644 --- a/src/main/java/com/example/mina/client/base/MatrixConstants.java +++ b/src/main/java/com/example/mina/client/base/MatrixConstants.java @@ -12,6 +12,8 @@ public class MatrixConstants { public static final String MATRIX_TYPE_QRB = "QRB3000"; + public static final String MATRIX_TYPE_RBM3000 = "RBM3000"; + public static final int COMMAND_RESET = 1; public static final int COMMAND_SET_ATTN = 2; diff --git a/src/main/java/com/example/mina/client/base/MatrixResponse.java b/src/main/java/com/example/mina/client/base/MatrixResponse.java index 1b42253..36e2309 100644 --- a/src/main/java/com/example/mina/client/base/MatrixResponse.java +++ b/src/main/java/com/example/mina/client/base/MatrixResponse.java @@ -16,6 +16,10 @@ public class MatrixResponse { private Integer attn; + private Integer rowCol; + + private Integer colRow; + public MatrixResponse() { isSetAttn = false; isSetOffset = false; diff --git a/src/main/java/com/example/mina/client/box/aeroflex/AeroFlexProtocolFactory.java b/src/main/java/com/example/mina/client/box/aeroflex/AeroFlexProtocolFactory.java index 4905707..50115b1 100644 --- a/src/main/java/com/example/mina/client/box/aeroflex/AeroFlexProtocolFactory.java +++ b/src/main/java/com/example/mina/client/box/aeroflex/AeroFlexProtocolFactory.java @@ -1,6 +1,7 @@ package com.example.mina.client.box.aeroflex; import com.example.mina.client.base.MatrixCommand; +import com.example.mina.client.base.MatrixConstants; import com.example.mina.client.base.MatrixResponse; import lombok.extern.slf4j.Slf4j; import org.apache.mina.core.buffer.IoBuffer; @@ -46,24 +47,23 @@ public class AeroFlexProtocolFactory implements ProtocolCodecFactory { mc.getCol(), mc.getCommand(), mc.getRow(), - mc.getMatrixId(), - mc.getType() + mc.getMatrixId() ); - MatrixCommand.Type mcType = mc.getType(); + int cmd = mc.getCommand(); IoBuffer buffer = IoBuffer.allocate(100, false).setAutoExpand(true); - if (MatrixCommand.Type.AERO_ATTN_ALL_MAX.equals(mcType)) { + if (cmd == MatrixConstants.COMMAND_RESET) { buffer.putString("ATTN ALL MAX", ENCODER); - } else if (MatrixCommand.Type.AERO_GET_ATTN.equals(mcType)) { + } else if (cmd == MatrixConstants.COMMAND_GET_OFFSET) { buffer.putString("ATTN?", ENCODER); buffer.putString(" ", ENCODER); buffer.putString(mc.getRow().toString(), ENCODER); - } else if (MatrixCommand.Type.AERO_SET_ATTN.equals(mcType)) { + } else if (cmd == MatrixConstants.COMMAND_SET_OFFSET) { buffer.putString("ATTN", ENCODER); buffer.putString(" ", ENCODER); diff --git a/src/main/java/com/example/mina/client/box/qrb3000/Qrb3000ProtocolFactory.java b/src/main/java/com/example/mina/client/box/qrb3000/Qrb3000ProtocolFactory.java index d723b36..e1ce702 100644 --- a/src/main/java/com/example/mina/client/box/qrb3000/Qrb3000ProtocolFactory.java +++ b/src/main/java/com/example/mina/client/box/qrb3000/Qrb3000ProtocolFactory.java @@ -49,8 +49,7 @@ public class Qrb3000ProtocolFactory implements ProtocolCodecFactory { mc.getCol(), mc.getCommand(), mc.getRow(), - mc.getMatrixId(), - mc.getType() + mc.getMatrixId() ); int cmd = mc.getCommand(); VbLogUtils.infoLog(log, "", mc.getMatrixId(),msg); diff --git a/src/main/java/com/example/mina/client/box/rbm3000/Rbm3000ClientFactory.java b/src/main/java/com/example/mina/client/box/rbm3000/Rbm3000ClientFactory.java new file mode 100644 index 0000000..3c7035d --- /dev/null +++ b/src/main/java/com/example/mina/client/box/rbm3000/Rbm3000ClientFactory.java @@ -0,0 +1,24 @@ +package com.example.mina.client.box.rbm3000; + +import com.example.mina.client.base.AbstractClientFactory; +import com.example.mina.client.base.MatrixConstants; +import com.example.mina.client.box.qrb3000.Qrb3000ClientIoHandler; +import com.example.mina.client.box.qrb3000.Qrb3000ProtocolFactory; +import org.apache.mina.core.filterchain.IoFilterChain; +import org.apache.mina.filter.codec.ProtocolCodecFilter; +import org.springframework.stereotype.Component; + +@Component(MatrixConstants.MATRIX_TYPE_RBM3000) +public class Rbm3000ClientFactory extends AbstractClientFactory { + + @Override + public Rbm3000ClientIoHandler getClientHandler() { + System.out.println("=============getClientHandler=================="); + return new Rbm3000ClientIoHandler(); + } + + @Override + public void buildFilterChain(IoFilterChain ioFilterChain) { + ioFilterChain.addLast("codec", new ProtocolCodecFilter(new Rbm3000ProtocolFactory())); + } +} 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 new file mode 100644 index 0000000..14cce72 --- /dev/null +++ b/src/main/java/com/example/mina/client/box/rbm3000/Rbm3000ClientIoHandler.java @@ -0,0 +1,38 @@ +package com.example.mina.client.box.rbm3000; + +import com.example.mina.client.base.AbstractMatrixIoHandler; +import com.example.mina.client.base.MatrixDataProxy; +import com.example.mina.client.base.MatrixResponse; +import lombok.extern.slf4j.Slf4j; +import org.apache.mina.core.session.IoSession; + +/** + * @author hl + * @date 2021/3/10 + */ +@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); + return false; + } + + @Override + public void sessionCreated(IoSession session) { + System.out.println("=========111========"); + } + + + +} diff --git a/src/main/java/com/example/mina/client/box/rbm3000/Rbm3000ProtocolFactory.java b/src/main/java/com/example/mina/client/box/rbm3000/Rbm3000ProtocolFactory.java new file mode 100644 index 0000000..a01afc1 --- /dev/null +++ b/src/main/java/com/example/mina/client/box/rbm3000/Rbm3000ProtocolFactory.java @@ -0,0 +1,142 @@ +package com.example.mina.client.box.rbm3000; + +import com.example.mina.client.base.MatrixCommand; +import com.example.mina.client.base.MatrixConstants; +import com.example.mina.client.base.MatrixResponse; +import com.example.mina.processor.VbLogUtils; +import com.example.mina.server.util.CommandHelper; +import lombok.extern.slf4j.Slf4j; +import org.apache.mina.core.buffer.IoBuffer; +import org.apache.mina.core.session.IoSession; +import org.apache.mina.filter.codec.*; + +import java.nio.charset.CharacterCodingException; +import java.nio.charset.CharsetDecoder; +import java.nio.charset.CharsetEncoder; +import java.nio.charset.StandardCharsets; + +@Slf4j +public class Rbm3000ProtocolFactory implements ProtocolCodecFactory { + + private static final CharsetDecoder DECODER = StandardCharsets.UTF_8.newDecoder(); + + private static final CharsetEncoder ENCODER = StandardCharsets.UTF_8.newEncoder(); + + @Override + public ProtocolEncoder getEncoder(IoSession ioSession) throws Exception { + return new Qrb3000ProtocolEncoder(); + } + + @Override + public ProtocolDecoder getDecoder(IoSession ioSession) throws Exception { + return new Qrb3000ProtocolDecoder(); + } + + public static class Qrb3000ProtocolEncoder extends ProtocolEncoderAdapter { + + @Override + public void encode(IoSession ioSession, Object msg, ProtocolEncoderOutput protocolEncoderOutput) + throws CharacterCodingException { + + if (!(msg instanceof MatrixCommand)) { + log.error("error msg, msg is: {}", msg); + return; + } + + MatrixCommand mc = (MatrixCommand) msg; + log.info("---发送数据参数!Attn = {},Col = {},Command = {},Row = {},MatrixId = {},type = {}", + mc.getAttn(), + mc.getCol(), + mc.getCommand(), + mc.getRow(), + mc.getMatrixId() + ); + int cmd = mc.getCommand(); + VbLogUtils.infoLog(log, "", mc.getMatrixId(),msg); + + IoBuffer buffer = IoBuffer.allocate(100, false).setAutoExpand(true); + + // Len==8 cmd【0】 0x30 set row/col attn=1 + if (cmd == MatrixConstants.COMMAND_SET_ATTN) { + buffer.put((byte)0x30); + buffer.put((byte)0xFE); + buffer.put((byte)0xFE); + buffer.put(mc.getRow().byteValue()); + buffer.put(mc.getCol().byteValue()); + buffer.put((byte)0xFE); + buffer.put((byte)0xFE); + buffer.put((byte)0xFE); + }else if (cmd == MatrixConstants.COMMAND_GET_ATTN) { + buffer.put((byte)0x68); + buffer.put((byte)0xFE); + buffer.put((byte)0xFE); + if(mc.getRow() != null){ + // row + buffer.put((byte)0x0A); + buffer.put(mc.getRow().byteValue()); + } else { + // col + buffer.put((byte)0x0B); + buffer.put(mc.getCol().byteValue()); + } + buffer.put((byte)0xFE); + buffer.put((byte)0xFE); + buffer.put((byte)0xFE); + + } else { + buffer.put((byte)0x62); + buffer.put((byte)0xFE); + buffer.put((byte)0xFE); + buffer.put((byte)0xFE); + buffer.put((byte)0xFE); + buffer.put((byte)0xFE); + buffer.put((byte)0xFE); + buffer.put((byte)0xFE); + } + + buffer.flip(); + protocolEncoderOutput.write(buffer); + } + } + + public static class Qrb3000ProtocolDecoder extends ProtocolDecoderAdapter { + + @Override + public void decode(IoSession ioSession, IoBuffer ioBuffer, ProtocolDecoderOutput protocolDecoderOutput) + throws Exception { + log.info("--server返回给----client ------IoBuffer{}", ioBuffer); + MatrixResponse response = new MatrixResponse(); + int len = ioBuffer.limit(); + byte[] bytes = new byte[len]; + ioBuffer.get(bytes); + int cmd = bytes[0]; + if (cmd == 0x30 && len == 8) { + int row = CommandHelper.BCD_REV[bytes[3]]; + int col = CommandHelper.BCD_REV[bytes[4]]; + int rowCol = bytes[6]; + int colRow = bytes[5]; + + response.setRow(row); + response.setCol(col); + response.setRowCol(rowCol); + response.setColRow(colRow); + response.setIsSetAttn(true); + + } + if (cmd == 0x68 && len == 8) { + boolean isA = (bytes[3] == (byte) 0x0A); + int tmp = bytes[4]; + if (isA) { + // col + response.setCol(tmp); + } else { + // row + response.setRow(tmp); + } + } + protocolDecoderOutput.write(response); + } + + } + +} diff --git a/src/main/java/com/example/mina/client/box/rec6000/REC6000ProtocolFactory.java b/src/main/java/com/example/mina/client/box/rec6000/REC6000ProtocolFactory.java index 6088490..af1fe81 100644 --- a/src/main/java/com/example/mina/client/box/rec6000/REC6000ProtocolFactory.java +++ b/src/main/java/com/example/mina/client/box/rec6000/REC6000ProtocolFactory.java @@ -47,8 +47,7 @@ public class REC6000ProtocolFactory implements ProtocolCodecFactory { mc.getCol(), mc.getCommand(), mc.getRow(), - mc.getMatrixId(), - mc.getType() + mc.getMatrixId() ); // REC6000 rest 开关 diff --git a/src/main/resources/logback-spring.xml b/src/main/resources/logback-spring.xml index b99839f..dc74221 100644 --- a/src/main/resources/logback-spring.xml +++ b/src/main/resources/logback-spring.xml @@ -1,5 +1,10 @@ - + + + + %d{HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n + +