Commit 69bfaf7fde391a8b793a0c2f065328e5b5f7f473

Authored by wu
1 parent 90e60467
Exists in develop

feat: 重构客户端

1,改为命令模式;
2,抽象client;
Showing 30 changed files with 294 additions and 628 deletions   Show diff stats
@@ -40,6 +40,11 @@ @@ -40,6 +40,11 @@
40 <artifactId>mina-core</artifactId> 40 <artifactId>mina-core</artifactId>
41 <version>2.1.4</version> 41 <version>2.1.4</version>
42 </dependency> 42 </dependency>
  43 + <dependency>
  44 + <groupId>org.apache.mina</groupId>
  45 + <artifactId>mina-http</artifactId>
  46 + <version>2.1.4</version>
  47 + </dependency>
43 48
44 <dependency> 49 <dependency>
45 <groupId>org.springframework.boot</groupId> 50 <groupId>org.springframework.boot</groupId>
src/main/java/com/example/mina/client/base/AbstractClient.java
1 package com.example.mina.client.base; 1 package com.example.mina.client.base;
2 2
3 -import com.example.mina.client.entity.AbstractClientMessage;  
4 -import com.example.mina.client.entity.ClientDTO;  
5 -import com.example.mina.client.service.ServerService;  
6 -import com.example.mina.client.service.impl.ServerServiceImpl;  
7 import com.example.mina.server.base.AbstractHardwareDataBuffer; 3 import com.example.mina.server.base.AbstractHardwareDataBuffer;
8 import org.apache.mina.core.future.ConnectFuture; 4 import org.apache.mina.core.future.ConnectFuture;
9 import org.apache.mina.core.service.IoConnector; 5 import org.apache.mina.core.service.IoConnector;
@@ -13,6 +9,7 @@ import org.apache.mina.filter.codec.ProtocolCodecFilter; @@ -13,6 +9,7 @@ import org.apache.mina.filter.codec.ProtocolCodecFilter;
13 import org.apache.mina.transport.socket.nio.NioSocketConnector; 9 import org.apache.mina.transport.socket.nio.NioSocketConnector;
14 10
15 import java.net.InetSocketAddress; 11 import java.net.InetSocketAddress;
  12 +import java.util.concurrent.ArrayBlockingQueue;
16 13
17 /** 14 /**
18 * @author dy 15 * @author dy
@@ -20,59 +17,87 @@ import java.net.InetSocketAddress; @@ -20,59 +17,87 @@ import java.net.InetSocketAddress;
20 */ 17 */
21 public abstract class AbstractClient { 18 public abstract class AbstractClient {
22 19
23 - protected ProtocolCodecFactory protocolCodecFactory; 20 + /**
  21 + * 客户端与设备端连接的配置信息
  22 + */
  23 + protected BoxConnectConfig boxConnectConfig;
24 24
25 - protected AbstractVirtualBoxClientHandler abstractVirtualBoxClientHandler; 25 + /**
  26 + * 存储设备返回的响应数据缓存
  27 + */
  28 + protected AbstractHardwareDataBuffer responsePool;
26 29
27 - protected AbstractHardwareDataBuffer hardwareDataBuffer;  
28 -  
29 - protected AbstractClientMessage abstractClientMessage; 30 + /**
  31 + * 存储客户端的请求指令的队列
  32 + */
  33 + protected ArrayBlockingQueue<BaseRequest> requestsPool;
30 34
31 protected IoSession ioSession; 35 protected IoSession ioSession;
32 36
33 - protected ServerService serverService = new ServerServiceImpl();  
34 37
35 - protected AbstractClient() {  
36 - init(); 38 + public AbstractClient(BoxConnectConfig connectConfig) {
  39 + this.boxConnectConfig = connectConfig;
  40 + this.requestsPool = new ArrayBlockingQueue<BaseRequest>(100);
  41 + //TODO 初始化响应缓存
  42 + this.responsePool = null;
  43 + }
  44 +
  45 + /**
  46 + *获取设备的类型
  47 + */
  48 + abstract public String getDeviceType();
  49 +
  50 + /**
  51 + * 返回客户端对响应的Handler
  52 + * @return
  53 + */
  54 + abstract protected AbstractVirtualBoxClientHandler getIoHandler();
  55 +
  56 + /**
  57 + * 返回该盒子的编解码器
  58 + * @return
  59 + */
  60 + abstract protected ProtocolCodecFactory getCodecFactory();
  61 +
  62 + /**
  63 + * 返回缓存数据,提供给Request执行;
  64 + * @return
  65 + */
  66 + public AbstractHardwareDataBuffer getResponsePool() {
  67 + return this.responsePool;
37 } 68 }
38 69
39 - protected abstract void init();  
40 70
41 - public void start(ClientDTO clientDTO) { 71 + public void start() {
42 //1、创建客户端IoService 72 //1、创建客户端IoService
43 IoConnector connector = new NioSocketConnector(); 73 IoConnector connector = new NioSocketConnector();
44 //客户端链接超时时间 74 //客户端链接超时时间
45 connector.setConnectTimeoutMillis(30000); 75 connector.setConnectTimeoutMillis(30000);
46 //2、客户端过滤器 76 //2、客户端过滤器
47 - connector.getFilterChain().addLast("codec", new ProtocolCodecFilter(protocolCodecFactory)); 77 + connector.getFilterChain().addLast("codec", new ProtocolCodecFilter(getCodecFactory()));
48 //3、客户端IoHandler,发生消息 78 //3、客户端IoHandler,发生消息
49 - connector.setHandler(abstractVirtualBoxClientHandler); 79 + connector.setHandler(getIoHandler());
50 80
51 //连接服务端 81 //连接服务端
52 - ConnectFuture connectFuture = connector.connect(new InetSocketAddress(abstractClientMessage.getServerMessage().getHost(),  
53 - abstractClientMessage.getServerMessage().getPort())); 82 + ConnectFuture connectFuture = connector.connect(new InetSocketAddress(boxConnectConfig.getHost(),
  83 + boxConnectConfig.getPort()));
54 // 等待建立连接 84 // 等待建立连接
55 connectFuture.awaitUninterruptibly(); 85 connectFuture.awaitUninterruptibly();
56 // 获取连接会话 86 // 获取连接会话
57 this.ioSession = connectFuture.getSession(); 87 this.ioSession = connectFuture.getSession();
  88 + this.ioSession.setAttribute(BoxConstants.SESSION_CONFIG_NAME, boxConnectConfig);
58 89
59 } 90 }
60 91
  92 + /**
  93 + * 执行指令
  94 + * @param request
  95 + */
  96 + public <Q extends BaseRequest<R>, R extends BaseResponse> R execute(Q request) {
  97 + requestsPool.offer(request);
  98 + ioSession.write(request);
61 99
62 - abstract public int getAttenuation(int col);  
63 -  
64 - /*public boolean isConnected() {  
65 - return false;  
66 - }*/  
67 -  
68 - //public void close() {}  
69 -  
70 - abstract public void setAttenuation(ClientDTO clientDTO);  
71 -  
72 -  
73 -  
74 - //abstract public Boolean reset();  
75 -  
76 - //abstract public int[][] getAll(); 100 + return request.execute();
  101 + }
77 102
78 } 103 }
src/main/java/com/example/mina/client/base/AbstractVirtualBoxClientHandler.java
1 package com.example.mina.client.base; 1 package com.example.mina.client.base;
2 2
3 3
4 -import com.example.mina.client.entity.AbstractClientMessage;  
5 -import com.example.mina.client.entity.Command;  
6 import com.example.mina.server.base.AbstractHardwareDataBuffer; 4 import com.example.mina.server.base.AbstractHardwareDataBuffer;
7 -import com.example.mina.server.util.LogUtils;  
8 import lombok.Data; 5 import lombok.Data;
  6 +import lombok.extern.slf4j.Slf4j;
  7 +import org.apache.mina.core.buffer.IoBuffer;
9 import org.apache.mina.core.service.IoHandlerAdapter; 8 import org.apache.mina.core.service.IoHandlerAdapter;
10 import org.apache.mina.core.session.IdleStatus; 9 import org.apache.mina.core.session.IdleStatus;
11 import org.apache.mina.core.session.IoSession; 10 import org.apache.mina.core.session.IoSession;
12 11
13 -import java.nio.charset.StandardCharsets;  
14 -  
15 /** 12 /**
16 * @author dy 13 * @author dy
17 */ 14 */
18 @Data 15 @Data
19 -public abstract class AbstractVirtualBoxClientHandler<RECEIVE extends BaseReceiveMessage>  
20 - extends IoHandlerAdapter { 16 +@Slf4j
  17 +public abstract class AbstractVirtualBoxClientHandler extends IoHandlerAdapter {
  18 +
  19 + protected String deviceType;
21 20
22 - protected AbstractClientMessage clientMessage; 21 + protected AbstractHardwareDataBuffer responsePool;
23 22
24 - protected AbstractHardwareDataBuffer hardwareDataBuffer;  
25 23
26 - private SendMessage sendMessage = new SendMessage(); 24 + public AbstractVirtualBoxClientHandler(String deviceType, AbstractHardwareDataBuffer abstractHardwareDataBuffer) {
  25 + this.deviceType = deviceType;
  26 + this.responsePool = abstractHardwareDataBuffer;
  27 + }
27 28
28 - private BaseReceiveMessage receiveMessage; 29 + protected BoxConnectConfig getConnectConfig(IoSession session) {
  30 + Object boxConnectConfig = session.getAttribute(BoxConstants.SESSION_CONFIG_NAME);
29 31
30 - public AbstractVirtualBoxClientHandler(AbstractClientMessage clientMessage,  
31 - AbstractHardwareDataBuffer abstractHardwareDataBuffer) {  
32 - this.clientMessage = clientMessage;  
33 - this.hardwareDataBuffer = abstractHardwareDataBuffer; 32 + if( boxConnectConfig instanceof BoxConnectConfig) {
  33 + return (BoxConnectConfig) boxConnectConfig;
  34 + }
  35 + return null;
34 } 36 }
35 37
36 @Override 38 @Override
37 public void exceptionCaught(IoSession session, Throwable throwable) { 39 public void exceptionCaught(IoSession session, Throwable throwable) {
38 - System.out.println("客户端exceptionCaught被调用!");  
39 - throwable.printStackTrace();  
40 } 40 }
41 41
42 @Override 42 @Override
43 public void messageReceived(IoSession session, Object message) { 43 public void messageReceived(IoSession session, Object message) {
44 - if (message instanceof BaseReceiveMessage) {  
45 - receiveMessage = (RECEIVE) message; 44 + if (!(message instanceof IoBuffer)) {
  45 + log.error("客户端接收到的消息不为定义的响应类! message:" + message);
  46 + throw new RuntimeException("Unsupported response message");
46 } 47 }
47 - handleCommandResponse(sendMessage, receiveMessage);  
48 - System.out.println("客户端messageReceived被调用!");  
49 48
50 - System.out.println("client端接收信息:" + new String(receiveMessage.getReceiveMessage(), StandardCharsets.UTF_8));  
51 - LogUtils.println("client端接收信息hex:" , receiveMessage.getReceiveMessage()); 49 + //TODO 客户端将数据服务器的字符串数组读取出来
  50 + byte[] response = null;
  51 + log.info("the client recieved the device response, deviceType: {}, device:{}, response is: {}", deviceType,
  52 + getConnectConfig(session), response);
  53 + handleCommandResponse(response);
52 } 54 }
53 55
54 @Override 56 @Override
55 public void messageSent(IoSession session, Object message) { 57 public void messageSent(IoSession session, Object message) {
56 - System.out.println("客户端messageSent被调用!");  
57 - System.out.println("client端发送信息:" + new String((byte[]) message, StandardCharsets.UTF_8));  
58 - LogUtils.println("client端发送信息hex:", (byte[]) message);  
59 - this.sendMessage = SendMessage.builder().sendMessage((byte[]) message).build();  
60 } 58 }
61 59
62 @Override 60 @Override
63 public void inputClosed(IoSession session) { 61 public void inputClosed(IoSession session) {
64 - System.out.println("客户端inputClosed被调用!");  
65 - System.out.println("client端:" + session.getId() + " 关闭输入");  
66 } 62 }
67 63
68 @Override 64 @Override
69 public void sessionClosed(IoSession session) { 65 public void sessionClosed(IoSession session) {
70 - System.out.println("客户端sessionClosed被调用!");  
71 - System.out.println("client端与:" + session.getRemoteAddress().toString() + " 关闭连接");  
72 - System.exit(0);  
73 } 66 }
74 67
75 @Override 68 @Override
76 public void sessionCreated(IoSession session) { 69 public void sessionCreated(IoSession session) {
77 - System.out.println("客户端sessionCreated被调用!");  
78 - System.out.println("client端与:" + session.getRemoteAddress().toString() + " 建立连接"); 70 +
79 } 71 }
80 72
81 @Override 73 @Override
82 public void sessionIdle(IoSession session, IdleStatus status) { 74 public void sessionIdle(IoSession session, IdleStatus status) {
83 - System.out.println("客户端sessionIdle被调用!");  
84 - System.out.println("client端闲置连接:会话 " + session.getId() + " 被触发 " + session.getIdleCount(status) + " 次"); 75 + log.info("the session with box was idle, deviceType:{}, device is {}", deviceType, getConnectConfig(session));
85 } 76 }
86 77
87 @Override 78 @Override
88 public void sessionOpened(IoSession session) { 79 public void sessionOpened(IoSession session) {
89 - // for (int i = 0; i < clientMessage.getCommands().size(); i++) {  
90 -// handleOneCommand(i, session);  
91 -// }  
92 -// handleOneCommand(1, session);  
93 - System.out.println("客户端sessionOpened被调用!");  
94 - System.out.println("client端打开连接"); 80 + log.info("the system has connected to device, deviceType: {}, device is {}", deviceType, getConnectConfig(session));
95 } 81 }
96 82
97 - protected void handleOneCommand(int i, IoSession session) {  
98 -  
99 - Command command = clientMessage.getCommands().get(i);  
100 -  
101 - session.write(command.getBytes());  
102 - }  
103 -  
104 - protected abstract boolean handleCommandResponse(SendMessage sendMessage, BaseReceiveMessage receiveMessage);  
105 - 83 + abstract public boolean handleCommandResponse(byte[] response);
106 } 84 }
src/main/java/com/example/mina/client/base/BaseReceiveMessage.java
@@ -1,19 +0,0 @@ @@ -1,19 +0,0 @@
1 -package com.example.mina.client.base;  
2 -  
3 -import lombok.AllArgsConstructor;  
4 -import lombok.Data;  
5 -import lombok.NoArgsConstructor;  
6 -import lombok.experimental.SuperBuilder;  
7 -  
8 -/**  
9 - * @author dy  
10 - * @date 2021/3/12  
11 - */  
12 -@SuperBuilder  
13 -@Data  
14 -@AllArgsConstructor  
15 -@NoArgsConstructor  
16 -public abstract class BaseReceiveMessage {  
17 -  
18 - private byte[] receiveMessage;  
19 -}  
src/main/java/com/example/mina/client/base/BaseRequest.java 0 → 100644
@@ -0,0 +1,28 @@ @@ -0,0 +1,28 @@
  1 +package com.example.mina.client.base;
  2 +
  3 +import lombok.AllArgsConstructor;
  4 +import lombok.Data;
  5 +import lombok.NoArgsConstructor;
  6 +import lombok.experimental.SuperBuilder;
  7 +
  8 +/**
  9 + * @author dy
  10 + * @date 2021/3/12
  11 + */
  12 +@SuperBuilder
  13 +@Data
  14 +@AllArgsConstructor
  15 +@NoArgsConstructor
  16 +public abstract class BaseRequest <R extends BaseResponse>{
  17 +
  18 + protected AbstractClient client;
  19 +
  20 + /**
  21 + * 指令名称
  22 + * @return
  23 + */
  24 + abstract public String getCommandName();
  25 +
  26 + abstract public R execute();
  27 +
  28 +}
src/main/java/com/example/mina/client/base/BaseResponse.java 0 → 100644
@@ -0,0 +1,9 @@ @@ -0,0 +1,9 @@
  1 +package com.example.mina.client.base;
  2 +
  3 +import lombok.Data;
  4 +
  5 +@Data
  6 +public abstract class BaseResponse {
  7 + private String responseType;
  8 +
  9 +}
src/main/java/com/example/mina/client/base/BoxConnectConfig.java 0 → 100644
@@ -0,0 +1,24 @@ @@ -0,0 +1,24 @@
  1 +package com.example.mina.client.base;
  2 +
  3 +
  4 +import lombok.Builder;
  5 +import lombok.Data;
  6 +
  7 +import java.util.Map;
  8 +
  9 +@Data
  10 +@Builder
  11 +public class BoxConnectConfig {
  12 +
  13 + private String host;
  14 +
  15 + private Integer port;
  16 +
  17 + private Integer rows;
  18 +
  19 + private Integer cols;
  20 +
  21 + private Integer maxAttenuation;
  22 +
  23 + private Map<String, Object> options;
  24 +}
src/main/java/com/example/mina/client/base/BoxConstants.java 0 → 100644
@@ -0,0 +1,13 @@ @@ -0,0 +1,13 @@
  1 +package com.example.mina.client.base;
  2 +
  3 +public class BoxConstants {
  4 +
  5 + public static final String SESSION_CONFIG_NAME = "SESSION_CONFIG";
  6 +
  7 + public static final String DEVICE_TYPE_AERO = "AEROFLEX";
  8 +
  9 + public static final String DEVICE_TYPE_LTE3000 = "LTE3000";
  10 +
  11 + public static final String COMMAND_RESET = "RESET";
  12 +
  13 +}
src/main/java/com/example/mina/client/base/ByteProtocolFactory.java 0 → 100644
@@ -0,0 +1,61 @@ @@ -0,0 +1,61 @@
  1 +package com.example.mina.client.base;
  2 +
  3 +import org.apache.mina.core.buffer.IoBuffer;
  4 +import org.apache.mina.core.session.IoSession;
  5 +import org.apache.mina.filter.codec.*;
  6 +
  7 +public class ByteProtocolFactory implements ProtocolCodecFactory {
  8 +
  9 + private final ByteEncoder encoder;
  10 + private final ByteDecoder decoder;
  11 +
  12 + //构造
  13 + public ByteProtocolFactory() {
  14 + encoder = new ByteEncoder();
  15 + decoder = new ByteDecoder();
  16 + }
  17 +
  18 + @Override
  19 + public ProtocolDecoder getDecoder(IoSession arg0) throws Exception {
  20 + return decoder;
  21 + }
  22 +
  23 + @Override
  24 + public ProtocolEncoder getEncoder(IoSession arg0) throws Exception {
  25 + return encoder;
  26 + }
  27 +
  28 + public class ByteEncoder extends ProtocolEncoderAdapter {
  29 +
  30 + //编码 将数据包转成字节数组
  31 + @Override
  32 + public void encode(IoSession session, Object message, ProtocolEncoderOutput out) throws Exception {
  33 + byte[] bytes = (byte[]) message;
  34 +
  35 + IoBuffer buffer = IoBuffer.allocate(bytes.length);
  36 + buffer.setAutoExpand(true);
  37 +
  38 + // 将数据放入缓冲IoBuffer
  39 + buffer.put(bytes);
  40 + // 写状态切换到读状态
  41 + buffer.flip();
  42 +
  43 + out.write(buffer);
  44 + }
  45 +
  46 + }
  47 +
  48 + public class ByteDecoder extends ProtocolDecoderAdapter {
  49 +
  50 + @Override
  51 + public void decode(IoSession session, IoBuffer in, ProtocolDecoderOutput out) throws Exception {
  52 + int limit = in.limit();
  53 + byte[] bytes = new byte[limit];
  54 +
  55 + in.get(bytes);
  56 +
  57 + out.write(bytes);
  58 + }
  59 + }
  60 +
  61 +}
src/main/java/com/example/mina/client/base/request/ResetRequest.java 0 → 100644
@@ -0,0 +1,17 @@ @@ -0,0 +1,17 @@
  1 +package com.example.mina.client.base.request;
  2 +
  3 +import com.example.mina.client.base.BaseRequest;
  4 +import com.example.mina.client.base.BoxConstants;
  5 +import com.example.mina.client.base.response.ResetResponse;
  6 +
  7 +public class ResetRequest extends BaseRequest<ResetResponse> {
  8 + @Override
  9 + public String getCommandName() {
  10 + return BoxConstants.COMMAND_RESET;
  11 + }
  12 +
  13 + @Override
  14 + public ResetResponse execute() {
  15 + return null;
  16 + }
  17 +}
src/main/java/com/example/mina/client/base/response/ResetResponse.java 0 → 100644
@@ -0,0 +1,7 @@ @@ -0,0 +1,7 @@
  1 +package com.example.mina.client.base.response;
  2 +
  3 +import com.example.mina.client.base.BaseResponse;
  4 +
  5 +public class ResetResponse extends BaseResponse {
  6 +
  7 +}
src/main/java/com/example/mina/client/box/aeroflex/AeroflexByteDecoder.java
@@ -1,29 +0,0 @@ @@ -1,29 +0,0 @@
1 -package com.example.mina.client.box.aeroflex;  
2 -  
3 -import org.apache.mina.core.buffer.IoBuffer;  
4 -import org.apache.mina.core.session.IoSession;  
5 -import org.apache.mina.filter.codec.ProtocolDecoder;  
6 -import org.apache.mina.filter.codec.ProtocolDecoderAdapter;  
7 -import org.apache.mina.filter.codec.ProtocolDecoderOutput;  
8 -import org.slf4j.Logger;  
9 -import org.slf4j.LoggerFactory;  
10 -  
11 -/**  
12 - * @author dy  
13 - * @date 2021/3/3  
14 - */  
15 -public class AeroflexByteDecoder extends ProtocolDecoderAdapter {  
16 - //打印日志信息  
17 - private final static Logger log = LoggerFactory  
18 - .getLogger(ProtocolDecoder.class);  
19 -  
20 - @Override  
21 - public void decode(IoSession session, IoBuffer in, ProtocolDecoderOutput out) throws Exception {  
22 - int limit = in.limit();  
23 - byte[] bytes = new byte[limit];  
24 -  
25 - in.get(bytes);  
26 -  
27 - out.write(bytes);  
28 - }  
29 -}  
src/main/java/com/example/mina/client/box/aeroflex/AeroflexByteEnCoder.java
@@ -1,39 +0,0 @@ @@ -1,39 +0,0 @@
1 -package com.example.mina.client.box.aeroflex;  
2 -  
3 -import org.apache.mina.core.buffer.IoBuffer;  
4 -import org.apache.mina.core.session.IoSession;  
5 -import org.apache.mina.filter.codec.ProtocolEncoder;  
6 -import org.apache.mina.filter.codec.ProtocolEncoderAdapter;  
7 -import org.apache.mina.filter.codec.ProtocolEncoderOutput;  
8 -import org.slf4j.Logger;  
9 -import org.slf4j.LoggerFactory;  
10 -  
11 -/**  
12 - * @author dy  
13 - * @date 2021/3/3  
14 - */  
15 -public class AeroflexByteEnCoder extends ProtocolEncoderAdapter {  
16 - //用于打印日志信息  
17 - private final static Logger log = LoggerFactory  
18 - .getLogger(ProtocolEncoder.class);  
19 -  
20 - //编码 将数据包转成字节数组  
21 - @Override  
22 - public void encode(IoSession session, Object message, ProtocolEncoderOutput out) throws Exception {  
23 - byte[] bytes = (byte[]) message;  
24 -  
25 - IoBuffer buffer = IoBuffer.allocate(bytes.length);  
26 - buffer.setAutoExpand(true);  
27 -  
28 - // 将数据放入缓冲IoBuffer  
29 - buffer.put(bytes);  
30 - // 写状态切换到读状态  
31 - buffer.flip();  
32 -  
33 - out.write(buffer);  
34 -// out.flush();  
35 -//  
36 -// buffer.free();  
37 - }  
38 -  
39 -}  
src/main/java/com/example/mina/client/box/aeroflex/AeroflexByteFactory.java
@@ -1,34 +0,0 @@ @@ -1,34 +0,0 @@
1 -package com.example.mina.client.box.aeroflex;  
2 -  
3 -import org.apache.mina.core.session.IoSession;  
4 -import org.apache.mina.filter.codec.ProtocolCodecFactory;  
5 -import org.apache.mina.filter.codec.ProtocolDecoder;  
6 -import org.apache.mina.filter.codec.ProtocolEncoder;  
7 -  
8 -/**  
9 - * @author dy  
10 - * @date 2021/3/3  
11 - */  
12 -public class AeroflexByteFactory implements ProtocolCodecFactory {  
13 - private final AeroflexByteDecoder decoder;  
14 - private final AeroflexByteEnCoder encoder;  
15 -  
16 - //构造  
17 - public AeroflexByteFactory() {  
18 - encoder = new AeroflexByteEnCoder();  
19 - decoder = new AeroflexByteDecoder();  
20 - }  
21 -  
22 - @Override  
23 - public ProtocolDecoder getDecoder(IoSession arg0) throws Exception {  
24 - // TODO Auto-generated method stub  
25 - return decoder;  
26 - }  
27 -  
28 - @Override  
29 - public ProtocolEncoder getEncoder(IoSession arg0) throws Exception {  
30 - // TODO Auto-generated method stub  
31 - return encoder;  
32 - }  
33 -  
34 -}  
src/main/java/com/example/mina/client/box/aeroflex/AeroflexClient.java
1 package com.example.mina.client.box.aeroflex; 1 package com.example.mina.client.box.aeroflex;
2 2
3 import com.example.mina.client.base.AbstractClient; 3 import com.example.mina.client.base.AbstractClient;
4 -import com.example.mina.client.entity.AeroflexMessage;  
5 -import com.example.mina.client.entity.ClientDTO;  
6 -import com.example.mina.client.entity.ServerMessage;  
7 -import com.example.mina.server.entity.AeroflexDataBuffer; 4 +import com.example.mina.client.base.AbstractVirtualBoxClientHandler;
  5 +import com.example.mina.client.base.BoxConnectConfig;
  6 +import com.example.mina.client.base.BoxConstants;
  7 +import org.apache.mina.filter.codec.ProtocolCodecFactory;
8 8
9 /** 9 /**
10 * @author dy 10 * @author dy
@@ -12,44 +12,24 @@ import com.example.mina.server.entity.AeroflexDataBuffer; @@ -12,44 +12,24 @@ import com.example.mina.server.entity.AeroflexDataBuffer;
12 */ 12 */
13 public class AeroflexClient extends AbstractClient { 13 public class AeroflexClient extends AbstractClient {
14 14
15 - @Override  
16 - protected void init() {  
17 - ServerMessage serverMessage = serverService.getServerService(this.getClass().getSimpleName());  
18 - hardwareDataBuffer = new AeroflexDataBuffer(10, 10);  
19 - abstractClientMessage = new AeroflexMessage();  
20 - abstractClientMessage.setServerMessage(serverMessage);  
21 -  
22 - protocolCodecFactory = new AeroflexByteFactory();  
23 - abstractVirtualBoxClientHandler = new AeroflexClientHandler(abstractClientMessage, hardwareDataBuffer); 15 + public AeroflexClient(BoxConnectConfig boxConnectConfig) {
  16 + super(boxConnectConfig);
24 } 17 }
25 18
26 @Override 19 @Override
27 - public void setAttenuation(ClientDTO clientDTO) {  
28 -  
29 - }  
30 -  
31 - /*@Override  
32 - public boolean setAttenuation(int row, int col, int attenuation) {  
33 - return false; 20 + public String getDeviceType() {
  21 + return BoxConstants.DEVICE_TYPE_AERO;
34 } 22 }
35 23
36 @Override 24 @Override
37 - public int getAttenuation(int row, int col) {  
38 - return 0; 25 + protected ProtocolCodecFactory getCodecFactory() {
  26 + return null;
39 } 27 }
40 28
41 @Override 29 @Override
42 - public Boolean reset() { 30 + protected AbstractVirtualBoxClientHandler getIoHandler() {
43 return null; 31 return null;
44 } 32 }
45 33
46 - @Override  
47 - public int[][] getAll() {  
48 - return new int[0][];  
49 - }*/  
50 34
51 - @Override  
52 - public int getAttenuation(int col) {  
53 - return 0;  
54 - }  
55 } 35 }
src/main/java/com/example/mina/client/box/aeroflex/AeroflexClientHandler.java
1 package com.example.mina.client.box.aeroflex; 1 package com.example.mina.client.box.aeroflex;
2 2
3 import com.example.mina.client.base.AbstractVirtualBoxClientHandler; 3 import com.example.mina.client.base.AbstractVirtualBoxClientHandler;
4 -import com.example.mina.client.base.BaseReceiveMessage;  
5 -import com.example.mina.client.base.SendMessage;  
6 -import com.example.mina.client.entity.AbstractClientMessage;  
7 -import com.example.mina.server.base.AbstractHardwareDataBuffer; 4 +import com.example.mina.client.base.BaseResponse;
8 5
9 /** 6 /**
10 * @author dy 7 * @author dy
@@ -12,13 +9,10 @@ import com.example.mina.server.base.AbstractHardwareDataBuffer; @@ -12,13 +9,10 @@ import com.example.mina.server.base.AbstractHardwareDataBuffer;
12 */ 9 */
13 public class AeroflexClientHandler extends AbstractVirtualBoxClientHandler { 10 public class AeroflexClientHandler extends AbstractVirtualBoxClientHandler {
14 11
15 - public AeroflexClientHandler(AbstractClientMessage clientMessage,  
16 - AbstractHardwareDataBuffer abstractHardwareDataBuffer) {  
17 - super(clientMessage, abstractHardwareDataBuffer);  
18 - }  
19 -  
20 @Override 12 @Override
21 - protected boolean handleCommandResponse(SendMessage sendMessage, BaseReceiveMessage receiveMessage) { 13 + public boolean handleCommandResponse(byte[] response) {
  14 +
22 return false; 15 return false;
23 } 16 }
  17 +
24 } 18 }
src/main/java/com/example/mina/client/box/lte3000/Lte3000ByteDecoder.java
@@ -1,31 +0,0 @@ @@ -1,31 +0,0 @@
1 -package com.example.mina.client.box.lte3000;  
2 -  
3 -import org.apache.mina.core.buffer.IoBuffer;  
4 -import org.apache.mina.core.session.IoSession;  
5 -import org.apache.mina.filter.codec.ProtocolDecoder;  
6 -import org.apache.mina.filter.codec.ProtocolDecoderAdapter;  
7 -import org.apache.mina.filter.codec.ProtocolDecoderOutput;  
8 -import org.slf4j.Logger;  
9 -import org.slf4j.LoggerFactory;  
10 -  
11 -/**  
12 - * @author dy  
13 - * @date 2021/3/3  
14 - */  
15 -public class Lte3000ByteDecoder extends ProtocolDecoderAdapter {  
16 - //打印日志信息  
17 - private final static Logger log = LoggerFactory  
18 - .getLogger(ProtocolDecoder.class);  
19 -  
20 - @Override  
21 - public void decode(IoSession session, IoBuffer in, ProtocolDecoderOutput out) throws Exception {  
22 - int limit = in.limit();  
23 - byte[] bytes = new byte[limit];  
24 -  
25 - in.get(bytes);  
26 -  
27 - Lte3000ReceiveMessage receiveMessage = Lte3000ReceiveMessage.builder().receiveMessage(bytes).build();  
28 -  
29 - out.write(receiveMessage);  
30 - }  
31 -}  
src/main/java/com/example/mina/client/box/lte3000/Lte3000ByteEnCoder.java
@@ -1,39 +0,0 @@ @@ -1,39 +0,0 @@
1 -package com.example.mina.client.box.lte3000;  
2 -  
3 -import org.apache.mina.core.buffer.IoBuffer;  
4 -import org.apache.mina.core.session.IoSession;  
5 -import org.apache.mina.filter.codec.ProtocolEncoder;  
6 -import org.apache.mina.filter.codec.ProtocolEncoderAdapter;  
7 -import org.apache.mina.filter.codec.ProtocolEncoderOutput;  
8 -import org.slf4j.Logger;  
9 -import org.slf4j.LoggerFactory;  
10 -  
11 -/**  
12 - * @author dy  
13 - * @date 2021/3/3  
14 - */  
15 -public class Lte3000ByteEnCoder extends ProtocolEncoderAdapter {  
16 - //用于打印日志信息  
17 - private final static Logger log = LoggerFactory  
18 - .getLogger(ProtocolEncoder.class);  
19 -  
20 - //编码 将数据包转成字节数组  
21 - @Override  
22 - public void encode(IoSession session, Object message, ProtocolEncoderOutput out) throws Exception {  
23 - byte[] bytes = (byte[]) message;  
24 -  
25 - IoBuffer buffer = IoBuffer.allocate(bytes.length);  
26 - buffer.setAutoExpand(true);  
27 -  
28 - // 将数据放入缓冲IoBuffer  
29 - buffer.put(bytes);  
30 - // 写状态切换到读状态  
31 - buffer.flip();  
32 -  
33 - out.write(buffer);  
34 -// out.flush();  
35 -//  
36 -// buffer.free();  
37 - }  
38 -  
39 -}  
src/main/java/com/example/mina/client/box/lte3000/Lte3000ByteFactory.java
@@ -1,34 +0,0 @@ @@ -1,34 +0,0 @@
1 -package com.example.mina.client.box.lte3000;  
2 -  
3 -import org.apache.mina.core.session.IoSession;  
4 -import org.apache.mina.filter.codec.ProtocolCodecFactory;  
5 -import org.apache.mina.filter.codec.ProtocolDecoder;  
6 -import org.apache.mina.filter.codec.ProtocolEncoder;  
7 -  
8 -/**  
9 - * @author dy  
10 - * @date 2021/3/3  
11 - */  
12 -public class Lte3000ByteFactory implements ProtocolCodecFactory {  
13 - private final Lte3000ByteDecoder decoder;  
14 - private final Lte3000ByteEnCoder encoder;  
15 -  
16 - //构造  
17 - public Lte3000ByteFactory() {  
18 - encoder = new Lte3000ByteEnCoder();  
19 - decoder = new Lte3000ByteDecoder();  
20 - }  
21 -  
22 - @Override  
23 - public ProtocolDecoder getDecoder(IoSession arg0) throws Exception {  
24 - // TODO Auto-generated method stub  
25 - return decoder;  
26 - }  
27 -  
28 - @Override  
29 - public ProtocolEncoder getEncoder(IoSession arg0) throws Exception {  
30 - // TODO Auto-generated method stub  
31 - return encoder;  
32 - }  
33 -  
34 -}  
src/main/java/com/example/mina/client/box/lte3000/Lte3000Client.java
1 package com.example.mina.client.box.lte3000; 1 package com.example.mina.client.box.lte3000;
2 2
3 import com.example.mina.client.base.AbstractClient; 3 import com.example.mina.client.base.AbstractClient;
4 -import com.example.mina.client.entity.ClientDTO;  
5 -import com.example.mina.client.entity.Command;  
6 -import com.example.mina.client.entity.Lte3000Message;  
7 -import com.example.mina.client.entity.ServerMessage;  
8 -import com.example.mina.server.entity.Entry;  
9 -import com.example.mina.server.entity.Lte3000DataBuffer;  
10 -import com.example.mina.server.util.Lte3000CommandHelper; 4 +import com.example.mina.client.base.AbstractVirtualBoxClientHandler;
  5 +import com.example.mina.client.base.BoxConnectConfig;
  6 +import org.apache.mina.filter.codec.ProtocolCodecFactory;
11 7
12 /** 8 /**
13 * @author dy 9 * @author dy
14 * @date 2021/3/10 10 * @date 2021/3/10
15 */ 11 */
16 public class Lte3000Client extends AbstractClient { 12 public class Lte3000Client extends AbstractClient {
17 -  
18 - @Override  
19 - protected void init() {  
20 - ServerMessage serverMessage = serverService.getServerService(this.getClass().getSimpleName());  
21 - hardwareDataBuffer = new Lte3000DataBuffer(32, 32, 30);  
22 - abstractClientMessage = new Lte3000Message();  
23 - abstractClientMessage.setServerMessage(serverMessage);  
24 -  
25 - for (int i = 0; i < this.hardwareDataBuffer.getMaxRow(); i++) {  
26 - abstractClientMessage.getCommands().add(new Command("", Lte3000CommandHelper.genCommandGetCross(i + 1)));  
27 - }  
28 -  
29 - // query attenuation  
30 - // the LTE attenuation is bound to column  
31 - for (int j = 0; j < this.hardwareDataBuffer.getMaxCol(); j++) {  
32 - abstractClientMessage.getCommands().add(new Command("", Lte3000CommandHelper.genCommandGetAttn(j + 1)));  
33 - }  
34 - protocolCodecFactory = new Lte3000ByteFactory();  
35 - abstractVirtualBoxClientHandler = new Lte3000ClientHandler(abstractClientMessage, hardwareDataBuffer); 13 + public Lte3000Client(BoxConnectConfig connectConfig) {
  14 + super(connectConfig);
36 } 15 }
37 16
38 -  
39 @Override 17 @Override
40 - public void setAttenuation(ClientDTO clientDTO) {  
41 - byte[] cmd;  
42 - if (clientDTO.getRow() == 0) {  
43 - cmd = Lte3000CommandHelper.genCommandSetAttn(clientDTO.getCol(), clientDTO.getMaxAttn());  
44 - } else {  
45 - cmd = Lte3000CommandHelper.genCommandSetCross(clientDTO.getRow(), clientDTO.getCol());  
46 - }  
47 - ioSession.write(cmd);  
48 - }  
49 -  
50 - public boolean isCrossPointOn(int row, int col) {  
51 - return hardwareDataBuffer.getAttenuation(row, col) >= 1; 18 + public String getDeviceType() {
  19 + return null;
52 } 20 }
53 21
54 @Override 22 @Override
55 - public int getAttenuation(int col) {  
56 - return hardwareDataBuffer.getOffset(col);  
57 - }  
58 -  
59 - public byte[] genCloseCommand(){  
60 - return Lte3000CommandHelper.genCommandGetCross(1);  
61 - }  
62 -  
63 - public Entry[][] getMatrix(){  
64 - return hardwareDataBuffer.getMatrixData();  
65 - }  
66 -  
67 - public Entry[] getOffsetData(){  
68 - return hardwareDataBuffer.getOffsetData();  
69 - }  
70 -  
71 - /*@Override  
72 - public Boolean reset() { 23 + protected AbstractVirtualBoxClientHandler getIoHandler() {
73 return null; 24 return null;
74 } 25 }
75 26
76 @Override 27 @Override
77 - public int[][] getAll() {  
78 - return new int[0][];  
79 - }*/  
80 - 28 + protected ProtocolCodecFactory getCodecFactory() {
  29 + return null;
  30 + }
81 } 31 }
src/main/java/com/example/mina/client/box/lte3000/Lte3000ClientHandler.java
No preview for this file type
src/main/java/com/example/mina/client/box/lte3000/Lte3000ReceiveMessage.java
@@ -1,17 +0,0 @@ @@ -1,17 +0,0 @@
1 -package com.example.mina.client.box.lte3000;  
2 -  
3 -import com.example.mina.client.base.BaseReceiveMessage;  
4 -import lombok.AllArgsConstructor;  
5 -import lombok.Data;  
6 -import lombok.NoArgsConstructor;  
7 -import lombok.experimental.SuperBuilder;  
8 -  
9 -/**  
10 - * @author dy  
11 - * @date 2021/3/12  
12 - */  
13 -@SuperBuilder  
14 -@Data  
15 -@AllArgsConstructor  
16 -public class Lte3000ReceiveMessage extends BaseReceiveMessage {  
17 -}  
src/main/java/com/example/mina/client/entity/AbstractClientMessage.java
@@ -1,21 +0,0 @@ @@ -1,21 +0,0 @@
1 -package com.example.mina.client.entity;  
2 -  
3 -import lombok.AllArgsConstructor;  
4 -import lombok.Builder;  
5 -import lombok.Data;  
6 -import lombok.NoArgsConstructor;  
7 -  
8 -import java.util.ArrayList;  
9 -import java.util.List;  
10 -  
11 -/**  
12 - * @author dy  
13 - * @date 2021/3/11  
14 - */  
15 -@Data  
16 -public abstract class AbstractClientMessage {  
17 -  
18 - protected ServerMessage serverMessage;  
19 -  
20 - protected List<Command> commands = new ArrayList<>();  
21 -}  
src/main/java/com/example/mina/client/entity/AeroflexMessage.java
@@ -1,15 +0,0 @@ @@ -1,15 +0,0 @@
1 -package com.example.mina.client.entity;  
2 -  
3 -import lombok.AllArgsConstructor;  
4 -import lombok.Builder;  
5 -import lombok.Data;  
6 -import lombok.NoArgsConstructor;  
7 -  
8 -import java.util.List;  
9 -  
10 -/**  
11 - * @author dy  
12 - * @date 2021/3/11  
13 - */  
14 -public class AeroflexMessage extends AbstractClientMessage{  
15 -}  
src/main/java/com/example/mina/client/entity/ClientDTO.java
@@ -1,22 +0,0 @@ @@ -1,22 +0,0 @@
1 -package com.example.mina.client.entity;  
2 -  
3 -import lombok.Builder;  
4 -import lombok.Data;  
5 -  
6 -/**  
7 - * @author dy  
8 - * @date 2021/3/12  
9 - */  
10 -@Data  
11 -@Builder  
12 -public class ClientDTO {  
13 -  
14 - private Integer row;  
15 -  
16 - private Integer col;  
17 -  
18 - private Integer maxAttn;  
19 -  
20 - private String description;  
21 -  
22 -}  
src/main/java/com/example/mina/client/entity/Lte3000Message.java
@@ -1,13 +0,0 @@ @@ -1,13 +0,0 @@
1 -package com.example.mina.client.entity;  
2 -  
3 -import lombok.AllArgsConstructor;  
4 -import lombok.Builder;  
5 -import lombok.Data;  
6 -import lombok.NoArgsConstructor;  
7 -  
8 -/**  
9 - * @author dy  
10 - * @date 2021/3/11  
11 - */  
12 -public class Lte3000Message extends AbstractClientMessage{  
13 -}  
src/main/java/com/example/mina/client/entity/ServerMessage.java
@@ -1,21 +0,0 @@ @@ -1,21 +0,0 @@
1 -package com.example.mina.client.entity;  
2 -  
3 -import lombok.AllArgsConstructor;  
4 -import lombok.Builder;  
5 -import lombok.Data;  
6 -import lombok.NoArgsConstructor;  
7 -  
8 -/**  
9 - * @author dy  
10 - * @date 2021/3/12  
11 - */  
12 -@Data  
13 -@NoArgsConstructor  
14 -@AllArgsConstructor  
15 -@Builder  
16 -public class ServerMessage {  
17 -  
18 - protected String host;  
19 -  
20 - protected int port;  
21 -}  
src/main/java/com/example/mina/client/service/ServerService.java
@@ -1,12 +0,0 @@ @@ -1,12 +0,0 @@
1 -package com.example.mina.client.service;  
2 -  
3 -import com.example.mina.client.entity.AbstractClientMessage;  
4 -import com.example.mina.client.entity.ServerMessage;  
5 -  
6 -/**  
7 - * @author dy  
8 - * @date 2021/3/12  
9 - */  
10 -public interface ServerService {  
11 - ServerMessage getServerService(String serverName);  
12 -}  
src/main/java/com/example/mina/client/service/impl/ServerServiceImpl.java
@@ -1,22 +0,0 @@ @@ -1,22 +0,0 @@
1 -package com.example.mina.client.service.impl;  
2 -  
3 -import com.example.mina.client.entity.ServerMessage;  
4 -import com.example.mina.client.service.ServerService;  
5 -  
6 -/**  
7 - * @author dy  
8 - * @date 2021/3/12  
9 - */  
10 -public class ServerServiceImpl implements ServerService {  
11 -  
12 - @Override  
13 - public ServerMessage getServerService(String serverName) {  
14 - // 根据服务器名称获取数据库ip,port  
15 - // todo  
16 - ServerMessage serverMessage = ServerMessage.builder()  
17 - .host("localhost")  
18 - .port(9102)  
19 - .build();  
20 - return serverMessage;  
21 - }  
22 -}  
src/main/java/com/example/mina/client/test/MinaClient.java
@@ -1,43 +0,0 @@ @@ -1,43 +0,0 @@
1 -package com.example.mina.client.test;  
2 -  
3 -import com.example.mina.client.box.lte3000.Lte3000Client;  
4 -import com.example.mina.client.entity.ClientDTO;  
5 -import com.example.mina.server.entity.Entry;  
6 -import org.springframework.stereotype.Controller;  
7 -import org.springframework.web.bind.annotation.RequestMapping;  
8 -import org.springframework.web.bind.annotation.ResponseBody;  
9 -  
10 -@Controller  
11 -@RequestMapping("/client")  
12 -@ResponseBody  
13 -public class MinaClient {  
14 -  
15 - @RequestMapping("/isCrossPointOn")  
16 - public void index() {  
17 - ClientDTO clientDTO = ClientDTO.builder().row(2).col(3).maxAttn(5).build();  
18 - Lte3000Client lte3000Client = new Lte3000Client();  
19 - lte3000Client.start(clientDTO);  
20 -  
21 - boolean a = lte3000Client.isCrossPointOn(clientDTO.getRow(),clientDTO.getCol());  
22 - System.out.println(a);  
23 - }  
24 -  
25 - public static void main(String[] args) {  
26 -  
27 - ClientDTO clientDTO = ClientDTO.builder().row(2).col(3).maxAttn(5).build();  
28 - Lte3000Client lte3000Client = new Lte3000Client();  
29 - lte3000Client.start(clientDTO);  
30 -  
31 - boolean a = lte3000Client.isCrossPointOn(clientDTO.getRow(),clientDTO.getCol());  
32 - int c = lte3000Client.getAttenuation(clientDTO.getCol());  
33 - byte[] bytes = lte3000Client.genCloseCommand();  
34 - Entry[][] entries =lte3000Client.getMatrix();  
35 - Entry[] entry =lte3000Client.getOffsetData();  
36 - int q = lte3000Client.getAttenuation(clientDTO.getCol());  
37 - clientDTO.setRow(0);  
38 - lte3000Client.setAttenuation(clientDTO);  
39 - int w = lte3000Client.getAttenuation(clientDTO.getCol());  
40 -  
41 -  
42 - }  
43 -}