GetVoteDataRequest.java
4 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
package com.sunvote.cmd.basestation;
import com.sunvote.cmd.BaseCmd;
import com.sunvote.cmd.ICmd;
import java.io.ByteArrayOutputStream;
import java.util.Arrays;
/**
* Created by Elvis on 2017/8/30.
* Email:Eluis@psunsky.com
* 版权所有:长沙中天电子设计开发有限公司
* Description:平板模块键盘投票功能模块
*
* 基站内部有一个自动获取表决器结果的流程,除投票进行的时候表决器提交的结果,平常也可以接收表决器的状态报告、申请指令等。这些数据都要提交到电脑上。
由于存在多个基站同时使用的情况,基站不主动发送数据,而是等待电脑发读取基站结果指令查询,才回送数据。
基站回送数据的方法是这样的:最多一次回送10个数据包,每个数据包有编号,1到10,如果某个数据包编号为0xFF,就表示不足10个数据包,可以提前结束基站接收流程。
电脑在收到编号为0xFF的数据包后,或者到达10个数据包的接收时间后,给基站发个确认指令,通知基站刚才发出的10个数据包中正确接收到了哪些。
如果有多个基站的话,电脑查询下一个基站的结果。
电脑读取基站结果、接收基站结果数据包和确认数据包这3个步骤,是周而复始的,保证可随时接收到表决器的数据。
基站的结果数据包,实际是把键盘的关键数据重新打包,再一次传给电脑,一般情况下,一个数据包可传输几个表决器结果,比单个单个传递效率要高。由于结果有不同类型,因此结果数据包的类型和格式也有多种。
3.2 读取基站结果
电脑读取指定基站的结果:
字节 标识符 描述
1 BASECMD 0x60 基站类指令
2 BASEID 指定的基站编号
3 CMDTYPE 基站命令类型
5 读取基站结果
4-29 无意义
整个结果数据包结构如下:
字节 标识符 描述
1 BASECMD 0xE0 基站类指令应答
2 BASEID 应答的基站的编号
3 CMDTYPE 5 基站结果上传
4 MSGNO 数据包序号
5 MSGTYPE 基站数据包类型
1 单值
6-7 KEYID1 第1个结果的表决器编号,高位在前
表决器编号为0xFFFF表示结果空,不足8个结果
8 VALUE1 第1个结果值
9-11 KEYID2
VALUE2 第2个结果的表决器编号和值
。。。
27-29 KEYID8
VALUE8 第8个结果的表决器编号和值
*/
public class GetVoteDataRequest extends BaseCmd {
public final static byte CMD_TYPE = 0x05;
public static final byte CMD = 0x60;
/**
* 基站类指令
*/
private byte basecmd;
/**
* 指定的基站编号
*/
private byte baseid;
/**
* 基站命令类型
*/
private byte cmdtype;
private byte[] data = new byte[26];
@Override
public byte[] toBytes() {
try{
ByteArrayOutputStream stream = new ByteArrayOutputStream();
stream.write(getBasecmd());
stream.write(getBaseid());
stream.write(getCmdtype());
stream.write(getData());
return stream.toByteArray();
}catch (Exception ex){
ex.printStackTrace();
}
return new byte[0];
}
@Override
public ICmd parseCmd(byte[] source, int start) {
setBasecmd(source[start]);
setBaseid(source[start+1]);
setCmdtype(source[start+2]);
if(source.length > start + 3){
setData(Arrays.copyOfRange(source,start+3,source.length));
}
return this;
}
public byte getBasecmd() {
return basecmd;
}
public void setBasecmd(byte basecmd) {
this.basecmd = basecmd;
}
public byte getBaseid() {
return baseid;
}
public void setBaseid(byte baseid) {
this.baseid = baseid;
}
public byte getCmdtype() {
return cmdtype;
}
public void setCmdtype(byte cmdtype) {
this.cmdtype = cmdtype;
}
public byte[] getData() {
return data;
}
public void setData(byte[] data) {
this.data = data;
}
}