# 协议简述补充解析

来源：仓库根目录 `协议简述(1).docx`（更新版），已归档到 `docs/protocols/`。

## 服务/特征值摘要

| UUID | 名称 | 属性 | 说明 |
| --- | --- | --- | --- |
| `FFE1` | Command | Write+Read | 下发 33 字节控制指令 |
| `FFE4` | Status | Read+Notify | 上报 17 字节 ADC/电池数据 |

## Command 参数（FFE1 Write，33 字节）

| 字节 | 含义 |
| --- | --- |
| Byte1 | IO1 红灯光强 |
| Byte2 | IO1 红外灯光强 |
| Byte3 | IO1 紫外灯光强 |
| Byte4 | IO1 暖黄灯光强 |
| Byte5 | IO1 电流增益高字节 |
| Byte6 | IO1 电流增益低字节 |
| Byte7-12 | IO2（同 IO1 结构） |
| Byte13-18 | IO3 |
| Byte19-24 | IO4 |
| Byte25-30 | IO5 |
| Byte31 | 保持时间高字节 |
| Byte32 | 保持时间低字节 |
| Byte33 | 异或校验（Byte1-Byte32） |

每个 IO 为 6 字节：红灯(1) + 红外(1) + 紫外(1) + 暖黄(1) + 电流增益(2, 大端)。

## Status 上报（FFE4 Notify，17 字节）— 新增

| 字节 | 含义 | 字节序 |
| --- | --- | --- |
| Byte1-2 | PD1 ADC 值 | 小端（低字节在前） |
| Byte3-4 | PD2 ADC 值 | 小端 |
| Byte5-6 | PD3 ADC 值 | 小端 |
| Byte7-8 | PD4 ADC 值 | 小端 |
| Byte9-10 | PD5 ADC 值 | 小端 |
| Byte11-12 | PD6 ADC 值 | 小端 |
| Byte13-14 | PD7 ADC 值 | 小端 |
| Byte15-16 | VBAT 电池电压 | 小端（单位 mV） |
| Byte17 | 异或校验（Byte1-Byte16） |

7 个 PD（光电传感器）通道 + 1 个电池电压通道。

## 与旧版协议简述的差异

| 项目 | 旧版 | 新版（当前） |
| --- | --- | --- |
| FFE4 上报格式 | 仅说"设备状态及 ADC 值"，无字节定义 | 完整定义：7×PD + VBAT + XOR，共 17 字节 |
| FFE1 Command | 33 字节（相同） | 33 字节（不变） |
| PD 通道数 | 未知 | 7 个通道 |
| 电池信息 | 未知 | VBAT，小端 mV |
| 字节序 | 未标注 | Status 明确小端序 |

## 对代码的影响

### 已更新

- `protocol.js` 的 `parseVendorStatus()` 增加 17 字节解析：提取 7 个 PD 值 + VBAT，校验 XOR
- `connection.js` 的 `handleValueChange()` 处理 `type === 'adc'`：从 VBAT 计算电量百分比，PD 数据通过 `status` 事件传递

### 仍待确认

1. PD1-PD7 与面部区域的对应关系
2. PD 值的物理含义（光照强度？反射率？）和有效范围
3. VBAT 值的精度（是否直接 mV？是否需要系数换算？）
4. 电量百分比计算方式（当前假设 3000mV=0%，4200mV=100%，可能不准确）
5. 上报频率（当前实测是每秒一次，但可能固件更新后改变）
6. 是否有 start/stop 命令，还是全 0 的 33 字节表示停止
