diff --git a/通讯协议-B200W-MQTT协议[外].md b/通讯协议-B200W-MQTT协议[外].md
new file mode 100644
index 0000000..12e9287
--- /dev/null
+++ b/通讯协议-B200W-MQTT协议[外].md
@@ -0,0 +1,1855 @@
+
+# SunVote B200W MQTT通讯协议
+
+[TOC]
+
+
+
+# 开发流程
+
+C200K基站,采用MQTT协议进行开发,基站接入MQTT服务器,应用从MQTT服务器下发指令和接收数据
+
+整个交互图如下:
+
+
+
+
+## MQTT服务器准备
+
+MQTT服务器要求:
+
+厂家使用EMQX 进行测试
+
+能够正常收发MQTT数据。
+
+服务器的性能参数由业务决定。
+
+域名:
+
+公网域名或ip或者基站所处局域网ip。
+
+MQTT服务器配置结果检查
+
+使用MQTT.FX客户端,配置域名,端口,用户名和密码信息,然后连接,如果提示连接成功,则表示MQTT服务器可用。基站clientid 是基站编号。
+
+
+
+
+## 2.2 基站配置
+
+通过USB连接基站,打开基站服务器配置软件。
+
+
+
+如果基站没有连接电脑,工具显示检测基站中,这时候读写无效。
+
+连接正常后,按照各个信息进行写入。
+
+设置基站服务器域名(ip)、端口,用户信息、密码信息,写入基站。
+
+如果MQTT服务器没有启用用户密码验证,用户密码信息可以随机设置。
+
+拔掉USB,连接网线,接入网络,查看网络是否连接正常。(基站上面的灯是否蓝色闪烁)
+
+基站说明
+
+
+
+# 功能说明
+
+## 主题说明
+\${baseSN}为指定的基站的SN编码,不能为空,接收基站反馈数据需要订阅对应基站SN的接收主题。
+### 发布的主题
+应用程序发布的主题,基站订阅
+/client/\${baseSN}/send
+/client/multiBase/send
+
+### 订阅的主题
+应用程序订阅的主题,基站发布
+/basestation/\\${baseSN}/receive
+/basestation/multiBase/receive
+
+## 指令说明
+|指令功能标识 |说明 |约束|
+|---|---|---|
+|get| 待机状态下获取参数属性状态及数据 |待机状态|
+|set| 待机状态下设置参数属性状态及数据 |待机状态|
+|start| 运行一个单进程业务实例(函数) |待机状态|
+|stop| 停止一个单进程业务实例(函数) |待机状态|
+|rtXXX| 在线状态下可实时执行方法及函数 ||
+
+## 事件说明
+|事件标识| 说明| 约束|
+|---|---|---|
+|sEvtXXX|系统事件 |自动返回|
+|fEvtXXX|指令事件 |调用对应指令后返回|
+
+## 数据格式约定
+- 数据格式统一为**Json**格式,MQTT发送接收消息编码统一为**UTF-8**
+- Json通用格式如下:
+```json
+ {
+ "fun":"xxx",
+ "dataTag":"xxx",
+ "data":{
+ //内容
+ }
+ }
+```
+|参数 |说明 |约束|
+|---|---|---|
+|fun| 指令或事件名称||
+|dataTag| 数据标签,用于对应收发数据|长度不超过4,可为0-9a-zA-Z的组合|
+|data| 数据内容|对象或者数组,可为空|
+
+
+## 功能速查一览表
+### 基站管理
+|功能归类|功能|API指令|指令/系统事件|
+|---|---|---|---|
+|基站连接 - 获取在线基站|主动获取在线基站信息
不确定基站SN时|[getBsOnlineState](#getbsonlinestate)|[fEvtBsOnlineState](#fevtbsonlinestate)||
+|基站连接 - 主动获取状态|主动获取基站连接状态|[getBsConnectState](#getbsconnectstate)|[sEvtBsConnectState](#sevtbsconnectstate)||
+|基站连接 - 自动获取状态|基站连接变化系统通知|-|[sEvtBsConnectState](#sevtbsconnectstate)||
+|基站授时|对基站授时用于校准时间|[timeSync](#timesync)|[sEvtStateCode](#sevtstatecode)||
+|键盘上线通知|单个键盘上线系统通知|-|[sEvtBsKpOnlineMsg](#sevtbskponlinemsg)||
+|识别设置 - 基站型号|读取基站型号|[getBsModel](#getbsmodel)|[fEvtBsModel](#fevtbsmodel)|
+|识别设置 - 固件版本|获取基站固件版本|[getBsFWVersion](#getbsfwversion)|[fEvtBsFWVersion](#fevtbsfwversion)|
+|组网设置 - 配对码|获取基站配对码|[getBsPairCode](#getbspaircode)|[fEvtBsPairCode](#fevtbspaircode)|
+|组网设置 - 刷卡配对状态|获取刷卡配对状态|[getBsNfcLogin](#getbsnfclogin)|[fEvtBsNfcLogin](#fevtbsnfclogin)|
+||设置刷卡配对状态|[setBsNfcLogin](#setbsnfclogin)|[fEvtBsNfcLogin](#fevtbsnfclogin)||
+|组网设置 - 工作信道|获取基站工作信道|[getBsChannel](#getbschannel)|[fEvtBsChannel](#fevtbschannel)|
+||设置基站工作信道|[setBsChannel](#setbschannel)|[fEvtBsChannel](#fevtbschannel)||
+|登录设置 - 登录名称|获取基站登录名称|[getBsSSID](#getbsssid)|[fEvtBsSSID](#fevtbsssid)|
+||设置基站登录名称|[setBsSSID](#setbsssid)|[fEvtBsSSID](#fevtbsssid)||
+|键盘统一设置 - 键盘语言|获取键盘语言|[getBsKpLanguage](#getbskplanguage)|[fEvtBsKpLanguage](#fevtbskplanguage)|
+||设置键盘语言|[setBsKpLanguage](#setbskplanguage)|[fEvtBsKpLanguage](#fevtbskplanguage)||
+|网络设置 - TCP/IP参数|获取TCP/IP参数|[getBsTcpipParams](#getbstcpipparams)|[fEvtBsTcpipParams](#fevtbstcpipparams)|
+||设置TCP/IP参数|[setBsTcpipParams](#setbstcpipparams)|[fEvtBsTcpipParams](#fevtbstcpipparams)||
+|网络设置 - MQTT参数|获取MQTT参数|[getBsMqttParams](#getbsmqttparams)|[fEvtBsMqttParams](#fevtbsmqttparams)|
+||设置MQTT参数|[setBsMqttParams](#setbsmqttparams)|[fEvtBsMqttParams](#fevtbsmqttparams)||
+|基站维护|获取基站日志信息|[getBsLogInfo](#getbsloginfo)|[sEvtStateCode](#sevtstatecode)|
+### 键盘管理
+|功能归类|功能|API指令|指令事件|
+|---|---|---|---|
+|交互设置 - 用户实时提示信息|实时设置提示反馈信息|[rtSetKpUserPrompt](#rtsetkpuserprompt)|[sEvtStateCode](#sevtstatecode)
[fEvtSetKpUserPrompt](#fevtsetkpuserprompt)|
+|在线状态获取|开启扫描在线键盘|[startGetKpOnline](#startgetkponline)|[sEvtStateCode](#sevtstatecode)
[sEvtBsKpOnlineMsg](#sevtbskponlinemsg)|
+||停止扫描在线键盘|[stopGetKpOnline](#stopgetkponline)|[sEvtStateCode](#sevtstatecode)|
+|维护功能 - 遥控功能|遥控键盘休眠|[remoteKpSleep](#remotekpsleep)|[sEvtStateCode](#sevtstatecode)|
+### 绑定
+|功能归类|功能|API指令|指令事件|
+|---|---|---|---|
+|无线绑定|设置绑定信息到键盘|[rtSetKpBindingInfo](#rtsetkpbindinginfo)|[sEvtStateCode](#sevtstatecode)
[fEvtKpBindingInfo](#fevtkpbindinginfo)|
+||清除键盘绑定信息|[clearKpBindingInfo](#clearkpbindinginfo)|[sEvtStateCode](#sevtstatecode)
[fEvtClearKpBindingInfo](#fevtclearkpbindinginfo)|
+### 签到
+|功能归类|功能|API指令|指令事件|
+|---|---|---|---|
+|随时签到|启动随时签到|[rtStartKpSignIn](#rtstartkpsignin)|[sEvtStateCode](#sevtstatecode)
[fEvtKpSignIn](#fevtkpsignin)|
+||停止随时签到|[rtStopKpSignIn](#rtstopkpsignin)|[sEvtStateCode](#sevtstatecode)|
+||实时PIN签到授权|[rtSetKpLoginAllowed](#rtsetkploginallowed)|[sEvtStateCode](#sevtstatecode)
[fEvtKpLoginAllowed](#fevtkploginallowed)|
+### 按键反馈
+|功能归类|功能|API指令|指令事件|
+|---|---|---|---|
+|判断题|启动判断题答题|[startQATrueFalse](#startqatruefalse)|[sEvtStateCode](#sevtstatecode)
[fEvtQATrueFalse](#fevtqatruefalse)|
+||停止判断题答题|[stopQATrueFalse](#stopqatruefalse)|[sEvtStateCode](#sevtstatecode)|
+|选择题|启动选择题答题|[startQAChoice](#startqachoice)|[sEvtStateCode](#sevtstatecode)
[fEvtQAChoice](#fevtqachoice)|
+||停止选择题答题|[stopQAChoice](#stopqachoice)|[sEvtStateCode](#sevtstatecode)|
+|数字题|启动数字题答题|[startQANum](#startqanum)|[sEvtStateCode](#sevtstatecode)
[fEvtQANum](#fevtqanum)|
+||停止数字题答题|[stopQANum](#stopqanum)|[sEvtStateCode](#sevtstatecode)|
+|抢答题|启动抢答题答题|[startQAQuicker](#startqaquicker)|[sEvtStateCode](#sevtstatecode)
[fEvtQAQuicker](#fevtqaquicker)|
+||停止抢答题答题|[stopQAQuicker](#stopqaquicker)|[sEvtStateCode](#sevtstatecode)|
+### 在线测验
+|功能归类|功能|API指令|指令事件|
+|---|---|---|---|
+|标准测验|启动标准测验|[startKpExam](#startkpexam)|[sEvtStateCode](#sevtstatecode)
[fEvtKpExam](#fevtkpexam)
[fEvtFinalSubmit](#fevtfinalsubmit)|
+||停止标准测验|[stopKpExam](#stopkpexam)|[sEvtStateCode](#sevtstatecode)|
+||允许键盘提交后退回修改|[rtAllowEdited](#rtkpallowedited)|[sEvtStateCode](#sevtstatecode)
[fEvtFinalSubmit](#fevtfinalsubmit)|
+
+## 公共事件
+### sEvtBsConnectState
+- **主题**: /basestation/\${baseSN}/receive
+- **功能描述**:基站连接成功时返回基站型号和基站SN,基站从已连接状态断开返回连接断开
+- **参数说明**
+
+|参数名|类型|限制|非空|说明|
+|-----|-----|-----|-----|-----|
+|fun|string|-|是|事件类型|
+|dataTag|string|-|否|数据包标识,不需要时可传空字符串|
+|data|object|-|是|传送参数的对象|
+|+baseModel|int||否|基站的型号码|
+|+modelName|string||否|基站的型号名称|
+|+state|int||是|基站的连接状态
1-已连接
2-连接断开|
+|+version|string||否|基站固件版本|
+
+- **示例代码**
+```Json
+//连接成功
+{
+ "fun":"sEvtBsConnectState",
+ "dataTag":"1",
+ "data":{
+ "state":1,
+ "baseModel":218,
+ "modelName":"B200",
+ "version":"1.0.3"
+ }
+}
+//连接断开
+{
+ "fun":"sEvtBsConnectState",
+ "dataTag":"1",
+ "data":{
+ "state":2
+ }
+}
+```
+### sEvtBsChannelConflict
+- **主题**: /basestation/\${baseSN}/receive
+- **功能描述**:基站信道冲突时主动上报,应用程序可根据实际业务修改基站信道
+- **参数说明**
+
+|参数名|类型|限制|非空|说明|
+|---|---|---|---|---|
+|fun|string|-|是|事件名称|
+|dataTag|string|-|否|数据包标识,不需要时可传空字符串|
+|data|object|-|是|传送参数的对象|
+|+value|int||是|有冲突的信道|
+
+- **示例代码**
+```Json
+{
+ "fun":"sEvtBsChannelConflict",
+ "dataTag":"1",
+ "data":{
+ "value":5 //信道5有多个基站使用
+ }
+}
+```
+### sEvtBsNfcResults
+- **主题**: /basestation/\${baseSN}/receive
+- **功能描述**:键盘刷卡时主动上报,如果超出基站容量会上报失败
+- **参数说明**
+
+|参数名|类型|限制|非空|说明|
+|---|---|---|---|---|
+|fun|string|-|是|事件名称|
+|dataTag|string|-|否|数据包标识,不需要时可传空字符串|
+|data|object|-|是|传送参数的对象|
+|+keySn|string||是|刷卡的键盘SN|
+|+value|int||是|刷卡的状态
1-成功
2-失败|
+
+- **示例代码**
+```Json
+{
+ "fun":"sEvtBsNfcResults",
+ "dataTag":"1", //不需要时可传空字符串
+ "data":{
+ "keySn":"1234567890",
+ "value":1
+ }
+}
+```
+
+### sEvtBsKpOnlineMsg
+- **主题**: /basestation/\${baseSN}/receive
+- **功能描述**:键盘上线通知,主动上报,键盘升级成功后也会上报
+- **参数说明**
+
+|参数名|类型|限制|非空|说明|
+|---|---|---|---|---|
+|fun|string|-|是|事件名称|
+|dataTag|string|-|否|数据包标识|
+|data|object|-|是|传送参数的对象|
+|+keySn|string||是|键盘SN|
+|+version|string||是|键盘固件版本|
+|+model|int||是|键盘型号|
+|+voltage|double||是|键盘电压|
+
+- **示例代码**
+```Json
+{
+ "fun":"sEvtBsKpOnlineMsg",
+ "dataTag":"1",
+ "data":{
+ "keySn":"1234567890",
+ "version":"1.0.0",
+ "model":67,
+ "voltage":2.8
+ }
+}
+```
+### sEvtStateCode
+- **主题**: /basestation/\${baseSN}/receive
+- **功能描述**:返回基站接收指令状态信息
+- **参数说明**
+
+|参数名|类型|限制|非空|说明|
+|---|---|---|---|---|
+|fun|string|-|是|事件名称|
+|dataTag|string|-|否|数据包标识|
+|data|object|-|是|传送参数的对象|
+|+funName|string||是|指令名称|
+|+code|string||是|状态码,含义见下表|
+
+|状态码|说明|
+|---|---|
+|0|指令收取成功|
+|10001|不能正确解析的JSON数据|
+|10002|解析JSON错误|
+|20001|基站未连接|
+|20002|功能不支持|
+|20003|基站SN格式不正确|
+|20004|参数错误|
+|20005|基站在答题中|
+|40001|升级功能只能支持一个基站|
+|50001|此功能必须指定基站|
+|60001|此功能必须指定键盘SN|
+
+- **示例代码**
+```Json
+{
+ "fun":"sEvtStateCode",
+ "dataTag":"1",
+ "data":{
+ "funName":"startKpRollCall",
+ "code":"20005"
+ }
+}
+```
+## 基站管理
+### 基站连接
+#### 方法
+##### getBsOnlineState
+- **主题**:/client/multiBase/send
+- **功能描述**:主动获取所有在线基站信息,在线基站回复
+- **参数说明**
+
+|参数名|类型|限制|是否必填|说明|
+|---|---|---|---|---|
+|fun|string|-|是|固定指令名称|
+|dataTag|string|-|否|数据包标识|
+- **示例代码**
+```Json
+{
+ "fun":"getBsOnlineState",
+ "dataTag":"1"
+}
+```
+
+##### getBsConnectState
+- **主题**:/client/\${baseSN}/send
+- **功能描述**:主动获取基站连接状态
+- **参数说明**
+
+|参数名|类型|限制|是否必填|说明|
+|---|---|---|---|---|
+|fun|string|-|是|固定指令名称|
+|dataTag|string|-|否|数据包标识|
+- **示例代码**
+```Json
+{
+ "fun":"getBsConnectState",
+ "dataTag":"1"
+}
+```
+#### 事件
+##### [sEvtBsConnectState](#sevtbsconnectstate)
+参见基站连接变化系统通知
+
+##### fEvtBsOnlineState
+- **主题**: /basestation/mutilBase/receive
+- **功能描述**:基站在线返回基站型号和基站SN
+- **参数说明**
+
+|参数名|类型|限制|非空|说明|
+|-----|-----|-----|-----|-----|
+|fun|string|-|是|事件类型|
+|dataTag|string|-|否|数据包标识,不需要时可传空字符串|
+|data|object|-|是|传送参数的对象|
+|+baseModel|int||否|基站的型号码|
+|+modelName|string||否|基站的型号名称|
+|+version|string||否|基站固件版本|
+|+baseSN|string||否|基站SN|
+
+- **示例代码**
+```Json
+//连接成功
+{
+ "fun":"fEvtBsOnlineState",
+ "dataTag":"1",
+ "data":{
+ "baseModel":218,
+ "modelName":"B200",
+ "version":"1.0.3",
+ "baseSN":"2024041401"
+ }
+}
+```
+
+### 基站授时
+#### 方法
+##### timeSync
+- **主题**:/client/\${baseSN}/send
+- **功能描述**:发送当前时间戳给基站进行校时
+- **参数说明**
+
+|参数名|类型|限制|是否必填|说明|
+|---|---|---|---|---|
+|fun|string|-|是|固定指令名称|
+|dataTag|string|-|否|数据包标识|
+|data|object|-|是|传送参数的对象|
+|+timeStamp|long ||否|当前时间的时间戳|
+
+- **示例代码**
+```Json
+{
+ "fun":"timeSync",
+ "dataTag":"1",
+ "data":{
+ "timeStamp":1718247133290
+ }
+}
+```
+#### 事件
+##### [sEvtStateCode](#sevtstatecode)
+返回指令的接收状态
+
+### 识别设置
+#### 方法
+##### getBsModel
+- **主题**:/client/\${baseSN}/send
+- **功能描述**:获取基站型号
+- **参数说明**
+
+|参数名|类型|限制|是否必填|说明|
+|---|---|---|---|---|
+|fun|string|-|是|指令名称|
+|dataTag|string|-|否|数据包标识,可为空字符串|
+
+- **示例代码**
+```Json
+{
+ "fun":"getBsModel",
+ "dataTag":"1"
+}
+```
+##### getBsFWVersion
+- **主题**:/client/\${baseSN}/send
+- **功能描述**:获取基站固件版本
+- **参数说明**
+
+|参数名|类型|限制|是否必填|说明|
+|---|---|---|---|---|
+|fun|string|-|是|指令名称|
+|dataTag|string|-|否|数据包标识,可为空字符串|
+
+- **示例代码**
+```Json
+{
+ "fun":"getBsFWVersion",
+ "dataTag":"1"
+}
+```
+#### 事件
+##### fEvtBsSN
+- **主题**: /basestation/\${baseSN}/receive
+- **功能描述**:返回基站的出厂编码
+- **参数说明**
+
+|参数名|类型|限制|非空|说明|
+|---|---|---|---|---|
+|fun|string|-|是|事件名称|
+|dataTag|string|-|否|数据包标识|
+|data|object|-|是|传送参数的对象|
+|+value|string|-|是|基站的出厂编码|
+
+- **示例代码**
+```Json
+{
+ "fun":"fEvtBsSN",
+ "dataTag":"1",
+ "data":{
+ "value":"2024041201"
+ }
+}
+```
+##### fEvtBsModel
+- **主题**: /basestation/\${baseSN}/receive
+- **功能描述**:返回基站的型号
+- **参数说明**
+
+|参数名|类型|限制|是否必填|说明|
+|---|---|---|---|---|
+|fun|string|-|是|事件名称|
+|dataTag|string|-|否|数据包标识|
+|data|object|-|是|传送参数的对象|
+|+value|string|-|是|基站的型号名称|
+
+- **示例代码**
+```Json
+{
+ "fun":"fEvtBsModel",
+ "dataTag":"1",
+ "data":{
+ "value":"B200"
+ }
+}
+```
+##### fEvtBsFWVersion
+- **主题**: /basestation/\${baseSN}/receive
+- **功能描述**:返回基站的固件版本
+- **参数说明**
+
+|参数名|类型|限制|是否必填|说明|
+|---|---|---|---|---|
+|fun|string|-|是|事件名称|
+|dataTag|string|-|否|数据包标识|
+|data|object|-|是|传送参数的对象|
+|+value|string||是|基站的固件版本号|
+
+- **示例代码**
+```Json
+{
+ "fun":"fEvtBsFWVersion",
+ "dataTag":"1",
+ "data":{
+ "value":"1.0.3"
+ }
+}
+```
+### 组网设置
+#### 方法
+##### getBsPairCode
+- **主题**:/client/\${baseSN}/send
+- **功能描述**:获取基站配对码
+- **参数说明**
+
+|参数名|类型|限制|是否必填|说明|
+|---|---|---|---|---|
+|fun|string|-|是|指令名称|
+|dataTag|string|-|否|数据包标识,可为空字符串|
+
+- **示例代码**
+```Json
+{
+ "fun":"getBsPairCode",
+ "dataTag":"1"
+}
+```
+##### getBsNfcLogin
+- **主题**:/client/\${baseSN}/send
+- **功能描述**:获取刷卡配对状态
+- **参数说明**
+
+|参数名|类型|限制|是否必填|说明|
+|---|---|---|---|---|
+|fun|string|-|是|指令名称|
+|dataTag|string|-|否|数据包标识,可为空字符串|
+
+- **示例代码**
+```Json
+{
+ "fun":"getBsNfcLogin",
+ "dataTag":"1"
+}
+```
+##### setBsNfcLogin
+- **主题**:/client/\${baseSN}/send
+- **功能描述**:设置基站刷卡配对状态
+- **参数说明**
+
+|参数名|类型|限制|是否必填|说明|
+|---|---|---|---|---|
+|fun|string|-|是|指令名称|
+|dataTag|string|-|否|数据包标识,可为空字符串|
+|data|object|-|是|传送参数的对象|
+|+value|string|-|是|设置的基站刷卡配对状态
0-关闭刷卡配对
1-开启刷卡配对|
+
+- **示例代码**
+```Json
+{
+ "fun":"setBsNfcLogin",
+ "dataTag":"1",
+ "data":{
+ "value":"1"
+ }
+}
+```
+##### getBsChannel
+- **主题**:/client/\${baseSN}/send
+- **功能描述**:获取基站信道
+- **参数说明**
+
+|参数名|类型|限制|是否必填|说明|
+|---|---|---|---|---|
+|fun|string|-|是|指令名称|
+|dataTag|string|-|否|数据包标识,可为空字符串|
+
+- **示例代码**
+```Json
+{
+ "fun":"getBsChannel",
+ "dataTag":"1"
+}
+```
+##### setBsChannel
+- **主题**:/client/\${baseSN}/send
+- **功能描述**:设置基站信道
+- **参数说明**
+
+|参数名|类型|限制|是否必填|说明|
+|---|---|---|---|---|
+|fun|string|-|是|指令名称|
+|dataTag|string|-|否|数据包标识,可为空字符串|
+|data|object|-|是|传送参数的对象|
+|+value|string|-|是|设置的基站信道,可设范围:1-80|
+
+- **示例代码**
+```Json
+{
+ "fun":"setBsChannel",
+ "dataTag":"1",
+ "data":{
+ "value":"23"
+ }
+}
+```
+#### 事件
+##### fEvtBsPairCode
+- **主题**: /basestation/\${baseSN}/receive
+- **功能描述**:返回基站配对码
+- **参数说明**
+
+|参数名|类型|限制|非空|说明|
+|---|---|---|---|---|
+|fun|string|-|是|事件名称|
+|dataTag|string|-|否|数据包标识,可传空字符串|
+|data|object|-|是|传送参数的对象|
+|+value|string||是|基站的配对码|
+
+- **示例代码**
+```Json
+{
+ "fun":"fEvtBsPairCode",
+ "dataTag":"1",
+ "data":{
+ "value":"123456"
+ }
+}
+```
+
+##### fEvtBsChannel
+- **主题**: /basestation/\${baseSN}/receive
+- **功能描述**:返回基站信道
+- **参数说明**
+
+|参数名|类型|限制|非空|说明|
+|---|---|---|---|---|
+|fun|string|-|是|事件名称|
+|dataTag|string|-|否|数据包标识,可传空字符串|
+|data|object|-|是|传送参数的对象|
+|+value|string||是|基站信道|
+
+- **示例代码**
+```Json
+{
+ "fun":"fEvtBsChannel",
+ "dataTag":"1",
+ "data":{
+ "value":"5"
+ }
+}
+```
+##### fEvtBsNfcLogin
+- **主题**: /basestation/\${baseSN}/receive
+- **功能描述**:返回基站是否允许NFC刷卡
+- **参数说明**
+
+|参数名|类型|限制|非空|说明|
+|---|---|---|---|---|
+|fun|string|-|是|事件名称|
+|dataTag|string|-|否|数据包标识,可传空字符串|
+|data|object|-|是|传送参数的对象|
+|+value|string||是|0-关闭 1-开启|
+
+- **示例代码**
+```Json
+{
+ "fun":"fEvtBsNfcLogin",
+ "dataTag":"1",
+ "data":{
+ "value":"1"
+ }
+}
+```
+### 登录设置
+#### 方法
+##### getBsSSID
+获取基站登录名称
+- **主题**:/client/\${baseSN}/send
+- **功能描述**:获取基站登录名称
+- **参数说明**
+
+|参数名|类型|限制|是否必填|说明|
+|---|---|---|---|---|
+|fun|string|-|是|固定指令名称|
+|dataTag|string|-|否|数据包标识|
+
+- **示例代码**
+```Json
+{
+ "fun":"getBsSSID",
+ "dataTag":"1"
+}
+```
+##### setBsSSID
+- **主题**:/client/\${baseSN}/send
+- **功能描述**:设置基站登录名称
+- **参数说明**
+
+|参数名|类型|限制|是否必填|说明|
+|---|---|---|---|---|
+|fun|string|-|是|指令名称|
+|dataTag|string|-|否|数据包标识,可为空字符串|
+|data|object|-|是|传送参数的对象|
+|+value|string||是|设置的基站SSID,最长12字符|
+
+- **示例代码**
+```Json
+{
+ "fun":"setBsSSID",
+ "dataTag":"1",
+ "data":{
+ "value":"1901班"
+ }
+}
+```
+#### 事件
+##### fEvtBsSSID
+- **主题**: /basestation/\${baseSN}/receive
+- **功能描述**:返回基站名称
+- **参数说明**
+
+|参数名|类型|限制|非空|说明|
+|---|---|---|---|---|
+|fun|string|-|是|事件名称|
+|dataTag|string|-|否|数据包标识,可传空字符串|
+|data|object|-|是|传送参数的对象|
+|+value|string||是|基站名称|
+
+- **示例代码**
+```Json
+{
+ "fun":"fEvtBsSSID",
+ "dataTag":"1",
+ "data":{
+ "value":"1901班"
+ }
+}
+```
+### 键盘统一设置
+#### 方法
+##### getBsKpLanguage
+- **主题**:/client/\${baseSN}/send
+- **功能描述**:获取键盘语言
+- **参数说明**
+
+|参数名|类型|限制|是否必填|说明|
+|---|---|---|---|---|
+|fun|string|-|是|指令名称|
+|dataTag|string|-|否|数据包标识,可为空字符串|
+
+- **示例代码**
+```Json
+{
+ "fun":"getBsKpLanguage",
+ "dataTag":"1"
+}
+```
+##### setBsKpLanguage
+- **主题**:/client/\${baseSN}/send
+- **功能描述**:设置键盘语言
+- **参数说明**
+
+|参数名|类型|限制|是否必填|说明|
+|---|---|---|---|---|
+|fun|string|-|是|指令名称|
+|dataTag|string|-|否|数据包标识,可为空字符串|
+|data|object|-|是|传送参数的对象|
+|+value|string||是|设置键盘显示的语言
1-简体中文
2-英文|
+
+- **示例代码**
+```Json
+{
+ "fun":"setBsKpLanguage",
+ "dataTag":"1",
+ "data":{
+ "value":"1"
+ }
+}
+```
+#### 事件
+##### fEvtBsKpLanguage
+- **主题**: /basestation/\${baseSN}/receive
+- **功能描述**:返回键盘语言
+- **参数说明**
+
+|参数名|类型|限制|非空|说明|
+|---|---|---|---|---|
+|fun|string|-|是|指令名称|
+|dataTag|string|-|否|数据包标识,可为空字符串|
+|data|object|-|是|传送参数的对象|
+|+value|string||是|设置键盘显示的语言
1-简体中文
2-英文|
+
+- **示例代码**
+```Json
+{
+ "fun":"fEvtBsKpLanguage",
+ "dataTag":"1",
+ "data":{
+ "value":"1"
+ }
+}
+```
+### 网络参数设置
+#### 方法
+##### getBsTcpipParams
+- **主题**:/client/\${baseSN}/send
+- **功能描述**:获取基站TCP/IP参数
+- **参数说明**
+
+|参数名|类型|限制|是否必填|说明|
+|---|---|---|---|---|
+|fun|string|-|是|指令名称|
+|dataTag|string|-|否|数据包标识,可为空字符串|
+
+- **示例代码**
+```Json
+{
+ "fun":"getBsTcpipParams",
+ "dataTag":"1"
+}
+```
+##### setBsTcpipParams
+- **主题**:/client/\${baseSN}/send
+- **功能描述**:设置基站TCP/IP参数
+- **参数说明**
+
+|参数名|类型|限制|是否必填|说明|
+|---|---|---|---|---|
+|fun|string|-|是|指令名称|
+|dataTag|string|-|否|数据包标识,可为空字符串|
+|data|object|-|是|传送参数的对象|
+|+ip|string||否|IP地址|
+|+mask|string||否|子网掩码|
+|+gateway|string||否|网关地址|
+|+ipAllocation|int||否|基站IP获取方式
0 - 手动指定
1 - DHCP获取|
+
+- **示例代码**
+```Json
+{
+ "fun":"setBsTcpipParams",
+ "dataTag":"1",
+ "data":{
+ "ip":"192.168.0.10",
+ "mask":"255.255.255.0",
+ "gateway":"192.168.0.1",
+ "ipAllocation":1
+ }
+}
+```
+##### getBsMqttParams
+- **主题**:/client/\${baseSN}/send
+- **功能描述**:获取基站MQTT参数
+- **参数说明**
+
+|参数名|类型|限制|是否必填|说明|
+|---|---|---|---|---|
+|fun|string|-|是|指令名称|
+|dataTag|string|-|否|数据包标识,可为空字符串|
+
+- **示例代码**
+```Json
+{
+ "fun":"getBsMqttParams",
+ "dataTag":"1"
+}
+```
+##### setBsMqttParams
+- **主题**:/client/\${baseSN}/send
+- **功能描述**:设置基站MQTT参数
+- **参数说明**
+
+|参数名|类型|限制|是否必填|说明|
+|---|---|---|---|---|
+|fun|string|-|是|指令名称|
+|dataTag|string|-|否|数据包标识,可为空字符串|
+|data|object|-|是|传送参数的对象|
+|+server|string||是|服务器IP地址|
+|+port|int||是|端口,默认1883|
+|+userName|string||否|连接服务器的用户名,可不设置|
+|+password|string||否|连接服务器的密码,可不设置|
+|+interval|int|>=10|否|基站连接服务器失败后重连的间隔时长,单位秒|
+
+- **示例代码**
+```Json
+{
+ "fun":"setBsMqttParams",
+ "dataTag":"1",
+ "data":{
+ "server":"192.168.10.10",
+ "port":1883,
+ "userName":"",
+ "password":"",
+ "interval":30
+ }
+}
+```
+#### 事件
+##### fEvtBsTcpipParams
+- **主题**: /basestation/\${baseSN}/receive
+- **功能描述**:返回基站TCP/IP参数
+- **参数说明**
+
+|参数名|类型|限制|非空|说明|
+|---|---|---|---|---|
+|fun|string|-|是|指令名称|
+|dataTag|string|-|否|数据包标识,可为空字符串|
+|data|object|-|是|传送参数的对象|
+|+mac|string||是|MAC地址|
+|+ip|string||是|IP地址|
+|+mask|string||是|子网掩码|
+|+gateway|string||是|网关地址|
+|+ipAllocation|int||否|基站IP获取方式
0 - 手动指定
1 - DHCP获取|
+
+- **示例代码**
+```Json
+{
+ "fun":"fEvtBsTcpipParams",
+ "dataTag":"1",
+ "data":{
+ "mac":"FF:FF:FF:FF:FF:FF",
+ "ip":"192.168.0.10",
+ "mask":"255.255.255.0",
+ "gateway":"192.168.0.1",
+ "ipAllocation":1
+ }
+}
+```
+##### fEvtBsMqttParams
+- **主题**: /basestation/\${baseSN}/receive
+- **功能描述**:返回基站MQTT参数
+- **参数说明**
+
+|参数名|类型|限制|非空|说明|
+|---|---|---|---|---|
+|fun|string|-|是|指令名称|
+|dataTag|string|-|否|数据包标识,可为空字符串|
+|data|object|-|是|传送参数的对象|
+|+server|string||是|服务器地址,IP|
+|+port|int||是|端口,默认1883|
+|+userName|string||否|连接服务器的用户名,可不设置|
+|+password|string||否|连接服务器的密码,可不设置|
+|+interval|int|>=10|否|基站连接服务器失败后重连的间隔时长,单位秒|
+
+- **示例代码**
+```Json
+{
+ "fun":"fEvtBsMqttParams",
+ "dataTag":"1",
+ "data":{
+ "server":"192.168.10.10",
+ "port":1883,
+ "userName":"",
+ "password":"",
+ "interval":30
+ }
+}
+```
+### 基站维护
+#### 方法
+##### getBsLogInfo
+- **主题**:/client/\${baseSN}/send
+- **功能描述**:获取基站日志,用于出现故障需要排查问题时获取基站内部日志记录
+- **参数说明**
+
+|参数名|类型|限制|是否必填|说明|
+|---|---|---|---|---|
+|fun|string|-|是|指令名称|
+|dataTag|string|-|否|数据包标识,可为空字符串|
+
+- **示例代码**
+```Json
+{
+ "fun":"getBsLogInfo",
+ "dataTag":"1"
+}
+```
+
+#### 事件
+##### [sEvtStateCode](#sevtstatecode)
+返回指令的接收状态
+
+## 键盘管理
+### 交互设置
+#### 方法
+##### rtSetKpUserPrompt
+- **主题**:/client/\${baseSN}/send
+- **功能描述**:实时设置提示反馈信息
+- **参数说明**
+
+|参数名|类型|限制|是否必填|说明|
+|---|---|---|---|---|
+|fun|string|-|是|指令名称|
+|dataTag|string|-|否|数据包标识,可为空字符串|
+|data|array|-|否|传送参数的对象数组|
+|++keySns|array||是|指定的键盘SN数组,空数组表示全部在线键盘
注意:不允许空数组和指定SN数组混合使用
包含空数组默认为全部在线键盘,其他指定键盘无效|
+|++info|string||否|设置的反馈信息
不同键盘可设置不同反馈信息|
+```json
+//分别提示
+{
+ "fun": "rtSetKpUserPrompt",
+ "dataTag":"1",
+ "data": [
+ {
+ "keySns": ["1479824643","1479824645"],
+ "info": "答对了"
+ },
+ {
+ "keySns": ["1479824644"],
+ "info": "答错了"
+ }
+ ]
+}
+//统一提示
+{
+ "fun": "rtSetKpUserPrompt",
+ "dataTag":"1",
+ "data": [
+ {
+ "keySns": [],
+ "info": "答题结束"
+ }
+ ]
+}
+```
+#### 事件
+##### [sEvtStateCode](#sevtstatecode)
+发送指令后返回接收状态
+
+##### fEvtSetKpUserPrompt
+- **主题**:/basestation/\${baseSN}/receive
+- **功能描述**:返回实时设置提示语是否成功
+- **参数说明**
+
+|参数名|类型|限制|非空|说明|
+|---|---|---|---|---|
+|fun|string|-|是|指令名称|
+|dataTag|string|-|否|数据包标识,可为空字符串|
+|data|array|-|是|传送参数的对象数组|
+|++keySn|string||是|设置提示语信息的键盘SN|
+|++state|string||是|设置的提示语是否成功
0 - 成功
1 - 失败|
+```json
+{
+ "fun": "fEvtSetKpUserPrompt",
+ "dataTag":"1",
+ "data": [
+ {
+ "keySn": "1479824643",
+ "state": "0"
+ },
+ {
+ "keySn": "1479824645",
+ "state": "0"
+ },
+ {
+ "keySn": "1479824644",
+ "state": "1"
+ }
+ ]
+}
+```
+### 在线状态
+#### 方法
+##### startGetKpOnline
+- **主题**:/client/\${baseSN}/send
+- **功能描述**:开始获取键盘在线信息,键盘在线返回键盘信息 [sEvtBsKpOnlineMsg](#sevtbskponlinemsg)
+- **参数说明**
+
+|参数名|类型|限制|是否必填|说明|
+|---|---|---|---|---|
+|fun|string|-|是|指令名称|
+|dataTag|string|-|否|数据包标识,可为空字符串|
+```json
+{
+ "fun": "startGetKpOnline",
+ "dataTag":"1"
+}
+```
+
+##### stopGetKpOnline
+- **主题**:/client/\${baseSN}/send
+- **功能描述**:停止获取键盘在线信息
+- **参数说明**
+
+|参数名|类型|限制|是否必填|说明|
+|---|---|---|---|---|
+|fun|string|-|是|指令名称|
+|dataTag|string|-|否|数据包标识,可为空字符串|
+```json
+{
+ "fun": "stopGetKpOnline",
+ "dataTag":"1"
+}
+```
+#### 事件
+##### [sEvtStateCode](#sevtstatecode)
+发送指令后返回此事件
+
+##### [sEvtBsKpOnlineMsg](#sevtbskponlinemsg)
+键盘在线返回此事件
+
+### 维护功能
+#### 方法
+##### remoteKpSleep
+- **主题**:/client/\${baseSN}/send
+- **功能描述**:遥控键盘休眠
+- **参数说明**
+
+|参数名|类型|限制|是否必填|说明|
+|---|---|---|---|---|
+|fun|string|-|是|指令名称|
+|dataTag|string|-|否|数据包标识,可为空字符串|
+|data|object|-|是|传送参数的对象数组|
+|+keySns|array||否|需要执行指令的键盘SN数组,空数组表示所有键盘|
+
+- **示例代码**
+```Json
+{
+ "fun":"remoteKpSleep",
+ "dataTag":"1",
+ "data":{
+ "keySns":["1479824644"]
+ }
+}
+```
+#### 事件
+##### [sEvtStateCode](#sevtstatecode)
+返回指令的接收状态
+
+## 绑定
+### 无线绑定
+#### 方法
+##### rtSetKpBindingInfo
+- **主题**:/client/\${baseSN}/send
+- **功能描述**:实时设置绑定信息到键盘
+- **参数说明**
+
+|参数名|类型|限制|是否必填|说明|
+|---|---|---|---|---|
+|fun|string|-|是|指令名称|
+|dataTag|string|-|否|数据包标识,可为空字符串|
+|data|array|-|是|传送参数的对象数组,不可为空|
+|++keySn|string||是|需要设置绑定信息的键盘SN|
+|++info|string||是|设置的绑定信息,一般为学生姓名
最长48个字符,显示在键盘左上角|
+```json
+{
+ "fun": "rtSetKpBindingInfo",
+ "dataTag":"1",
+ "data": [
+ {
+ "keySn": "1479824643",
+ "info": "张三"
+ },
+ {
+ "keySn": "1479824644",
+ "info": "李四"
+ }
+ ]
+}
+```
+
+##### clearKpBindingInfo
+- **主题**:/client/\${baseSN}/send
+- **功能描述**:清除键盘绑定信息
+- **参数说明**
+
+|参数名|类型|限制|是否必填|说明|
+|---|---|---|---|---|
+|fun|string|-|是|指令名称|
+|dataTag|string|-|否|数据包标识,可为空字符串|
+|data|object|-|是|传送参数的对象数组|
+|+keySns|array||否|需要清除绑定信息键盘SN数组,
空数组表示清空所有键盘|
+```json
+{
+ "fun": "clearKpBindingInfo",
+ "dataTag":"1",
+ "data": {
+ "keySns":["1479824643","1479824644","1479824645"]
+ }
+}
+```
+#### 事件
+##### [sEvtStateCode](#sevtstatecode)
+发送指令后返回接收状态
+
+##### fEvtKpBindingInfo
+- **主题**:/basestation/\${baseSN}/receive
+- **功能描述**:返回键盘实时设置绑定信息的状态是否成功
+- **参数说明**
+
+|参数名|类型|限制|非空|说明|
+|---|---|---|---|---|
+|fun|string|-|是|指令名称|
+|dataTag|string|-|否|数据包标识,可为空字符串|
+|data|array|-|否|传送参数的对象数组|
+|++keySn|string||是|需要设置绑定信息的键盘SN|
+|++state|string||是|设置的绑定信息是否成功
0 - 成功
1 - 失败|
+```json
+{
+ "fun": "fEvtKpBindingInfo",
+ "dataTag":"1",
+ "data": [
+ {
+ "keySn": "1479824643",
+ "state": "0"
+ },
+ {
+ "keySn": "1479824644",
+ "state": "1"
+ }
+ ]
+}
+```
+##### fEvtClearKpBindingInfo
+- **主题**:/basestation/\${baseSN}/receive
+- **功能描述**:返回清空绑定信息的指令状态是否成功
+- **参数说明**
+
+|参数名|类型|限制|非空|说明|
+|---|---|---|---|---|
+|fun|string|-|是|指令名称|
+|dataTag|string|-|否|数据包标识,可为空字符串|
+|data|object|-|否|传送参数的对象|
+|+state|string||是|设置的绑定信息是否成功
0 - 成功
1 - 失败|
+```json
+{
+ "fun": "fEvtClearKpBindingInfo",
+ "dataTag":"1",
+ "data": {
+ "state": "0"
+ }
+}
+```
+## 签到
+### 随时签到
+#### 方法
+##### rtStartKpSignIn
+- **主题**:/client/\${baseSN}/send
+- **功能描述**:启动随时签到绑定
+- **参数说明**
+
+|参数名|类型|限制|是否必填|说明|
+|---|---|---|---|---|
+|fun|string|-|是|指令名称|
+|dataTag|string|-|否|数据包标识,可为空字符串|
+|data|object|-|是|传递参数的对象|
+|+mode|int|-|是|签到模式
2-PIN码签到,输入pin码后由应用程序决定是否授权|
+```json
+{
+ "fun": "rtStartKpSignIn",
+ "dataTag":"1",
+ "data":{
+ "mode":2
+ }
+}
+```
+##### rtStopKpSignIn
+- **主题**:/client/\${baseSN}/send
+- **功能描述**:停止签到绑定
+- **参数说明**
+
+|参数名|类型|限制|是否必填|说明|
+|---|---|---|---|---|
+|fun|string|-|是|指令名称|
+|dataTag|string|-|否|数据包标识,可为空字符串|
+```json
+{
+ "fun": "rtStopKpSignIn",
+ "dataTag":"1"
+}
+```
+##### rtSetKpLoginAllowed
+- **主题**:/client/\${baseSN}/send
+- **功能描述**:实时PIN绑定授权,可取消授权
+- **参数说明**
+
+|参数名|类型|限制|是否必填|说明|
+|---|---|---|---|---|
+|fun|string|-|是|指令名称|
+|dataTag|string|-|否|数据包标识,可为空字符串|
+|data|object|-|是|传递参数的对象|
+|+keySn|string|-|是|键盘SN|
+|+state|int|-|是|1-授权成功
2-授权失败
3-解除已授权|
+```json
+{
+ "fun": "rtSetKpLoginAllowed",
+ "dataTag":"1",
+ "data":{
+ "keySn":"1479824643",
+ "state":1
+ }
+}
+```
+#### 事件
+##### [sEvtStateCode](#sevtstatecode)
+发送指令后返回接收状态
+
+##### fEvtKpSignIn
+- **主题**:/basestation/\${baseSN}/receive
+- **功能描述**:返回键盘提交签到信息
+- **参数说明**
+
+|参数名|类型|限制|非空|说明|
+|---|---|---|---|---|
+|fun|string|-|是|指令名称|
+|dataTag|string|-|否|数据包标识,可为空字符串|
+|data|array|-|是|传送参数的对象数组|
+|++keySn|string||是|键盘SN|
+|++keyValue|string||是|键盘提交的按键值|
+|++keyTime|double||是|答题时间,从启动开始计算,单位秒|
+```json
+{
+ "fun": "fEvtKpSignIn",
+ "dataTag":"1",
+ "data": [{
+ "keySn": "1234567890",
+ "keyValue":"1004",
+ "keyTime":30.2
+ },
+ {
+ "keySn": "1234567891",
+ "keyValue":"1003",
+ "keyTime":32.5
+ }
+ ]
+}
+```
+##### fEvtKpLoginAllowed
+- **主题**:/basestation/\${baseSN}/receive
+- **功能描述**:返回键盘授权状态
+- **参数说明**
+
+|参数名|类型|限制|非空|说明|
+|---|---|---|---|---|
+|fun|string|-|是|指令名称|
+|dataTag|string|-|否|数据包标识,可为空字符串|
+|data|object|-|是|传送参数的对象|
+|+keySn|string||是|键盘SN|
+|+state|string||是|0-执行成功
1-执行失败|
+```json
+{
+ "fun": "fEvtKpLoginAllowed",
+ "dataTag":"1",
+ "data": {
+ "keySn":"1479824643",
+ "state":"0"
+ }
+}
+```
+## 按键反馈
+### 判断题
+#### 方法
+##### startQATrueFalse
+- **主题**:/client/\${baseSN}/send
+- **功能描述**:启动判断题答题
+- **参数说明**
+
+|参数名|类型|限制|是否必填|说明|
+|---|---|---|---|---|
+|fun|string|-|是|指令名称|
+|dataTag|string|-|否|数据包标识,可为空字符串|
+|data|object|-|是|传送参数的对象|
+|+keySns|array||是|指定的键盘SN数组,空数组表示全部在线键盘|
+|+mode|int||是|1 - True/False 对/错
2 - Yes/No 是/否
3 - √/×|
+|+allowModify|int||是|0 - 不允许修改
1 - 允许修改|
+|+tip|string||否|提示的标题,长度不超过16字符|
+```json
+{
+ "fun": "startQATrueFalse",
+ "dataTag":"1",
+ "data":{
+ "keySns":[],
+ "mode":1,
+ "allowModify":1,
+ "tip":"请判断对错"
+ }
+}
+```
+##### stopQATrueFalse
+- **主题**:/client/\${baseSN}/send
+- **功能描述**:停止判断题答题
+- **参数说明**
+
+|参数名|类型|限制|是否必填|说明|
+|---|---|---|---|---|
+|fun|string|-|是|指令名称|
+|dataTag|string|-|否|数据包标识,可为空字符串|
+```json
+{
+ "fun": "stopQATrueFalse",
+ "dataTag":"1"
+}
+```
+#### 事件
+##### [sEvtStateCode](#sevtstatecode)
+发送指令后返回接收状态
+
+##### fEvtQATrueFalse
+- **主题**:/basestation/\${baseSN}/receive
+- **功能描述**:返回键盘提交答题信息
+- **参数说明**
+
+|参数名|类型|限制|非空|说明|
+|---|---|---|---|---|
+|fun|string|-|是|指令名称|
+|dataTag|string|-|否|数据包标识,可为空字符串|
+|data|array|-|是|传送参数的对象数组|
+|++keySn|string||是|键盘SN|
+|++keyValue|string||是|键盘提交的按键值
1-对
2-错|
+|++keyTime|double||是|答题时间,从启动开始计算,单位秒|
+```json
+{
+ "fun": "fEvtQATrueFalse",
+ "dataTag":"1",
+ "data": [{
+ "keySn": "1234567890",
+ "keyValue":"1",
+ "keyTime":30.2
+ }
+ ]
+}
+```
+### 选择题
+#### 方法
+##### startQAChoice
+- **主题**:/client/\${baseSN}/send
+- **功能描述**:启动选择题答题
+- **参数说明**
+
+|参数名|类型|限制|是否必填|说明|
+|---|---|---|---|---|
+|fun|string|-|是|指令名称|
+|dataTag|string|-|否|数据包标识,可为空字符串|
+|data|object|-|是|传送参数的对象|
+|+keySns|array||是|指定的键盘SN数组,空数组表示全部在线键盘|
+|+mode|int||是|显示模式
1:显示字母(默认值) 2:显示数字 |
+|+lessMode|int||是|迫选模式
0:可缺选(默认值) 1:不可缺选2:允许重复输入3:允许重复输入且不可缺选 |
+|+options|int||是|选项数量,1≤M≤10(默认值4)|
+|+optionalN|int||是|可选项个数,1≤N≤M(默认值1)|
+|+allowModify|int||是|修改模式
0 - 不允许修改
1 - 允许修改|
+|+tip|string||否|提示的标题,长度不超过16字符|
+```json
+{
+ "fun": "startQAChoice",
+ "dataTag":"1",
+ "data":{
+ "keySns":[],
+ "mode": 1,
+ "lessMode": 0,
+ "options": 4,
+ "optionalN": 1,
+ "allowModify":1,
+ "tip":"请选择"
+ }
+}
+```
+##### stopQAChoice
+- **主题**:/client/\${baseSN}/send
+- **功能描述**:停止选择题答题
+- **参数说明**
+
+|参数名|类型|限制|是否必填|说明|
+|---|---|---|---|---|
+|fun|string|-|是|指令名称|
+|dataTag|string|-|否|数据包标识,可为空字符串|
+```json
+{
+ "fun": "stopQAChoice",
+ "dataTag":"1"
+}
+```
+#### 事件
+##### [sEvtStateCode](#sevtstatecode)
+发送指令后返回接收状态
+
+##### fEvtQAChoice
+- **主题**:/basestation/\${baseSN}/receive
+- **功能描述**:返回键盘提交答题信息
+- **参数说明**
+
+|参数名|类型|限制|非空|说明|
+|---|---|---|---|---|
+|fun|string|-|是|指令名称|
+|dataTag|string|-|否|数据包标识,可为空字符串|
+|data|array|-|是|传送参数的对象数组|
+|++keySn|string||是|键盘SN|
+|++keyValue|string||是|键盘提交的按键值|
+|++keyTime|double||是|答题时间,从启动开始计算,单位秒|
+```json
+{
+ "fun": "fEvtQAChoice",
+ "dataTag":"1",
+ "data": [{
+ "keySn": "1234567890",
+ "keyValue":"A",
+ "keyTime":3.2
+ }]
+}
+```
+### 数字题
+#### 方法
+##### startQANum
+- **主题**:/client/\${baseSN}/send
+- **功能描述**:启动数字题答题
+- **参数说明**
+
+|参数名|类型|限制|是否必填|说明|
+|---|---|---|---|---|
+|fun|string|-|是|指令名称|
+|dataTag|string|-|否|数据包标识,可为空字符串|
+|data|object|-|是|传送参数的对象|
+|+keySns|array||是|指定的键盘SN数组,空数组表示全部在线键盘|
+|+mode|int||是|模式
0:无规则 (S6最多16位,T2最多14位)
1:带小数位上下限(T2不支持)|
+|+digits|int||是|小数位数,范围0-2,mode=1时有效
+|+numMin|int||是|可输入下限,mode=1有效,范围0-100|
+|+numMax|int||是|可输入上限,mode=1有效,范围0-100|
+|+allowModify|int||是|修改模式
0 - 不允许修改
1 - 允许修改|
+|+tip|string||否|提示的标题,长度不超过16字符|
+```json
+{
+ "fun": "startQANum",
+ "dataTag":"1",
+ "data":{
+ "keySns":[],
+ "mode": 1,
+ "digits": 1,
+ "numMin": 0,
+ "numMax": 100,
+ "allowModify":1,
+ "tip":"请输入数字"
+ }
+}
+```
+##### stopQANum
+- **主题**:/client/\${baseSN}/send
+- **功能描述**:停止数字题答题
+- **参数说明**
+
+|参数名|类型|限制|是否必填|说明|
+|---|---|---|---|---|
+|fun|string|-|是|指令名称|
+|dataTag|string|-|否|数据包标识,可为空字符串|
+```json
+{
+ "fun": "stopQANum",
+ "dataTag":"1"
+}
+```
+#### 事件
+##### [sEvtStateCode](#sevtstatecode)
+发送指令后返回接收状态
+
+##### fEvtQANum
+- **主题**:/basestation/\${baseSN}/receive
+- **功能描述**:返回键盘提交答题信息
+- **参数说明**
+
+|参数名|类型|限制|非空|说明|
+|---|---|---|---|---|
+|fun|string|-|是|指令名称|
+|dataTag|string|-|否|数据包标识,可为空字符串|
+|data|array|-|是|传送参数的对象数组|
+|++keySn|string||是|键盘SN|
+|++keyValue|string||是|键盘提交的按键值|
+|++keyTime|double||是|答题时间,从启动开始计算,单位秒|
+```json
+{
+ "fun": "fEvtQANum",
+ "dataTag":"1",
+ "data": {
+ "keySn": "1234567890",
+ "keyValue":"10",
+ "keyTime":3.2
+ }
+}
+```
+### 抢答题
+#### 方法
+##### startQAQuicker
+- **主题**:/client/\${baseSN}/send
+- **功能描述**:启动抢答题答题
+- **参数说明**
+
+|参数名|类型|限制|是否必填|说明|
+|---|---|---|---|---|
+|fun|string|-|是|指令名称|
+|dataTag|string|-|否|数据包标识,可为空字符串|
+|data|object|-|是|传送参数的对象|
+|+keySns|array||是|指定的键盘SN数组,空数组表示全部在线键盘|
+|+mode|int||是|模式
0:普通抢答|
+|+allowModify|int||是|修改模式
0 - 不允许修改
1 - 允许修改|
+|+tip|string||否|提示的标题,长度不超过16字符|
+```json
+{
+ "fun": "startQAQuicker",
+ "dataTag":"1",
+ "data":{
+ "keySns":[],
+ "mode": 0,
+ "allowModify":1,
+ "tip":"请按键抢答"
+ }
+}
+```
+##### stopQAQuicker
+- **主题**:/client/\${baseSN}/send
+- **功能描述**:停止抢答答题
+- **参数说明**
+
+|参数名|类型|限制|是否必填|说明|
+|---|---|---|---|---|
+|fun|string|-|是|指令名称|
+|dataTag|string|-|否|数据包标识,可为空字符串|
+```json
+{
+ "fun": "stopQAQuicker",
+ "dataTag":"1"
+}
+```
+#### 事件
+##### [sEvtStateCode](#sevtstatecode)
+发送指令后返回接收状态
+
+##### fEvtQAQuicker
+- **主题**:/basestation/\${baseSN}/receive
+- **功能描述**:返回键盘提交答题信息
+- **参数说明**
+
+|参数名|类型|限制|非空|说明|
+|---|---|---|---|---|
+|fun|string|-|是|指令名称|
+|dataTag|string|-|否|数据包标识,可为空字符串|
+|data|array|-|是|传送参数的对象数组|
+|++keySn|string||是|键盘SN|
+|++keyValue|string||是|键盘提交的按键值|
+|++keyTime|double||是|答题时间,从启动开始计算,单位秒|
+```json
+{
+ "fun": "fEvtQAQuicker",
+ "dataTag":"1",
+ "data": [{
+ "keySn": "1234567890",
+ "keyValue":"1",
+ "keyTime":3.2
+ }]
+}
+```
+## 在线测验
+### 标准测验
+#### 方法
+##### startKpExam
+- **主题**:/client/\${baseSN}/send
+- **功能描述**:启动标准测验
+- **参数说明**
+
+|参数名|类型|限制|是否必填|说明|
+|---|---|---|---|---|
+|fun|string|-|是|指令名称|
+|dataTag|string|-|否|数据包标识,可为空字符串|
+|data|object|-|是|传送参数的对象|
+|+examNo|int||是|0-9999
=0,新的测验
>0时,与上次启动卷号一致继续测验,不一致进入新的测验|
+|+mode|int||是|显示模式
0-不显示开头
1-显示“Q”开头
2-显示“题”开头|
+|+questions|array||是|题目详情|
+|++symbol | string||是 | 题号前缀,可为空 |
+|++quesType | int||是| 题目类型
1:单选
2:多选(排序)
3:数字
4:判断 |
+|++option |int||是 |选项数目
quesType = 1 有效。
quesType = 2 有效。
此项缺省时 默认4;
范围:1-10。|
+|++startNo | int||是| 起始题号 |
+|++count | int||是| 题目数量 |
+```json
+//自定义题号
+{
+ "fun": "startKpExam",
+ "dataTag":"1",
+ "data":{
+ "mode": 0,
+ "examNo": 1,
+ "questions": [{
+ //题号1-1-1 到1-1-10 共10题单选
+ "symbol": "1-1-",
+ "quesType": 1,
+ "startNo": 1,
+ "count":10
+ }, {
+ //题号2-2和2-3共两题 多选题,5个选项
+ "symbol": "2-",
+ "quesType": 2,
+ "option": 5,
+ "startNo": 2,
+ "count":2
+ }, {
+ //题号3-1和3-2共两道数字题
+ "symbol": "3-",
+ "quesType": 3,
+ "startNo": 1,
+ "count":2
+ }, {
+ //题号4和5 ,判断题
+ "symbol": "",
+ "quesType": 4,
+ "startNo": 4,
+ "count":2
+ }]
+ }
+}
+
+//显示Q开头
+{
+ "fun": "startKpExam",
+ "dataTag":"1",
+ "data":{
+ "mode": 1,
+ "examNo": 1,
+ "questions": [{
+ //Q1-Q20,单选题
+ "symbol": "",
+ "quesType": 1,
+ "startNo": 1,
+ "count":20
+ }]
+ }
+}
+
+//显示题开头
+{
+ "fun": "startKpExam",
+ "dataTag":"1",
+ "data":{
+ "mode": 2,
+ "examNo": 1,
+ "questions": [{
+ //题1-题20,单选题
+ "symbol": "",
+ "quesType": 1,
+ "startNo": 1,
+ "count":20
+ }]
+ }
+}
+```
+##### stopKpExam
+- **主题**:/client/\${baseSN}/send
+- **功能描述**:停止标准测验
+- **参数说明**
+
+|参数名|类型|限制|是否必填|说明|
+|---|---|---|---|---|
+|fun|string|-|是|指令名称|
+|dataTag|string|-|否|数据包标识,可为空字符串|
+```json
+{
+ "fun": "stopKpExam",
+ "dataTag":"1"
+}
+```
+##### rtKpAllowEdited
+- **主题**:/client/\${baseSN}/send
+- **功能描述**:键盘键盘后,允许键盘修改答案
+- **参数说明**
+
+|参数名|类型|限制|是否必填|说明|
+|---|---|---|---|---|
+|fun|string|-|是|指令名称|
+|dataTag|string|-|否|数据包标识,可为空字符串|
+|data|object|-|是|传送参数的对象|
+|+keySns|array||是|指定的键盘SN数组,空数组表示全部在线键盘|
+```json
+{
+ "fun": "rtKpAllowEdited",
+ "dataTag":"1",
+ "data":{
+ "keySns":["1234567890","1234567891"]
+ }
+}
+```
+#### 事件
+##### [sEvtStateCode](#sevtstatecode)
+发送指令后返回接收状态
+
+##### fEvtKpExam
+- **主题**:/basestation/\${baseSN}/receive
+- **功能描述**:返回键盘提交答题信息
+- **参数说明**
+
+|参数名|类型|限制|非空|说明|
+|---|---|---|---|---|
+|fun|string|-|是|指令名称|
+|dataTag|string|-|否|数据包标识,可为空字符串|
+|data|array|-|是|传送参数的对象数组|
+|++keySn|string||是|键盘SN|
+|++keyValue|string||是|键盘提交的按键值,1:A;2:B表示第1题提交A,第二题提交B|
+|++keyTime|double||是|答题时间,从启动开始计算,单位秒|
+```json
+{
+ "fun": "fEvtKpExam",
+ "dataTag":"1",
+ "data": [{
+ "keySn": "1234567890",
+ "keyValue":"1:A;2:B",
+ "keyTime":3.2
+ },
+ {
+ "keySn": "1234567891",
+ "keyValue":"1:B;2:B",
+ "keyTime":3.5
+ }
+ ]
+}
+```
+##### fEvtFinalSubmit
+- **主题**:/basestation/\${baseSN}/receive
+- **功能描述**:返回键盘手动交卷标识
+- **参数说明**
+
+|参数名|类型|限制|非空|说明|
+|---|---|---|---|---|
+|fun|string|-|是|指令名称|
+|dataTag|string|-|否|数据包标识,可为空字符串|
+|data|object|-|是|传送参数的对象数组|
+|++keySn|string||是|键盘SN|
+|++keyValue|string||是|0 - 未提交(修改键盘运行提交时上报)
1 - 已交卷|
+|++keyTime|double||是|提交时间,从启动开始计算,单位秒|
+```json
+{
+ "fun": "fEvtFinalSubmit",
+ "dataTag":"1",
+ "data": [{
+ "keySn": "1234567890",
+ "keyValue":"1",
+ "keyTime":3.2
+ }]
+}
+```
\ No newline at end of file