Commit 69bfaf7fde391a8b793a0c2f065328e5b5f7f473
1 parent
90e60467
Exists in
develop
feat: 重构客户端
1,改为命令模式; 2,抽象client;
Showing
30 changed files
with
294 additions
and
628 deletions
Show diff stats
pom.xml
... | ... | @@ -40,6 +40,11 @@ |
40 | 40 | <artifactId>mina-core</artifactId> |
41 | 41 | <version>2.1.4</version> |
42 | 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 | 49 | <dependency> |
45 | 50 | <groupId>org.springframework.boot</groupId> | ... | ... |
src/main/java/com/example/mina/client/base/AbstractClient.java
1 | 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 | 3 | import com.example.mina.server.base.AbstractHardwareDataBuffer; |
8 | 4 | import org.apache.mina.core.future.ConnectFuture; |
9 | 5 | import org.apache.mina.core.service.IoConnector; |
... | ... | @@ -13,6 +9,7 @@ import org.apache.mina.filter.codec.ProtocolCodecFilter; |
13 | 9 | import org.apache.mina.transport.socket.nio.NioSocketConnector; |
14 | 10 | |
15 | 11 | import java.net.InetSocketAddress; |
12 | +import java.util.concurrent.ArrayBlockingQueue; | |
16 | 13 | |
17 | 14 | /** |
18 | 15 | * @author dy |
... | ... | @@ -20,59 +17,87 @@ import java.net.InetSocketAddress; |
20 | 17 | */ |
21 | 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 | 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 | 72 | //1、创建客户端IoService |
43 | 73 | IoConnector connector = new NioSocketConnector(); |
44 | 74 | //客户端链接超时时间 |
45 | 75 | connector.setConnectTimeoutMillis(30000); |
46 | 76 | //2、客户端过滤器 |
47 | - connector.getFilterChain().addLast("codec", new ProtocolCodecFilter(protocolCodecFactory)); | |
77 | + connector.getFilterChain().addLast("codec", new ProtocolCodecFilter(getCodecFactory())); | |
48 | 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 | 85 | connectFuture.awaitUninterruptibly(); |
56 | 86 | // 获取连接会话 |
57 | 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 | 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 | 4 | import com.example.mina.server.base.AbstractHardwareDataBuffer; |
7 | -import com.example.mina.server.util.LogUtils; | |
8 | 5 | import lombok.Data; |
6 | +import lombok.extern.slf4j.Slf4j; | |
7 | +import org.apache.mina.core.buffer.IoBuffer; | |
9 | 8 | import org.apache.mina.core.service.IoHandlerAdapter; |
10 | 9 | import org.apache.mina.core.session.IdleStatus; |
11 | 10 | import org.apache.mina.core.session.IoSession; |
12 | 11 | |
13 | -import java.nio.charset.StandardCharsets; | |
14 | - | |
15 | 12 | /** |
16 | 13 | * @author dy |
17 | 14 | */ |
18 | 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 | 38 | @Override |
37 | 39 | public void exceptionCaught(IoSession session, Throwable throwable) { |
38 | - System.out.println("客户端exceptionCaught被调用!"); | |
39 | - throwable.printStackTrace(); | |
40 | 40 | } |
41 | 41 | |
42 | 42 | @Override |
43 | 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 | 56 | @Override |
55 | 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 | 60 | @Override |
63 | 61 | public void inputClosed(IoSession session) { |
64 | - System.out.println("客户端inputClosed被调用!"); | |
65 | - System.out.println("client端:" + session.getId() + " 关闭输入"); | |
66 | 62 | } |
67 | 63 | |
68 | 64 | @Override |
69 | 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 | 68 | @Override |
76 | 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 | 73 | @Override |
82 | 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 | 78 | @Override |
88 | 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 | -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 @@ |
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
src/main/java/com/example/mina/client/base/BoxConnectConfig.java
0 → 100644
... | ... | @@ -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 @@ |
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 @@ |
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 @@ |
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
src/main/java/com/example/mina/client/box/aeroflex/AeroflexByteDecoder.java
... | ... | @@ -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 | -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 | -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 | 1 | package com.example.mina.client.box.aeroflex; |
2 | 2 | |
3 | 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 | 10 | * @author dy |
... | ... | @@ -12,44 +12,24 @@ import com.example.mina.server.entity.AeroflexDataBuffer; |
12 | 12 | */ |
13 | 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 | 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 | 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 | 29 | @Override |
42 | - public Boolean reset() { | |
30 | + protected AbstractVirtualBoxClientHandler getIoHandler() { | |
43 | 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 | 1 | package com.example.mina.client.box.aeroflex; |
2 | 2 | |
3 | 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 | 7 | * @author dy |
... | ... | @@ -12,13 +9,10 @@ import com.example.mina.server.base.AbstractHardwareDataBuffer; |
12 | 9 | */ |
13 | 10 | public class AeroflexClientHandler extends AbstractVirtualBoxClientHandler { |
14 | 11 | |
15 | - public AeroflexClientHandler(AbstractClientMessage clientMessage, | |
16 | - AbstractHardwareDataBuffer abstractHardwareDataBuffer) { | |
17 | - super(clientMessage, abstractHardwareDataBuffer); | |
18 | - } | |
19 | - | |
20 | 12 | @Override |
21 | - protected boolean handleCommandResponse(SendMessage sendMessage, BaseReceiveMessage receiveMessage) { | |
13 | + public boolean handleCommandResponse(byte[] response) { | |
14 | + | |
22 | 15 | return false; |
23 | 16 | } |
17 | + | |
24 | 18 | } | ... | ... |
src/main/java/com/example/mina/client/box/lte3000/Lte3000ByteDecoder.java
... | ... | @@ -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 | -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 | -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 | 1 | package com.example.mina.client.box.lte3000; |
2 | 2 | |
3 | 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 | 9 | * @author dy |
14 | 10 | * @date 2021/3/10 |
15 | 11 | */ |
16 | 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 | 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 | 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 | 24 | return null; |
74 | 25 | } |
75 | 26 | |
76 | 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 | -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 | -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 | -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 | -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 | -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 | -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 | -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 | -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 | -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 | -} |