Rbm3000CodecFactory.java
4.49 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
package com.example.mina.box.rbm3000;
import com.example.mina.util.CommandHelper;
import org.apache.mina.core.buffer.IoBuffer;
import org.apache.mina.core.session.IoSession;
import org.apache.mina.filter.codec.*;
/**
* @author dy
* @date 21/03/09
*/
public class Rbm3000CodecFactory implements ProtocolCodecFactory {
@Override
public ProtocolEncoder getEncoder(IoSession session) {
return new Rbm3000MessageEncoder();
}
@Override
public ProtocolDecoder getDecoder(IoSession session) {
return new Rbm3000MessageDecoder();
}
static class Rbm3000MessageEncoder implements ProtocolEncoder {
@Override
public void encode(IoSession session, Object message, ProtocolEncoderOutput out) {
if (message instanceof Rbm3000ResponseMessage) {
byte[] result = ((Rbm3000ResponseMessage) message).getResult();
session.write(IoBuffer.wrap(result));
}
}
@Override
public void dispose(IoSession session) {
}
}
static class Rbm3000MessageDecoder implements ProtocolDecoder {
// private final CharsetDecoder decoder = StandardCharsets.UTF_8.newDecoder();
@Override
public void decode(IoSession session, IoBuffer in, ProtocolDecoderOutput out) {
byte[] bytes = new byte[in.limit()];
in.get(bytes);
byte[] buffer;
Rbm3000RequestMessage rbm3000RequestMessage = Rbm3000RequestMessage.builder()
.input(bytes)
.build();
if (bytes.length == rbm3000RequestMessage.LENGTH8) {
switch (bytes[0]) {
case 0x30:
int row = CommandHelper.BCD_REV[bytes[3]];
int col = CommandHelper.BCD_REV[bytes[4]];
int rowCol = 0;
int colRow = 0;
rbm3000RequestMessage.setRow(row);
rbm3000RequestMessage.setRow(col);
rbm3000RequestMessage.setRow(rowCol);
rbm3000RequestMessage.setRow(colRow);
buffer = new byte[8];
buffer[0] = bytes[0];
buffer[1] = bytes[1];
buffer[2] = bytes[2];
buffer[3] = bytes[3];
buffer[4] = bytes[4];
buffer[5] = CommandHelper.BCD[colRow];
buffer[6] = CommandHelper.BCD[rowCol];
buffer[7] = (byte) 0x03;
rbm3000RequestMessage.setAnalyticalMessage(buffer);
break;
case 0x68:
boolean isA = (bytes[3] == (byte) 0x0A);
int callPort = CommandHelper.BCD_REV[bytes[4]];
int returnPort = 0;
rbm3000RequestMessage.setCallPort(callPort);
rbm3000RequestMessage.setA(isA);
rbm3000RequestMessage.setReturnPort(returnPort);
buffer = new byte[8];
buffer[0] = bytes[0];
buffer[1] = bytes[1];
buffer[2] = bytes[2];
if (isA) {
buffer[3] = 0x0B;
} else {
buffer[3] = 0x0A;
}
buffer[5] = 0x00;
buffer[6] = 0x06;
buffer[7] = (byte) 0x03;
rbm3000RequestMessage.setAnalyticalMessage(buffer);
break;
default:
buffer = new byte[8];
buffer[0] = bytes[0];
buffer[1] = bytes[1];
buffer[2] = bytes[2];
buffer[3] = bytes[3];
buffer[4] = bytes[4];
buffer[5] = bytes[5];
buffer[6] = bytes[6];
buffer[7] = (byte) 0x03;
rbm3000RequestMessage.setAnalyticalMessage(buffer);
break;
}
}
out.write(rbm3000RequestMessage);
}
@Override
public void finishDecode(IoSession session, ProtocolDecoderOutput out) {
}
@Override
public void dispose(IoSession session) {
}
}
}