diff --git a/src/main/java/com/example/mina/Application.java b/src/main/java/com/example/mina/Application.java index f3cc4bb..fba4ea6 100644 --- a/src/main/java/com/example/mina/Application.java +++ b/src/main/java/com/example/mina/Application.java @@ -1,9 +1,6 @@ package com.example.mina; -import com.example.mina.client.base.ClientManager; -import com.example.mina.client.base.MatrixClient; -import com.example.mina.client.base.MatrixCommand; -import com.example.mina.client.base.MatrixConnectConfig; +import com.example.mina.client.base.*; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; import org.springframework.context.ConfigurableApplicationContext; @@ -42,6 +39,17 @@ public class Application { client.setAttenuation(1,2,3, MatrixCommand.Type.AERO_GET_ATTN); + MatrixConnectConfig REC3000 = MatrixConnectConfig.builder() + .deviceId("158") + .deviceType(MatrixConstants.MATRIX_TYPE_REC3000) + .host("127.0.0.1") + .port(9099) + .build(); + + MatrixClient REC3000Client = clientManager.getOrCreateClient(REC3000); + + REC3000Client.setAttenuation(1, 2, 3, null); + } } 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 53e4b18..dd6adfc 100644 --- a/src/main/java/com/example/mina/client/base/MatrixConstants.java +++ b/src/main/java/com/example/mina/client/base/MatrixConstants.java @@ -8,6 +8,8 @@ public class MatrixConstants { public static final String MATRIX_TYPE_LTE3000 = "LTE3000"; + public static final String MATRIX_TYPE_REC3000 = "REC3000"; + 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/box/rec6000/REC3000ClientFactory.java b/src/main/java/com/example/mina/client/box/rec6000/REC3000ClientFactory.java new file mode 100644 index 0000000..efbd8c0 --- /dev/null +++ b/src/main/java/com/example/mina/client/box/rec6000/REC3000ClientFactory.java @@ -0,0 +1,23 @@ +package com.example.mina.client.box.rec6000; + +import com.example.mina.client.base.AbstractClientFactory; +import com.example.mina.client.base.MatrixConstants; +import org.apache.mina.core.filterchain.IoFilterChain; +import org.apache.mina.filter.codec.ProtocolCodecFilter; +import org.springframework.stereotype.Component; + +@Component(MatrixConstants.MATRIX_TYPE_REC3000) +public class REC3000ClientFactory extends AbstractClientFactory { + + @Override + public REC3000ClientIoHandler getClientHandler() { + System.out.println("=============getClientHandler=================="); + return new REC3000ClientIoHandler(); + } + + @Override + public void buildFilterChain(IoFilterChain ioFilterChain) { + // java.lang.IllegalArgumentException: Other filter is using the same name 'codec' + ioFilterChain.addLast("codec", new ProtocolCodecFilter(new REC3000ProtocolFactory())); + } +} diff --git a/src/main/java/com/example/mina/client/box/rec6000/REC3000ClientIoHandler.java b/src/main/java/com/example/mina/client/box/rec6000/REC3000ClientIoHandler.java new file mode 100644 index 0000000..321d964 --- /dev/null +++ b/src/main/java/com/example/mina/client/box/rec6000/REC3000ClientIoHandler.java @@ -0,0 +1,37 @@ +package com.example.mina.client.box.rec6000; + +import com.example.mina.client.base.AbstractMatrixIoHandler; +import com.example.mina.client.base.MatrixDataProxy; +import lombok.extern.slf4j.Slf4j; +import org.apache.mina.core.session.IoSession; + +/** + * @author dy + * @date 2021/3/10 + */ +@Slf4j +public class REC3000ClientIoHandler extends AbstractMatrixIoHandler { + + //public AeroflexClientIoHandler(MatrixDataProxy matrixDataProxy) { + // super(matrixDataProxy); + // } + + public REC3000ClientIoHandler() { + super(new MatrixDataProxy()); + } + + + @Override + public boolean handleCommandResponse(byte[] response) { + log.info("------REC3000ClientIoHandler-----{}",response); + return false; + } + + @Override + public void sessionCreated(IoSession session) { + System.out.println("=========111========"); + } + + + +} diff --git a/src/main/java/com/example/mina/client/box/rec6000/REC3000ProtocolFactory.java b/src/main/java/com/example/mina/client/box/rec6000/REC3000ProtocolFactory.java new file mode 100644 index 0000000..3f51d89 --- /dev/null +++ b/src/main/java/com/example/mina/client/box/rec6000/REC3000ProtocolFactory.java @@ -0,0 +1,89 @@ +package com.example.mina.client.box.rec6000; + +import com.example.mina.client.base.MatrixCommand; +import com.example.mina.client.base.MatrixResponse; +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 org.apache.mina.http.api.DefaultHttpResponse; +import org.apache.mina.http.api.HttpResponse; +import org.apache.mina.http.api.HttpStatus; +import org.apache.mina.http.api.HttpVersion; + +import java.nio.charset.StandardCharsets; +import java.util.HashMap; +import java.util.Map; + +@Slf4j +public class REC3000ProtocolFactory implements ProtocolCodecFactory { + + @Override + public ProtocolEncoder getEncoder(IoSession ioSession) throws Exception { + return new REC3000ProtocolEncoder(); + } + + @Override + public ProtocolDecoder getDecoder(IoSession ioSession) throws Exception { + return new REC3000ProtocolDecoder(); + } + + public static class REC3000ProtocolEncoder extends ProtocolEncoderAdapter { + + @Override + public void encode(IoSession ioSession, Object msg, ProtocolEncoderOutput protocolEncoderOutput) { + + 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(), + mc.getType() + ); + + // 响应HTML + String responseJson = "{\n \"row\": 2,\n \"col\": 5\n}"; + byte[] responseBytes = responseJson.getBytes(StandardCharsets.UTF_8); + int contentLength = responseBytes.length; + + // 构造HttpResponse对象,HttpResponse只包含响应的status line和header部分 + Map headers = new HashMap<>(8); + headers.put("Content-Type", "application/json"); + headers.put("Content-Length", Integer.toString(contentLength)); + HttpResponse response = new DefaultHttpResponse(HttpVersion.HTTP_1_1, HttpStatus.SUCCESS_OK, headers); + + // 响应BODY + IoBuffer responseIoBuffer = IoBuffer.allocate(contentLength); + responseIoBuffer.put(responseBytes); + responseIoBuffer.flip(); + + // 响应的status line和header部分 + ioSession.write(response); + // 响应body部分 + ioSession.write(responseIoBuffer); + + } + + } + + public static class REC3000ProtocolDecoder extends ProtocolDecoderAdapter { + + @Override + public void decode(IoSession ioSession, IoBuffer ioBuffer, ProtocolDecoderOutput protocolDecoderOutput) { + log.info("--server返回给----client ------IoBuffer{}", ioBuffer); + int cmd = ioBuffer.get(); + MatrixResponse response = new MatrixResponse(); // todo + + protocolDecoderOutput.write(ioBuffer); + } + + } + +} -- libgit2 0.21.2