Commit 40f3a57b17c0e62d8953c9f1080c6aedcce533fa
1 parent
fe6c067a
Exists in
develop
feat: 新增Rbm3000VirtualBox
Showing
8 changed files
with
324 additions
and
35 deletions
Show diff stats
... | ... | @@ -0,0 +1,33 @@ |
1 | +package com.example.mina.base; | |
2 | + | |
3 | +public class CommandHelper { | |
4 | + public static final byte[] BCD = new byte[]{ | |
5 | + 0x00,0x01,0x02,0x03,0x04,0x05,0x06,0x07,0x08,0x09, | |
6 | + 0x10,0x11,0x12,0x13,0x14,0x15,0x16,0x17,0x18,0x19, | |
7 | + 0x20,0x21,0x22,0x23,0x24,0x25,0x26,0x27,0x28,0x29, | |
8 | + 0x30,0x31,0x32,0x33,0x34,0x35,0x36,0x37,0x38,0x39, | |
9 | + 0x40,0x41,0x42,0x43,0x44,0x45,0x46,0x47,0x48,0x49, | |
10 | + 0x50,0x51,0x52,0x53,0x54,0x55,0x56,0x57,0x58,0x59, | |
11 | + 0x60,0x61,0x62,0x63,0x64,0x65,0x66,0x67,0x68,0x69, | |
12 | + 0x70,0x71,0x72,0x73,0x74,0x75,0x76,0x77,0x78,0x79, | |
13 | + (byte)0x80,(byte)0x81,(byte)0x82,(byte)0x83,(byte)0x84,(byte)0x85,(byte)0x86,(byte)0x87,(byte)0x88,(byte)0x89, | |
14 | + (byte)0x90,(byte)0x91,(byte)0x92,(byte)0x93,(byte)0x94,(byte)0x95,(byte)0x96,(byte)0x97,(byte)0x98,(byte)0x99 | |
15 | + }; | |
16 | + | |
17 | + public static final int[] BCD_REV = new int[]{ | |
18 | + 0,1,2,3,4,5,6,7,8,9,-1,-1,-1,-1,-1,-1, | |
19 | + 10,11,12,13,14,15,16,17,18,19,-1,-1,-1,-1,-1,-1, | |
20 | + 20,21,22,23,24,25,26,27,28,29,-1,-1,-1,-1,-1,-1, | |
21 | + 30,31,32,33,34,35,36,37,38,39,-1,-1,-1,-1,-1,-1, | |
22 | + 40,41,42,43,44,45,46,47,48,49,-1,-1,-1,-1,-1,-1, | |
23 | + 50,51,52,53,54,55,56,57,58,59,-1,-1,-1,-1,-1,-1, | |
24 | + 60,61,62,63,64,65,66,67,68,69,-1,-1,-1,-1,-1,-1, | |
25 | + 70,71,72,73,74,75,76,77,78,79,-1,-1,-1,-1,-1,-1, | |
26 | + 80,81,82,83,84,85,86,87,88,89,-1,-1,-1,-1,-1,-1, | |
27 | + 90,91,92,93,94,95,96,97,98,99,-1,-1,-1,-1,-1,-1, | |
28 | + }; | |
29 | + | |
30 | + | |
31 | + | |
32 | + | |
33 | +} | ... | ... |
src/main/java/com/example/mina/box1/Rbm3000VirtualBoxHander.java
0 → 100644
... | ... | @@ -0,0 +1,176 @@ |
1 | +package com.example.mina.box1; | |
2 | + | |
3 | +import com.example.mina.base.AbstractVirtualBoxHandler; | |
4 | +import com.example.mina.base.CommandHelper; | |
5 | +import com.example.mina.entity.AeroflexDataBuffer; | |
6 | +import com.example.mina.entity.Entry; | |
7 | +import lombok.extern.slf4j.Slf4j; | |
8 | +import org.apache.mina.core.buffer.IoBuffer; | |
9 | +import org.apache.mina.core.session.IoSession; | |
10 | + | |
11 | +/** | |
12 | + * @author dy | |
13 | + * @date 2021/3/5 | |
14 | + */ | |
15 | +@Slf4j | |
16 | +public class Rbm3000VirtualBoxHander extends AbstractVirtualBoxHandler { | |
17 | + | |
18 | + private AeroflexDataBuffer dataBuffer; | |
19 | + | |
20 | + public Rbm3000VirtualBoxHander() { | |
21 | + this.initMatrix(); | |
22 | + } | |
23 | + | |
24 | + @Override | |
25 | + protected void initMatrix() { | |
26 | + | |
27 | + int row = 6; | |
28 | + int col = 8; | |
29 | + int maxAtten = 222; | |
30 | + | |
31 | + dataBuffer = new AeroflexDataBuffer(row, maxAtten); | |
32 | + } | |
33 | + | |
34 | + @Override | |
35 | + protected byte[] handleMessage(byte[] cmd, int len) { | |
36 | + return new byte[0]; | |
37 | + } | |
38 | + | |
39 | + @Override | |
40 | + public void messageReceived(IoSession session, Object message) { | |
41 | + | |
42 | + IoBuffer ioBuffer = (IoBuffer) message; | |
43 | + byte[] bytes = new byte[ioBuffer.limit()]; | |
44 | + ioBuffer.get(bytes, ioBuffer.position(), ioBuffer.limit()); | |
45 | + | |
46 | + byte[] result = handleCommand(bytes, bytes.length); | |
47 | + | |
48 | + session.write(IoBuffer.wrap(result)); | |
49 | + } | |
50 | + | |
51 | + @Override | |
52 | + public void sessionCreated(IoSession session) { | |
53 | + | |
54 | + log.info("---server session created"); | |
55 | + } | |
56 | + | |
57 | + @Override | |
58 | + public void sessionOpened(IoSession session) { | |
59 | + | |
60 | + log.info("---server session Opened"); | |
61 | + } | |
62 | + | |
63 | + @Override | |
64 | + public void sessionClosed(IoSession session) { | |
65 | + | |
66 | + log.info("---server session Closed"); | |
67 | + } | |
68 | + | |
69 | + @Override | |
70 | + public void messageSent(IoSession session, Object message) { | |
71 | + | |
72 | + log.info("---发送数据成功了。。。{}", message); | |
73 | + } | |
74 | + | |
75 | + protected byte[] handleCommand(byte[] cmd, int len) { | |
76 | + | |
77 | + byte[] buffer; | |
78 | + Entry[][] entries = dataBuffer.getMatrixData(); | |
79 | + | |
80 | + if (len == 8) { | |
81 | + switch (cmd[0]) { | |
82 | + case 0x30: | |
83 | + int row = CommandHelper.BCD_REV[cmd[3]]; | |
84 | + int col = CommandHelper.BCD_REV[cmd[4]]; | |
85 | + | |
86 | + int rowCol = 0; | |
87 | + int colRow = 0; | |
88 | + | |
89 | + for (int i = 0; i < dataBuffer.getMaxCol(); i++) { | |
90 | + if (entries[row - 1][i].getValue() == 1) { | |
91 | + rowCol = i + 1; | |
92 | + break; | |
93 | + } | |
94 | + } | |
95 | + for (int i = 0; i < dataBuffer.getMaxRow(); i++) { | |
96 | + if (entries[i][col - 1].getValue() == 1) { | |
97 | + colRow = i + 1; | |
98 | + } | |
99 | + } | |
100 | + | |
101 | + dataBuffer.setAttenuation(row, rowCol, 0); | |
102 | + dataBuffer.setAttenuation(row, col, 1); | |
103 | + dataBuffer.setAttenuation(colRow, col, 0); | |
104 | + dataBuffer.setAttenuation(colRow, rowCol, 1); | |
105 | + | |
106 | + buffer = new byte[8]; | |
107 | + buffer[0] = cmd[0]; | |
108 | + buffer[1] = cmd[1]; | |
109 | + buffer[2] = cmd[2]; | |
110 | + buffer[3] = cmd[3]; | |
111 | + buffer[4] = cmd[4]; | |
112 | + buffer[5] = CommandHelper.BCD[colRow]; | |
113 | + buffer[6] = CommandHelper.BCD[rowCol]; | |
114 | + buffer[7] = (byte) 0x03; | |
115 | + | |
116 | + return buffer; | |
117 | + case 0x68: | |
118 | + boolean isA = (cmd[3] == (byte) 0x0A); | |
119 | + int callPort = CommandHelper.BCD_REV[cmd[4]]; | |
120 | + int returnPort = 0; | |
121 | + | |
122 | + if (isA) { | |
123 | + for (int i = 0; i < dataBuffer.getMaxCol(); i++) { | |
124 | + if (entries[callPort - 1][i].getValue() == 1) { | |
125 | + returnPort = i + 1; | |
126 | + break; | |
127 | + } | |
128 | + } | |
129 | + } else { | |
130 | + for (int i = 0; i < dataBuffer.getMaxRow(); i++) { | |
131 | + if (entries[i][callPort - 1].getValue() == 1) { | |
132 | + returnPort = i + 1; | |
133 | + } | |
134 | + } | |
135 | + } | |
136 | + | |
137 | + buffer = new byte[8]; | |
138 | + buffer[0] = cmd[0]; | |
139 | + buffer[1] = cmd[1]; | |
140 | + buffer[2] = cmd[2]; | |
141 | + if (isA) { | |
142 | + buffer[3] = 0x0B; | |
143 | + } else { | |
144 | + buffer[3] = 0x0A; | |
145 | + } | |
146 | + buffer[4] = CommandHelper.BCD[returnPort]; | |
147 | + buffer[5] = 0x00; | |
148 | + buffer[6] = 0x06; | |
149 | + buffer[7] = (byte) 0x03; | |
150 | + | |
151 | + return buffer; | |
152 | + case 0x62: | |
153 | + buffer = new byte[8]; | |
154 | + buffer[0] = cmd[0]; | |
155 | + buffer[1] = cmd[1]; | |
156 | + buffer[2] = cmd[2]; | |
157 | + buffer[3] = cmd[3]; | |
158 | + buffer[4] = cmd[4]; | |
159 | + buffer[5] = cmd[5]; | |
160 | + buffer[6] = cmd[6]; | |
161 | + buffer[7] = (byte) 0x03; | |
162 | + | |
163 | + return buffer; | |
164 | + default: | |
165 | + break; | |
166 | + } | |
167 | + } | |
168 | + | |
169 | + buffer = new byte[len + 2]; | |
170 | + buffer[0] = (byte) 0xFE; | |
171 | + buffer[1] = (byte) 0xFE; | |
172 | + System.arraycopy(cmd, 0, buffer, 2, len); | |
173 | + | |
174 | + return buffer; | |
175 | + } | |
176 | +} | ... | ... |
src/main/java/com/example/mina/config/AeroflexVirtualBoxConfiguration.java
1 | 1 | package com.example.mina.config; |
2 | 2 | |
3 | 3 | import com.example.mina.box1.AeroflexVirtualBoxHandler; |
4 | -import com.example.mina.property.AeroflexVirtualProperties; | |
4 | +import com.example.mina.property.AeroflexVirtualBoxProperties; | |
5 | 5 | import lombok.extern.slf4j.Slf4j; |
6 | 6 | import org.apache.mina.transport.socket.nio.NioSocketAcceptor; |
7 | 7 | import org.springframework.context.annotation.Configuration; |
... | ... | @@ -17,21 +17,21 @@ import java.net.InetSocketAddress; |
17 | 17 | @Configuration(proxyBeanMethods = false) |
18 | 18 | public class AeroflexVirtualBoxConfiguration { |
19 | 19 | |
20 | - private final AeroflexVirtualProperties aeroflexVirtualProperties; | |
20 | + private final AeroflexVirtualBoxProperties aeroflexVirtualBoxProperties; | |
21 | 21 | |
22 | - public AeroflexVirtualBoxConfiguration(AeroflexVirtualProperties aeroflexVirtualProperties) { | |
23 | - this.aeroflexVirtualProperties = aeroflexVirtualProperties; | |
22 | + public AeroflexVirtualBoxConfiguration(AeroflexVirtualBoxProperties aeroflexVirtualBoxProperties) { | |
23 | + this.aeroflexVirtualBoxProperties = aeroflexVirtualBoxProperties; | |
24 | 24 | } |
25 | 25 | |
26 | 26 | @PostConstruct |
27 | 27 | public void init() { |
28 | 28 | |
29 | - if (!aeroflexVirtualProperties.getEnable()) { | |
29 | + if (!aeroflexVirtualBoxProperties.getEnable()) { | |
30 | 30 | log.info("AeroflexVirtual服务端 配置未开启"); |
31 | 31 | return; |
32 | 32 | } |
33 | 33 | |
34 | - if (aeroflexVirtualProperties.getPort() == null) { | |
34 | + if (aeroflexVirtualBoxProperties.getPort() == null) { | |
35 | 35 | log.info("AeroflexVirtual服务端 端口未配置"); |
36 | 36 | return; |
37 | 37 | } |
... | ... | @@ -40,8 +40,8 @@ public class AeroflexVirtualBoxConfiguration { |
40 | 40 | NioSocketAcceptor acceptor = new NioSocketAcceptor(); |
41 | 41 | acceptor.setHandler(new AeroflexVirtualBoxHandler()); |
42 | 42 | acceptor.setReuseAddress(true); |
43 | - acceptor.bind(new InetSocketAddress(aeroflexVirtualProperties.getPort())); | |
44 | - log.info("AeroflexVirtual服务端已经启动,监听端口: {}", aeroflexVirtualProperties.getPort()); | |
43 | + acceptor.bind(new InetSocketAddress(aeroflexVirtualBoxProperties.getPort())); | |
44 | + log.info("AeroflexVirtual服务端已经启动,监听端口: {}", aeroflexVirtualBoxProperties.getPort()); | |
45 | 45 | } catch (Exception e) { |
46 | 46 | log.error("无法启动AeroflexVirtual服务端, {}", e.getMessage(), e); |
47 | 47 | } | ... | ... |
src/main/java/com/example/mina/config/Rbm3000VirtualBoxConfiguration.java
0 → 100644
... | ... | @@ -0,0 +1,51 @@ |
1 | +package com.example.mina.config; | |
2 | + | |
3 | +import com.example.mina.box1.Rbm3000VirtualBoxHander; | |
4 | +import com.example.mina.property.Rbm3000VitualBoxProperties; | |
5 | +import lombok.extern.slf4j.Slf4j; | |
6 | +import org.apache.mina.transport.socket.nio.NioSocketAcceptor; | |
7 | +import org.springframework.context.annotation.Configuration; | |
8 | + | |
9 | +import javax.annotation.PostConstruct; | |
10 | +import java.net.InetSocketAddress; | |
11 | + | |
12 | +/** | |
13 | + * @author 杜云山 | |
14 | + * @date 21/03/05 | |
15 | + */ | |
16 | +@Slf4j | |
17 | +@Configuration(proxyBeanMethods = false) | |
18 | +public class Rbm3000VirtualBoxConfiguration { | |
19 | + | |
20 | + private final Rbm3000VitualBoxProperties rbm3000VitualBoxProperties; | |
21 | + | |
22 | + public Rbm3000VirtualBoxConfiguration(Rbm3000VitualBoxProperties rbm3000VitualBoxProperties) { | |
23 | + this.rbm3000VitualBoxProperties = rbm3000VitualBoxProperties; | |
24 | + } | |
25 | + | |
26 | + | |
27 | + @PostConstruct | |
28 | + public void init() { | |
29 | + | |
30 | + if (!rbm3000VitualBoxProperties.getEnable()) { | |
31 | + log.info("Rbm3000Virtual服务端 配置未开启"); | |
32 | + return; | |
33 | + } | |
34 | + | |
35 | + if (rbm3000VitualBoxProperties.getPort() == null) { | |
36 | + log.info("Rbm3000Virtual服务端 端口未配置"); | |
37 | + return; | |
38 | + } | |
39 | + | |
40 | + try { | |
41 | + NioSocketAcceptor acceptor = new NioSocketAcceptor(); | |
42 | + acceptor.setHandler(new Rbm3000VirtualBoxHander()); | |
43 | + acceptor.setReuseAddress(true); | |
44 | + acceptor.bind(new InetSocketAddress(rbm3000VitualBoxProperties.getPort())); | |
45 | + log.info("Rbm3000Virtual服务端已经启动,监听端口: {}", rbm3000VitualBoxProperties.getPort()); | |
46 | + } catch (Exception e) { | |
47 | + log.error("无法启动Rbm3000Virtual服务端, {}", e.getMessage(), e); | |
48 | + } | |
49 | + } | |
50 | + | |
51 | +} | ... | ... |
src/main/java/com/example/mina/property/AeroflexVirtualBoxProperties.java
0 → 100644
... | ... | @@ -0,0 +1,26 @@ |
1 | +package com.example.mina.property; | |
2 | + | |
3 | +import lombok.Getter; | |
4 | +import lombok.Setter; | |
5 | +import lombok.ToString; | |
6 | +import org.springframework.boot.context.properties.ConfigurationProperties; | |
7 | +import org.springframework.boot.context.properties.EnableConfigurationProperties; | |
8 | +import org.springframework.context.annotation.Configuration; | |
9 | + | |
10 | +/** | |
11 | + * @author 杜云山 | |
12 | + * @date 2021/03/05 | |
13 | + */ | |
14 | +@Getter | |
15 | +@Setter | |
16 | +@ToString | |
17 | +@ConfigurationProperties(prefix = "aeroflex-virtual") | |
18 | +@Configuration | |
19 | +@EnableConfigurationProperties(AeroflexVirtualBoxProperties.class) | |
20 | +public class AeroflexVirtualBoxProperties { | |
21 | + | |
22 | + private Boolean enable = false; | |
23 | + | |
24 | + private Integer port = null; | |
25 | + | |
26 | +} | |
0 | 27 | \ No newline at end of file | ... | ... |
src/main/java/com/example/mina/property/AeroflexVirtualProperties.java
... | ... | @@ -1,26 +0,0 @@ |
1 | -package com.example.mina.property; | |
2 | - | |
3 | -import lombok.Getter; | |
4 | -import lombok.Setter; | |
5 | -import lombok.ToString; | |
6 | -import org.springframework.boot.context.properties.ConfigurationProperties; | |
7 | -import org.springframework.boot.context.properties.EnableConfigurationProperties; | |
8 | -import org.springframework.context.annotation.Configuration; | |
9 | - | |
10 | -/** | |
11 | - * @author 杜云山 | |
12 | - * @date 2021/03/05 | |
13 | - */ | |
14 | -@Getter | |
15 | -@Setter | |
16 | -@ToString | |
17 | -@ConfigurationProperties(prefix = "aeroflex-virtual") | |
18 | -@Configuration | |
19 | -@EnableConfigurationProperties(AeroflexVirtualProperties.class) | |
20 | -public class AeroflexVirtualProperties { | |
21 | - | |
22 | - private Boolean enable = false; | |
23 | - | |
24 | - private Integer port = null; | |
25 | - | |
26 | -} | |
27 | 0 | \ No newline at end of file |
src/main/java/com/example/mina/property/Rbm3000VitualBoxProperties.java
0 → 100644
... | ... | @@ -0,0 +1,26 @@ |
1 | +package com.example.mina.property; | |
2 | + | |
3 | +import lombok.Getter; | |
4 | +import lombok.Setter; | |
5 | +import lombok.ToString; | |
6 | +import org.springframework.boot.context.properties.ConfigurationProperties; | |
7 | +import org.springframework.boot.context.properties.EnableConfigurationProperties; | |
8 | +import org.springframework.context.annotation.Configuration; | |
9 | + | |
10 | +/** | |
11 | + * @author 杜云山 | |
12 | + * @date 2021/03/05 | |
13 | + */ | |
14 | +@Getter | |
15 | +@Setter | |
16 | +@ToString | |
17 | +@ConfigurationProperties(prefix = "rbm3000-vitualbox-virtual") | |
18 | +@Configuration | |
19 | +@EnableConfigurationProperties(Rbm3000VitualBoxProperties.class) | |
20 | +public class Rbm3000VitualBoxProperties { | |
21 | + | |
22 | + private Boolean enable = false; | |
23 | + | |
24 | + private Integer port = null; | |
25 | + | |
26 | +} | |
0 | 27 | \ No newline at end of file | ... | ... |