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