Blame view

海亮定制.md 18.3 KB
fac0c011   孙向锦   添加海亮定制
1
2
  # C200K
  
c8b510aa   孙向锦   海亮定制
3
4
  [TOC]
  
fac0c011   孙向锦   添加海亮定制
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
  # 1. 前言
  
    
  ## 1.1 背景
  
  方便客户基于C200K基站设备使用 通信基站数据接收及解析。
  
    
  ## 1.2 编写目的
  
  此说明书是为了说明协议内容,开发流程,方便基于此进行二次开发。
  
   
  ##  1.3 读者对象
  
  1. 相关研发人员
  2. 方案制定人员
  3. 决策人员
  
  
  # 2. 开发流程
  
  C200K基站,采用MQTT协议进行开发,基站接入MQTT服务器,应用从MQTT服务器下发指令和接收数据
  
  整个交互图如下:
  
  ![](img/mqtt_1.png)
  
    
  ## 2.1 MQTT服务器准备
  
  MQTT服务器要求:
  
  能够正常收发MQTT数据。
  
  服务器的性能参数由业务决定。
  
  域名:
  
  公网域名或ip或者基站所处局域网ip。
  
  MQTT服务器配置结果检查
  
57b8f891   孙向锦   海亮定制
48
  使用MQTT.FX客户端,配置域名,端口,用户名和密码信息,然后连接,如果提示连接成功,则表示MQTT服务器可用。基站clientid 是基站编号。
fac0c011   孙向锦   添加海亮定制
49
50
51
52
53
54
55
56
  
  ![](img/mqtt_2.png)
  
    
  ## 2.2 基站配置
  
  通过USB连接基站,打开基站服务器配置软件。
  
5391e692   孙向锦   海亮定制
57
  ![](img/mqtt_3.png)
fac0c011   孙向锦   添加海亮定制
58
59
60
61
62
63
64
65
66
67
68
69
70
  
  如果基站没有连接电脑,工具显示检测基站中,这时候读写无效。
  
  连接正常后,按照各个信息进行写入。
  
  设置基站服务器域名(ip)、端口,用户信息、密码信息,写入基站。
  
  如果MQTT服务器没有启用用户密码验证,用户密码信息可以随机设置。
  
  拔掉USB,连接网线,接入网络,查看网络是否连接正常。(基站上面的灯是否蓝色闪烁)
  
  基站说明
  
5391e692   孙向锦   海亮定制
71
  ![](img/mqtt_4.png)
fac0c011   孙向锦   添加海亮定制
72
73
74
75
76
77
  
    
  ## 2.3 应用开发
  
  整体开发流程图如下:
  
5391e692   孙向锦   海亮定制
78
  ![](img/mqtt_5.png)
fac0c011   孙向锦   添加海亮定制
79
80
81
82
83
84
85
86
87
88
89
90
  
  
  # 3. 功能清单
  
    
  ## 3.1 支持的功能清单
  
  | **功能** | **说明** |
  | --- | --- |
  | 授时 | 给基站校时 |
  | 基站上下线 | 基站上下线信息 |
  | 键盘上下线 | 键盘上下线信息 |
4dae75b4   孙向锦   海亮定制
91
92
  | 单题 | 下发一题练习 |
  | 多级编号题 | 下发多题练习 |
fac0c011   孙向锦   添加海亮定制
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
  | 基站升级 | 基站固件升级 |
  | 键盘升级 | 键盘固件升级 |
  | 基站错误信息上报 | 基站错误信息上报 |
  
    
  ## 3.2 协议简介
  
      
  ### 3.2.1 MQTT
  
  关于MQTT说明,请参考 https://mqtt.org/
  
  ${clinetId} clinetId 是基站编号,为替换字符串。
  
        
  #### 3.2.1.1 应用程序发布的主题
  
  | 主题 | 功能 |
  | --- | --- |
  | /client/${clientId}/operate | 基站的设置,查询等指令 |
  | /lesson/class/${clinetId}/receive | 接收答题的指令 |
  
        
  #### 3.2.1.2 应用程序订阅的主题
  
  | 主题 | 功能 |
  | --- | --- |
  | /client/${clientId}/online | 基站上线通知。 |
  | /client/${clientId}/offline | 基站下线通知。 |
  | /client/${clientId}/card/online | 答题器上线通知。 |
  | /client/${clientId}/card/offline | 答题器离线通知。 |
fac0c011   孙向锦   添加海亮定制
124
  | /client/${clientId}/report | 基站主动上报状态,或者对设置指令的回应。 |
e16c5296   孙向锦   海亮定制
125
  | /lesson/class/${clinetId}/send | 基站对答题的反馈 |
fac0c011   孙向锦   添加海亮定制
126
127
128
129
130
  | /client/${clientId}/error | 基站错误信息上报 |
  
      
  ### 3.2.2 协议格式
  
5391e692   孙向锦   海亮定制
131
  ![](img/mqtt_6.png)
fac0c011   孙向锦   添加海亮定制
132
133
134
135
136
137
138
139
  
  协议采用json格式,数据中字段见属性介绍。
  
      
  ### 3.2.3 指令属性介绍
  
  | 名称 | 类型 | 说明 |
  | --- | --- | --- |
73fb9953   孙向锦   update
140
  | i | number | 消息指令类型(instruction),取值范围: 1-9999。 <br> i = 3 添加白名单 <br> i = 4 删除白名单 <br> i = 5 清除白名单 <br> i = 11 停止 <br> i = 12开启答题 <br> i = 13 接收答题数据 <br> i = 14 键盘上线 <br> i = 15 键盘下线 <br> i = 17 基站升级 <br> i = 18 升级报告 <br> i = 19 授时 <br>  i = 20 设置基站信息 <br> i = 21基站信息上报 <br> i = 22基站错误信息上报 <br> i = 28 键盘升级 <br> i = 29 键盘升级报告 <br> I= 30 读取白名单 <br> I= 31 白名单上传 <br> i = 40 基站上线 <br> i = 41 基站下线  <br> i = 60 文本预设 <br> i = 61 文本预设返回|
fac0c011   孙向锦   添加海亮定制
141
142
143
  | m | object | 答题消息的内容(message) 对象或数组 |
  | c | string | 答题器的序号(card) |
  | t | number | 时间戳(10位timestamp) |
e16c5296   孙向锦   海亮定制
144
  | qm | number | 模式(question model)取值范围:<br> 0:停止 <br> 1:单题  <br> 14:多级编号答题 |
4dae75b4   孙向锦   海亮定制
145
  | qt | number | 题型(question type),取值范围: <br> 0:字母单选 <br> 1:字母多选 <br> 2:数字题 <br> 3:判断题 <br> 5:抢答 <br> 7: 自判题判断题 |
57b8f891   孙向锦   海亮定制
146
  | qs | number | 该题型数量(question sum),单题为1,多题则为实际数量。 |
e16c5296   孙向锦   海亮定制
147
148
  | qn | number | 题目序号(question No),题目顺序号 |
  | dn | string | display no 显示编号,键盘上显示的题目编号|
92de8c2b   孙向锦   海亮定制
149
  | a | string | 答案(answer)<br> 示例:字母单选:A  <br> 字母多选:A&#124;B&#124;C |
fac0c011   孙向锦   添加海亮定制
150
  | en | string | 练习(考试)编号(exercise No)每次考试或者练习的唯一编号,用于确定提交的答案属于那次练习。 |
57b8f891   孙向锦   海亮定制
151
  | on | number | 单选和多选题的选项数量(option no) |
fac0c011   孙向锦   添加海亮定制
152
153
154
  | cid | string | 客户端ID(client Id) |
  | cm | string | 客户端型号(client Model) |
  | cv | string | 客户端版本(client Version)基站软件版本号 |
e16c5296   孙向锦   海亮定制
155
  | f | number | 信道频点(frequency) 基站频点取值:1-80 |
fac0c011   孙向锦   添加海亮定制
156
  | content | string | 题干内容(选项信息都包含在此),中文信息用hex进行传输。内容前面需要 hex:详见后面示例 |
9c6cde27   孙向锦   海亮定制
157
  | sn | string | sn  序列号 |
fac0c011   孙向锦   添加海亮定制
158
  | et | number | 错误类型et =1 基站频点冲突 |
57b8f891   孙向锦   海亮定制
159
  | em | string | 错误消息em = "3" 配合et使用,如et=1 em=3 表示3号频点冲突 |
e16c5296   孙向锦   海亮定制
160
  | success | number | 0 成功  -1 错误/失败 |
fac0c011   孙向锦   添加海亮定制
161
162
  
    
c8b510aa   孙向锦   海亮定制
163
  ## 3.3 功能说明
fac0c011   孙向锦   添加海亮定制
164
165
166
167
168
169
  
      
  ### 授时
  
  对客户端授时,发送指令即可,基站会完成校时。
  
92de8c2b   孙向锦   海亮定制
170
  <br>主题 : /client/${client}/operate 
36c06ee8   孙向锦   修改代码可复制
171
172
  
  ```
0a1ae1cf   孙向锦   表格中放入代码
173
174
175
176
  {
  	"i": 19,
  	"t": 1634802943
  }
36c06ee8   孙向锦   修改代码可复制
177
  ```
a41e0380   孙向锦   海亮定制
178
  
92de8c2b   孙向锦   海亮定制
179
  | 名称 | 备注 |
580adb3c   孙向锦   海亮定制
180
  | --- | --- | 
2e304a0b   孙向锦   海亮定制
181
  | i = 19 | 授时 |
580adb3c   孙向锦   海亮定制
182
183
  | t | 当前时间轴秒 |
  
fac0c011   孙向锦   添加海亮定制
184
185
186
187
188
  
      
  ### 基站管理
  
        
2e304a0b   孙向锦   海亮定制
189
  #### 基站上线(待完成-可能修改)
fac0c011   孙向锦   添加海亮定制
190
191
192
  
  由基站发给应用程序,应用需要订阅主题
  
92de8c2b   孙向锦   海亮定制
193
  <br>主题 : /client/${clientId}/online 
6c9b1262   孙向锦   海亮定制
194
  
92de8c2b   孙向锦   海亮定制
195
  <br>指令内容:
6c9b1262   孙向锦   海亮定制
196
197
198
199
200
  ``` 
  {
  	"i": 40
  } 
  ``` 
fac0c011   孙向锦   添加海亮定制
201
  
92de8c2b   孙向锦   海亮定制
202
203
204
205
  | 名称 | 备注 |
  | --- | --- |
  | i = 40 | 基站上线 |
  
fac0c011   孙向锦   添加海亮定制
206
        
2e304a0b   孙向锦   海亮定制
207
  #### 基站下线(待完成-可能修改)
fac0c011   孙向锦   添加海亮定制
208
209
210
  
  由服务器发给应用程序,应用需要订阅主题
  
92de8c2b   孙向锦   海亮定制
211
212
  <br>主题:/client/${clientId}/offline 
  <br>指令内容:
6c9b1262   孙向锦   海亮定制
213
214
215
216
217
  ```json 
  { 
  	"i": 41
  } 
  ``` 
92de8c2b   孙向锦   海亮定制
218
219
220
  | 名称 | 备注 |
  | --- | --- |
  | i = 41 | 基站下线 |
fac0c011   孙向锦   添加海亮定制
221
222
223
224
225
        
  #### 基站信息设置与读取
  
  应用程序发送给基站
  
92de8c2b   孙向锦   海亮定制
226
227
  <br>主题: /client/${client}/operate 
  <br>指令内容:
6c9b1262   孙向锦   海亮定制
228
229
230
231
  ```json 
  {
  	"i": 20,
  	"m": {
60a60b35   孙向锦   修改2处错误
232
  		"f": 1,
6c9b1262   孙向锦   海亮定制
233
234
235
  		"mqtt_ip": "edunew.sunvotecloud.cn",
  		"mqtt_port": 8443,
  		"mqtt_username": "admin",
2e304a0b   孙向锦   海亮定制
236
  		"mqtt_password": "1223456789"
6c9b1262   孙向锦   海亮定制
237
238
239
240
  	}
  }
  ```
  
92de8c2b   孙向锦   海亮定制
241
  | 名称 | 备注 |
6c9b1262   孙向锦   海亮定制
242
  | --- | --- |
92de8c2b   孙向锦   海亮定制
243
  | i= 20 |基站信息设置与读取 |
e16c5296   孙向锦   海亮定制
244
  | f |基站频点 频点范围1-80|
92de8c2b   孙向锦   海亮定制
245
246
247
248
  | mqtt_ip | 连接服务器的IP| 
  | mqtt_port | 连接mqtt服务器的端口 |
  | mqtt_username | 连接mqtt服务器的用户名 |
  | mqtt_password | 连接mqtt服务器的密码 | 
edbfcbb6   孙向锦   海亮定制
249
  | 注意 | 如果没有该字段则不设置该值,保持原值下发对有需要修改的值设置完成后,基站信息会自动上报一次 |
fac0c011   孙向锦   添加海亮定制
250
251
252
253
254
255
  
        
  #### 基站信息上报
  
  基站发送给应用程序
  
92de8c2b   孙向锦   海亮定制
256
257
  <br>主题: /client/${client}/report
  <br>指令内容:
68f3ad33   孙向锦   海亮定制
258
259
260
261
262
263
  ```json
  {
  	"i": 21,
  	"cId": "2024010282",
  	"m": {
  		"f": 1,
68f3ad33   孙向锦   海亮定制
264
  		"mqtt_ip": "edunew.sunvotecloud.cn",
92de8c2b   孙向锦   海亮定制
265
  		"mqtt_port": 1883,
68f3ad33   孙向锦   海亮定制
266
  		"mqtt_username": "admin",
2e304a0b   孙向锦   海亮定制
267
  		"mqtt_password": "1223456789"
68f3ad33   孙向锦   海亮定制
268
269
270
  	}
  }
  ```
92de8c2b   孙向锦   海亮定制
271
  | 名称 | 备注 |
68f3ad33   孙向锦   海亮定制
272
  | --- | --- |
92de8c2b   孙向锦   海亮定制
273
274
  | i= 21 |基站信息上报 |
  | cId |客户端ID |
68f3ad33   孙向锦   海亮定制
275
  | f |基站频点 |
60a60b35   孙向锦   修改2处错误
276
277
278
279
  | mqtt_ip | 连接服务器的IP | 
  | mqtt_port | 连接mqtt服务器的端口 |
  | mqtt_username | 连接mqtt服务器的用户名 |
  | mqtt_password | 连接mqtt服务器的密码 | 
fac0c011   孙向锦   添加海亮定制
280
281
  
        
2e304a0b   孙向锦   海亮定制
282
  #### 基站错误信息上报(待完成-可能修改)
fac0c011   孙向锦   添加海亮定制
283
  
92de8c2b   孙向锦   海亮定制
284
285
286
  基站发送给应用程序主题
  <br>主题:/client/${client}/error
  <br>指令内容:
68f3ad33   孙向锦   海亮定制
287
288
289
290
291
292
293
294
295
  ```json
  {
  	"i": 22,
  	"m": {
  		"et": 1,
  		"em": "3"
  	}
  }
  ```
92de8c2b   孙向锦   海亮定制
296
  | 名称 | 备注 |
68f3ad33   孙向锦   海亮定制
297
  | --- | --- |
2e304a0b   孙向锦   海亮定制
298
  | i = 22 | 基站错误信息上报 |
68f3ad33   孙向锦   海亮定制
299
300
  | et |错误类型 et = 1 :基站频点冲突 |
  | em |错误消息 em=3 :3号频点示例 基站频点3冲突 |
94d3e689   孙向锦   海亮定制
301
  
fac0c011   孙向锦   添加海亮定制
302
  
68f3ad33   孙向锦   海亮定制
303
     
fac0c011   孙向锦   添加海亮定制
304
305
306
307
308
309
  ### 键盘管理
  
        
  #### 键盘上线
  
  由基站发给应用程序,应用需要订阅主题
92de8c2b   孙向锦   海亮定制
310
311
  <br>主题: /client/${clientId}/card/online
  <br>指令内容:
5890e4c7   孙向锦   海亮定制
312
313
314
315
  ```json
  {
  	"i": 14,
  	"m": [{
4dae75b4   孙向锦   海亮定制
316
  		"c": "2126833671",
5890e4c7   孙向锦   海亮定制
317
318
319
320
321
  		"el": 0.75,
  		"t": 1626016299
  	}]
  }
  ```
92de8c2b   孙向锦   海亮定制
322
  | 名称 | 备注 |
5890e4c7   孙向锦   海亮定制
323
324
  | --- | --- |
  | i = 14 |键盘上线 |
9c6cde27   孙向锦   海亮定制
325
  | c |键盘sn号 |
5890e4c7   孙向锦   海亮定制
326
  | el |电量信息答题器编号和上线时间及电量信息 |
94d3e689   孙向锦   海亮定制
327
  
fac0c011   孙向锦   添加海亮定制
328
  
5890e4c7   孙向锦   海亮定制
329
    
fac0c011   孙向锦   添加海亮定制
330
331
332
  #### 键盘下线
  
  由基站发给应用程序,应用需要订阅主题
92de8c2b   孙向锦   海亮定制
333
334
  <br>主题: /client/${clientId}/card/offline
  <br>指令内容:
5890e4c7   孙向锦   海亮定制
335
336
337
338
  ```json
  {
  	"i": 15,
  	"m": [{
4dae75b4   孙向锦   海亮定制
339
  		"c": "2126833671",
5890e4c7   孙向锦   海亮定制
340
341
342
343
  		"t": 1626016299
  	}]
  }
  ```
92de8c2b   孙向锦   海亮定制
344
  | 名称 | 备注 |
5890e4c7   孙向锦   海亮定制
345
346
  | --- | --- |
  | i = 15 |键盘下线 |
9c6cde27   孙向锦   海亮定制
347
  | c |键盘sn号 |
5890e4c7   孙向锦   海亮定制
348
  | t |答题器编号和下线时间 |
94d3e689   孙向锦   海亮定制
349
  
fac0c011   孙向锦   添加海亮定制
350
351
352
353
        
  #### 读取白名单
  
  应用程序发送给基站
92de8c2b   孙向锦   海亮定制
354
355
  <br>主题: /lesson/class/${clinetId}/receive
  <br>指令内容:
5890e4c7   孙向锦   海亮定制
356
357
358
359
360
  ```json
  {
  	"i": 30
  }
  ```
92de8c2b   孙向锦   海亮定制
361
  | 名称 | 备注 |
5890e4c7   孙向锦   海亮定制
362
363
  | --- | --- |
  | i = 30 |读取白名单 |
94d3e689   孙向锦   海亮定制
364
  
fac0c011   孙向锦   添加海亮定制
365
  
fac0c011   孙向锦   添加海亮定制
366
  
92de8c2b   孙向锦   海亮定制
367
368
369
  基站发给应用程序主题
  <br>主题: /lesson/class/${clinetId}/receive
  <br>指令内容:
5890e4c7   孙向锦   海亮定制
370
371
372
373
374
375
376
377
  ```json
  {
  	"i": 31,
  	"total": 1,
  	"current": 1,
  	"m": ["2126932551"]
  }
  ```
92de8c2b   孙向锦   海亮定制
378
  | 名称 | 备注 |
5890e4c7   孙向锦   海亮定制
379
380
  | --- | --- |
  | i = 31 |白名单上传 |
9c6cde27   孙向锦   海亮定制
381
382
  | total |一共上传的数据包数 |
  | current |当前第几包 |
e16c5296   孙向锦   海亮定制
383
  | m |键盘序列号列表 |
94d3e689   孙向锦   海亮定制
384
  
fac0c011   孙向锦   添加海亮定制
385
  
fac0c011   孙向锦   添加海亮定制
386
387
388
389
390
  
        
  #### 添加白名单
  
  应用程序发送给基站
92de8c2b   孙向锦   海亮定制
391
392
  <br>主题: /lesson/class/${clinetId}/receive
  <br>指令内容:
5890e4c7   孙向锦   海亮定制
393
394
395
  ```json
  {
  	"i": 3,
e16c5296   孙向锦   海亮定制
396
  	"m": ["2126833703", "2126833671"]
5890e4c7   孙向锦   海亮定制
397
398
  }
  ```
92de8c2b   孙向锦   海亮定制
399
  | 名称 | 备注 |
5890e4c7   孙向锦   海亮定制
400
401
  | --- | --- |
  | i = 3 |添加白名单m内包含白名单键盘按编号 |
e16c5296   孙向锦   海亮定制
402
  | m |键盘序列号列表 |
94d3e689   孙向锦   海亮定制
403
  
fac0c011   孙向锦   添加海亮定制
404
  
fac0c011   孙向锦   添加海亮定制
405
406
407
408
409
  
        
  #### 删除白名单
  
  应用程序发送给基站
92de8c2b   孙向锦   海亮定制
410
411
  <br>主题: /lesson/class/${clinetId}/receive
  <br>指令内容:
5890e4c7   孙向锦   海亮定制
412
413
414
  ```json
  {
  	"i": 4,
e16c5296   孙向锦   海亮定制
415
  	"m": ["2126833703", "2126833671"]
5890e4c7   孙向锦   海亮定制
416
417
  }
  ```
fac0c011   孙向锦   添加海亮定制
418
  
92de8c2b   孙向锦   海亮定制
419
  | 名称 | 备注 |
5890e4c7   孙向锦   海亮定制
420
421
  | --- | --- |
  | i = 4 |删除白名单m内包含白名单键盘按编号 |
e16c5296   孙向锦   海亮定制
422
  | m |键盘序列号列表 |
94d3e689   孙向锦   海亮定制
423
  
fac0c011   孙向锦   添加海亮定制
424
425
426
427
428
  
        
  #### 清空白名单
  
  应用程序发送给基站
92de8c2b   孙向锦   海亮定制
429
430
  <br>主题: /lesson/class/${clinetId}/receive
  <br>指令内容:
5890e4c7   孙向锦   海亮定制
431
432
433
434
435
  ```json
  {
  	"i": 5
  }
  ```
92de8c2b   孙向锦   海亮定制
436
  | 名称 | 备注 |
5890e4c7   孙向锦   海亮定制
437
438
  | --- | --- |
  | i = 5 |清空白名单 |
94d3e689   孙向锦   海亮定制
439
  
fac0c011   孙向锦   添加海亮定制
440
441
  
      
fac0c011   孙向锦   添加海亮定制
442
  
fac0c011   孙向锦   添加海亮定制
443
444
445
446
447
448
449
450
  
      
  ### 单题
  
        
  #### 开启答题
  
  由应用程序发给基站,应用按照主题发送
92de8c2b   孙向锦   海亮定制
451
452
  <br>主题: /lesson/class/${clinetId}/receive
  <br>指令内容:
5890e4c7   孙向锦   海亮定制
453
454
455
  ```json
  {
  	"i": 12,
358ce6fb   孙向锦   修改en序号不重复
456
  	"en": "1",
5890e4c7   孙向锦   海亮定制
457
458
459
460
  	"qm": 1,
  	"m": {
  		"qt": 0,
  		"on": 4,
bee414de   孙向锦   海亮定制
461
  		"content": "hex:d5c5c8fd"
5890e4c7   孙向锦   海亮定制
462
463
464
  	}
  }
  ```
92de8c2b   孙向锦   海亮定制
465
  | 名称 | 备注 |
5890e4c7   孙向锦   海亮定制
466
  | --- | --- |
9c6cde27   孙向锦   海亮定制
467
468
  | i = 12 |下发答题  |
  | en |序号  |
5890e4c7   孙向锦   海亮定制
469
470
471
  | qm = 1 |单题模式 示例为单题模式的字母单选 |
  | qt  |字母单选 |
  | on  |选项数 |
9c6cde27   孙向锦   海亮定制
472
473
474
  | content = 1 |题目主干内容,hex: 为内容的GBK编码的hex内容 |
  
  ```java
bee414de   孙向锦   海亮定制
475
476
  
  System.out.println(new String(hex2Bytes(bytesToHexString("李四".getBytes("GBK"))),"GBK"));
9c6cde27   孙向锦   海亮定制
477
478
479
480
  
  public static String bytesToHexString(byte[] src) {
      StringBuilder stringBuilder = new StringBuilder("");
      if (src == null || src.length <= 0) {
107f06d8   孙向锦   海亮定制
481
          return "";
9c6cde27   孙向锦   海亮定制
482
483
484
485
486
487
488
489
490
491
492
493
      }
      for (int i = 0; i < src.length; i++) {
          int v = src[i] & 0xFF;
          String hv = Integer.toHexString(v);
          if (hv.length() < 2) {
              stringBuilder.append(0);
          }
          stringBuilder.append(hv);
          stringBuilder.append("");
      }
      return stringBuilder.toString();
  }
bee414de   孙向锦   海亮定制
494
495
496
497
498
499
500
501
502
503
504
  
   public static byte[] hex2Bytes(String hex){
  	if(hex.length() % 2 == 0){
  		byte[] ret = new byte[hex.length() / 2];
  		for(int i = 0 ; i< hex.length() / 2 ; i++){
  			ret[i] = (byte)Integer.parseInt(hex.substring(2*i,2*i+2),16);
  		}
  		return ret;
  	}
  	return null;
  }
9c6cde27   孙向锦   海亮定制
505
  ```
fac0c011   孙向锦   添加海亮定制
506
507
508
509
        
  #### 接收答题数据
  
  由基站发给应用程序,应用订阅主题
92de8c2b   孙向锦   海亮定制
510
511
  <br>主题: /lesson/class/${clinetId}/send
  <br><br>指令内容:
5890e4c7   孙向锦   海亮定制
512
513
514
  ```json
  {
  	"i": 13,
358ce6fb   孙向锦   修改en序号不重复
515
  	"en": "1",
5890e4c7   孙向锦   海亮定制
516
  	"qm": 1,
4dae75b4   孙向锦   海亮定制
517
  	"c": "2126833671",
5890e4c7   孙向锦   海亮定制
518
519
520
521
522
523
524
  	"m": [{
  		"qn": 1,
  		"a": "A",
  		"t": 1626016299
  	}]
  }
  ```
92de8c2b   孙向锦   海亮定制
525
  | 名称 | 备注 |
5890e4c7   孙向锦   海亮定制
526
527
  | --- | --- |
  | i = 13 | 答题数据 |
92de8c2b   孙向锦   海亮定制
528
  | qn |上报答题数据,单题题号固定为1 |
5890e4c7   孙向锦   海亮定制
529
530
  | t  |提交答案时间 |
  | a  | 答题数据 |
94d3e689   孙向锦   海亮定制
531
  
fac0c011   孙向锦   添加海亮定制
532
533
        
  #### 停止答题
92de8c2b   孙向锦   海亮定制
534
535
536
  由应用程序发给基站,应用按照发送
  <br>主题:/lesson/class/${clinetId}/receive 
  <br>指令内容:
5890e4c7   孙向锦   海亮定制
537
538
539
  ```json
  {
  	"i": 11,
358ce6fb   孙向锦   修改en序号不重复
540
  	"en": "1"
5890e4c7   孙向锦   海亮定制
541
542
  }
  ```
92de8c2b   孙向锦   海亮定制
543
  | 名称 | 备注 |
5890e4c7   孙向锦   海亮定制
544
545
  | --- | --- |
  | i = 11 | 停止答题 |
4dae75b4   孙向锦   海亮定制
546
  | en |停止对序号1的练习 |
94d3e689   孙向锦   海亮定制
547
  
fac0c011   孙向锦   添加海亮定制
548
  
92de8c2b   孙向锦   海亮定制
549
  ### 抢答
fac0c011   孙向锦   添加海亮定制
550
        
92de8c2b   孙向锦   海亮定制
551
  #### 开启答题
fac0c011   孙向锦   添加海亮定制
552
  
92de8c2b   孙向锦   海亮定制
553
554
555
  由应用程序发给基站,应用按照发送
  <br>主题:  /lesson/class/${clinetId}/receive
  <br>指令内容:
5890e4c7   孙向锦   海亮定制
556
557
558
  ```json
  {
  	"i": 12,
358ce6fb   孙向锦   修改en序号不重复
559
  	"en": "2",
5890e4c7   孙向锦   海亮定制
560
561
562
  	"qm": 4
  }
  ```
92de8c2b   孙向锦   海亮定制
563
  | 名称 | 备注 |
5890e4c7   孙向锦   海亮定制
564
565
  | --- | --- |
  | i = 12 | 开启答题 |
4dae75b4   孙向锦   海亮定制
566
  | en |序号2的练习 |
5890e4c7   孙向锦   海亮定制
567
  | qm | qm =4 抢答题 |
94d3e689   孙向锦   海亮定制
568
  
fac0c011   孙向锦   添加海亮定制
569
570
  
        
92de8c2b   孙向锦   海亮定制
571
  #### 接收答题数据
fac0c011   孙向锦   添加海亮定制
572
  
92de8c2b   孙向锦   海亮定制
573
574
575
  由基站发给应用程序,应用订阅
  <br>主题: /lesson/class/${clinetId}/send
  <br>指令内容:
5890e4c7   孙向锦   海亮定制
576
577
578
  ```json
  {
  	"i": 13,
358ce6fb   孙向锦   修改en序号不重复
579
  	"en": "2",
5890e4c7   孙向锦   海亮定制
580
  	"qm": 4,
5890e4c7   孙向锦   海亮定制
581
  	"m": [{
92de8c2b   孙向锦   海亮定制
582
  	    "c": "2126833671",
5890e4c7   孙向锦   海亮定制
583
584
585
586
  		"t": 1626016299
  	}]
  }
  ```
fac0c011   孙向锦   添加海亮定制
587
  
92de8c2b   孙向锦   海亮定制
588
  | 名称 | 备注 |
5890e4c7   孙向锦   海亮定制
589
590
  | --- | --- |
  | i = 12 | 开启答题 |
4dae75b4   孙向锦   海亮定制
591
  | en |序号2的练习 |
5890e4c7   孙向锦   海亮定制
592
593
594
595
596
  | qm | qm =4 抢答题 |
  | c | 键盘编号 |
  | qn |上报答题数据,单题题号固定为1 |
  | t  |提交答案时间 |
  | a  | 答题数据 |
94d3e689   孙向锦   海亮定制
597
  
fac0c011   孙向锦   添加海亮定制
598
599
  
        
2e304a0b   孙向锦   海亮定制
600
  #### 停止答题(待完成-可能修改)
fac0c011   孙向锦   添加海亮定制
601
  由应用程序发给基站,应用按照主题发送
92de8c2b   孙向锦   海亮定制
602
603
  <br>主题:/lesson/class/${clinetId}/receive 
  <br>指令内容:
5890e4c7   孙向锦   海亮定制
604
605
606
  ```json
  {
  	"i": 11,
358ce6fb   孙向锦   修改en序号不重复
607
  	"en": "2"
5890e4c7   孙向锦   海亮定制
608
609
  }
  ```
92de8c2b   孙向锦   海亮定制
610
  | 名称 | 备注 |
5890e4c7   孙向锦   海亮定制
611
612
  | --- | --- |
  | i = 11 | 停止答题 |
4dae75b4   孙向锦   海亮定制
613
  | en |停止对序号2的练习 |
94d3e689   孙向锦   海亮定制
614
  
fac0c011   孙向锦   添加海亮定制
615
  
fac0c011   孙向锦   添加海亮定制
616
  
fac0c011   孙向锦   添加海亮定制
617
618
  ### 多题题号多题
  
fac0c011   孙向锦   添加海亮定制
619
620
621
  #### 开启答题
  
  由应用程序发给基站,应用按照主题发送
92de8c2b   孙向锦   海亮定制
622
623
  <br>主题: /lesson/class/${clinetId}/receive
  <br>指令内容:
5890e4c7   孙向锦   海亮定制
624
625
626
  ```json
  {
  	"i": 12,
358ce6fb   孙向锦   修改en序号不重复
627
  	"en": "3",
5890e4c7   孙向锦   海亮定制
628
  	"qm": 14,
9c6cde27   孙向锦   海亮定制
629
630
  	"total": 1,
      "current": 1,
5890e4c7   孙向锦   海亮定制
631
632
633
634
  	"qs": 3,
  	"m": [{
  		"qt": 0,
  		"on": 4,
e16c5296   孙向锦   海亮定制
635
  		"dn": "1-1-1"
5890e4c7   孙向锦   海亮定制
636
637
638
  	}, {
  		"qt": 0,
  		"on": 4,
e16c5296   孙向锦   海亮定制
639
  		"dn": "2-1"
5890e4c7   孙向锦   海亮定制
640
641
642
  	}, {
  		"qt": 0,
  		"on": 4,
e16c5296   孙向锦   海亮定制
643
  		"dn": "3"
5890e4c7   孙向锦   海亮定制
644
645
646
  	}]
  }
  ```
fac0c011   孙向锦   添加海亮定制
647
  
92de8c2b   孙向锦   海亮定制
648
  | 名称 | 备注 |
5890e4c7   孙向锦   海亮定制
649
650
  | --- | --- |
  | i = 12 | 开启答题 |
4dae75b4   孙向锦   海亮定制
651
  | en |12341练习 |
5890e4c7   孙向锦   海亮定制
652
  | qm = 14 | 多题多级编号模式 |
9c6cde27   孙向锦   海亮定制
653
654
655
  | current |当前第几包数据 |
  | total |一共几包数据 |
  | qs | 题目总数 |
5890e4c7   孙向锦   海亮定制
656
657
  | qt = 0 | 字母单选 |
  | on | 选项数量 |
e16c5296   孙向锦   海亮定制
658
  | dn | 显示编号,题目最多3级数字编号,多级数字编号中间必须以“-”隔开,每级最大数200 |
94d3e689   孙向锦   海亮定制
659
  
fac0c011   孙向锦   添加海亮定制
660
661
662
663
        
  #### 接收答题数据
  
  由基站发给应用程序,应用订阅主题
92de8c2b   孙向锦   海亮定制
664
665
  <br>主题: /lesson/class/${clinetId}/send
  <br>指令内容:
5890e4c7   孙向锦   海亮定制
666
667
668
  ```json
  {
  	"i": 13,
358ce6fb   孙向锦   修改en序号不重复
669
  	"en": "3",
5890e4c7   孙向锦   海亮定制
670
  	"qm": 14,
4dae75b4   孙向锦   海亮定制
671
  	"c": "2126833671",
5890e4c7   孙向锦   海亮定制
672
  	"m": [{
92de8c2b   孙向锦   海亮定制
673
  		"qn": 1,
5890e4c7   孙向锦   海亮定制
674
675
676
677
678
  		"a": "A",
  		"t": 1626016299
  	}]
  }
  ```
fac0c011   孙向锦   添加海亮定制
679
  
92de8c2b   孙向锦   海亮定制
680
  | 名称 | 备注 |
5890e4c7   孙向锦   海亮定制
681
682
  | --- | --- |
  | i = 13 | 接收答题数据 |
4dae75b4   孙向锦   海亮定制
683
  | en |12341练习 |
5890e4c7   孙向锦   海亮定制
684
685
  | qm = 14 | 多题多级编号模式 |
  | c | 键盘编号 |
e16c5296   孙向锦   海亮定制
686
  | qn |顺序题号,不为显示编号,是上述题目的顺序号 |
5890e4c7   孙向锦   海亮定制
687
688
  | t  |提交答案时间 |
  | a  | 答题数据 |
94d3e689   孙向锦   海亮定制
689
  
fac0c011   孙向锦   添加海亮定制
690
691
692
  
        
  #### 停止答题
fac0c011   孙向锦   添加海亮定制
693
  由应用程序发给基站,应用按照主题发送
92de8c2b   孙向锦   海亮定制
694
695
  <br>主题:/lesson/class/${clinetId}/receive 
  <br>指令内容:
5890e4c7   孙向锦   海亮定制
696
697
698
  ```json
  {
  	"i": 11,
358ce6fb   孙向锦   修改en序号不重复
699
  	"en": "3"
5890e4c7   孙向锦   海亮定制
700
701
  }
  ```
92de8c2b   孙向锦   海亮定制
702
  | 名称 | 备注 |
5890e4c7   孙向锦   海亮定制
703
704
  | --- | --- |
  | i = 11 | 停止答题 |
4dae75b4   孙向锦   海亮定制
705
  | en |停止对序号12341的练习 |
94d3e689   孙向锦   海亮定制
706
  
fac0c011   孙向锦   添加海亮定制
707
708
709
      
  ### 基站升级
  
fac0c011   孙向锦   添加海亮定制
710
  #### 开始升级
92de8c2b   孙向锦   海亮定制
711
712
  <br>主题: /client/${client}/operate
  <br>指令内容:
84dcab21   孙向锦   海亮定制
713
714
715
  ```json
  {
  	"i": 17,
358ce6fb   孙向锦   修改en序号不重复
716
  	"en": "5",
84dcab21   孙向锦   海亮定制
717
718
719
720
721
722
723
  	"m": {
  		"url": "",
  		"version": "",
  		"CRC": ""
  	}
  }
  ```
92de8c2b   孙向锦   海亮定制
724
  | 名称 | 备注 |
84dcab21   孙向锦   海亮定制
725
726
  | --- | --- |
  | i = 17 | 基站升级 |
358ce6fb   孙向锦   修改en序号不重复
727
  | en |序号5 |
84dcab21   孙向锦   海亮定制
728
729
730
  | url |固件包地址,基站能访问到的路径 |
  | version |新固件的版本 |
  | CRC |新关键计算的CRC |
94d3e689   孙向锦   海亮定制
731
  
fac0c011   孙向锦   添加海亮定制
732
733
734
  
        
  #### 升级进度报告
92de8c2b   孙向锦   海亮定制
735
736
  <br>主题: /client/${client}/report
  <br>指令内容:
84dcab21   孙向锦   海亮定制
737
738
739
740
  ```json
  {
  	"i": 18,
  	"m": {
4dae75b4   孙向锦   海亮定制
741
  		"cId": "3411111156",
84dcab21   孙向锦   海亮定制
742
743
744
745
746
  		"percent": 0,
  		"status": 0
  	}
  }
  ```
92de8c2b   孙向锦   海亮定制
747
  | 名称 | 备注 |
84dcab21   孙向锦   海亮定制
748
749
750
751
  | --- | --- |
  | i = 18 | 升级进度报告 |
  | cId |基站编号 |
  | percent |升级百分比 |
043d31f7   孙向锦   海亮定制
752
  | status |升级状态信息。 <br> 0:未开始<br> 1:升级中<br> 2:升级成功<br> 4:固件版本号错误<br> 5:不在升级名单内<br> 6:升级指令错误<br> \>127:升级中的错误码。 |
94d3e689   孙向锦   海亮定制
753
  
fac0c011   孙向锦   添加海亮定制
754
755
      
  ### 键盘升级
fac0c011   孙向锦   添加海亮定制
756
757
        
  #### 开始升级
92de8c2b   孙向锦   海亮定制
758
759
  <br>主题: /client/${client}/operate
  <br>指令内容:
84dcab21   孙向锦   海亮定制
760
761
762
763
  ```json
  {
  	"i": 28,
  	"m": {
92de8c2b   孙向锦   海亮定制
764
765
766
  		"url": "http://120.78.57.84:8888/file/S6_2.4G_2.1.2.50_GB2312_CGC_add_head.bin",
  		"version": "2.1.2.50",
  		"CRC": "10605263"
84dcab21   孙向锦   海亮定制
767
768
769
  	}
  }
  ```
92de8c2b   孙向锦   海亮定制
770
  | 名称 | 备注 |
84dcab21   孙向锦   海亮定制
771
772
773
774
775
  | --- | --- |
  | i = 28 | 键盘升级 |
  | url |固件包地址,基站能访问到的路径 |
  | version |新固件的版本号 |
  | CRC |新关键计算的CRC |
94d3e689   孙向锦   海亮定制
776
  
fac0c011   孙向锦   添加海亮定制
777
778
        
  #### 升级进度报告
92de8c2b   孙向锦   海亮定制
779
780
  <br>主题: /client/${client}/report
  <br>指令内容:
84dcab21   孙向锦   海亮定制
781
782
783
784
  ```json
  {
  	"i": 29,
  	"m": {
4dae75b4   孙向锦   海亮定制
785
  		"cId": "2023065218",
84dcab21   孙向锦   海亮定制
786
787
788
789
790
  		"percent": 0,
  		"status": 0
  	}
  }
  ```
92de8c2b   孙向锦   海亮定制
791
  | 名称 | 备注 |
84dcab21   孙向锦   海亮定制
792
  | --- | --- |
92de8c2b   孙向锦   海亮定制
793
  | i = 29 | 升级进度报告 |
84dcab21   孙向锦   海亮定制
794
795
  | cId |基站编号 |
  | percent |升级百分比 |
043d31f7   孙向锦   海亮定制
796
  | status |升级状态信息。 <br> 0:未开始<br> 1:升级中<br> 2:升级成功<br> 4:固件版本号错误<br> 5:不在升级名单内<br> 6:升级指令错误<br> \>127:升级中的错误码。 |
94d3e689   孙向锦   海亮定制
797
  
fac0c011   孙向锦   添加海亮定制
798
  
92de8c2b   孙向锦   海亮定制
799
  ### 文本下发
fac0c011   孙向锦   添加海亮定制
800
  
92de8c2b   孙向锦   海亮定制
801
802
803
  #### 文本下发
  <br>主题: /client/${client}/operate
  <br>指令内容:
84dcab21   孙向锦   海亮定制
804
805
  ```json
  {
73fb9953   孙向锦   update
806
  	"i": 60,
358ce6fb   孙向锦   修改en序号不重复
807
  	"en": "6",
043d31f7   孙向锦   海亮定制
808
  	"cmd": 1,
84dcab21   孙向锦   海亮定制
809
  	"m": [{
043d31f7   孙向锦   海亮定制
810
          "sn": "2126833671",
bee414de   孙向锦   海亮定制
811
          "text": "hex:d5c5c8fd"
043d31f7   孙向锦   海亮定制
812
813
  	},{
          "sn": "2126833672",
bee414de   孙向锦   海亮定制
814
          "text": "hex:c0eecbc4"
84dcab21   孙向锦   海亮定制
815
816
817
  	}]
  }
  ```
92de8c2b   孙向锦   海亮定制
818
  | 名称 | 备注 |
84dcab21   孙向锦   海亮定制
819
  | --- | --- |
92de8c2b   孙向锦   海亮定制
820
  | i = 60 | 文本下发 |
84dcab21   孙向锦   海亮定制
821
  | sn |键盘列表 |
043d31f7   孙向锦   海亮定制
822
  | cmd |下发的命令 <br> 1: 姓名下发 <br> 4: 第二行文本 <br> 85: 自判题判断  <br> 87: 清除 |
84dcab21   孙向锦   海亮定制
823
  | text |标题信息,以hex:开头添加的内容 内容为GBK的hex编码 |
94d3e689   孙向锦   海亮定制
824
  
84dcab21   孙向锦   海亮定制
825
826
  
  ```java
bee414de   孙向锦   海亮定制
827
828
829
   
   System.out.println(bytesToHexString("李四".getBytes("GBK")));
   
84dcab21   孙向锦   海亮定制
830
831
832
   public static String bytesToHexString(byte[] src) {
  	StringBuilder stringBuilder = new StringBuilder("");
  	if (src == null || src.length <= 0) {
107f06d8   孙向锦   海亮定制
833
  		return "";
84dcab21   孙向锦   海亮定制
834
835
836
837
838
839
840
841
842
843
844
845
846
  	}
  	for (int i = 0; i < src.length; i++) {
  		int v = src[i] & 0xFF;
  		String hv = Integer.toHexString(v);
  		if (hv.length() < 2) {
  			stringBuilder.append(0);
  		}
  		stringBuilder.append(hv);
  		stringBuilder.append("");
  	}
  	return stringBuilder.toString();
  }
  ```
fac0c011   孙向锦   添加海亮定制
847
  
fac0c011   孙向锦   添加海亮定制
848
849
  
        
92de8c2b   孙向锦   海亮定制
850
851
852
  #### 文本下发返回
  <br>主题: /client/${client}/report
  <br>指令内容:
84dcab21   孙向锦   海亮定制
853
854
  ```json
  {
73fb9953   孙向锦   update
855
  	"i": 61,
358ce6fb   孙向锦   修改en序号不重复
856
  	"en": "6",
92de8c2b   孙向锦   海亮定制
857
  	"cmd": 1,
84dcab21   孙向锦   海亮定制
858
  	"m": [{
92de8c2b   孙向锦   海亮定制
859
860
861
862
863
          "sn": "2126833671",
          "success": 0
  	},{
          "sn": "2126833672",
          "success": 0
84dcab21   孙向锦   海亮定制
864
865
866
  	}]
  }
  ```
92de8c2b   孙向锦   海亮定制
867
  | 名称 | 备注 |
84dcab21   孙向锦   海亮定制
868
  | --- | --- |
92de8c2b   孙向锦   海亮定制
869
870
871
  | i = 61 | 文本下发返回 |
  | sn |键盘号 |
  | cmd |下发的命令 <br> 1: 姓名下发 <br> 4: 第二行文本 <br> 85:自判题判断  <br> 87:清除 |
e16c5296   孙向锦   海亮定制
872
  | success | 是否成功。<br> 0 表示成功 <br> -1 失败 |
94d3e689   孙向锦   海亮定制
873
  
e16c5296   孙向锦   海亮定制
874
875
  ### 学生卡信息上报
  卡初始化组网的时候会上报一次
92de8c2b   孙向锦   海亮定制
876
877
  <br>主题:/client/${client}/report
  <br>指令内容:
e16c5296   孙向锦   海亮定制
878
879
880
881
882
883
884
885
886
887
888
889
890
  ```json
  {
      "i":32,
      "m":[
          {
              "c":"1873373905",
              "cv":"0.2.2",
              "hw":"67.0",
              "t":1638865040
          }
      ]
  }
  ```
92de8c2b   孙向锦   海亮定制
891
  | 名称 | 备注 |
e16c5296   孙向锦   海亮定制
892
893
894
895
896
897
  | --- | --- |
  | i = 32 | 学生卡信息上报 |
  | c |键盘编号 |
  | cv |固件版本号 |
  | hw |硬件版本号 |
  | t | 时间戳 |