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
+
+