Files
Wx_BLWConfigTools_V02_Prod/Document/BLV_RQ蓝牙通信控制页面实施文档.md

683 lines
12 KiB
Markdown
Raw Permalink Normal View History

# BLV_RQ 蓝牙通信控制页面实施文档
- 归档日期2026年3月19日
- 适用项目:`Wx_BLWConfigTools_V02_Prod`
- 参考协议:`Document/RF_RQ2603 蓝牙通讯协议.md`
- 当前状态:已确认,待进入代码实现
---
## 一、实施目标
`BLV_RQ` 设备新增独立的蓝牙通信控制页面,用于完成以下能力:
1. 展示 BLE 连接信息
2. 读取设备版本信息
3. 设置蓝牙名称
4. 读取按键配置
5. 设置按键功能与按键映射
6. 基于映射关系执行按键控制
7. 查看、清空、导出通信日志
页面采用**从上到下的单屏结构**,页面自身不做上下滚动;若日志区需要展示更多内容,仅允许日志内容区内部滚动。
---
## 二、已确认实施约束
1. **单独新建一个新页面路径**
2. **设备型号固定写死为 `BLV_RQ`**
3. **按键支持映射设置**
4. **蓝牙名称输入规则为 ASCII + 最多 8 字节自定义名,仅允许数字和英文字符**
5. **允许按键类型由用户先选,读取配置后再按设备返回结果自动修正**
6. **允许通信日志导出**
7. **未配置映射的按键允许继续下发(方案 B**
8. **采纳建议:未配置映射项下发时,优先“保持设备当前返回值不变”**
---
## 三、页面路径规划
建议新增页面路径:
`pages/basics/BluetoothDebugging/BLVRQPage/`
页面文件包括:
- `BLVRQPage.js`
- `BLVRQPage.wxml`
- `BLVRQPage.wxss`
- `BLVRQPage.json`
该页面仅服务于 `BLV_RQ` 设备,不复用 `W13` 页面逻辑。
---
## 四、页面结构设计
## 1. 页面总结构
页面自上而下分为三大区域:
1. 蓝牙信息栏
2. 设备管理框
3. 通信日志框组
页面整体不滚动,建议通过高度配比保证三块区域稳定展示:
- 蓝牙信息栏:约 26%
- 设备管理框:约 46%
- 通信日志框组:约 28%
---
## 2. 蓝牙信息栏
### 展示内容
- 蓝牙名称
- MAC / DeviceId
- ServiceId
- Tx 特征值
- Rx 特征值
- 连接状态
- 蓝牙信号 / RSSI
### 交互内容
- `断开` 按钮
- `重连` 按钮
- 蓝牙名称输入框
- `设置蓝牙名称` 按钮
### 交互规则
#### 蓝牙名称输入限制
输入内容必须满足:
- 仅允许数字和英文字符
- 长度为 1~8 字节
- ASCII 编码
建议使用如下校验规则:
`^[A-Za-z0-9]{1,8}$`
#### 设置蓝牙名称按钮启用条件
仅当同时满足以下条件时可点击:
- 当前已连接设备
- 输入内容非空
- 输入内容满足校验规则
#### 设置蓝牙名称交互流程
1. 用户输入新名称
2. 点击 `设置蓝牙名称`
3. 下发 `0x05` 指令
4. 回包成功后刷新显示名称
5. 记录 TX / RX / UI 日志
---
## 3. 设备管理框
设备管理框分为两部分:
### 3.1 设备信息栏
包含:
- 设备型号:`BLV_RQ`(固定写死)
- 软件版本
- 硬件版本
- `读取版本` 按钮
- 按键类型下拉框
- `读取按键配置` 按钮
- `设置按键配置` 按钮
### 3.2 设备按键栏
根据按键类型动态生成按键卡片。
布局要求:
- 一行 2 个卡片
- Z 型排列
- 奇数卡片时最后一个左对齐
每个按键卡片包含:
- 按键序号(表示硬件按键位置)
- 按键控制按钮
- 按键功能下拉框
- 映射下拉框
建议标题展示方式:
- `按键1硬件`
- `按键2硬件`
- ...
可附加展示小字:
- `当前映射键值X`
---
## 五、按钮与控件启用逻辑
### 1. 读取版本按钮
启用条件:
- 已连接设备
### 2. 读取按键配置按钮
启用条件:
- 已连接设备
- 已选择按键类型1~8键
### 3. 设置按键配置按钮
启用条件:
- 已连接设备
- 已选择按键类型1~8键
### 4. 按键控制按钮
启用条件:
- 已连接设备
- 当前按键存在有效映射
### 5. 设置蓝牙名称按钮
启用条件:
- 已连接设备
- 名称输入合法
---
## 六、按键类型、功能与映射设计
## 1. 按键类型下拉框
选项:
- 请选择按键类型
- 1键
- 2键
- 3键
- 4键
- 5键
- 6键
- 7键
- 8键
### 规则
- 用户先选择按键类型后,才允许读取/设置按键配置
- 读取设备配置后,如果设备返回键数与当前选择不同:
- 页面提示:`设备返回为 X 键,已按设备实际值修正`
- 页面自动修正下拉框与卡片数量
---
## 2. 按键功能下拉框
依据协议中的功能码 `0x00 ~ 0x0F`
- 不设置0x00
- 普通按键0x01
- 清理按键0x02
- 投诉按键0x03
- 预留0x04
- 预留0x05
- ...
- 预留0x0F
页面展示建议使用:
- `普通按键 (0x01)`
- `投诉按键 (0x03)`
---
## 3. 映射下拉框
映射选项需根据当前按键类型动态生成。
例如:
- 当前为 4 键:只允许映射 `键值1 ~ 键值4`
- 当前为 8 键:允许映射 `键值1 ~ 键值8`
### 映射校验规则
根据协议要求:
- 不同硬件位置不能映射到相同键值
- 映射值必须落在当前按键类型范围内
因此页面在设置前必须校验:
1. 是否存在重复映射
2. 是否存在越界映射
3. 是否存在未配置映射
---
## 七、协议交互设计
---
## 1. 读取版本号0x01
### 发送
- `Frame_Type = 0x01`
- `P0 = 0x01`
### 回包
- `P0 = 软件版本号`
- `P1 = 硬件版本号`
### 页面交互
- 点击 `读取版本`
- 成功回包后更新:
- 软件版本
- 硬件版本
---
## 2. 设置蓝牙名称0x05
### 发送
- `Frame_Type = 0x05`
- `P0 = 名称长度`
- `P1~Pn = ASCII字符`
### 回包
- `P0 = 0x01`:设置成功
- `P0 = 0x02`:设置失败
### 页面交互
- 输入名称
- 点击 `设置蓝牙名称`
- 成功后提示并刷新名称显示
---
## 3. 读取按键配置0x04
### 前置条件
- 已连接设备
- 已选择按键类型
### 发送
- `Frame_Type = 0x04`
- `P0 = 0x01`
### 回包
- `P0 = 硬件按键总数`
- `P1~P8 = 各硬件按键配置字节`
### 配置字节解析规则
每个配置字节:
- Bit0~3映射键值
- Bit4~7按键功能
### 页面处理
- 自动解析并回填每张卡片的:
- `mappedKey`
- `functionCode`
---
## 4. 设置按键配置0x02
协议规定 `0x02` 分为两个子命令:
### 子命令 1设置按键功能
- `P0 = 0x01`
- `P1~P8 = 逻辑键值功能码`
### 子命令 2设置按键映射
- `P0 = 0x02`
- `P1~P8 = 硬件位置映射到的键值`
### 页面交互流程
用户点击 `设置按键配置` 后,执行以下步骤:
#### 第一步:前端校验
检查:
1. 是否已选择按键类型
2. 是否存在重复映射
3. 是否存在越界映射
4. 是否存在未配置映射
5. 功能配置是否完整
#### 第二步:弹出二次确认框
##### 场景 A存在未配置映射按键
弹窗提示示例:
> 以下按键未配置映射按键2、按键5
> 若继续下发,将保持这些按键当前设备返回值不变。
> 是否继续?
##### 场景 B无缺失项
弹窗提示示例:
> 确认下发当前按键功能与映射配置?
#### 第三步:用户确认后继续下发(方案 B
执行顺序建议为:
1. 先下发功能配置(`P0 = 0x01`
2. 再下发映射配置(`P0 = 0x02`
#### 第四步:未配置映射项处理策略(采纳建议)
对于未配置映射的按键,不直接写入空值或 `0x00`,而是:
- **保持设备当前返回值不变**
即:
- 页面在成功读取配置后缓存设备原始映射值
- 用户未配置映射的项,设置时继续带上原设备返回值
该策略的优点:
- 最稳妥
- 避免把设备有效映射误清空
- 与“允许继续”的方案 B 兼容
#### 第五步:结果反馈
- 两条命令都成功:提示 `设置成功`
- 任一命令失败:提示 `设置失败`
- 日志中记录失败发生在功能设置还是映射设置阶段
---
## 5. 按键控制0x06
### 交互逻辑
用户通过映射下拉框配置卡片映射值后,点击某个按键卡片中的控制按钮时:
- 发送的不是硬件按键序号
- 而是该卡片当前映射到的**逻辑键值**
### 示例
- 硬件按键1 当前映射为键值3
- 点击“按键1”的控制按钮
- 实际发送键值3的模拟触发命令
### 发送
- `Frame_Type = 0x06`
- `P0 = 1`
- `P1 = 1 << (mappedKey - 1)`
### 回包
- `P0 = 0x01`:成功
- `P0 = 0x02`:失败
### 限制
- 未连接不可触发
- 未配置映射不可触发
- 点击未映射按键时提示:`当前按键未配置映射`
---
## 八、日志设计
## 1. 日志分类
建议日志类型:
- `UI`:用户操作
- `CFG`:状态变化
- `TX`:发送命令
- `RX`:接收回包
- `WARN`:警告
- `ERR`:错误
## 2. 日志内容建议
每条日志包含:
- 时间戳
- 日志类型
- 命令字
- Hex 内容
- 文本说明
### 示例
- `[TX][0x04] 读取按键配置`
- `[RX][0x04] 返回4键配置`
- `[WARN] 未配置映射按键2、按键5继续按原设备值下发`
- `[TX][0x06] 触发键值3`
## 3. 日志功能
顶部功能按钮:
- `清空日志`
- `导出日志`
## 4. 导出格式
允许导出为 `txt` 文件。
建议文件名:
`BLV_RQ_Log_yyyyMMdd_HHmmss.txt`
导出内容建议包含:
- 当前设备信息
- 当前连接参数
- 全量日志内容
---
## 九、推荐数据模型
```js
data: {
bleInfo: {
devName: '',
mac: '',
serviceId: '',
txCharId: '',
rxCharId: '',
connected: false,
rssi: null,
signalText: '-'
},
deviceInfo: {
model: 'BLV_RQ',
softwareVersion: '-',
hardwareVersion: '-'
},
keyConfig: {
selectedKeyCount: 0,
keyCountOptions: ['请选择按键类型', '1键', '2键', '3键', '4键', '5键', '6键', '7键', '8键'],
keys: [
{
hwIndex: 1,
mappedKey: 1,
functionCode: 1,
functionLabel: '普通按键',
originalMappedKey: 1
}
]
},
logs: []
}
```
其中:
- `hwIndex`:硬件按键位置
- `mappedKey`:当前界面配置映射值
- `originalMappedKey`:设备读取回来的原始映射值,用于方案 B 放行时保留原值
---
## 十、测试范围
## 1. 蓝牙信息栏
- 能显示蓝牙名称、MAC、特征值、连接状态、信号
- 断开按钮有效
- 重连按钮有效
## 2. 蓝牙名称设置
- 非英文数字不可通过
- 超过 8 字节不可通过
- 合法名称可设置成功
- 成功失败提示正确
## 3. 版本读取
- 可正常读取软件版本、硬件版本
## 4. 按键配置读取
- 未选按键类型时按钮禁用
- 选定后可读取
- 返回值可正确解析
- 设备返回键数与页面选择不一致时可自动修正
## 5. 按键配置设置
- 功能可正确下发
- 映射可正确下发
- 重复映射必须拦截
- 越界映射必须拦截
- 未配置映射时弹窗提示并允许继续
- 未配置映射项按原设备值下发
## 6. 按键控制
- 点击卡片时基于映射后的逻辑键值发送命令
- 未配置映射不可触发
## 7. 日志
- TX / RX / WARN / ERR 记录完整
- 清空日志可用
- 导出日志可用
---
## 十一、首版实施范围
首版实施包含:
1. 新建 `BLVRQPage`
2. BLE 信息展示
3. 断开 / 重连
4. 读取版本
5. 设置蓝牙名称
6. 选择按键类型
7. 读取按键配置
8. 设置按键功能
9. 设置按键映射
10. 按映射执行单键控制
11. 日志显示 / 清空 / 导出
首版暂不做:
1. 多键同时触发
2. 批量压测模式
3. 原始报文自由编辑器
---
## 十二、建议实施顺序
### 第 1 阶段:页面骨架
- 新建 `BLVRQPage`
- 搭建静态页面结构
- 接收 BLE 上下文参数
### 第 2 阶段:基础蓝牙能力
- 连接信息展示
- 断开 / 重连
- RSSI 刷新
- 蓝牙名称设置
- 版本读取
### 第 3 阶段:按键配置能力
- 按键类型下拉
- 配置读取
- 卡片渲染
- 功能与映射编辑
- 二次确认弹窗
- 方案 B 放行逻辑
### 第 4 阶段:控制与日志增强
- 单键触发
- 日志导出
- 异常处理优化
---
## 十三、结论
本实施文档已完成以下关键决策固化:
- `BLV_RQ` 单独新建页面
- 设备型号固定为 `BLV_RQ`
- 页面支持按键功能与映射双配置
- 设置时采用二次确认
- 未配置映射按键采用 **方案 B允许继续**
- 继续时采纳建议:**未配置映射项保持设备当前返回值不变**
- 页面整体不滚动,仅日志区允许内部滚动
该文档可作为后续代码实现的直接依据。