文件
jw-beauty/docs/design/01-BLE通信协议明细.md
T

227 行
9.6 KiB
Markdown
原始文件 Blame 文件历史

此文件含有模棱两可的 Unicode 字符
此文件含有可能会与其他字符混淆的 Unicode 字符。 如果您是想特意这样的,可以安全地忽略该警告。 使用 Escape 按钮显示他们。
# BLE 通信协议明细
基于 `软件系统说明.docx` 整理。本文档用于把 BLE 通信协议推进到"可联调设计"层,把帧结构、服务、命令表和时序骨架补到足够继续细化的程度。
本文档仍然遵循一个原则:不虚构未被产品说明证实的命令字、UUID 或 payload 值。以下内容中,凡是来源仅为"推导"而非"文档原文确认"的,会标明"待确认"。
## 已确认事实
- 通信方式:`BLE 5.0 GATT`
- 协议帧格式:帧头 `0xAA 0x55`,随后是长度、类型、数据、XOR 校验
- 已知服务 UUID
- `FFE0`:设备信息服务
- `FFE1`:数据通信服务
- `FFE2`OTA 升级服务
- 业务流程中至少存在以下设备交互阶段:连接设备、确认佩戴、自动扫描、开始治疗
## 供应商补充协议摘录(2026-05-11)
根目录新增的 `协议简述.docx` 已归档到 `docs/protocols/协议简述.docx`,解析稿见 `docs/protocols/协议简述-补充解析.md`
补充文档主要给出 `FFE1` 数据通信相关信息:
| UUID/字段 | 名称 | 属性/说明 |
| --- | --- | --- |
| `FFE1` | 数据通信服务 / Command | 文档中同时写作服务和 Command,`Write+Read`,下发控制指令 |
| `FFE4` | Status | `Read + Notify`,设备状态及 ADC 值数据上报 |
Command 参数区被描述为 33 字节:
- IO1-IO5,每个 IO 含 4 个光强字段:红灯、红外、紫外、暖黄
- IO1-IO5,每个 IO 含 2 字节电流增益
- Byte31-Byte32:保持时间高/低字节
- Byte33:异或校验
### 与当前实现的关键差异
由于项目当前优先目标是尽快跑通真机,新补充协议先作为当前执行协议:`FFE1` 写 Command,`FFE4` 订阅 Status,Command 直接写 33 字节参数块。旧 `0xAA 0x55 | length | type | payload | XOR checksum` 帧协议暂作为历史参考和后续兼容方案保留。
需要硬件侧优先确认:
1. `FFE1``FFE4``FFE5` 的最终服务/特征分配。
2. Command 写入是否为裸 33 字节,还是仍需现有帧封装。
3. Byte33 XOR 的计算范围。
4. Byte31-Byte32 保持时间单位和字节序。
5. Status/ADC 上报的完整字节布局。
## 帧结构草案
### 帧总体格式
| 字段 | 偏移 | 长度 | 值域 | 来源 | 说明 |
| --- | --- | --- | --- | --- | --- |
| `header` | 0 | 2 字节 | `0xAA 0x55` | 文档确认 | 帧头标识 |
| `length` | 2 | 1 字节 | 待确认 | 文档确认存在,定义待补 | 数据长度 |
| `type` | 3 | 1 字节 | 待确认 | 文档确认存在,枚举待补 | 命令/数据/事件类型 |
| `payload` | 4 | N 字节 | 待确认 | 文档确认存在 | 业务载荷 |
| `checksum` | 4+N | 1 字节 | 待确认 | 文档确认为 XOR | 校验 |
### 必须补齐的帧定义
| 项目 | 当前状态 | 阻塞影响 |
| --- | --- | --- |
| `length` 是否包含 `type``checksum` | 未定义 | 无法正确解析帧 |
| `checksum` XOR 计算范围 | 未定义 | 无法正确校验帧 |
| 多字节字段字节序 | 未定义 | 数值解析错误 |
| 字符串编码方式 | 未定义 | 文本解析错误 |
| 最大 payload 长度 | 未定义 | 分包策略无法设计 |
| MTU 约束 | 未定义 | 传输效率与可靠性 |
### 建议帧计算规则(待确认)
以下为建议方案,非最终定义:
- `length`:建议仅表示 `payload` 的字节长度
- `checksum`:建议对 `length``type``payload` 所有字节做 XOR 运算
- 字节序:建议统一大端序(`Big-Endian`
- 字符串:建议统一 `UTF-8`
## 服务与 characteristic 草案
### `FFE0` 设备信息服务
职责:提供设备基础信息。
建议 characteristic 划分(待确认):
| 建议名称 | 建议属性 | 说明 |
| --- | --- | --- |
| `device_info` | `read` | 读取设备型号、固件版本、硬件版本、序列号 |
| `battery_level` | `read` / `notify` | 电量信息 |
UUID 值:待确认
### `FFE1` 数据通信服务
职责:承担主要业务通信。
建议 characteristic 划分(待确认):
| 建议名称 | 建议属性 | 说明 |
| --- | --- | --- |
| `write_cmd` | `write` / `writeWithoutResponse` | 小程序向设备发送命令 |
| `notify_data` | `notify` | 设备向小程序上报数据和事件 |
UUID 值:待确认
### `FFE2` OTA 升级服务
职责:固件升级传输。
建议 characteristic 划分(待确认):
| 建议名称 | 建议属性 | 说明 |
| --- | --- | --- |
| `ota_control` | `write` / `notify` | OTA 控制命令和状态通知 |
| `ota_data` | `writeWithoutResponse` | 升级包分片传输 |
UUID 值:待确认
## 命令表草案
以下命令基于业务流程推导,所有 `type` 值和 `payload` 结构都是待确认的占位。
### 设备信息类
| 建议命令名 | 建议方向 | 建议功能 | type 占位 | payload 请求 | payload 响应 | 待确认 |
| --- | --- | --- | --- | --- | --- | --- |
| `GET_DEVICE_INFO` | 小程序 -> 设备 | 读取设备型号、固件版本、序列号 | `0x??` | 空 | 设备信息结构体 | 是 |
| `GET_BATTERY` | 小程序 -> 设备 | 读取设备电量 | `0x??` | 空 | 电量值 | 是 |
| `GET_DEVICE_STATUS` | 小程序 -> 设备 | 读取设备当前状态 | `0x??` | 空 | 状态码 | 是 |
### 治疗流程类
| 建议命令名 | 建议方向 | 建议功能 | type 占位 | payload 请求 | payload 响应 | 待确认 |
| --- | --- | --- | --- | --- | --- | --- |
| `START_WEARING_CHECK` | 小程序 -> 设备 | 启动佩戴确认 | `0x??` | 空 | 佩戴检测结果 | 是 |
| `WEARING_CHECK_RESULT` | 设备 -> 小程序 | 上报佩戴确认结果 | `0x??` | 无(通知) | 佩戴状态 | 是 |
| `START_AUTO_SCAN` | 小程序 -> 设备 | 启动自动扫描 | `0x??` | 空 | 扫描结果 | 是 |
| `AUTO_SCAN_RESULT` | 设备 -> 小程序 | 上报自动扫描结果 | `0x??` | 无(通知) | 扫描数据 | 是 |
| `START_TREATMENT` | 小程序 -> 设备 | 开始治疗 | `0x??` | 治疗参数(待确认) | 确认/拒绝 | 是 |
| `PAUSE_TREATMENT` | 小程序 -> 设备 | 暂停治疗 | `0x??` | 空 | 确认 | 是 |
| `RESUME_TREATMENT` | 小程序 -> 设备 | 恢复治疗 | `0x??` | 空 | 确认 | 是 |
| `STOP_TREATMENT` | 小程序 -> 设备 | 结束治疗 | `0x??` | 空 | 治疗摘要 | 是 |
| `TREATMENT_PROGRESS` | 设备 -> 小程序 | 上报治疗进度 | `0x??` | 无(通知) | 进度数据 | 是 |
| `TREATMENT_ERROR` | 设备 -> 小程序 | 上报治疗异常 | `0x??` | 无(通知) | 错误码 | 是 |
### OTA 类
| 建议命令名 | 建议方向 | 建议功能 | type 占位 | payload 请求 | payload 响应 | 待确认 |
| --- | --- | --- | --- | --- | --- | --- |
| `OTA_START` | 小程序 -> 设备 | 启动 OTA | `0x??` | 固件版本、总大小 | 确认/拒绝 | 是 |
| `OTA_CHUNK` | 小程序 -> 设备 | 传输分片 | `0x??` | 分片序号、分片数据 | 确认 | 是 |
| `OTA_VERIFY` | 小程序 -> 设备 | 校验完整固件 | `0x??` | 校验值 | 校验结果 | 是 |
| `OTA_APPLY` | 小程序 -> 设备 | 应用新固件 | `0x??` | 空 | 结果 | 是 |
| `OTA_PROGRESS` | 设备 -> 小程序 | 上报 OTA 进度 | `0x??` | 无(通知) | 进度百分比 | 是 |
## 会话时序草案
### 连接后初始化时序(建议)
以下为建议流程,非最终定义:
1. 小程序扫描并连接设备 GATT
2. 发现 `FFE0``FFE1``FFE2` 服务
3. 订阅 `FFE1``notify_data` 通知
4. 读取 `FFE0``device_info` 获取设备基本信息
5. 根据业务需要发送后续命令
### 治疗主流程时序(建议)
1. 发送 `START_WEARING_CHECK`
2. 等待 `WEARING_CHECK_RESULT` 通知
3. 佩戴确认通过后发送 `START_AUTO_SCAN`
4. 等待 `AUTO_SCAN_RESULT` 通知
5. 扫描完成后发送 `START_TREATMENT`
6. 接收 `TREATMENT_PROGRESS` 周期通知
7. 治疗完成或用户主动停止后发送 `STOP_TREATMENT`
### 异常处理时序(建议)
- 命令超时:建议 3-5 秒未收到响应则重试,最多重试 3 次
- 断连重连:建议重连后重新订阅 notify 并查询设备当前状态
- 治疗中断:建议重连后查询是否需要恢复上次治疗会话
## ACK/NACK 机制建议
建议每个命令都存在对应的 ACK 或 NACK 响应(待确认):
| 响应类型 | 含义 |
| --- | --- |
| ACK | 命令已接收并执行成功 |
| NACK | 命令接收失败或执行失败,附带错误码 |
建议错误码表(待确认):
| 建议范围 | 含义 |
| --- | --- |
| `0x00` | 成功 |
| `0x01` - `0x0F` | 通用错误 |
| `0x10` - `0x1F` | 参数错误 |
| `0x20` - `0x2F` | 设备状态错误 |
| `0x30` - `0x3F` | 治疗相关错误 |
| `0x40` - `0x4F` | OTA 相关错误 |
## 分包与粘包建议
当前文档未定义,以下为建议方案(待确认):
- 建议每个 BLE 写入操作对应一个完整帧
- 若 payload 超过 MTU 限制,建议在应用层定义分包协议
- 每个分包建议携带:帧序号、是否最后一包的标记
- 接收端建议按序号拼装,收到最后一包后校验完整性
## 待确认问题
- 设备绑定是否依赖 BLE 返回的设备唯一标识,还是依赖扫码
- "确认佩戴"由什么传感器或状态判断,是自动还是手动
- "自动扫描"具体扫描什么数据
- 治疗模式、档位、时长是否由小程序下发
- 治疗记录是否由小程序组装后上传,还是由设备通过 MQTT 直接上报云端
- OTA 是否通过小程序中转升级包
- 是否需要设备端主动发起的连接认证或握手
## 当前结论
当前说明已经足够把 BLE 协议推进到"命令表草案"层。所有标为"待确认"的命令字、payload 和 UUID 都需要在下一步被确认或修正。最优先要补齐的是 `FFE1` 下的 characteristic UUID、命令字分配、ACK/NACK 机制和帧计算规则。