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 | 942 | \ No newline at end of file | ... | ... |