TWS 耳机 BLE GATT 服务表 (Finalized)¶
芯片: 杰理 AC7002 | 蓝牙版本: BT 5.3 | 配对方式: Just Works 文档版本: v1.0 | 最后更新: 2026-05-17 | 来源: docs/ble-protocol.md
1. 服务概览¶
| Service UUID | 服务名称 | 类型 | 必选 | 说明 |
|---|---|---|---|---|
| 0x1800 | Generic Access | Primary | 是 | 标准 GAP 服务 |
| 0x1801 | Generic Attribute | Primary | 是 | 标准 GATT 服务 |
| 0xFEE0 | 设备信息服务 | Primary | 是 | 电量、状态、控制、事件 |
| 0xFEE4 | OTA 升级服务 | Primary | 是 | 固件升级全流程 |
| 0x180F | 电池服务 | Primary | 否 | 备用电量通道 (可选) |
注意: APP 端只需要发现 0xFEE0 和 0xFEE4 两个自定义服务即可。
2. 设备信息服务 (0xFEE0)¶
2.1 特征值总表¶
| UUID | 名称 | 属性 | 权限 | 最大长度 | 说明 |
|---|---|---|---|---|---|
| 0xFEE1 | 设备状态 | Read + Notify | 无加密 | 12 bytes (Read) / 4 bytes (Notify) | 电量/固件版本/ANC/EQ 状态 |
| 0xFEE2 | 控制指令 | Write (With Response) | 无加密 | 3 bytes | 播放/暂停/音量/ANC/EQ/通话等 |
| 0xFEE3 | 事件通知 | Notify Only | 无加密 | 2 bytes | 按键事件/佩戴检测/入盒检测 |
2.2 特征值 0xFEE1: 设备状态¶
Read 响应 (12 bytes):
| 偏移 | 长度 | 字段 | 取值范围 | 说明 |
|---|---|---|---|---|
| 0 | 1 | Status Code | 0x00=正常, 0x01=充电中, 0x02=低电量 | 整体状态 |
| 1 | 1 | Battery L | 0~100 | 左耳电量百分比 |
| 2 | 1 | Battery R | 0~100 | 右耳电量百分比 |
| 3 | 1 | Battery Case | 0~100, 0xFE=未连接, 0xFF=充电中 | 充电仓电量 |
| 4 | 2 | Firmware Version | BCD (e.g. 0x0123 = v1.23) | 固件版本号 |
| 6 | 2 | Hardware Version | BCD (e.g. 0x0100 = v1.0) | 硬件版本号 |
| 8 | 1 | Connection Status | Bit0=左耳连, Bit1=右耳连, Bit2=Phone连, Bit3=仓在位 | 连接拓扑 |
| 9 | 1 | ANC Mode | 0x00=关, 0x01=降噪, 0x02=通透, 0x03=自适应 | 当前 ANC 模式 |
| 10 | 1 | EQ Mode | 0x00=默认, 0x01=流行, 0x02=古典, 0x03=摇滚, 0x04=自定义 | 当前 EQ 模式 |
| 11 | 1 | Reserved | 0x00 | 保留 |
Notify 格式 (4 bytes) — 状态变化时自动推送:
| 偏移 | 长度 | 字段 | 说明 |
|---|---|---|---|
| 0 | 1 | Changed Mask | Bit0=电量, Bit1=连接, Bit2=ANC, Bit3=佩戴, Bit4=EQ, Bit5~7=保留 |
| 1 | 1 | Old Value | 变化前的值 |
| 2 | 1 | New Value | 变化后的新值 |
| 3 | 1 | Reserved | 保留 |
2.3 特征值 0xFEE2: 控制指令¶
请求格式 (3 bytes):
| 偏移 | 长度 | 字段 | 说明 |
|---|---|---|---|
| 0 | 1 | Command ID | 指令码 (见下方) |
| 1 | 1 | Parameter | 参数 |
| 2 | 1 | Checksum | Command XOR Parameter |
指令定义表:
| Cmd ID | 指令名称 | Parameter | 说明 |
|---|---|---|---|
| 媒体控制 | |||
| 0x01 | 播放/暂停 | 0x00 | 触发切换 |
| 0x02 | 下一曲 | 0x00 | — |
| 0x03 | 上一曲 | 0x00 | — |
| 0x04 | 音量增加 | 0x00=步进+1, 0x01~0x63=直接设置 | — |
| 0x05 | 音量减少 | 0x00=步进-1, 0x01~0x63=直接设置 | — |
| 0x06 | 设置音量 | 0x00~0x63 (0~99) | 绝对音量值 |
| ANC 控制 | |||
| 0x10 | 设置 ANC 模式 | 0x00=关, 0x01=降噪, 0x02=通透, 0x03=自适应 | — |
| 0x11 | ANC 模式循环切换 | 0x00 | 关闭→降噪→通透→自适应 |
| EQ 控制 | |||
| 0x12 | 设置 EQ 模式 | 0x00=默认, 0x01=流行, 0x02=古典, 0x03=摇滚, 0x04=自定义 | — |
| 0x13 | EQ 自定义参数 | (扩展格式) | 10 段均衡器参数 |
| 通话控制 | |||
| 0x20 | 接听电话 | 0x00 | — |
| 0x21 | 挂断/拒接电话 | 0x00 | — |
| 0x22 | 唤醒语音助手 | 0x00 | Siri/Google Assistant |
| 设备管理 | |||
| 0x30 | 查找耳机 | 0x00=左耳, 0x01=右耳, 0x02=双耳 | 触发响铃 |
| 0x40 | 断开 BLE | 0x00 | — |
| 0x50 | 恢复出厂设置 | 0x00 | 清除配对信息 |
| 0x60 | 读设备日志 | 0x00 | 触发日志上报 |
Write 响应 (1 byte):
| 值 | 含义 |
|---|---|
| 0x00 | ACK — 指令接收成功 |
| 0x01 | NACK — 校验失败 |
| 0x02 | NACK — 命令不支持 |
| 0x03 | NACK — 参数无效 |
| 0x04 | NACK — 忙/不可执行 |
2.4 特征值 0xFEE3: 事件通知¶
格式 (2 bytes):
| 偏移 | 长度 | 字段 | 说明 |
|---|---|---|---|
| 0 | 1 | Event Code | 事件码 |
| 1 | 1 | Event Data | 事件参数 (0x00=左耳, 0x01=右耳, 0x02=双耳) |
事件定义:
| Event Code | 事件名称 | 说明 |
|---|---|---|
| 按键事件 | ||
| 0x01 | 按键 - 单击 | Data: 0x00=左耳, 0x01=右耳 |
| 0x02 | 按键 - 双击 | Data: 同上 |
| 0x03 | 按键 - 三击 | Data: 同上 |
| 0x04 | 按键 - 长按 (1s) | Data: 同上 |
| 0x05 | 按键 - 长按 (2s) | Data: 同上 |
| 佩戴检测 | ||
| 0x10 | 佩戴检测 - 戴上 | Data: 0x00=左耳, 0x01=右耳, 0x02=双耳 |
| 0x11 | 佩戴检测 - 取下 | Data: 同上 |
| 入盒检测 | ||
| 0x20 | 入盒检测 - 放入 | Data: 0x00=左耳, 0x01=右耳 |
| 0x21 | 入盒检测 - 取出 | Data: 同上 |
| 系统告警 | ||
| 0x30 | 低电量告警 | Data: 0x00=左耳, 0x01=右耳, 0x02=充电仓 (电量 < 10%) |
| 0x31 | 充电状态 | Data: 0x00=开始充电, 0x01=充电完成 |
| 0x40 | 连接状态 | Data: 0x00=已断开, 0x01=已连接 |
3. OTA 升级服务 (0xFEE4)¶
3.1 特征值总表¶
| UUID | 名称 | 属性 | 最大长度 | 说明 |
|---|---|---|---|---|
| 0xFEE5 | OTA 控制 | Write (With Response) | 4 bytes | 开始/提交/中止/查询 |
| 0xFEE6 | OTA 数据通道 | Write (Without Response) | 2+N bytes (N=块大小) | 固件分块上传 |
| 0xFEE7 | OTA 状态 | Notify | 4 bytes | 升级进度/结果通知 |
3.2 特征值 0xFEE5: OTA 控制¶
请求格式 (4 bytes):
| 偏移 | 长度 | 字段 | 说明 |
|---|---|---|---|
| 0 | 1 | Command | 操作码 |
| 1 | 2 | Parameter | 参数 (小端) |
| 3 | 1 | Checksum | 前 3 字节 XOR |
操作码:
| Command | 名称 | Parameter | 说明 |
|---|---|---|---|
| 0x01 | OTA_START | 固件总大小 (bytes) | 开始升级, 初始化存储 |
| 0x02 | OTA_COMMIT | CRC32 (小端) | 提交固件校验 |
| 0x03 | OTA_ABORT | 0x0000 | 中止升级 |
| 0x04 | OTA_GET_INFO | 0x0000 | 查询固件信息 |
| 0x05 | OTA_SET_BLOCK_SIZE | 块大小 (bytes) | 设置数据块大小 (默认 128) |
Write 响应 (1 byte): 0x00=ACK, 0x01~0x04=NACK (格式/容量/CRC/忙)
3.3 特征值 0xFEE6: OTA 数据通道¶
| 偏移 | 长度 | 字段 | 说明 |
|---|---|---|---|
| 0 | 2 | Sequence Number | 序列号 (小端, 从 0 开始) |
| 2 | N | Payload | 固件数据块 |
- MTU 建议 ≥ 512 bytes
- 默认块大小 128 bytes, 可通过 OTA_SET_BLOCK_SIZE 调整
- Write Without Response, 连续写入无需等待
3.4 特征值 0xFEE7: OTA 状态¶
格式 (4 bytes):
| 偏移 | 长度 | 字段 | 说明 |
|---|---|---|---|
| 0 | 1 | Notification Type | 状态类型 |
| 1 | 2 | Value | 值 (小端) |
| 3 | 1 | Reserved | 保留 |
状态类型:
| Type | 名称 | Value 说明 |
|---|---|---|
| 0x00 | OTA_PROGRESS | 0~10000 (0.00%~100.00%) |
| 0x01 | OTA_RESULT_SUCCESS | Value=固件版本号 (BCD) |
| 0x02 | OTA_RESULT_FAIL | 错误码 |
| 0x03 | OTA_RESULT_REJECT | 0x0000 |
| 0x04 | OTA_VERSION_INFO | 当前固件版本 (BCD) |
错误码: 0x0001=存储写入失败, 0x0002=Flash擦除失败, 0x0003=CRC校验失败, 0x0004=固件大小不匹配, 0x0005=固件签名无效, 0x0006=超时, 0x0007=蓝牙断开
4. 广播数据格式 (扫描阶段)¶
| AD Type | 内容 | 长度 |
|---|---|---|
| 0x01 (Flags) | LE General Discoverable + BR/EDR Not Supported | 2 |
| 0x08 (Shortened Name) | TWS-XXXX | 9 |
| 0xFF (Manufacturer Data) | 电量及状态 (见下方) | 6 |
Manufacturer Data (6 bytes):
| 偏移 | 长度 | 字段 | 说明 |
|---|---|---|---|
| 0 | 2 | Company ID | 0x005D (杰理) 或 0xFFFF (自定义) |
| 2 | 1 | Battery L | 左耳电量 0~100, 0xFF=充电中 |
| 3 | 1 | Battery R | 右耳电量 0~100, 0xFF=充电中 |
| 4 | 1 | Battery Case | 充电仓电量, 0xFF=充电中, 0xFE=未连接 |
| 5 | 1 | Status Flags | Bit0=左耳佩戴, Bit1=右耳佩戴, Bit2=充电中, Bit3~7=保留 |
5. APP 端常量定义 (建议)¶
注意: 所有自定义 UUID 使用 16-bit 短 UUID (0xFEE0~0xFEE7), 在 BLE 协议中需要补齐为标准 128-bit UUID:
0000XXXX-0000-1000-8000-00805F9B34FB.
文档结束 — 对应 ble-protocol.md v1.0, 确认所有服务/特征值定义一致。