蓝牙耳机和手机通信,不是只有一条"蓝牙连接"这么简单。实际上一副耳机和手机之间通常会同时跑好几个协议/通道:
text
1. 经典蓝牙 BR/EDR:
用来传音乐、通话、播放控制
A2DP / AVRCP / HFP
2. BLE 低功耗蓝牙:
用来做弹窗、配套 App 控制、电量显示、ANC 设置、OTA 等
GAP / GATT
3. 如果是新一代 LE Audio:
可能用 BLE Isochronous + LC3 传音频
大多数普通蓝牙耳机,尤其是传统 TWS 耳机,核心还是:
text
听歌:A2DP
控制播放/音量:AVRCP
打电话:HFP
App 控制/电量/弹窗:BLE GATT
1. 手机和耳机之间不是 IP + 端口,而是蓝牙地址 + Profile
网络通信里你熟悉的是:
text
IP 地址 + 端口号
例如:
192.168.1.10:8080
蓝牙里不是这样。
蓝牙设备靠:
text
蓝牙地址 BD_ADDR
Service UUID
L2CAP PSM
RFCOMM Channel
Profile
例如:
text
手机蓝牙地址: 11:22:33:44:55:66
耳机蓝牙地址: AA:BB:CC:DD:EE:FF
手机连接耳机,不是连接 IP:Port,而是先发现耳机地址,然后查询它支持哪些蓝牙服务:
text
A2DP Sink 支持播放音乐
AVRCP Target 支持播放控制
HFP HF 支持通话
Battery Service 支持电量读取
厂商私有服务 支持 App 控制
2. 总体通信架构图
传统蓝牙耳机大概是这样:
text
手机 App / 系统音频 / 电话
│
├── A2DP:音乐音频
├── AVRCP:播放/暂停/上一曲/下一曲/音量
├── HFP:电话通话
└── BLE GATT:电量、弹窗、设置、OTA
│
手机蓝牙协议栈
│
蓝牙射频 2.4GHz
│
耳机蓝牙协议栈
│
├── A2DP Sink:接收音乐
├── AVRCP Controller/Target:控制播放
├── HFP HF:通话
└── BLE GATT Server:给手机 App 读写配置
│
音频解码 / DSP / DAC / 功放 / 喇叭
3. 第一次连接:配对 Pairing 流程
第一次使用耳机时,通常要进入配对模式。
比如耳机开盖后进入配对:
text
耳机:AA:BB:CC:DD:EE:FF
手机:11:22:33:44:55:66
3.1 耳机进入可发现状态
耳机开始让自己可以被手机发现:
text
耳机进入 Inquiry Scan / Page Scan
或者 BLE Advertising
手机蓝牙设置里开始搜索设备。
手机会看到:
text
设备名:Vik Earbuds
地址:AA:BB:CC:DD:EE:FF
设备类型:Audio / Headset
3.2 手机点击连接耳机
用户在手机上点:
text
Vik Earbuds
手机开始和耳机建立底层链路。
经典蓝牙里面大概是:
text
手机 耳机
Inquiry 扫描 ────────> 耳机响应设备信息
Page 连接 ────────> 建立 ACL 链路
Pairing <───────> 配对认证
生成 Link Key <──────> 双方保存密钥
开启加密 <───────> 后续通信加密
3.3 配对成功后保存密钥
手机和耳机都会保存一个密钥,叫:
text
Link Key
保存后,下次就不需要重新配对了。
下次开盖时流程变成:
text
耳机广播/可连接
手机识别到这是以前配对过的设备
手机自动重连
用之前保存的 Link Key 加密连接
所以你平时看到的"自动回连",底层就是靠之前保存的配对信息。
4. 配对后:手机查询耳机支持什么服务
配对和底层连接建立后,手机会通过 SDP 查询耳机支持哪些服务。
SDP 全称:
text
Service Discovery Protocol
服务发现协议
手机会问耳机:
text
你支持哪些蓝牙服务?
耳机会告诉手机:
text
我支持:
1. A2DP Sink:可以接收音乐
2. AVRCP:可以控制播放
3. HFP HF:可以作为通话耳机
4. 可能还有 Battery Service
5. 可能还有厂商私有 BLE 服务
可以类比 TCP 里的端口发现:
text
TCP:
服务端开放 80 / 443 / 1883 端口
蓝牙:
耳机暴露 A2DP / AVRCP / HFP / GATT 服务
5. 听音乐时:A2DP 工作流程
听歌走的是 A2DP。
A2DP 全称:
text
Advanced Audio Distribution Profile
高级音频分发协议
角色是:
text
手机:A2DP Source
耳机:A2DP Sink
意思是:
text
手机是音频源头
耳机是音频接收端
5.1 A2DP 音乐链路流程
比如手机播放一首歌:
text
手机音乐 App
↓
手机系统音频框架
↓
蓝牙 A2DP Source
↓
音频编码 SBC / AAC / aptX / LDAC
↓
AVDTP
↓
L2CAP
↓
ACL 蓝牙链路
↓
耳机蓝牙芯片
↓
A2DP Sink
↓
音频解码
↓
DSP 音效处理
↓
I2S / PCM
↓
DAC / 功放
↓
喇叭出声
图:
text
手机 蓝牙耳机
音乐 App
│
│ PCM 原始音频
▼
A2DP Source
│
│ 编码成 SBC/AAC/aptX/LDAC
▼
AVDTP / L2CAP / ACL
│ 2.4GHz 蓝牙无线传输
├──────────────────────────────────────>
A2DP Sink
│
│ 解码成 PCM
▼
DSP / DAC / 喇叭
5.2 音频不是直接传 PCM
手机一般不会直接把 PCM 裸音频丢给耳机,而是先编码。
常见编码:
text
SBC:蓝牙 A2DP 基础必选编码
AAC:苹果/部分安卓常用
aptX:高通方案常见
LDAC:索尼方案常见
LHDC:部分国产耳机常见
大概流程:
text
音乐文件 / 流媒体
↓
手机解码成 PCM
↓
再编码成蓝牙音频编码,例如 SBC/AAC
↓
发给耳机
↓
耳机解码成 PCM
↓
播放
所以蓝牙耳机里通常有:
text
蓝牙协议栈
音频 codec 解码器
DSP 音效算法
DAC 或外部 Codec
功放
扬声器
6. 播放控制:AVRCP 工作流程
你按耳机上的按钮:
text
单击:播放/暂停
双击:下一曲
三击:上一曲
长按:音量加减/语音助手
这些通常走 AVRCP。
AVRCP 全称:
text
Audio/Video Remote Control Profile
音视频远程控制协议
它管的是:
text
播放
暂停
上一曲
下一曲
音量
歌曲信息
播放状态
6.1 耳机控制手机播放暂停
比如你按一下右耳:
text
耳机检测到按键
↓
耳机协议栈生成 AVRCP 命令
↓
发送 Play/Pause 命令给手机
↓
手机系统收到控制命令
↓
音乐 App 暂停/播放
图:
text
蓝牙耳机 手机
按键单击
│
▼
AVRCP Controller
│
│ Play/Pause 命令
├──────────────────────────────>
AVRCP Target
│
▼
音乐 App 暂停/播放
这里常见角色是:
text
耳机:AVRCP Controller
手机:AVRCP Target
但是实际产品里,手机和耳机可能都同时支持 Controller/Target,因为还要处理音量、状态、歌曲信息等。
6.2 手机把歌曲信息发给耳机
有些耳机或车机能显示:
text
歌曲名
歌手
播放进度
播放状态
这也可以通过 AVRCP 相关机制传递。
比如:
text
手机当前播放:
歌名:Song A
歌手:Artist B
状态:Playing
耳机或车机可以获取这些媒体信息。
7. 打电话时:HFP 工作流程
打电话不是走 A2DP,而是走 HFP。
HFP 全称:
text
Hands-Free Profile
免提协议
角色:
text
手机:Audio Gateway,简称 AG
耳机:Hands-Free,简称 HF
意思是:
text
手机是电话网关
耳机是免提设备
7.1 HFP 包含两部分
HFP 里有两条重要通道:
text
1. 控制通道:
RFCOMM 上跑 AT 命令
2. 语音音频通道:
SCO / eSCO 链路上传双向语音
可以画成:
text
手机 耳机
HFP AG HFP HF
│ │
│ AT 命令控制通道,走 RFCOMM │
├───────────────────────────────────────────┤
│ │
│ SCO/eSCO 语音通道 │
├───────────────────────────────────────────┤
7.2 来电话时具体发生什么
假设手机来电:
text
手机收到蜂窝网络来电
↓
手机通过 HFP 控制通道通知耳机
↓
耳机响铃/播放提示音
↓
用户按耳机接听
↓
耳机通过 AT 命令告诉手机接听
↓
手机建立 SCO/eSCO 语音链路
↓
双向语音开始
具体一点:
text
手机 AG 耳机 HF
来电
│
│ RING / 来电状态通知
├────────────────────────────────────>
耳机响铃提示
用户按耳机接听
AT+ATA
<────────────────────────────────────┤
建立 SCO/eSCO 语音链路
├════════════════════════════════════┤
手机下行语音 ─────────────────────────>
耳机麦克风上行语音 <──────────────────
7.3 通话音频怎么走
通话音频和听歌不同。
听歌:
text
A2DP
高音质
单向:手机 -> 耳机
延迟可以稍高
通话:
text
HFP
双向语音
手机 -> 耳机:对方说话
耳机 -> 手机:你的麦克风声音
低延迟
音质比 A2DP 低
HFP 常见语音编码:
text
CVSD:传统窄带语音
mSBC:宽带语音,俗称高清通话的一种基础方式
所以你会发现:
text
听音乐时音质好
一进入电话/语音聊天,音质可能变差
原因是手机从 A2DP 音乐通道切换到了 HFP 通话通道。
8. 为什么打电话时音乐音质会变差?
因为模式切换了。
听音乐时:
text
手机 -> 耳机
A2DP
SBC/AAC/aptX/LDAC
高码率
单向音频
打电话时:
text
手机 <-> 耳机
HFP
CVSD/mSBC
低延迟双向语音
同时要用麦克风
蓝牙经典音频里,传统 HFP 不是为高保真音乐设计的,而是为实时语音通话设计的。
所以:
text
A2DP:适合听音乐
HFP:适合打电话
9. 电量显示、弹窗、降噪设置:BLE GATT 流程
很多耳机连接手机时,除了经典蓝牙,还会开一个 BLE 通道。
BLE 常用于:
text
1. 开盖弹窗
2. 左右耳电量
3. 充电盒电量
4. ANC 降噪模式设置
5. 通透模式设置
6. 触摸按键功能设置
7. 固件 OTA 升级
8. 查找耳机
9. EQ 设置
9.1 BLE 角色
通常:
text
耳机:BLE Peripheral + GATT Server
手机:BLE Central + GATT Client
流程:
text
耳机 BLE 广播
↓
手机扫描到耳机
↓
手机连接 BLE
↓
手机发现 GATT 服务
↓
手机读写 Characteristic
9.2 读取电量例子
假设耳机有一个 GATT 服务:
text
Service UUID:厂商私有服务
Characteristic UUID:电量特征值
手机读取:
text
手机 GATT Client 耳机 GATT Server
Read Battery Characteristic ────────>
查询当前电量
<────────────────────────────────────
Response:
左耳 85%
右耳 82%
盒子 60%
9.3 设置降噪模式例子
手机 App 里点:
text
开启 ANC 降噪
手机通过 BLE 写耳机的某个 Characteristic:
text
手机 GATT Client 耳机 GATT Server
Write ANC Mode = ON ────────────────>
耳机切换 DSP 参数
开启降噪算法
<────────────────────────────────────
Write Response / Notify 状态
9.4 BLE GATT 不负责传统音乐音频
这个要注意。
传统蓝牙耳机里:
text
音乐不是 BLE GATT 传的
通话也不是 BLE GATT 传的
BLE GATT 主要传:
text
控制命令
状态
电量
配置
少量数据
传统音乐和通话主要走:
text
A2DP / HFP
10. 一次完整连接过程:从开盖到听歌
下面把流程完整串起来。
10.1 耳机开盖
text
耳机上电
↓
读取 Flash 里保存的配对记录
↓
发现之前连过手机 11:22:33:44:55:66
↓
进入回连模式
耳机可能同时做两件事:
text
1. 经典蓝牙尝试回连手机
2. BLE 开始广播,让手机或 App 发现
10.2 手机发现耳机
如果之前配对过,手机系统可能自动发现并回连:
text
手机蓝牙后台扫描/监听
↓
发现耳机
↓
根据配对记录发起连接
10.3 建立经典蓝牙 ACL 链路
先建立基础链路:
text
手机 耳机
建立 ACL 链路 <──────────> 成功
认证加密 <──────────> 成功
ACL 可以理解为经典蓝牙里的普通数据链路,A2DP、AVRCP、HFP 的控制部分很多都基于它承载。
10.4 建立 Profile 连接
手机接着连接多个 Profile:
text
1. A2DP:准备传音乐
2. AVRCP:准备播放控制
3. HFP:准备电话通话
大概:
text
手机 耳机
连接 A2DP ────────────────> A2DP Sink 就绪
连接 AVRCP ────────────────> 播放控制就绪
连接 HFP ────────────────> 通话控制就绪
10.5 手机开始播放音乐
text
手机音乐 App 播放
↓
手机系统选择蓝牙耳机作为音频输出
↓
A2DP Start
↓
手机编码音频
↓
蓝牙发送
↓
耳机接收解码
↓
喇叭播放
流程图:
text
手机音乐 App
│
▼
系统音频路由选择蓝牙耳机
│
▼
A2DP Source 编码 SBC/AAC/aptX
│
▼
蓝牙 ACL 链路发送音频包
│
▼
耳机 A2DP Sink 解码
│
▼
DSP / DAC / 喇叭
11. 听歌过程中按耳机按键
比如用户双击右耳下一曲:
text
耳机按键/触摸检测
↓
耳机 MCU/蓝牙 SoC 判断为"下一曲"
↓
通过 AVRCP 发送 Next 命令
↓
手机收到 AVRCP 命令
↓
音乐 App 切到下一首
↓
手机继续通过 A2DP 发新歌音频
图:
text
耳机 手机
双击右耳
│
▼
AVRCP: NEXT
├──────────────────────────────────>
音乐 App 下一曲
A2DP 继续发音频
<═══════════════════════════════════
12. 听歌时突然来电话
这个流程很典型。
text
当前状态:
A2DP 正在播放音乐
AVRCP 可控制播放
HFP 已连接但未通话
来电话后:
text
手机收到来电
↓
暂停或降低 A2DP 音乐
↓
通过 HFP 通知耳机来电
↓
耳机播放铃声/提示音
↓
用户按耳机接听
↓
HFP 建立 SCO/eSCO 语音链路
↓
开始双向通话
流程图:
text
手机 耳机
A2DP 音乐播放中
════════════════════════════════════>
来电
│
│ HFP RING / call status
├─────────────────────────────────>
用户按耳机接听
│ HFP AT+ATA
<─────────────────────────────────┤
建立 SCO/eSCO 语音链路
══════════════════════════════════
手机下行语音 ───────────────────────>
耳机麦克风上行语音 <────────────────
挂断后:
text
SCO/eSCO 语音链路关闭
↓
HFP 回到空闲
↓
手机恢复 A2DP 音乐播放
13. TWS 左右耳之间怎么通信?
TWS 耳机还多一个问题:
text
手机怎么同时给左耳和右耳传声音?
常见有几种方案。
13.1 传统主从转发模式
早期或普通 TWS 常见:
text
手机只连接主耳
主耳再把另一声道转发给副耳
例如:
text
手机 <────蓝牙经典链路────> 右耳主耳 <────私有链路────> 左耳副耳
流程:
text
手机把立体声音频发给右耳
右耳播放右声道
右耳把左声道转发给左耳
左耳播放左声道
图:
text
手机
│
│ A2DP 立体声音频
▼
右耳主耳
├── 播放右声道
└── 转发左声道 ─────> 左耳副耳
└── 播放左声道
缺点:
text
主耳耗电更快
主耳延迟更重
左右耳同步难度高
13.2 双耳分别和手机通信
一些新方案会让手机和左右耳都建立某种连接,降低单主耳压力。
概念上类似:
text
手机
├────────> 左耳
└────────> 右耳
但具体实现和芯片厂商、手机系统、耳机方案强相关。
很多 TWS 同步技术是厂商私有的,例如高通、恒玄、络达、苹果等都有自己的方案。
13.3 左右耳同步要解决什么?
TWS 难点不只是收到声音,还要:
text
1. 左右耳同时播放,不能一边快一边慢
2. 延迟要低
3. 主副耳切换
4. 单耳入盒/出盒检测
5. 左右耳电量同步
6. 通话时麦克风选择
7. 降噪参数同步
所以 TWS 耳机里面除了手机通信,还有:
text
耳机左/右之间通信
主副耳角色管理
音频同步算法
电量和状态同步
14. 蓝牙耳机里的协议栈分层
传统蓝牙耳机大概这样:
text
应用层:
耳机业务逻辑、按键、入耳检测、电量、ANC、提示音
Profile 层:
A2DP / AVRCP / HFP / BLE GATT / OTA Profile
协议层:
AVDTP / AVCTP / RFCOMM / SDP / ATT / GATT / SMP
适配层:
L2CAP / HCI
控制器:
Baseband / Link Manager / Link Layer / PHY
硬件:
2.4GHz RF / PA / LNA / 天线
更具体一点:
text
音乐:
A2DP
↓
AVDTP
↓
L2CAP
↓
HCI / Controller
↓
Radio
播放控制:
AVRCP
↓
AVCTP
↓
L2CAP
↓
HCI / Controller
↓
Radio
通话控制:
HFP
↓
RFCOMM
↓
L2CAP
↓
HCI / Controller
↓
Radio
通话语音:
HFP Audio
↓
SCO / eSCO
↓
Baseband
↓
Radio
App 控制:
BLE GATT
↓
ATT
↓
L2CAP
↓
BLE Link Layer
↓
Radio
15. 传统蓝牙音频和 BLE 的区别
很多人容易混:
text
蓝牙耳机连接手机,是 BLE 吗?
答案是:
text
不一定。
传统听歌和打电话主要是经典蓝牙 BR/EDR。
BLE 多用于控制和状态。
对比:
| 功能 | 常用协议 |
|---|---|
| 听音乐 | A2DP,经典蓝牙 |
| 播放/暂停/下一曲 | AVRCP,经典蓝牙 |
| 电话通话 | HFP,经典蓝牙 |
| 电量显示 | HFP/BLE GATT/厂商协议都有可能 |
| App 设置 ANC/EQ | BLE GATT 常见 |
| 开盖弹窗 | BLE 广播 + 厂商协议常见 |
| 固件 OTA | BLE GATT 或经典蓝牙私有通道都有可能 |
| 新 LE Audio | BLE Isochronous + LC3 |
16. 新一代 LE Audio 简单说明
新一点的蓝牙音频可能支持 LE Audio。
LE Audio 不再是传统 A2DP/HFP 那套,而是基于:
text
Bluetooth LE
Isochronous Channels
LC3 编码
典型特点:
text
1. 使用 LC3 音频编码
2. 支持低功耗音频
3. 支持广播音频 Auracast
4. 支持更标准化的多设备音频
5. 左右耳同步机制更现代
简单理解:
text
传统蓝牙耳机:
经典蓝牙 BR/EDR + A2DP/HFP
LE Audio 耳机:
BLE + LC3 + Isochronous Channel
不过目前大量耳机仍然是传统 A2DP/HFP 为主,BLE 只是辅助控制。
17. 从嵌入式开发角度,你真正要关心哪些事件?
如果你在耳机固件里做开发,通常会关心这些状态机事件:
text
1. 开机
2. 进入配对模式
3. 被手机发现
4. 手机发起连接
5. 配对成功/失败
6. ACL 连接成功
7. A2DP 连接成功
8. AVRCP 连接成功
9. HFP 连接成功
10. A2DP 开始播放
11. A2DP 暂停
12. HFP 来电
13. HFP 接听
14. SCO/eSCO 建立
15. 通话结束
16. BLE GATT 连接
17. 手机 App 写配置
18. 断开连接
19. 回连
20. 入盒/出盒
21. 左右耳主副切换
在代码里通常就是一堆 callback/event,例如:
text
BT_EVENT_ACL_CONNECTED
BT_EVENT_ACL_DISCONNECTED
BT_EVENT_A2DP_CONNECTED
BT_EVENT_A2DP_STREAM_START
BT_EVENT_A2DP_STREAM_SUSPEND
BT_EVENT_AVRCP_PLAY
BT_EVENT_AVRCP_PAUSE
BT_EVENT_HFP_CONNECTED
BT_EVENT_HFP_RING
BT_EVENT_HFP_CALL_ACTIVE
BT_EVENT_SCO_CONNECTED
BT_EVENT_BLE_CONNECTED
BT_EVENT_GATT_WRITE
不同芯片平台名字不一样,但逻辑差不多。
18. 最完整的一条主线
你可以把手机和蓝牙耳机通信过程记成这条线:
text
第一次使用:
耳机进入配对模式
↓
手机扫描发现耳机
↓
手机连接耳机
↓
双方配对,生成 Link Key
↓
手机通过 SDP 查询耳机服务
↓
建立 A2DP / AVRCP / HFP 连接
↓
可能再建立 BLE GATT 连接
↓
开始正常使用
听音乐:
手机音乐 App
↓
A2DP 编码音频
↓
蓝牙发送
↓
耳机解码播放
按键控制:
耳机按键
↓
AVRCP 命令
↓
手机控制音乐 App
打电话:
手机来电
↓
HFP 通知耳机
↓
用户接听
↓
建立 SCO/eSCO
↓
双向语音
App 控制:
手机 App
↓
BLE GATT 写 Characteristic
↓
耳机修改 ANC/EQ/按键配置
19. 最简单总结
text
手机和蓝牙耳机之间通常不是一个协议,而是一组协议同时工作。
A2DP:
手机给耳机传音乐。
AVRCP:
耳机控制手机播放、暂停、上一曲、下一曲、音量。
HFP:
手机和耳机进行电话通话,控制用 AT 命令,语音走 SCO/eSCO。
BLE GATT:
手机 App 读取电量、设置降噪、EQ、按键、做 OTA 等。
SDP:
手机查询耳机支持哪些服务。
配对 Pairing:
手机和耳机建立安全关系,保存密钥,下次自动回连。
TWS:
还要处理左右耳之间的同步、转发、主副耳切换。
一句话记:
text
听歌走 A2DP,
按键控制走 AVRCP,
打电话走 HFP,
电量和 App 设置多半走 BLE GATT,
第一次连接要配对,
配对后靠密钥自动回连。