diff --git a/通讯协议-平台化-应用部分[内部].md b/通讯协议-平台化-应用部分[内部].md
index 6c1d7ba..5d8d859 100644
--- a/通讯协议-平台化-应用部分[内部].md
+++ b/通讯协议-平台化-应用部分[内部].md
@@ -32,7 +32,7 @@ SunVote 二次开发
通讯协议
-Ver 1.0.11
+Ver 1.0.12
@@ -48,7 +48,7 @@ Ver 1.0.11
-二〇二五年七月
+二〇二五年九月
@@ -78,6 +78,7 @@ Ver 1.0.11
|1.0.9| 2025年7月17日|刘琴|1. 基站自检项增加字库检测
2. 键盘扫描指令增加键盘id返回
3. 修改设置键盘ID和返回事件为外部指令|
|1.0.10| 2025年7月24日|刘琴|1. 增加写键盘OEM型号名称|
|1.0.11| 2025年7月30日|刘琴|1. 增加表决功能(暂只有三键表决)|
+|1.0.12| 2025年9月4日|刘琴|1. 增加白名单模式下的键盘登录信息,用作上线信息的补充
2. 增加答题反馈事件中的时间戳返回
3. 修改拍照反馈及返回事件的接口参数|
@@ -173,6 +174,7 @@ WebSocket方式应用与SDK建立长连接后,通过WebSocket接口发送接
|公共事件|基站连接状态变化|-|[sEvtBsConnectState](#sevtbsconnectstate)|
|公共事件|基站信道冲突|-|[sEvtBsChannelConflict](#sevtbschannelconflict)|
|公共事件|键盘上线通知|-|[sEvtBsKpOnlineMsg](#sevtbskponlinemsg)|
+|公共事件|键盘登入通知|-|[sEvtBsKpLoginMsg](#sevtbskploginmsg)|
|公共事件|键盘离线通知|-|[sEvtBsKpOfflineMsg](#sevtbskpofflinemsg)|
|公共事件|键盘刷卡事件|-|[sEvtBsNfcResults](#sevtbsnfcresults)|
|公共事件|在线键盘列表|-|[sEvtBsKpOnlineList](#sevtbskponlinelist)|
@@ -317,17 +319,16 @@ WebSocket方式应用与SDK建立长连接后,通过WebSocket接口发送接
### 拍照反馈
|功能归类|功能|API指令|指令事件|
|---|---|---|---|
-|拍照反馈-单题拍照反馈|启动单题拍照反馈|[startQAPhoto](#startqaphoto)|[sEvtStateCode](#sevtstatecode)
[fEvtPhotoFile](#fEvtphotofile)|
-||停止单题拍照反馈|[stopKpVote](#stopkpvote)|[sEvtStateCode](#sevtstatecode)|
+|拍照反馈|启动拍照反馈|[startQAPhoto](#startqaphoto)|[sEvtStateCode](#sevtstatecode)
[fEvtPhotoFile](#fEvtphotofile)|
+||停止拍照反馈|[stopKpVote](#stopkpvote)|[sEvtStateCode](#sevtstatecode)|
### 在线测验
|功能归类|功能|API指令|指令事件|
|---|---|---|---|
-|标准测验|启动标准测验|[startKpExam](#startkpexam)|[sEvtStateCode](#sevtstatecode)
[fEvtKpExam](#fevtkpexam)
[fEvtFinalSubmit](#fevtfinalsubmit)|
+|标准测验|启动标准测验|[startKpExam](#startkpexam)|[sEvtStateCode](#sevtstatecode)
[fEvtKpExam](#fevtkpexam)|
||停止标准测验|[stopKpVote](#stopkpvote)|[sEvtStateCode](#sevtstatecode)|
-||允许键盘提交后退回修改|[rtAllowEdited](#rtkpallowedited)|[sEvtStateCode](#sevtstatecode)
[fEvtFinalSubmit](#fevtfinalsubmit)|
-|多科测验|启动多科测验|[startKpMultiExam](#startkpmultiexam)|[sEvtStateCode](#sevtstatecode)
[fEvtKpExam](#fevtkpexam)
[fEvtFinalSubmit](#fevtfinalsubmit)|
-||停止标准测验|[stopKpVote](#stopkpvote)|[sEvtStateCode](#sevtstatecode)|
-|自主录分|启动自主录分|[startKpScoreInput](#startkpscoreinput)|[sEvtStateCode](#sevtstatecode)
[fEvtKpScore](#fevtkpscore)
[fEvtFinalSubmit](#fevtfinalsubmit)|
+|多科测验|启动多科测验|[startKpMultiExam](#startkpmultiexam)|[sEvtStateCode](#sevtstatecode)
[fEvtKpExam](#fevtkpexam)|
+||停止多科测验|[stopKpVote](#stopkpvote)|[sEvtStateCode](#sevtstatecode)|
+|自主录分|启动自主录分|[startKpScoreInput](#startkpscoreinput)|[sEvtStateCode](#sevtstatecode)
[fEvtKpScore](#fevtkpscore)|
||停止自主录分|[stopKpVote](#stopkpvote)|[sEvtStateCode](#sevtstatecode)|
|自定义测验题型标题|自定义测验题型标题内容|[setKpExamQuesTitle](#setkpexamquestitle)|[sEvtStateCode](#sevtstatecode)
[fEvtKpExamQuesTitle](#fevtkpexamquestitle)|
||清除自定义测验题型标题内容|[clearKpExamQuesTitle](#clearkpexamquestitle)|[sEvtStateCode](#sevtstatecode)
[fEvtClearKpExamQuesTitle](#fevtclearkpexamquestitle)|
@@ -607,6 +608,35 @@ WebSocket方式应用与SDK建立长连接后,通过WebSocket接口发送接
}
```
+### sEvtBsKpLoginMsg
+- **主题**: /basestation/{baseSN}/receive
+- **功能描述**:键盘登入的通知信息,用作上线信息的补充
+- **参数说明**
+
+|参数名|类型|限制|非空|说明|
+|---|---|---|---|---|
+|fun|string|-|是|事件名称|
+|dataTag|string|-|否|数据包标识|
+|baseSn|string||是|基站的出厂编码|
+|data|object|-|是|传送参数的对象|
+|+keySn|string||是|键盘SN|
+|+version|string||是|键盘固件版本|
+|+model|int||是|键盘型号|
+
+- **示例代码**
+```json
+{
+ "fun":"sEvtBsKpLoginMsg",
+ "dataTag":"1",
+ "baseSn":"2024061101",
+ "data":{
+ "keySn":"1234567890",
+ "version":"1.0.0",
+ "model":67
+ }
+}
+```
+
### sEvtBsKpOfflineMsg
- **主题**: /basestation/{baseSN}/receive
- **功能描述**:单个键盘离线通知,主动上报
@@ -3515,7 +3545,7 @@ WebSocket方式应用与SDK建立长连接后,通过WebSocket接口发送接
|baseSn|string||是|基站的出厂编码|
|data|object|-|是|传送参数的对象|
|+keySns|array||否|需要执行指令的键盘SN数组,空数组表示所有键盘|
-|+value|string||是|OEM定制型号名称,不超过16个字符|
+|+value|string||是|OEM定制型号名称,不超过11个字符|
- **示例代码**
```json
@@ -3795,7 +3825,7 @@ WebSocket方式应用与SDK建立长连接后,通过WebSocket接口发送接
|dataTag|string|-|否|数据包标识,可为空字符串|
|baseSn|string||是|基站的出厂编码|
|data|object|-|是|传送参数的对象数组|
-|+keySns|array||否|需要清除分数的键盘SN数组
空数组表示清空所有键盘|
+|+keySns|array||否|需要清除分数的键盘SN数组|
- **示例代码**
@@ -4791,6 +4821,7 @@ WebSocket方式应用与SDK建立长连接后,通过WebSocket接口发送接
|++keyTime|double||是|答题时间,从启动开始计算,单位毫秒|
|++voltage|double||是|键盘电量|
|++retryCount|int||是|键盘提交数据的重发次数|
+|++timeStamp|long ||是|键盘提交数据至基站的时间戳|
- **示例代码**
@@ -4901,6 +4932,7 @@ WebSocket方式应用与SDK建立长连接后,通过WebSocket接口发送接
|++keyTime|double||是|答题时间,从启动开始计算,单位毫秒|
|++voltage|double||是|键盘电量|
|++retryCount|int||是|键盘提交数据的重发次数|
+|++timeStamp|long ||是|键盘提交数据至基站的时间戳|
- **示例代码**
@@ -4984,6 +5016,7 @@ WebSocket方式应用与SDK建立长连接后,通过WebSocket接口发送接
|++keyTime|double||是|答题时间,从启动开始计算,单位毫秒|
|++voltage|double||是|键盘电量|
|++retryCount|int||是|键盘提交数据的重发次数|
+|++timeStamp|long ||是|键盘提交数据至基站的时间戳|
- **示例代码**
@@ -5064,6 +5097,7 @@ WebSocket方式应用与SDK建立长连接后,通过WebSocket接口发送接
|++keyTime|double||是|答题时间,从启动开始计算,单位毫秒|
|++voltage|double||是|键盘电量|
|++retryCount|int||是|键盘提交数据的重发次数|
+|++timeStamp|long ||是|键盘提交数据至基站的时间戳|
- **示例代码**
@@ -5137,6 +5171,7 @@ WebSocket方式应用与SDK建立长连接后,通过WebSocket接口发送接
|++keyTime|double||是|答题时间,从启动开始计算,单位毫秒|
|++voltage|double||是|键盘电量|
|++retryCount|int||是|键盘提交数据的重发次数|
+|++timeStamp|long ||是|键盘提交数据至基站的时间戳|
- **示例代码**
@@ -5206,6 +5241,7 @@ WebSocket方式应用与SDK建立长连接后,通过WebSocket接口发送接
|++keySn|string||是|键盘SN|
|++keyValue|string||是|键盘提交的按键值|
|++keyTime|double||是|答题时间,从启动开始计算,单位毫秒|
+|++timeStamp|long ||是|键盘提交数据至基站的时间戳|
- **示例代码**
```json
@@ -5354,7 +5390,7 @@ WebSocket方式应用与SDK建立长连接后,通过WebSocket接口发送接
```
##### [stopKpVote](#stopkpvote)
-停止判断题答题
+停止表决
#### 事件
##### [sEvtStateCode](#sevtstatecode)
@@ -5376,6 +5412,7 @@ WebSocket方式应用与SDK建立长连接后,通过WebSocket接口发送接
|++keyTime|double||是|答题时间,从启动开始计算,单位毫秒|
|++voltage|double||是|键盘电量|
|++retryCount|int||是|键盘提交数据的重发次数|
+|++timeStamp|long ||是|键盘提交数据至基站的时间戳|
- **示例代码**
@@ -5661,7 +5698,7 @@ WebSocket方式应用与SDK建立长连接后,通过WebSocket接口发送接
## 拍照反馈
### 方法
-#### 单题拍照反馈
+#### 拍照反馈
##### startQAPhoto
- **主题**:/client/{baseSN}/send
- **功能描述**:启动单题拍照反馈
@@ -5674,6 +5711,10 @@ WebSocket方式应用与SDK建立长连接后,通过WebSocket接口发送接
|baseSn|string||是|基站的出厂编码|
|data|object|-|是|传送参数的对象|
|+keySns|array||是|指定的键盘SN数组,空数组表示全部在线键盘|
+|+tip|string||否|提示的标题,长度不超过16字符|
+|+questions|array||是|需要提交照片列表, 最多9张照片|
+|++index|int||是|照片的序号,1-9|
+|++info|string||否|拍照的描述,如第10题-阅读理解,长度不超过20个字符|
- **示例代码**
```json
@@ -5682,7 +5723,21 @@ WebSocket方式应用与SDK建立长连接后,通过WebSocket接口发送接
"dataTag":"1",
"baseSn":"2024061101",
"data": {
- "keySns": []
+ "keySns": [],
+ "tip": "请拍照提交",
+ "questions": [{
+ "index":1,
+ "info":"试卷1-A面左侧"
+ }, {
+ "index":2,
+ "info":"试卷1-A面右侧"
+ }, {
+ "index":3,
+ "info":"试卷1-B面左侧"
+ }, {
+ "index":4,
+ "info":"试卷1-B面右侧"
+ }]
}
}
```
@@ -5706,6 +5761,7 @@ WebSocket方式应用与SDK建立长连接后,通过WebSocket接口发送接
|baseSn|string||是|基站的出厂编码|
|data|array|-|是|传送参数的对象数组|
|++keySn|string||是|键盘SN|
+|++index|int||是|提交的照片序号,对应启动的题目列表中的index|
|++filePath|string||是|键盘提交图片文件的路径|
- **示例代码**
@@ -5716,6 +5772,7 @@ WebSocket方式应用与SDK建立长连接后,通过WebSocket接口发送接
"baseSn":"2024061101",
"data": [{
"keySn": "1479824643",
+ "index": 1,
"filePath":"D:\\SunVoteSDK\\photo\\20250502\\photo_1479824643_1635832534000.jpg"
}]
}
@@ -5971,6 +6028,7 @@ WebSocket方式应用与SDK建立长连接后,通过WebSocket接口发送接
|++keyTime|double||是|答题时间,从启动开始计算,单位毫秒|
|++voltage|double||是|键盘电量|
|++retryCount|int||是|键盘提交数据的重发次数|
+|++timeStamp|long ||是|键盘提交数据至基站的时间戳|
- **示例代码**
@@ -5992,35 +6050,6 @@ WebSocket方式应用与SDK建立长连接后,通过WebSocket接口发送接
]
}
```
-##### fEvtFinalSubmit
-- **主题**:/basestation/{baseSN}/receive
-- **功能描述**:返回键盘手动交卷标识
-- **参数说明**
-
-|参数名|类型|限制|非空|说明|
-|---|---|---|---|---|
-|fun|string|-|是|指令名称|
-|dataTag|string|-|否|数据包标识,可为空字符串|
-|baseSn|string||是|基站的出厂编码|
-|data|array|-|是|传送参数的对象数组|
-|++keySn|string||是|键盘SN|
-|++keyValue|string||是|0 - 未提交(提交完成后,允许键盘修改答案时上报)
1 - 已交卷|
-|++keyTime|double||是|提交时间,从启动开始计算,单位毫秒|
-
-- **示例代码**
-
-```json
-{
- "fun":"fEvtFinalSubmit",
- "dataTag":"1",
- "baseSn":"2024061101",
- "data": [{
- "keySn": "1234567890",
- "keyValue":"1",
- "keyTime":3200
- }]
-}
-```
### 多科测验
#### 方法
@@ -6132,9 +6161,6 @@ WebSocket方式应用与SDK建立长连接后,通过WebSocket接口发送接
##### [fEvtKpExam](#fevtkpexam)
返回测验中键盘提交答题数据
-##### [fEvtFinalSubmit](#fevtfinalsubmit)
-返回键盘手动交卷标识
-
### 自主录分
#### 方法
##### startKpScoreInput
@@ -6205,6 +6231,7 @@ WebSocket方式应用与SDK建立长连接后,通过WebSocket接口发送接
|++keyTime|double||是|录分时间,从启动录分开始计算,单位毫秒|
|++voltage|double||是|键盘电量|
|++retryCount|int||是|键盘提交数据的重发次数|
+|++timeStamp|long ||是|键盘提交数据至基站的时间戳|
- **示例代码**
```json
@@ -6230,7 +6257,7 @@ WebSocket方式应用与SDK建立长连接后,通过WebSocket接口发送接
#### 方法
##### setKpExamQuesTitle
- **主题**:/client/{baseSN}/send
-- **功能描述**:设置自定义测验题题型标题,键盘需在线才能接收成功。
设置完成后启动测验,对应的题型显示为设置的自定义标题。
题型标题相对固定,下发成功后键盘会保存标题,标题无变化时无需重复下发
+- **功能描述**:设置自定义测验题题型标题,键盘需在线才能接收成功。
设置完成后启动测验,对应的题型显示为设置的自定义标题。
题型标题相对固定,下发成功后键盘会保存标题,标题无变化时无需重复下发。
如果没有指定键盘进行下发,基站需要一段时间进行下发的操作,强烈建议将下发操作提前完成,以免影响正常的答题流程。
- **参数说明**
|参数名|类型|限制|是否必填|说明|
@@ -6378,7 +6405,7 @@ WebSocket方式应用与SDK建立长连接后,通过WebSocket接口发送接
#### 方法
##### setKpExamSubject
- **主题**:/client/{baseSN}/send
-- **功能描述**:设置自定义科目名称,键盘需在线才能接收成功。
设置完成后启动多科测验,对应的科目显示为设置的自定义科目名称。
科目名称相对固定,下发成功后键盘会保存科目名称,无变化时无需重复下发
+- **功能描述**:设置自定义科目名称,键盘需在线才能接收成功。
设置完成后启动多科测验,对应的科目显示为设置的自定义科目名称。
科目名称相对固定,下发成功后键盘会保存科目名称,无变化时无需重复下发。
如果没有指定键盘进行下发,基站需要一段时间进行下发的操作,强烈建议将下发操作提前完成,以免影响正常的答题流程。
- **参数说明**
|参数名|类型|限制|是否必填|说明|
diff --git a/通讯协议-教育新版-表决器部分.md b/通讯协议-教育新版-表决器部分.md
index 7c87bd4..1c4ce24 100644
--- a/通讯协议-教育新版-表决器部分.md
+++ b/通讯协议-教育新版-表决器部分.md
@@ -3243,11 +3243,10 @@ AES加密格式
| **字节** | **标识符** | **描述** |
| --- | --- | --- |
| 1 | CMD | 3 透传数据 |
-| 2 | LEN | 数据内容[Data]长度 |
-| 1 | Broadcast Number | 值等于datapos 透传数据编号 1-255 由软件确定是那一轮投票datapos的对应的广播|
-| 12 | NULL | 预留 |
+| 2 | LEN | 数据内容[Data] + 1 长度 保持前面16个字节偏移 |
+| 13 | NULL | 预留 |
+| 1 | Broadcast Number | 值等于datapos 透传数据编号 1-255 由软件确定是那一轮投票datapos的对应的广播 涵盖在Data内的第一字节|
| N | Data | 数据内容|
-
#### 6.6.2.3 数据表内容数据
| **字节** | **标识符** | **描述** |