Commit 8cb7be3cb3ec639d88a869404db2bb2c17deb030
1 parent
39eb8a55
Exists in
develop
1、按照原有的hardware代码,修改RBM、LTE、QRB类型设备client端指令发送编码
Showing
9 changed files
with
688 additions
and
120 deletions
Show diff stats
src/main/java/com/example/mina/client/box/lte3000/Lte3000ClientFactory.java
@@ -3,6 +3,10 @@ package com.example.mina.client.box.lte3000; | @@ -3,6 +3,10 @@ package com.example.mina.client.box.lte3000; | ||
3 | import com.example.mina.client.base.AbstractClientFactory; | 3 | import com.example.mina.client.base.AbstractClientFactory; |
4 | import com.example.mina.client.base.AbstractMatrixIoHandler; | 4 | import com.example.mina.client.base.AbstractMatrixIoHandler; |
5 | import com.example.mina.client.base.MatrixConstants; | 5 | import com.example.mina.client.base.MatrixConstants; |
6 | +import com.example.mina.client.box.aeroflex.AeroFlexProtocolFactory; | ||
7 | +import com.example.mina.client.box.aeroflex.AeroflexClientIoHandler; | ||
8 | +import org.apache.mina.core.filterchain.IoFilterChain; | ||
9 | +import org.apache.mina.filter.codec.ProtocolCodecFilter; | ||
6 | import org.springframework.stereotype.Component; | 10 | import org.springframework.stereotype.Component; |
7 | 11 | ||
8 | @Component(MatrixConstants.MATRIX_TYPE_LTE3000) | 12 | @Component(MatrixConstants.MATRIX_TYPE_LTE3000) |
@@ -10,6 +14,12 @@ public class Lte3000ClientFactory extends AbstractClientFactory { | @@ -10,6 +14,12 @@ public class Lte3000ClientFactory extends AbstractClientFactory { | ||
10 | 14 | ||
11 | @Override | 15 | @Override |
12 | public AbstractMatrixIoHandler getClientHandler() { | 16 | public AbstractMatrixIoHandler getClientHandler() { |
13 | - return null; | 17 | + System.out.println("=============getClientHandler=================="); |
18 | + return new Lte3000ClientIoHandler(); | ||
19 | + } | ||
20 | + | ||
21 | + @Override | ||
22 | + public void buildFilterChain(IoFilterChain ioFilterChain) { | ||
23 | + ioFilterChain.addLast("codec", new ProtocolCodecFilter(new Lte3000ProtocolFactory())); | ||
14 | } | 24 | } |
15 | } | 25 | } |
src/main/java/com/example/mina/client/box/lte3000/Lte3000ClientIoHandler.java
@@ -5,6 +5,7 @@ import com.example.mina.client.base.MatrixDataProxy; | @@ -5,6 +5,7 @@ import com.example.mina.client.base.MatrixDataProxy; | ||
5 | import com.example.mina.client.base.MatrixResponse; | 5 | import com.example.mina.client.base.MatrixResponse; |
6 | import com.example.mina.server.util.Lte3000CommandHelper; | 6 | import com.example.mina.server.util.Lte3000CommandHelper; |
7 | import lombok.extern.slf4j.Slf4j; | 7 | import lombok.extern.slf4j.Slf4j; |
8 | +import org.apache.mina.core.session.IoSession; | ||
8 | 9 | ||
9 | /** | 10 | /** |
10 | * @author dy | 11 | * @author dy |
@@ -13,8 +14,8 @@ import lombok.extern.slf4j.Slf4j; | @@ -13,8 +14,8 @@ import lombok.extern.slf4j.Slf4j; | ||
13 | @Slf4j | 14 | @Slf4j |
14 | public class Lte3000ClientIoHandler extends AbstractMatrixIoHandler { | 15 | public class Lte3000ClientIoHandler extends AbstractMatrixIoHandler { |
15 | 16 | ||
16 | - public Lte3000ClientIoHandler(MatrixDataProxy matrixDataProxy) { | ||
17 | - super(matrixDataProxy); | 17 | + public Lte3000ClientIoHandler() { |
18 | + super(new MatrixDataProxy()); | ||
18 | } | 19 | } |
19 | 20 | ||
20 | protected boolean isSameValue(byte value, int expect) { | 21 | protected boolean isSameValue(byte value, int expect) { |
@@ -23,84 +24,11 @@ public class Lte3000ClientIoHandler extends AbstractMatrixIoHandler { | @@ -23,84 +24,11 @@ public class Lte3000ClientIoHandler extends AbstractMatrixIoHandler { | ||
23 | 24 | ||
24 | @Override | 25 | @Override |
25 | public boolean handleCommandResponse(MatrixResponse matrixResponse) { | 26 | public boolean handleCommandResponse(MatrixResponse matrixResponse) { |
26 | -// int responseLen = response.length; | ||
27 | -// if (response[0] != Lte3000CommandHelper.ACK || responseLen < 6) { | ||
28 | -// return false; | ||
29 | -// } | ||
30 | -// //api document: "SRM - MRF - MRM - XRM - QRM - LTE Protocol v2.15 Rev FR.pdf" | ||
31 | -// | ||
32 | -// //O:Query Output Channel P.106 | ||
33 | -// //0x4F | ||
34 | -// if (responseLen == 9 && isSameValue(response[3], 0x4F)) { // 'O' | ||
35 | -//// 0x6 0x46 0x46 0x4F 0x30 0x32 0x38 0x3 0x70 | ||
36 | -// int col = Lte3000CommandHelper.getBcdPort(response[4], response[5], response[6]); | ||
37 | -// int row = Lte3000CommandHelper.getBcdPort(response[4], response[5], response[6]); | ||
38 | -// // limits only one set "ON" in a column, others should be OFF | ||
39 | -//// for (int i = 1; i <= responsePool.getMaxRow(); i++) { | ||
40 | -//// if (i == row) { | ||
41 | -//// responsePool.setAttenuation(i, col, 1); | ||
42 | -//// } else { | ||
43 | -//// responsePool.setAttenuation(i, col, 0); | ||
44 | -//// } | ||
45 | -//// } TODO 再次调用MatrixDataProxy的方法来设置衰减值 | ||
46 | -// log.info("RESPONSE Ox4F. ROW = {}, COL = {}", row, col); | ||
47 | -// return true; | ||
48 | -// } | ||
49 | -// | ||
50 | -// //S: Set CrossPoint P.115 | ||
51 | -// //0x53 | ||
52 | -// if (responseLen == 6 && isSameValue(response[3], 0x53)) { | ||
53 | -// int col = Lte3000CommandHelper.getBcdPort(response[4], response[5], response[6]); | ||
54 | -// int row = Lte3000CommandHelper.getBcdPort(response[7], response[8], response[9]); | ||
55 | -// // limits only one set "ON" in a column, others should be OFF | ||
56 | -//// for (int i = 1; i <= responsePool.getMaxRow(); i++) { | ||
57 | -//// if (i == row) { | ||
58 | -//// responsePool.setAttenuation(i, col, 1); | ||
59 | -//// } else { | ||
60 | -//// responsePool.setAttenuation(i, col, 0); | ||
61 | -//// } | ||
62 | -//// } TODO 再次调用MatrixDataProxy的方法来设置衰减值 | ||
63 | -// log.info("RESPONSE Ox53. ROW = {}, COL = {}", row, col); | ||
64 | -// return true; | ||
65 | -// } | ||
66 | -// | ||
67 | -// //XGMO: Set Gain Control to Manual Mode - Output p.137 | ||
68 | -// //0x58 0x47 0x4D 0x4F | ||
69 | -// if (responseLen == 9 && response[3] == 'X' && response[4] == 'G' && response[5] == 'M' && response[6] == 'O') { | ||
70 | -//// receive - 0x2 0x30 0x30 0x58 0x47 0x4D 0x4F 0x30 0x30 0x31 0x40 0x2D 0x36 0x33 0x2E 0x30 0x3 0x5B | ||
71 | -//// 00XGMO001@-63.0[ | ||
72 | -//// set col/attn 1/63 | ||
73 | -// | ||
74 | -// int col = Lte3000CommandHelper.getBcdPort(response[7], response[8], response[9]); | ||
75 | -// int attn = Lte3000CommandHelper.getBcdAttn(response[11], response[12], response[13], response[14], response[15]); | ||
76 | -// //responsePool.setOffset(col, attn); TODO 再次调用MatrixDataProxy的方法来设置衰减值 | ||
77 | -// log.info("RESPONSE XGMO. ATTN = {}, COL = {}", attn, col); | ||
78 | -// return true; | ||
79 | -// } | ||
80 | -// | ||
81 | -// | ||
82 | -// //XGRO: Gain Control Read Status - Output P.139 | ||
83 | -// if (responseLen == 16 && response[3] == 'X' && response[4] == 'G' && response[5] == 'R' && response[6] == 'O') { | ||
84 | -// /* | ||
85 | -// Example Command: | ||
86 | -// 02 XX XX 58 46 52 4F 30 31 36 03 XX | ||
87 | -// STX ADR ADR X G R O O 1 6 ETX CHK | ||
88 | -// (Read attenuation control status of system output 16) | ||
89 | -// */ | ||
90 | -// /* | ||
91 | -// Example Response: | ||
92 | -// 06 XX XX 58 46 52 4F 4D 40 2D 31 33 2E 35 03 XX | ||
93 | -// ACK ADR ADR X G R O M @ - 1 3 . 5 ETX CHX | ||
94 | -// (Output set at -13.5 dB of attenuation in manual mode. ) | ||
95 | -// */ | ||
96 | -// int col = Lte3000CommandHelper.getBcdPort(response[7], response[8], response[9]); | ||
97 | -// int attn = Lte3000CommandHelper.getBcdAttn(response[9], response[10], response[11], response[12], response[13]); | ||
98 | -// //responsePool.setOffset(col, attn); TODO 再次调用MatrixDataProxy的方法来设置衰减值 | ||
99 | -// log.info("RESPONSE XGRO. ATTN = {}, COL = {}", attn, col); | ||
100 | -// return true; | ||
101 | -// } | ||
102 | -// | ||
103 | -// log.info("收到服务器回传的消息了"); | 27 | + log.info("------Qrb3000ClientIoHandler-----{}",matrixResponse); |
104 | return false; | 28 | return false; |
105 | } | 29 | } |
30 | + | ||
31 | + @Override | ||
32 | + public void sessionCreated(IoSession session) {} | ||
33 | + | ||
106 | } | 34 | } |
src/main/java/com/example/mina/client/box/lte3000/Lte3000CommandHelper.java
0 → 100644
@@ -0,0 +1,157 @@ | @@ -0,0 +1,157 @@ | ||
1 | +package com.example.mina.client.box.lte3000; | ||
2 | + | ||
3 | +import org.apache.commons.lang3.ArrayUtils; | ||
4 | + | ||
5 | +import java.nio.charset.StandardCharsets; | ||
6 | + | ||
7 | +/** | ||
8 | + * @ProjectName: demo | ||
9 | + * @Package: com.example.mina.client.box.lte3000 | ||
10 | + * @ClassName: Lte3000CommandHelper | ||
11 | + * @Author: HuangLang | ||
12 | + * @Description: Lte command helper | ||
13 | + * @Date: 2021-04-02 下午 5:12 | ||
14 | + */ | ||
15 | +public class Lte3000CommandHelper { | ||
16 | + public static final byte STX = 0X02; | ||
17 | + public static final byte ETX = 0X03; | ||
18 | + public static final byte ACK = 0X06; | ||
19 | + public static final byte NAK = 0X15; | ||
20 | + | ||
21 | + public static void setCHK(byte[] bs) { | ||
22 | + bs[bs.length - 1] = 0; | ||
23 | + | ||
24 | + for (int i = 0; i < bs.length - 1; i++) { | ||
25 | + bs[bs.length - 1] ^= bs[i]; | ||
26 | + } | ||
27 | + } | ||
28 | + | ||
29 | + public static int getBcdPort(byte a, byte b, byte c) { | ||
30 | + String port = new StringBuilder().append(a - 0x30).append(b - 0x30).append(c - 0x30).toString(); | ||
31 | + return Integer.parseInt(port); | ||
32 | + } | ||
33 | + | ||
34 | + /** | ||
35 | + * input: "-12.2" | ||
36 | + * @param a sign | ||
37 | + * @param b tenth | ||
38 | + * @param c single | ||
39 | + * @param d dot | ||
40 | + * @param e tenths | ||
41 | + * @return int -12 if -12.2 | ||
42 | + */ | ||
43 | + public static int getBcdAttn(byte a, byte b, byte c, byte d, byte e) { | ||
44 | + String port = new StringBuilder() | ||
45 | + //.append((char)a) // sign -/+ | ||
46 | + .append(b - 0x30).append(c - 0x30) // integer | ||
47 | + //.append((char)d) // . | ||
48 | + //.append(e - 0x30) | ||
49 | + .toString(); // tenths. | ||
50 | + return Integer.parseInt(port); | ||
51 | + } | ||
52 | + | ||
53 | + public static byte[] genCommandSetAttn(int col, int val){ | ||
54 | + byte[] command = new byte[18]; | ||
55 | + byte[] vCol = intToReversedBytes(col); | ||
56 | + byte[] vVal = intToReversedBytes(val); | ||
57 | + command[0] = STX; | ||
58 | + command[1] = 0x30; | ||
59 | + command[2] = 0x30; | ||
60 | + command[3] = 'X'; | ||
61 | + command[4] = 'G'; | ||
62 | + command[5] = 'M'; | ||
63 | + command[6] = 'O'; | ||
64 | + command[7] = vCol.length > 2 ? vCol[2] : 0x30; | ||
65 | + command[8] = vCol.length > 1 ? vCol[1] : 0x30; | ||
66 | + command[9] = vCol.length > 0 ? vCol[0] : 0x30; | ||
67 | + command[10] = '@'; | ||
68 | + command[11] = '-'; | ||
69 | + command[12] = vVal.length > 1 ? vVal[1] : 0x30; | ||
70 | + command[13] = vVal.length > 0 ? vVal[0] : 0x30; | ||
71 | + command[14] = '.'; | ||
72 | + command[15] = '0'; | ||
73 | + command[16] = ETX; | ||
74 | + command[17] = 0; | ||
75 | + | ||
76 | + setCHK(command); | ||
77 | + | ||
78 | + return command; | ||
79 | + } | ||
80 | + | ||
81 | + public static byte[] genCommandGetAttn(int col){ | ||
82 | + byte[] command = new byte[12]; | ||
83 | + byte[] vCol = intToReversedBytes(col); | ||
84 | + command[0] = STX; | ||
85 | + command[1] = 0x30; | ||
86 | + command[2] = 0x30; | ||
87 | + command[3] = 'X'; | ||
88 | + command[4] = 'G'; | ||
89 | + command[5] = 'R'; | ||
90 | + command[6] = 'O'; | ||
91 | + command[7] = vCol.length > 2 ? vCol[2] : 0x30; | ||
92 | + command[8] = vCol.length > 1 ? vCol[1] : 0x30; | ||
93 | + command[9] = vCol.length > 0 ? vCol[0] : 0x30; | ||
94 | + command[10] = ETX; | ||
95 | + command[11] = 0; | ||
96 | + | ||
97 | + setCHK(command); | ||
98 | + | ||
99 | + return command; | ||
100 | + } | ||
101 | + | ||
102 | + | ||
103 | + public static byte[] genCommandSetCross(int row, int col){ | ||
104 | + byte[] command = new byte[12]; | ||
105 | + byte[] vRow = intToReversedBytes(row); | ||
106 | + byte[] vCol = intToReversedBytes(col); | ||
107 | + command[0] = STX; | ||
108 | + command[1] = 0x30; | ||
109 | + command[2] = 0x30; | ||
110 | + command[3] = 'S'; | ||
111 | + command[4] = vCol.length > 2 ? vCol[2] : 0x30; | ||
112 | + command[5] = vCol.length > 1 ? vCol[1] : 0x30; | ||
113 | + command[6] = vCol.length > 0 ? vCol[0] : 0x30; | ||
114 | + command[7] = vRow.length > 2 ? vRow[2] : 0x30; | ||
115 | + command[8] = vRow.length > 1 ? vRow[1] : 0x30; | ||
116 | + command[9] = vRow.length > 0 ? vRow[0] : 0x30; | ||
117 | + command[10] = ETX; | ||
118 | + command[11] = 0; | ||
119 | + | ||
120 | + setCHK(command); | ||
121 | + | ||
122 | + return command; | ||
123 | + } | ||
124 | + | ||
125 | + /** | ||
126 | + * 1234 => "1234" => ['4','3','2','1'] | ||
127 | + * 1 => [31] | ||
128 | + * 12 => [32,31] | ||
129 | + * 123 => [33,32,31] | ||
130 | + * @param value value to convert | ||
131 | + * @return result | ||
132 | + */ | ||
133 | + public static byte[] intToReversedBytes(int value) { | ||
134 | + byte[] result = String.valueOf(value).getBytes(StandardCharsets.US_ASCII); | ||
135 | + ArrayUtils.reverse(result); | ||
136 | + return result; | ||
137 | + } | ||
138 | + | ||
139 | + public static byte[] genCommandGetCross(int col){ | ||
140 | + byte[] command = new byte[9]; | ||
141 | + byte[] value = String.valueOf(col).getBytes(StandardCharsets.US_ASCII); | ||
142 | + ArrayUtils.reverse(value); | ||
143 | + command[0] = STX; | ||
144 | + command[1] = 0x30; | ||
145 | + command[2] = 0x30; | ||
146 | + command[3] = 'O'; | ||
147 | + command[4] = value.length >= 3 ? value[2] : 0x30; | ||
148 | + command[5] = value.length >= 2 ? value[1] : 0x30; | ||
149 | + command[6] = value.length >= 1 ? value[0] : 0x30; | ||
150 | + command[7] = ETX; | ||
151 | + command[8] = 0; | ||
152 | + | ||
153 | + setCHK(command); | ||
154 | + | ||
155 | + return command; | ||
156 | + } | ||
157 | +} |
src/main/java/com/example/mina/client/box/lte3000/Lte3000ProtocolFactory.java
0 → 100644
@@ -0,0 +1,112 @@ | @@ -0,0 +1,112 @@ | ||
1 | +package com.example.mina.client.box.lte3000; | ||
2 | + | ||
3 | +import com.example.mina.client.base.MatrixCommand; | ||
4 | +import com.example.mina.client.base.MatrixConstants; | ||
5 | +import com.example.mina.client.base.MatrixResponse; | ||
6 | +import com.example.mina.processor.VbLogUtils; | ||
7 | +import com.example.mina.server.util.CommandHelper; | ||
8 | +import lombok.extern.slf4j.Slf4j; | ||
9 | +import org.apache.mina.core.buffer.IoBuffer; | ||
10 | +import org.apache.mina.core.session.IoSession; | ||
11 | +import org.apache.mina.filter.codec.*; | ||
12 | + | ||
13 | +import java.nio.charset.CharacterCodingException; | ||
14 | +import java.nio.charset.CharsetDecoder; | ||
15 | +import java.nio.charset.CharsetEncoder; | ||
16 | +import java.nio.charset.StandardCharsets; | ||
17 | + | ||
18 | +@Slf4j | ||
19 | +public class Lte3000ProtocolFactory implements ProtocolCodecFactory { | ||
20 | + | ||
21 | + private static final CharsetDecoder DECODER = StandardCharsets.UTF_8.newDecoder(); | ||
22 | + | ||
23 | + private static final CharsetEncoder ENCODER = StandardCharsets.UTF_8.newEncoder(); | ||
24 | + | ||
25 | + @Override | ||
26 | + public ProtocolEncoder getEncoder(IoSession ioSession) throws Exception { | ||
27 | + return new Lte3000ProtocolEncoder(); | ||
28 | + } | ||
29 | + | ||
30 | + @Override | ||
31 | + public ProtocolDecoder getDecoder(IoSession ioSession) throws Exception { | ||
32 | + return new Lte3000ProtocolDecoder(); | ||
33 | + } | ||
34 | + | ||
35 | + public static class Lte3000ProtocolEncoder extends ProtocolEncoderAdapter { | ||
36 | + | ||
37 | + @Override | ||
38 | + public void encode(IoSession ioSession, Object msg, ProtocolEncoderOutput protocolEncoderOutput) | ||
39 | + throws CharacterCodingException { | ||
40 | + | ||
41 | + if (!(msg instanceof MatrixCommand)) { | ||
42 | + log.error("error msg, msg is: {}", msg); | ||
43 | + return; | ||
44 | + } | ||
45 | + | ||
46 | + MatrixCommand mc = (MatrixCommand) msg; | ||
47 | + log.info("---发送数据参数!Attn = {},Col = {},Command = {},Row = {},MatrixId = {},type = {}", | ||
48 | + mc.getAttn(), | ||
49 | + mc.getCol(), | ||
50 | + mc.getCommand(), | ||
51 | + mc.getRow(), | ||
52 | + mc.getMatrixId() | ||
53 | + ); | ||
54 | + int cmd = mc.getCommand(); | ||
55 | + VbLogUtils.infoLog(log, "", mc.getMatrixId(),msg); | ||
56 | + | ||
57 | + IoBuffer buffer = IoBuffer.allocate(100, false).setAutoExpand(true); | ||
58 | + | ||
59 | + int row = mc.getRow(); | ||
60 | + byte[] command; | ||
61 | + if (row == 0) { | ||
62 | + command = Lte3000CommandHelper.genCommandSetAttn(mc.getCol(), mc.getAttn()); | ||
63 | + }else{ | ||
64 | + command = Lte3000CommandHelper.genCommandSetCross(row, mc.getCol()); | ||
65 | + } | ||
66 | + | ||
67 | + buffer.put(command); | ||
68 | + buffer.flip(); | ||
69 | + protocolEncoderOutput.write(buffer); | ||
70 | + } | ||
71 | + } | ||
72 | + | ||
73 | + public static class Lte3000ProtocolDecoder extends ProtocolDecoderAdapter { | ||
74 | + | ||
75 | + @Override | ||
76 | + public void decode(IoSession ioSession, IoBuffer ioBuffer, ProtocolDecoderOutput protocolDecoderOutput) | ||
77 | + throws Exception { | ||
78 | + log.info("--server返回给----client ------IoBuffer{}", ioBuffer); | ||
79 | + MatrixResponse response = new MatrixResponse(); | ||
80 | + int len = ioBuffer.limit(); | ||
81 | + byte[] bytes = new byte[len]; | ||
82 | + ioBuffer.get(bytes); | ||
83 | + int cmd = bytes[0]; | ||
84 | + if(cmd == 0x30 && len==8) { | ||
85 | + int row = CommandHelper.BCD_REV[bytes[3]]; | ||
86 | + int col = CommandHelper.BCD_REV[bytes[4]]; | ||
87 | + int attn = bytes[5]; | ||
88 | + | ||
89 | + response.setRow(row); | ||
90 | + response.setCol(col); | ||
91 | + response.setIsSetAttn(true); | ||
92 | + response.setAttn(attn); | ||
93 | + | ||
94 | + } else if (cmd == 0x68 && len ==8) { | ||
95 | + int offset = bytes[6]; | ||
96 | + int col = CommandHelper.BCD_REV[bytes[3]]; | ||
97 | + response.setIsSetOffset(true); | ||
98 | + response.setCol(col); | ||
99 | + response.setOffset(offset); | ||
100 | + } else { | ||
101 | + int offset = bytes[6]; | ||
102 | + response.setOffset(offset); | ||
103 | + } | ||
104 | + protocolDecoderOutput.write(response); | ||
105 | + } | ||
106 | + | ||
107 | + } | ||
108 | + | ||
109 | + | ||
110 | + | ||
111 | + | ||
112 | +} |
src/main/java/com/example/mina/client/box/qrb3000/Qrb3000CommandHelper.java
0 → 100644
@@ -0,0 +1,186 @@ | @@ -0,0 +1,186 @@ | ||
1 | +package com.example.mina.client.box.qrb3000; | ||
2 | + | ||
3 | +import com.example.mina.server.util.CommandHelper; | ||
4 | + | ||
5 | +/** | ||
6 | + * @ProjectName: demo | ||
7 | + * @Package: com.example.mina.client.box.qrb3000 | ||
8 | + * @ClassName: Qrb3000CommandHelper | ||
9 | + * @Author: HuangLang | ||
10 | + * @Description: Qrb command helper | ||
11 | + * @Date: 2021-04-02 下午 5:55 | ||
12 | + */ | ||
13 | +public class Qrb3000CommandHelper { | ||
14 | + | ||
15 | + public static byte[] genCommand30(int row, int col, int val){ | ||
16 | + byte[] command = new byte[8]; | ||
17 | + | ||
18 | + command[0] = 0x30; | ||
19 | + command[1] = 0x40; | ||
20 | + command[2] = 0x00; | ||
21 | + command[3] = CommandHelper.BCD[row]; | ||
22 | + command[4] = CommandHelper.BCD[col]; | ||
23 | + command[5] = (byte)val; | ||
24 | + command[6] = 0x00; | ||
25 | + command[7] = 0x00; | ||
26 | + | ||
27 | + return command; | ||
28 | + } | ||
29 | + | ||
30 | + public static byte[] genCommand31(int row, int col, int val){ | ||
31 | + byte[] command = new byte[8]; | ||
32 | + | ||
33 | + command[0] = 0x31; | ||
34 | + command[1] = 0x40; | ||
35 | + command[2] = 0x00; | ||
36 | + command[3] = CommandHelper.BCD[row]; | ||
37 | + command[4] = CommandHelper.BCD[col]; | ||
38 | + command[5] = (byte)val; | ||
39 | + command[6] = 0x00; | ||
40 | + command[7] = 0x00; | ||
41 | + | ||
42 | + return command; | ||
43 | + } | ||
44 | + | ||
45 | + | ||
46 | + public static byte[] genCommand32(){ | ||
47 | + byte[] command = new byte[8]; | ||
48 | + | ||
49 | + command[0] = 0x32; | ||
50 | + command[1] = 0x00; | ||
51 | + command[2] = 0x00; | ||
52 | + command[3] = 0x00; | ||
53 | + command[4] = 0x00; | ||
54 | + command[5] = 0x00; | ||
55 | + command[6] = 0x00; | ||
56 | + command[7] = 0x00; | ||
57 | + | ||
58 | + return command; | ||
59 | + } | ||
60 | + | ||
61 | + | ||
62 | + | ||
63 | + public static byte[] genCommand4D(byte val){ | ||
64 | + byte[] command = new byte[1028]; | ||
65 | + | ||
66 | + command[0] = 0x4D; | ||
67 | + command[1] = 0x40; | ||
68 | + command[2] = 0x00; | ||
69 | + | ||
70 | + for(int i = 0; i < 1024; i++) { | ||
71 | + command[ 3 + i] = val; | ||
72 | + } | ||
73 | + command[1027] = 0x00; | ||
74 | + | ||
75 | + | ||
76 | + return command; | ||
77 | + } | ||
78 | + | ||
79 | + public static byte[] genCommand62(int row){ | ||
80 | + byte[] command = new byte[8]; | ||
81 | + | ||
82 | + command[0] = 0x62; | ||
83 | + command[1] = 0x40; | ||
84 | + command[2] = 0x00; | ||
85 | + command[3] = CommandHelper.BCD[row]; | ||
86 | + command[4] = 0x00; | ||
87 | + command[5] = 0x00; | ||
88 | + command[6] = 0x00; | ||
89 | + command[7] = 0x00; | ||
90 | + | ||
91 | + return command; | ||
92 | + } | ||
93 | + | ||
94 | + public static byte[] genCommand68(int row){ | ||
95 | + byte[] command = new byte[8]; | ||
96 | + | ||
97 | + command[0] = 0x68; | ||
98 | + command[1] = 0x40; | ||
99 | + command[2] = 0x00; | ||
100 | + command[3] = CommandHelper.BCD[row]; | ||
101 | + command[4] = 0x00; | ||
102 | + command[5] = 0x00; | ||
103 | + command[6] = 0x00; | ||
104 | + command[7] = 0x00; | ||
105 | + | ||
106 | + return command; | ||
107 | + } | ||
108 | + | ||
109 | + @Deprecated | ||
110 | + public static int parseCommand68_Response(byte[] b){//TODO : need double check | ||
111 | + int b7 = 0xFF & b[6]; | ||
112 | + int b8 = 0xFF & b[7]; | ||
113 | + | ||
114 | + int rec = 0; | ||
115 | + | ||
116 | + if(b7 == 0xFE || b7 == 0xFF || b8 == 0xEE){ | ||
117 | + rec = -99; | ||
118 | + } | ||
119 | +// else if(b7 ==0xF9){ | ||
120 | +// rec = 31; | ||
121 | +// } | ||
122 | + else if(b7 == 0x80){ | ||
123 | + rec = 0; | ||
124 | + } | ||
125 | + else if(b7 < 0x80){ | ||
126 | + rec = (b7 / 16) * 10 + (0x0F & b7); | ||
127 | + } | ||
128 | + else{ | ||
129 | + b7= 0x7f & b7; | ||
130 | + rec = - ( (b7 / 16) * 10 + (0x0F & b7)); | ||
131 | + } | ||
132 | + | ||
133 | + return rec; | ||
134 | + } | ||
135 | + | ||
136 | + public static byte[] genCommand4F(int row){ | ||
137 | + byte[] command = new byte[8]; | ||
138 | + | ||
139 | + command[0] = 0x4F; | ||
140 | + command[1] = 0x40; | ||
141 | + command[2] = 0x00; | ||
142 | + command[3] = CommandHelper.BCD[row]; | ||
143 | + command[4] = 0x00; | ||
144 | + command[5] = 0x00; | ||
145 | + command[6] = 0x00; | ||
146 | + command[7] = 0x00; | ||
147 | + | ||
148 | + return command; | ||
149 | + } | ||
150 | + | ||
151 | + public static byte[] genCommandEA(){ | ||
152 | + byte[] command = new byte[8]; | ||
153 | + | ||
154 | + int b = 0xEA; | ||
155 | + | ||
156 | + command[0] = (byte)b; | ||
157 | + command[1] = 0x40; | ||
158 | + command[2] = 0x00; | ||
159 | + command[3] = 0x00; | ||
160 | + command[4] = 0x00; | ||
161 | + command[5] = 0x00; | ||
162 | + command[6] = 0x00; | ||
163 | + command[7] = 0x00; | ||
164 | + | ||
165 | + return command; | ||
166 | + } | ||
167 | + | ||
168 | + | ||
169 | + public static byte[] genCommandEE(){ | ||
170 | + byte[] command = new byte[8]; | ||
171 | + | ||
172 | + int b = 0xEE; | ||
173 | + | ||
174 | + command[0] = (byte)b; | ||
175 | + command[1] = 0x40; | ||
176 | + command[2] = 0x00; | ||
177 | + command[3] = 0x00; | ||
178 | + command[4] = 0x00; | ||
179 | + command[5] = 0x00; | ||
180 | + command[6] = 0x00; | ||
181 | + command[7] = 0x00; | ||
182 | + | ||
183 | + return command; | ||
184 | + } | ||
185 | + | ||
186 | +} |
src/main/java/com/example/mina/client/box/qrb3000/Qrb3000ProtocolFactory.java
@@ -52,39 +52,48 @@ public class Qrb3000ProtocolFactory implements ProtocolCodecFactory { | @@ -52,39 +52,48 @@ public class Qrb3000ProtocolFactory implements ProtocolCodecFactory { | ||
52 | mc.getMatrixId() | 52 | mc.getMatrixId() |
53 | ); | 53 | ); |
54 | int cmd = mc.getCommand(); | 54 | int cmd = mc.getCommand(); |
55 | + int row = mc.getRow(); | ||
56 | + int col = mc.getCol(); | ||
57 | + int attn = mc.getAttn(); | ||
55 | VbLogUtils.infoLog(log, "", mc.getMatrixId(),msg); | 58 | VbLogUtils.infoLog(log, "", mc.getMatrixId(),msg); |
56 | 59 | ||
57 | IoBuffer buffer = IoBuffer.allocate(100, false).setAutoExpand(true); | 60 | IoBuffer buffer = IoBuffer.allocate(100, false).setAutoExpand(true); |
58 | 61 | ||
62 | + byte[] command; | ||
63 | + | ||
59 | if (cmd == MatrixConstants.COMMAND_SET_ATTN) { | 64 | if (cmd == MatrixConstants.COMMAND_SET_ATTN) { |
60 | - buffer.put((byte)0x30); | ||
61 | - buffer.put((byte)0xFE); | ||
62 | - buffer.put((byte)0xFE); | ||
63 | - buffer.put(mc.getRow().byteValue()); | ||
64 | - buffer.put(mc.getCol().byteValue()); | ||
65 | - buffer.put(mc.getAttn().byteValue()); | ||
66 | - buffer.put((byte)0xFE); | ||
67 | - buffer.put((byte)0xFE); | 65 | +// buffer.put((byte)0x30); |
66 | +// buffer.put((byte)0xFE); | ||
67 | +// buffer.put((byte)0xFE); | ||
68 | +// buffer.put(mc.getRow().byteValue()); | ||
69 | +// buffer.put(mc.getCol().byteValue()); | ||
70 | +// buffer.put(mc.getAttn().byteValue()); | ||
71 | +// buffer.put((byte)0xFE); | ||
72 | +// buffer.put((byte)0xFE); | ||
73 | + command = QrbCommandHelper.genSetAttenuation(row, col, attn); | ||
68 | } | 74 | } |
69 | if (cmd == MatrixConstants.COMMAND_SET_OFFSET) { | 75 | if (cmd == MatrixConstants.COMMAND_SET_OFFSET) { |
70 | - buffer.put((byte)0x68); | ||
71 | - buffer.put((byte)0xFE); | ||
72 | - buffer.put((byte)0xFE); | ||
73 | - buffer.put(mc.getCol().byteValue()); | ||
74 | - buffer.put(mc.getOffset().byteValue()); | ||
75 | - buffer.put((byte)0xFE); | ||
76 | - buffer.put((byte)0xFE); | ||
77 | - buffer.put((byte)0xFE); | 76 | + // 0x68 |
77 | + command = Qrb3000CommandHelper.genCommand30(row, col, attn); | ||
78 | +// buffer.put((byte)0x68); | ||
79 | +// buffer.put((byte)0xFE); | ||
80 | +// buffer.put((byte)0xFE); | ||
81 | +// buffer.put(mc.getCol().byteValue()); | ||
82 | +// buffer.put(mc.getOffset().byteValue()); | ||
83 | +// buffer.put((byte)0xFE); | ||
84 | +// buffer.put((byte)0xFE); | ||
85 | +// buffer.put((byte)0xFE); | ||
78 | 86 | ||
79 | } | 87 | } |
80 | if (cmd == MatrixConstants.COMMAND_GET_OFFSET) { | 88 | if (cmd == MatrixConstants.COMMAND_GET_OFFSET) { |
81 | - buffer.put((byte)0xFE); | ||
82 | - buffer.put((byte)0xFE); | ||
83 | - buffer.put((byte)0xFE); | ||
84 | - buffer.put(mc.getCol().byteValue()); | ||
85 | - buffer.put((byte)0xFE); | ||
86 | - buffer.put((byte)0xFE); | ||
87 | - buffer.put((byte)0xFE); | 89 | + command = QrbCommandHelper.genSetAttenuation(row, col, attn); |
90 | +// buffer.put((byte)0xFE); | ||
91 | +// buffer.put((byte)0xFE); | ||
92 | +// buffer.put((byte)0xFE); | ||
93 | +// buffer.put(mc.getCol().byteValue()); | ||
94 | +// buffer.put((byte)0xFE); | ||
95 | +// buffer.put((byte)0xFE); | ||
96 | +// buffer.put((byte)0xFE); | ||
88 | } | 97 | } |
89 | 98 | ||
90 | buffer.flip(); | 99 | buffer.flip(); |
src/main/java/com/example/mina/client/box/qrb3000/QrbCommandHelper.java
0 → 100644
@@ -0,0 +1,110 @@ | @@ -0,0 +1,110 @@ | ||
1 | +package com.example.mina.client.box.qrb3000; | ||
2 | + | ||
3 | +import org.apache.commons.lang3.ArrayUtils; | ||
4 | + | ||
5 | +import java.nio.charset.StandardCharsets; | ||
6 | +import java.util.ArrayList; | ||
7 | +import java.util.Optional; | ||
8 | +import java.util.stream.Stream; | ||
9 | + | ||
10 | +/** | ||
11 | + * @ProjectName: demo | ||
12 | + * @Package: com.example.mina.client.box.qrb3000 | ||
13 | + * @ClassName: QrbCommandHelper | ||
14 | + * @Author: HuangLang | ||
15 | + * @Description: QrbCommandHelper | ||
16 | + * @Date: 2021-04-02 下午 6:13 | ||
17 | + */ | ||
18 | +public class QrbCommandHelper { | ||
19 | + | ||
20 | + public static final byte STX = 0x02; | ||
21 | + public static final byte ETX = 0x03; | ||
22 | + | ||
23 | + /** | ||
24 | + * 1234 => "1234" => ['4','3','2','1'] | ||
25 | + * 1 => [31] | ||
26 | + * 12 => [32,31] | ||
27 | + * 123 => [33,32,31] | ||
28 | + * @param value value to convert | ||
29 | + * @return result | ||
30 | + */ | ||
31 | + public static byte[] intToReversedBytes(int value) { | ||
32 | + byte[] result = String.valueOf(value).getBytes(StandardCharsets.US_ASCII); | ||
33 | + ArrayUtils.reverse(result); | ||
34 | + return result; | ||
35 | + } | ||
36 | + | ||
37 | + public static byte[] addChecksumAndGenerateCommand(ArrayList<Byte> bytes) { | ||
38 | + Optional<Byte> checksum = bytes.stream().reduce((x, y) -> (byte) (x ^ y)); | ||
39 | + checksum.ifPresent(bytes::add); | ||
40 | + byte[] result = new byte[bytes.size()]; | ||
41 | + for(int i = 0; i < bytes.size(); i ++) result[i] = bytes.get(i); | ||
42 | + return result; | ||
43 | + } | ||
44 | + | ||
45 | + /** | ||
46 | + * XRI: RF Input Signal Level Check | ||
47 | + * @param row starts from 1 | ||
48 | + * @return a command bytes | ||
49 | + */ | ||
50 | + public static byte[] genInputSignalLevelCheck(int row){ | ||
51 | + ArrayList<Byte> command = new ArrayList<Byte>(); | ||
52 | + byte[] vRow = intToReversedBytes(row); | ||
53 | + | ||
54 | + command.add(STX); | ||
55 | + command.add((byte)0x30); | ||
56 | + command.add((byte)0x30); | ||
57 | + command.add((byte)0x58); // X | ||
58 | + command.add((byte)0x52); // R | ||
59 | + command.add((byte)0x49); // I | ||
60 | + command.add(vRow.length > 2 ? vRow[2] : (byte)0x30); | ||
61 | + command.add(vRow.length > 1 ? vRow[1] : (byte)0x30); | ||
62 | + command.add(vRow.length > 0 ? vRow[0] : (byte)0x30); | ||
63 | + command.add(ETX); | ||
64 | + | ||
65 | + return addChecksumAndGenerateCommand(command); | ||
66 | + | ||
67 | + } | ||
68 | + | ||
69 | + /** | ||
70 | + * Not documented, from logs | ||
71 | + * Request: set attenuation 13, 19 | ||
72 | + * 0x02 0x30 0x30 0x58 0x41 0x57 0x41 0x30 0x32 0x39 0x42 0x30 0x31 0x39 0x30 0x30 0x30 0x03 0x7f | ||
73 | + * Request: set attenuation 13, 19 | ||
74 | + * 0x02 0x30 0x30 0x58 0x41 0x57 0x41 0x30 0x30 0x31 0x42 0x30 0x30 0x31 0x36 0x33 0x30 0x03 0x79 | ||
75 | + * Response: | ||
76 | + * N/A | ||
77 | + * @param row starts from 1 | ||
78 | + * @return a command bytes | ||
79 | + */ | ||
80 | + public static byte[] genSetAttenuation(int row, int col, int attn){ | ||
81 | + ArrayList<Byte> command = new ArrayList<Byte>(); | ||
82 | + byte[] vRow = intToReversedBytes(row); | ||
83 | + byte[] vCol = intToReversedBytes(col); | ||
84 | + byte[] vValue = intToReversedBytes(attn); | ||
85 | + | ||
86 | + command.add(STX); | ||
87 | + command.add((byte)0x30); | ||
88 | + command.add((byte)0x30); | ||
89 | + command.add((byte)0x58); // X | ||
90 | + command.add((byte)0x41); // A | ||
91 | + command.add((byte)0x57); // W | ||
92 | + command.add((byte)0x41); // A | ||
93 | + command.add(vRow.length > 2 ? vRow[2] : (byte)0x30); | ||
94 | + command.add(vRow.length > 1 ? vRow[1] : (byte)0x30); | ||
95 | + command.add(vRow.length > 0 ? vRow[0] : (byte)0x30); | ||
96 | + command.add((byte)0x42); // B | ||
97 | + command.add(vCol.length > 2 ? vCol[2] : (byte)0x30); | ||
98 | + command.add(vCol.length > 1 ? vCol[1] : (byte)0x30); | ||
99 | + command.add(vCol.length > 0 ? vCol[0] : (byte)0x30); | ||
100 | + command.add(vValue.length > 1 ? vValue[1] : (byte)0x30); | ||
101 | + command.add(vValue.length > 0 ? vValue[0] : (byte)0x30); | ||
102 | + command.add((byte)0x30); // no decimal | ||
103 | + command.add(ETX); | ||
104 | + | ||
105 | + return addChecksumAndGenerateCommand(command); | ||
106 | + | ||
107 | + } | ||
108 | + | ||
109 | + | ||
110 | +} |
src/main/java/com/example/mina/client/box/rbm3000/Rbm3000CommandHelper.java
0 → 100644
@@ -0,0 +1,67 @@ | @@ -0,0 +1,67 @@ | ||
1 | +package com.example.mina.client.box.rbm3000; | ||
2 | + | ||
3 | +import com.example.mina.server.util.CommandHelper; | ||
4 | + | ||
5 | +/** | ||
6 | + * @ProjectName: demo | ||
7 | + * @Package: com.example.mina.client.box.rbm3000 | ||
8 | + * @ClassName: Rbm3000CommandHelper | ||
9 | + * @Author: HuangLang | ||
10 | + * @Description: Rbm command helper | ||
11 | + * @Date: 2021-04-02 下午 5:30 | ||
12 | + */ | ||
13 | +public class Rbm3000CommandHelper { | ||
14 | + | ||
15 | + public static byte[] genCommand30(int row, int col){ | ||
16 | + byte[] command = new byte[8]; | ||
17 | + | ||
18 | + command[0] = 0x30; | ||
19 | + command[1] = 0x50; | ||
20 | + command[2] = 0x00; | ||
21 | + command[3] = CommandHelper.BCD[row]; | ||
22 | + command[4] = CommandHelper.BCD[col]; | ||
23 | + command[5] = 0x00; | ||
24 | + command[6] = 0x00; | ||
25 | + command[7] = 0x00; | ||
26 | + | ||
27 | + return command; | ||
28 | + } | ||
29 | + | ||
30 | + | ||
31 | + public static byte[] genCommand68(boolean isA, int port){ | ||
32 | + byte[] command = new byte[8]; | ||
33 | + | ||
34 | + command[0] = 0x68; | ||
35 | + command[1] = 0x50; | ||
36 | + command[2] = 0x00; | ||
37 | + if(isA){ | ||
38 | + command[3] = 0x0A; | ||
39 | + } | ||
40 | + else{ | ||
41 | + command[3] = 0x0B; | ||
42 | + } | ||
43 | + | ||
44 | + command[4] = CommandHelper.BCD[port]; | ||
45 | + command[5] = 0x00; | ||
46 | + command[6] = 0x00; | ||
47 | + command[7] = 0x00; | ||
48 | + | ||
49 | + return command; | ||
50 | + } | ||
51 | + | ||
52 | + | ||
53 | + public static byte[] genCommand62(){ | ||
54 | + byte[] command = new byte[8]; | ||
55 | + | ||
56 | + command[0] = 0x62; | ||
57 | + command[1] = 0x50; | ||
58 | + command[2] = 0x00; | ||
59 | + command[3] = 0x00; | ||
60 | + command[4] = 0x00; | ||
61 | + command[5] = 0x00; | ||
62 | + command[6] = 0x00; | ||
63 | + command[7] = 0x00; | ||
64 | + | ||
65 | + return command; | ||
66 | + } | ||
67 | +} |
src/main/java/com/example/mina/client/box/rbm3000/Rbm3000ProtocolFactory.java
@@ -56,17 +56,12 @@ public class Rbm3000ProtocolFactory implements ProtocolCodecFactory { | @@ -56,17 +56,12 @@ public class Rbm3000ProtocolFactory implements ProtocolCodecFactory { | ||
56 | 56 | ||
57 | IoBuffer buffer = IoBuffer.allocate(100, false).setAutoExpand(true); | 57 | IoBuffer buffer = IoBuffer.allocate(100, false).setAutoExpand(true); |
58 | 58 | ||
59 | + byte[] comand = null; | ||
59 | // Len==8 cmd【0】 0x30 set row/col attn=1 | 60 | // Len==8 cmd【0】 0x30 set row/col attn=1 |
60 | if (cmd == MatrixConstants.COMMAND_SET_ATTN) { | 61 | if (cmd == MatrixConstants.COMMAND_SET_ATTN) { |
61 | - buffer.put((byte)0x30); | ||
62 | - buffer.put((byte)0xFE); | ||
63 | - buffer.put((byte)0xFE); | ||
64 | - buffer.put(mc.getRow().byteValue()); | ||
65 | - buffer.put(mc.getCol().byteValue()); | ||
66 | - buffer.put((byte)0xFE); | ||
67 | - buffer.put((byte)0xFE); | ||
68 | - buffer.put((byte)0xFE); | 62 | + comand = Rbm3000CommandHelper.genCommand30(mc.getRow(), mc.getCol()); |
69 | }else if (cmd == MatrixConstants.COMMAND_GET_ATTN) { | 63 | }else if (cmd == MatrixConstants.COMMAND_GET_ATTN) { |
64 | + // todo 业务需求需要进一步明确 | ||
70 | buffer.put((byte)0x68); | 65 | buffer.put((byte)0x68); |
71 | buffer.put((byte)0xFE); | 66 | buffer.put((byte)0xFE); |
72 | buffer.put((byte)0xFE); | 67 | buffer.put((byte)0xFE); |
@@ -84,16 +79,10 @@ public class Rbm3000ProtocolFactory implements ProtocolCodecFactory { | @@ -84,16 +79,10 @@ public class Rbm3000ProtocolFactory implements ProtocolCodecFactory { | ||
84 | buffer.put((byte)0xFE); | 79 | buffer.put((byte)0xFE); |
85 | 80 | ||
86 | } else { | 81 | } else { |
87 | - buffer.put((byte)0x62); | ||
88 | - buffer.put((byte)0xFE); | ||
89 | - buffer.put((byte)0xFE); | ||
90 | - buffer.put((byte)0xFE); | ||
91 | - buffer.put((byte)0xFE); | ||
92 | - buffer.put((byte)0xFE); | ||
93 | - buffer.put((byte)0xFE); | ||
94 | - buffer.put((byte)0xFE); | 82 | + comand = Rbm3000CommandHelper.genCommand62(); |
95 | } | 83 | } |
96 | 84 | ||
85 | + buffer.put(comand); | ||
97 | buffer.flip(); | 86 | buffer.flip(); |
98 | protocolEncoderOutput.write(buffer); | 87 | protocolEncoderOutput.write(buffer); |
99 | } | 88 | } |