跳转至

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 端常量定义 (建议)

// Service UUIDs
const String SERVICE_DEVICE_INFO  = '0000fee0-0000-1000-8000-00805f9b34fb';
const String SERVICE_OTA          = '0000fee4-0000-1000-8000-00805f9b34fb';

// Characteristic UUIDs (Device Info Service)
const String CHAR_DEVICE_STATUS   = '0000fee1-0000-1000-8000-00805f9b34fb';
const String CHAR_CONTROL_CMD     = '0000fee2-0000-1000-8000-00805f9b34fb';
const String CHAR_EVENT_NOTIFY    = '0000fee3-0000-1000-8000-00805f9b34fb';

// Characteristic UUIDs (OTA Service)
const String CHAR_OTA_CONTROL     = '0000fee5-0000-1000-8000-00805f9b34fb';
const String CHAR_OTA_DATA        = '0000fee6-0000-1000-8000-00805f9b34fb';
const String CHAR_OTA_STATUS      = '0000fee7-0000-1000-8000-00805f9b34fb';

注意: 所有自定义 UUID 使用 16-bit 短 UUID (0xFEE0~0xFEE7), 在 BLE 协议中需要补齐为标准 128-bit UUID: 0000XXXX-0000-1000-8000-00805F9B34FB.


文档结束 — 对应 ble-protocol.md v1.0, 确认所有服务/特征值定义一致。