Commit 37821ab202e0ff2d9414e68099c67d359a0b253d

Authored by 杜云山
1 parent 5938f6b5
Exists in develop

feat: 完成REC6000客户端发送HTTP消息

src/main/java/com/example/mina/Application.java
1 1 package com.example.mina;
2 2  
3   -import com.example.mina.client.base.ClientManager;
4   -import com.example.mina.client.base.MatrixClient;
5   -import com.example.mina.client.base.MatrixCommand;
6   -import com.example.mina.client.base.MatrixConnectConfig;
  3 +import com.example.mina.client.base.*;
7 4 import org.springframework.boot.SpringApplication;
8 5 import org.springframework.boot.autoconfigure.SpringBootApplication;
9 6 import org.springframework.context.ConfigurableApplicationContext;
... ... @@ -42,6 +39,17 @@ public class Application {
42 39  
43 40 client.setAttenuation(1,2,3, MatrixCommand.Type.AERO_GET_ATTN);
44 41  
  42 + MatrixConnectConfig REC3000 = MatrixConnectConfig.builder()
  43 + .deviceId("158")
  44 + .deviceType(MatrixConstants.MATRIX_TYPE_REC3000)
  45 + .host("127.0.0.1")
  46 + .port(9099)
  47 + .build();
  48 +
  49 + MatrixClient REC3000Client = clientManager.getOrCreateClient(REC3000);
  50 +
  51 + REC3000Client.setAttenuation(1, 2, 3, null);
  52 +
45 53 }
46 54  
47 55 }
... ...
src/main/java/com/example/mina/client/base/MatrixConstants.java
... ... @@ -8,6 +8,8 @@ public class MatrixConstants {
8 8  
9 9 public static final String MATRIX_TYPE_LTE3000 = "LTE3000";
10 10  
  11 + public static final String MATRIX_TYPE_REC3000 = "REC3000";
  12 +
11 13 public static final int COMMAND_RESET = 1;
12 14  
13 15 public static final int COMMAND_SET_ATTN = 2;
... ...
src/main/java/com/example/mina/client/box/rec6000/REC3000ClientFactory.java 0 → 100644
... ... @@ -0,0 +1,23 @@
  1 +package com.example.mina.client.box.rec6000;
  2 +
  3 +import com.example.mina.client.base.AbstractClientFactory;
  4 +import com.example.mina.client.base.MatrixConstants;
  5 +import org.apache.mina.core.filterchain.IoFilterChain;
  6 +import org.apache.mina.filter.codec.ProtocolCodecFilter;
  7 +import org.springframework.stereotype.Component;
  8 +
  9 +@Component(MatrixConstants.MATRIX_TYPE_REC3000)
  10 +public class REC3000ClientFactory extends AbstractClientFactory {
  11 +
  12 + @Override
  13 + public REC3000ClientIoHandler getClientHandler() {
  14 + System.out.println("=============getClientHandler==================");
  15 + return new REC3000ClientIoHandler();
  16 + }
  17 +
  18 + @Override
  19 + public void buildFilterChain(IoFilterChain ioFilterChain) {
  20 + // java.lang.IllegalArgumentException: Other filter is using the same name 'codec'
  21 + ioFilterChain.addLast("codec", new ProtocolCodecFilter(new REC3000ProtocolFactory()));
  22 + }
  23 +}
... ...
src/main/java/com/example/mina/client/box/rec6000/REC3000ClientIoHandler.java 0 → 100644
... ... @@ -0,0 +1,37 @@
  1 +package com.example.mina.client.box.rec6000;
  2 +
  3 +import com.example.mina.client.base.AbstractMatrixIoHandler;
  4 +import com.example.mina.client.base.MatrixDataProxy;
  5 +import lombok.extern.slf4j.Slf4j;
  6 +import org.apache.mina.core.session.IoSession;
  7 +
  8 +/**
  9 + * @author dy
  10 + * @date 2021/3/10
  11 + */
  12 +@Slf4j
  13 +public class REC3000ClientIoHandler extends AbstractMatrixIoHandler {
  14 +
  15 + //public AeroflexClientIoHandler(MatrixDataProxy matrixDataProxy) {
  16 + // super(matrixDataProxy);
  17 + // }
  18 +
  19 + public REC3000ClientIoHandler() {
  20 + super(new MatrixDataProxy());
  21 + }
  22 +
  23 +
  24 + @Override
  25 + public boolean handleCommandResponse(byte[] response) {
  26 + log.info("------REC3000ClientIoHandler-----{}",response);
  27 + return false;
  28 + }
  29 +
  30 + @Override
  31 + public void sessionCreated(IoSession session) {
  32 + System.out.println("=========111========");
  33 + }
  34 +
  35 +
  36 +
  37 +}
... ...
src/main/java/com/example/mina/client/box/rec6000/REC3000ProtocolFactory.java 0 → 100644
... ... @@ -0,0 +1,89 @@
  1 +package com.example.mina.client.box.rec6000;
  2 +
  3 +import com.example.mina.client.base.MatrixCommand;
  4 +import com.example.mina.client.base.MatrixResponse;
  5 +import lombok.extern.slf4j.Slf4j;
  6 +import org.apache.mina.core.buffer.IoBuffer;
  7 +import org.apache.mina.core.session.IoSession;
  8 +import org.apache.mina.filter.codec.*;
  9 +import org.apache.mina.http.api.DefaultHttpResponse;
  10 +import org.apache.mina.http.api.HttpResponse;
  11 +import org.apache.mina.http.api.HttpStatus;
  12 +import org.apache.mina.http.api.HttpVersion;
  13 +
  14 +import java.nio.charset.StandardCharsets;
  15 +import java.util.HashMap;
  16 +import java.util.Map;
  17 +
  18 +@Slf4j
  19 +public class REC3000ProtocolFactory implements ProtocolCodecFactory {
  20 +
  21 + @Override
  22 + public ProtocolEncoder getEncoder(IoSession ioSession) throws Exception {
  23 + return new REC3000ProtocolEncoder();
  24 + }
  25 +
  26 + @Override
  27 + public ProtocolDecoder getDecoder(IoSession ioSession) throws Exception {
  28 + return new REC3000ProtocolDecoder();
  29 + }
  30 +
  31 + public static class REC3000ProtocolEncoder extends ProtocolEncoderAdapter {
  32 +
  33 + @Override
  34 + public void encode(IoSession ioSession, Object msg, ProtocolEncoderOutput protocolEncoderOutput) {
  35 +
  36 + if (!(msg instanceof MatrixCommand)) {
  37 + log.error("error msg, msg is: {}", msg);
  38 + return;
  39 + }
  40 +
  41 + MatrixCommand mc = (MatrixCommand) msg;
  42 + log.info("---发送数据参数!Attn = {},Col = {},Command = {},Row = {},MatrixId = {},type = {}",
  43 + mc.getAttn(),
  44 + mc.getCol(),
  45 + mc.getCommand(),
  46 + mc.getRow(),
  47 + mc.getMatrixId(),
  48 + mc.getType()
  49 + );
  50 +
  51 + // 响应HTML
  52 + String responseJson = "{\n \"row\": 2,\n \"col\": 5\n}";
  53 + byte[] responseBytes = responseJson.getBytes(StandardCharsets.UTF_8);
  54 + int contentLength = responseBytes.length;
  55 +
  56 + // 构造HttpResponse对象,HttpResponse只包含响应的status line和header部分
  57 + Map<String, String> headers = new HashMap<>(8);
  58 + headers.put("Content-Type", "application/json");
  59 + headers.put("Content-Length", Integer.toString(contentLength));
  60 + HttpResponse response = new DefaultHttpResponse(HttpVersion.HTTP_1_1, HttpStatus.SUCCESS_OK, headers);
  61 +
  62 + // 响应BODY
  63 + IoBuffer responseIoBuffer = IoBuffer.allocate(contentLength);
  64 + responseIoBuffer.put(responseBytes);
  65 + responseIoBuffer.flip();
  66 +
  67 + // 响应的status line和header部分
  68 + ioSession.write(response);
  69 + // 响应body部分
  70 + ioSession.write(responseIoBuffer);
  71 +
  72 + }
  73 +
  74 + }
  75 +
  76 + public static class REC3000ProtocolDecoder extends ProtocolDecoderAdapter {
  77 +
  78 + @Override
  79 + public void decode(IoSession ioSession, IoBuffer ioBuffer, ProtocolDecoderOutput protocolDecoderOutput) {
  80 + log.info("--server返回给----client ------IoBuffer{}", ioBuffer);
  81 + int cmd = ioBuffer.get();
  82 + MatrixResponse response = new MatrixResponse(); // todo
  83 +
  84 + protocolDecoderOutput.write(ioBuffer);
  85 + }
  86 +
  87 + }
  88 +
  89 +}
... ...