diff --git a/通讯协议-平台化-应用部分[内部].md b/通讯协议-平台化-应用部分[内部].md
index cf714de..23276aa 100644
--- a/通讯协议-平台化-应用部分[内部].md
+++ b/通讯协议-平台化-应用部分[内部].md
@@ -32,7 +32,7 @@ SunVote 二次开发
通讯协议
-Ver 1.0.13
+Ver 1.0.14
@@ -48,7 +48,7 @@ Ver 1.0.13
-二〇二五年九月
+二〇二五年十二月
@@ -80,6 +80,7 @@ Ver 1.0.13
|1.0.11| 2025年7月30日|刘琴|1. 增加表决功能(暂只有三键表决)|
|1.0.12| 2025年9月4日|刘琴|1. 增加白名单模式下的键盘登录信息,用作上线信息的补充
2. 增加答题反馈事件中的时间戳返回
3. 修改拍照反馈及返回事件的接口参数|
|1.0.13| 2025年9月8日|刘琴|1. 增加基站连接事件返回字库版本
2. 增加单独读取基站字库版本接口
3. 修改设置读取键盘自动休眠等级和返回事件为外部指令|
+|1.0.14| 2025年12月2日|刘琴|1. 增加按键反馈事件的keyId返回
2. 增加数字选举相关接口|
@@ -118,7 +119,7 @@ WebSocket方式应用与SDK建立长连接后,通过WebSocket接口发送接
|get| 待机状态下获取参数属性状态及数据 |待机状态|
|set| 待机状态下设置参数属性状态及数据 |待机状态|
|start| 运行一个单进程业务实例(函数) |待机状态|
-|stop| 停止一个单进程业务实例(函数) |待机状态|
+|stop| 停止一个单进程业务实例(函数) |在线状态|
|rtXXX| 在线状态下可实时执行方法及函数 ||
## 事件说明
@@ -160,13 +161,11 @@ WebSocket方式应用与SDK建立长连接后,通过WebSocket接口发送接
|SDK连接 - 保持连接|设置心跳间隔|[setHeartbeatInterval](#setheartbeatinterval)|[fEvtHeartbeatInterval](#fevtheartbeatinterval)|
|SDK识别 - SDK版本|获取SDK版本|[getSdkVersion](#getsdkversion)|[fEvtSdkVersion](#fevtsdkversion)|
|SDK连接 - 终止连接|关闭SDK连接|[closeSdk](#closesdk)|-|
-
### 公共方法
可以在多种业务中调用的通用方法
|功能归类|功能|API指令|指令/系统事件|
|---|---|---|---|
|停止投票|可停止通过调用startXXX启动的答题业务|[stopKpVote](#stopkpvote)|[sEvtStateCode](#sevtstatecode)||
-
### 公共事件
无需调用指令,自动返回的事件
|功能归类|功能|API指令|指令/系统事件|
@@ -182,7 +181,6 @@ WebSocket方式应用与SDK建立长连接后,通过WebSocket接口发送接
|公共事件|键盘待机实时按键反馈|-|[sEvtKpRtFeedback](#sevtkprtfeedback)|
|公共事件|键盘举手键实时按键反馈|-|[sEvtKpHandUp](#sevtkphandup)|
|公共事件|遥控器实时按键反馈|-|[sEvtKpRemoteControl](#sevtkpremotecontrol)|
-
### 基站管理
|功能归类|功能|API指令|指令/系统事件|
|---|---|---|---|
@@ -336,7 +334,11 @@ WebSocket方式应用与SDK建立长连接后,通过WebSocket接口发送接
||清除自定义测验题型标题内容|[clearKpExamQuesTitle](#clearkpexamquestitle)|[sEvtStateCode](#sevtstatecode)
[fEvtClearKpExamQuesTitle](#fevtclearkpexamquestitle)|
|自定义科目名称|自定义科目名称|[setKpExamSubject](#setkpexamsubject)|[sEvtStateCode](#sevtstatecode)
[fEvtKpExamSubject](#fevtkpexamsubject)|
||清除自定义科目名称|[clearKpExamSubject](#clearkpexamsubject)|[sEvtStateCode](#sevtstatecode)
[fEvtClearKpExamSubject](#fevtclearkpexamsubject)|
-
+### 选举
+|功能归类|功能|API指令|指令事件|
+|---|---|---|---|
+|数字选举|启动数字选举|[startQADigitalElection](#startqadigitalelection)|[sEvtStateCode](#sevtstatecode)
[fEvtDigitalElection](#fevtdigitalelection)|
+||停止数字选举|[stopKpVote](#stopkpvote)|[sEvtStateCode](#sevtstatecode)|
## SDK管理
### 方法
#### heartbeat
@@ -478,11 +480,13 @@ WebSocket方式应用与SDK建立长连接后,通过WebSocket接口发送接
|-----|-----|-----|-----|-----|
|fun|string|-|是|事件类型|
|dataTag|string||否|数据包标识,不需要时可传空字符串|
+|baseSn|string||是|基站的出厂编码|
- **示例代码**
```json
{
"fun":"stopKpVote",
+ "baseSn":"2024061101",
"dataTag":"1"
}
```
@@ -713,6 +717,7 @@ WebSocket方式应用与SDK建立长连接后,通过WebSocket接口发送接
|baseSn|string||是|基站的出厂编码|
|data|array|-|是|传送参数的对象数组|
|++keySn|string||是|键盘SN|
+|++keyId|int||是|键盘编号,65535代表键盘未编号|
|++keyValue|string||是|键盘提交的按键值|
|++voltage|double||是|键盘电量|
|++retryCount|int||是|键盘提交数据的重发次数|
@@ -725,6 +730,7 @@ WebSocket方式应用与SDK建立长连接后,通过WebSocket接口发送接
"baseSn":"2024061101",
"data":[{
"keySn":"1234567890",
+ "keyId":1,
"keyValue":"A",
"voltage":2.6,
"retryCount":1
@@ -744,6 +750,7 @@ WebSocket方式应用与SDK建立长连接后,通过WebSocket接口发送接
|baseSn|string||是|基站的出厂编码|
|data|object|-|是|传送参数的对象|
|+keySn|string||是|举手的键盘SN|
+|+keyId|int||是|键盘编号,65535代表键盘未编号|
- **示例代码**
```json
@@ -752,7 +759,8 @@ WebSocket方式应用与SDK建立长连接后,通过WebSocket接口发送接
"dataTag":"1",
"baseSn":"2024061101",
"data":{
- "keySn":"1234567890"
+ "keySn":"1234567890",
+ "keyId":1
}
}
```
@@ -901,7 +909,7 @@ WebSocket方式应用与SDK建立长连接后,通过WebSocket接口发送接
"modelName":"BS200",
"version":"1.0.3",
"fontLibVer":"1.0.0",
- "baseSn":"2024041401"
+ "baseSn":"2024061101"
}
}
```
@@ -4775,8 +4783,47 @@ WebSocket方式应用与SDK建立长连接后,通过WebSocket接口发送接
##### [sEvtStateCode](#sevtstatecode)
发送指令后返回接收状态
-##### [fEvtKpSignIn](#fevtkpsignin)
-返回键盘提交的签到数据
+##### fEvtKpSignIn
+- **主题**:/basestation/{baseSn}/receive
+- **功能描述**:返回键盘提交签到信息
+- **参数说明**
+
+|参数名|类型|限制|非空|说明|
+|---|---|---|---|---|
+|fun|string|-|是|指令名称|
+|dataTag|string|-|否|数据包标识,可为空字符串|
+|baseSn|string||是|基站的出厂编码|
+|data|array|-|是|传送参数的对象数组|
+|++keySn|string||是|键盘SN|
+|++keyId|int||是|键盘编号,65535代表键盘未编号|
+|++keyValue|string||是|键盘提交的按键值|
+|++keyTime|double||是|答题时间,从启动开始计算,单位毫秒|
+|++voltage|double||是|键盘电量|
+|++retryCount|int||是|键盘提交数据的重发次数|
+|++timeStamp|long ||是|键盘提交数据至基站的时间戳|
+
+- **示例代码**
+
+```json
+{
+ "fun":"fEvtKpSignIn",
+ "dataTag":"1",
+ "baseSn":"2024061101",
+ "data": [{
+ "keySn": "1234567890",
+ "keyId": 1,
+ "keyValue":"1004",
+ "keyTime":3300
+ },
+ {
+ "keySn": "1234567891",
+ "keyId": 2,
+ "keyValue":"1003",
+ "keyTime":3320
+ }
+ ]
+}
+```
### 随时签到
#### 方法
@@ -4856,44 +4903,9 @@ WebSocket方式应用与SDK建立长连接后,通过WebSocket接口发送接
##### [sEvtStateCode](#sevtstatecode)
发送指令后返回接收状态
-##### fEvtKpSignIn
-- **主题**:/basestation/{baseSn}/receive
-- **功能描述**:返回键盘提交签到信息
-- **参数说明**
-
-|参数名|类型|限制|非空|说明|
-|---|---|---|---|---|
-|fun|string|-|是|指令名称|
-|dataTag|string|-|否|数据包标识,可为空字符串|
-|baseSn|string||是|基站的出厂编码|
-|data|array|-|是|传送参数的对象数组|
-|++keySn|string||是|键盘SN|
-|++keyValue|string||是|键盘提交的按键值|
-|++keyTime|double||是|答题时间,从启动开始计算,单位毫秒|
-|++voltage|double||是|键盘电量|
-|++retryCount|int||是|键盘提交数据的重发次数|
-|++timeStamp|long ||是|键盘提交数据至基站的时间戳|
-
-- **示例代码**
+##### [fEvtKpSignIn](#fevtkpsignin)
+返回键盘提交的签到数据
-```json
-{
- "fun":"fEvtKpSignIn",
- "dataTag":"1",
- "baseSn":"2024061101",
- "data": [{
- "keySn": "1234567890",
- "keyValue":"1004",
- "keyTime":3300
- },
- {
- "keySn": "1234567891",
- "keyValue":"1003",
- "keyTime":3320
- }
- ]
-}
-```
##### fEvtKpLoginAllowed
- **主题**:/basestation/{baseSn}/receive
- **功能描述**:返回键盘授权状态
@@ -4921,6 +4933,7 @@ WebSocket方式应用与SDK建立长连接后,通过WebSocket接口发送接
}
}
```
+
## 按键反馈
### 判断题
#### 方法
@@ -4979,6 +4992,7 @@ WebSocket方式应用与SDK建立长连接后,通过WebSocket接口发送接
|baseSn|string||是|基站的出厂编码|
|data|array|-|是|传送参数的对象数组|
|++keySn|string||是|键盘SN|
+|++keyId|int||是|键盘编号,65535代表键盘未编号|
|++keyValue|string||是|键盘提交的按键值
1-对
2-错|
|++keyTime|double||是|答题时间,从启动开始计算,单位毫秒|
|++voltage|double||是|键盘电量|
@@ -4994,6 +5008,7 @@ WebSocket方式应用与SDK建立长连接后,通过WebSocket接口发送接
"baseSn":"2024061101",
"data": [{
"keySn": "1234567890",
+ "keyId": 1,
"keyValue":"1",
"keyTime":2300
}
@@ -5063,6 +5078,7 @@ WebSocket方式应用与SDK建立长连接后,通过WebSocket接口发送接
|baseSn|string||是|基站的出厂编码|
|data|array|-|是|传送参数的对象数组|
|++keySn|string||是|键盘SN|
+|++keyId|int||是|键盘编号,65535代表键盘未编号|
|++keyValue|string||是|键盘提交的按键值|
|++keyTime|double||是|答题时间,从启动开始计算,单位毫秒|
|++voltage|double||是|键盘电量|
@@ -5078,6 +5094,7 @@ WebSocket方式应用与SDK建立长连接后,通过WebSocket接口发送接
"baseSn":"2024061101",
"data": [{
"keySn": "1234567890",
+ "keyId": 1,
"keyValue":"A",
"keyTime":2230
}]
@@ -5144,6 +5161,7 @@ WebSocket方式应用与SDK建立长连接后,通过WebSocket接口发送接
|baseSn|string||是|基站的出厂编码|
|data|array|-|是|传送参数的对象数组|
|++keySn|string||是|键盘SN|
+|++keyId|int||是|键盘编号,65535代表键盘未编号|
|++keyValue|string||是|键盘提交的按键值|
|++keyTime|double||是|答题时间,从启动开始计算,单位毫秒|
|++voltage|double||是|键盘电量|
@@ -5159,6 +5177,7 @@ WebSocket方式应用与SDK建立长连接后,通过WebSocket接口发送接
"baseSn":"2024061101",
"data":[{
"keySn": "1234567890",
+ "keyId": 1,
"keyValue":"10",
"keyTime":2230
}]
@@ -5218,6 +5237,7 @@ WebSocket方式应用与SDK建立长连接后,通过WebSocket接口发送接
|baseSn|string||是|基站的出厂编码|
|data|array|-|是|传送参数的对象数组|
|++keySn|string||是|键盘SN|
+|++keyId|int||是|键盘编号,65535代表键盘未编号|
|++keyValue|string||是|键盘提交的按键值|
|++keyTime|double||是|答题时间,从启动开始计算,单位毫秒|
|++voltage|double||是|键盘电量|
@@ -5233,6 +5253,7 @@ WebSocket方式应用与SDK建立长连接后,通过WebSocket接口发送接
"baseSn":"2024061101",
"data": [{
"keySn": "1234567890",
+ "keyId": 1,
"keyValue":"1",
"keyTime":2230
}]
@@ -5290,6 +5311,7 @@ WebSocket方式应用与SDK建立长连接后,通过WebSocket接口发送接
|baseSn|string||是|基站的出厂编码|
|data|array|-|是|传送参数的对象数组|
|++keySn|string||是|键盘SN|
+|++keyId|int||是|键盘编号,65535代表键盘未编号|
|++keyValue|string||是|键盘提交的按键值|
|++keyTime|double||是|答题时间,从启动开始计算,单位毫秒|
|++timeStamp|long ||是|键盘提交数据至基站的时间戳|
@@ -5302,6 +5324,7 @@ WebSocket方式应用与SDK建立长连接后,通过WebSocket接口发送接
"baseSn":"2024061101",
"data": [{
"keySn": "1234567890",
+ "keyId": 1,
"keyValue":"hello",
"keyTime":3260
}]
@@ -5459,6 +5482,7 @@ WebSocket方式应用与SDK建立长连接后,通过WebSocket接口发送接
|baseSn|string||是|基站的出厂编码|
|data|array|-|是|传送参数的对象数组|
|++keySn|string||是|键盘SN|
+|++keyId|int||是|键盘编号,65535代表键盘未编号|
|++keyValue|string||是|键盘提交的按键值
1-赞成
2-反对
3-弃权|
|++keyTime|double||是|答题时间,从启动开始计算,单位毫秒|
|++voltage|double||是|键盘电量|
@@ -5474,6 +5498,7 @@ WebSocket方式应用与SDK建立长连接后,通过WebSocket接口发送接
"baseSn":"2024061101",
"data": [{
"keySn": "1234567890",
+ "keyId": 1,
"keyValue":"1",
"keyTime":2300
}
@@ -5762,6 +5787,7 @@ WebSocket方式应用与SDK建立长连接后,通过WebSocket接口发送接
|baseSn|string||是|基站的出厂编码|
|data|object|-|是|传送参数的对象|
|+keySns|array||是|指定的键盘SN数组,空数组表示全部在线键盘|
+|+mode|int||是|拍照模式(预留)
0 - 自动提交
1 - 普通拍照(默认模式)|
|+tip|string||否|提示的标题,长度不超过16字符|
|+questions|array||是|需要提交照片列表, 最多9张照片|
|++index|int||是|照片的序号,1-9|
@@ -5775,6 +5801,7 @@ WebSocket方式应用与SDK建立长连接后,通过WebSocket接口发送接
"baseSn":"2024061101",
"data": {
"keySns": [],
+ "mode": 1,
"tip": "请拍照提交",
"questions": [{
"index":1,
@@ -6034,31 +6061,6 @@ WebSocket方式应用与SDK建立长连接后,通过WebSocket接口发送接
##### [stopKpVote](#stopkpvote)
停止在线测验
-##### rtKpAllowEdited
-- **主题**:/client/{baseSn}/send
-- **功能描述**:键盘提交后,允许键盘修改答案
-- **参数说明**
-
-|参数名|类型|限制|是否必填|说明|
-|---|---|---|---|---|
-|fun|string|-|是|指令名称|
-|dataTag|string|-|否|数据包标识,可为空字符串|
-|baseSn|string||是|基站的出厂编码|
-|data|object|-|是|传送参数的对象|
-|+keySns|array||是|指定的键盘SN数组,空数组表示全部在线键盘|
-
-- **示例代码**
-
-```json
-{
- "fun":"rtKpAllowEdited",
- "dataTag":"1",
- "baseSn":"2024061101",
- "data":{
- "keySns":["1234567890","1234567891"]
- }
-}
-```
#### 事件
##### [sEvtStateCode](#sevtstatecode)
发送指令后返回接收状态
@@ -6075,6 +6077,7 @@ WebSocket方式应用与SDK建立长连接后,通过WebSocket接口发送接
|baseSn|string||是|基站的出厂编码|
|data|array|-|是|传送参数的对象数组|
|++keySn|string||是|键盘SN|
+|++keyId|int||是|键盘编号,65535代表键盘未编号|
|++keyValue|string||是|键盘提交的按键值,1:A;2:B表示第1题提交A,第二题提交B
注意:如启动的是多科测验,键盘提交的题目序号对应启动时下发的题目总序号,不按科目区分|
|++keyTime|double||是|答题时间,从启动开始计算,单位毫秒|
|++voltage|double||是|键盘电量|
@@ -6090,11 +6093,13 @@ WebSocket方式应用与SDK建立长连接后,通过WebSocket接口发送接
"baseSn":"2024061101",
"data": [{
"keySn": "1234567890",
+ "keyId": 1,
"keyValue":"1:A;2:B",
"keyTime":3200
},
{
"keySn": "1234567891",
+ "keyId": 2,
"keyValue":"1:B;2:B",
"keyTime":3500
}
@@ -6278,6 +6283,7 @@ WebSocket方式应用与SDK建立长连接后,通过WebSocket接口发送接
|baseSn|string||是|基站的出厂编码|
|data|array|-|是|传送参数的对象数组|
|++keySn|string||是|键盘SN|
+|++keyId|int||是|键盘编号,65535代表键盘未编号|
|++keyValue|string||是|键盘提交的分值,1:10;2:0表示第1题提交10分,第二题提交0分|
|++keyTime|double||是|录分时间,从启动录分开始计算,单位毫秒|
|++voltage|double||是|键盘电量|
@@ -6292,11 +6298,13 @@ WebSocket方式应用与SDK建立长连接后,通过WebSocket接口发送接
"baseSn":"2024061101",
"data": [{
"keySn": "1234567890",
+ "keyId": 1,
"keyValue":"1:8;2:7.5;3:2;4:3",
"keyTime":3200
},
{
"keySn": "1234567891",
+ "keyId": 2,
"keyValue":"1:10;2:0",
"keyTime":3500
}
@@ -6600,3 +6608,91 @@ WebSocket方式应用与SDK建立长连接后,通过WebSocket接口发送接
}
```
+## 选举
+### 数字选举
+#### 方法
+##### startQADigitalElection
+- **主题**:/client/{baseSn}/send
+- **功能描述**:启动数字选举
+- **参数说明**
+
+|参数名|类型|限制|是否必填|说明|
+|---|---|---|---|---|
+|fun|string|-|是|指令名称|
+|dataTag|string|-|否|数据包标识,可为空字符串|
+|baseSn|string||是|基站的出厂编码|
+|data|object|-|是|传送参数的对象|
+|+allowModify|int||是|0 - 不允许修改
1 - 允许修改|
+|+allowRepeat|int||是|0 - 不允许重复输入
1 - 允许重复输入|
+|+isSecrecy|int||是|0 - 不保密|
+|+lessMode|int||是|0 - 允许缺选(可不选满最少人数)
1 - 不允许缺选(需选满最少人数)|
+|+maxSelect|int||是|最多可选人数,1-99|
+|+minSelect|int||是|最少需选人数,1-99,≤最多可选人数,不可缺选时需选满最少人数才能提交|
+|+abstainNum|int||否|弃权数字,最大999,在序号1输入该数字代表弃权,其他序号为正常输入,不传此参数代表不启用,不能与空白数字相同|
+|+blankNum|int||否|空白数字,最大999,在序号1输入该数字代表全部空白票,不传此参数代表不启用,不能与弃权数字相同|
+|+numberRanges|string||是|可以输入的数字范围,格式如"1-100,203,210,300-500"
"-"表示连续的数字,单独数字的用","分隔,可输入的数字最大不超过999|
+|+simParams|object||否|内部模拟测试参数设置对象|
+|++answer|string||是|预设提交的按键起始值,如设置100,最多可选人数设置了30,则依次提交从100-129|
+
+- **示例代码**
+```json
+{
+ "fun":"startQADigitalElection",
+ "dataTag":"1",
+ "baseSn":"2024061101",
+ "data": {
+ "allowModify": 1,
+ "allowRepeat": 1,
+ "isSecrecy": 0,
+ "lessMode": 1,
+ "maxSelect":10,
+ "minSelect":1,
+ "abstainNum":777,
+ "blankNum":999,
+ "numberRanges":"1-200,203,210,300-500",
+ "simParams":{
+ "answer":"100"
+ }
+ }
+}
+```
+
+##### [stopKpVote](#stopkpvote)
+停止投票
+
+#### 事件
+##### [sEvtStateCode](#sevtstatecode)
+发送指令后返回接收状态
+
+##### fEvtDigitalElection
+- **主题**:/basestation/{baseSn}/receive
+- **功能描述**:返回键盘提交的选举数字
+- **参数说明**
+
+|参数名|类型|限制|非空|说明|
+|---|---|---|---|---|
+|fun|string|-|是|指令名称|
+|dataTag|string|-|否|数据包标识,可为空字符串|
+|baseSn|string||是|基站的出厂编码|
+|data|array|-|是|传送参数的对象数组|
+|++keySn|string||是|键盘SN|
+|++keyId|int||是|键盘编号,65535代表键盘未编号|
+|++index|int||是|提交的选票序号|
+|++value|string||是|键盘提交的按键值,为空字符串代表删除了按键值或跳过|
+|++submitted|int||是|0-未提交,1-提交完成|
+
+- **示例代码**
+```json
+{
+ "fun":"fEvtDigitalElection",
+ "dataTag":"1",
+ "baseSn":"2024061101",
+ "data": [{
+ "keySn": "1479824643",
+ "keyId": 1,
+ "index": 1,
+ "value":"123",
+ "submitted":0
+ }]
+}
+```
\ No newline at end of file