15 · Profile 与传输协议图解(每个协议干嘛、靠什么传)
适用范围:纯协议科普,回答新人最朴素的疑问——「HFP/A2DP/PBAP 这些到底是干嘛的、数据靠什么传过去」。承接 13-协议栈分层详解,把镜头拉近到「应用层 + 它正下方的传输协议」这两层。 关联:缩写全称查 14;车机 Android 代码里的 profile 角色实现(settingslib 各 *Profile.java)查 12-Profile体系与车机角色——本篇讲协议本身,12 讲代码实现,互为表里。
0. 先搞懂「Profile」是什么
Profile(规范)= 一份约定书。蓝牙 SIG(标准组织)写了一份份文档,规定「打电话这个场景,双方该怎么配合」「放音乐这个场景,数据怎么编码怎么传」。每份文档就是一个 profile。
打比方:profile 就像「快递服务条款」——寄件人(手机)和收件人(车机)都按同一份条款办事,才能把货(音频/通讯录/通话)正确送达。没有 profile,双方只是「管道通了但不知道传什么、怎么解码」。
新人最该记住的对照:
| profile | 通俗一句话 | 车机角色 | 手机角色 | 数据走什么 |
|---|---|---|---|---|
| HFP | 打电话免提 | HF 免提 | AG 网关 | SCO 传声音 + RFCOMM 传命令 |
| A2DP | 蓝牙放歌 | Sink 收 | Source 发 | AVDTP 传音频流 |
| PBAP | 读通讯录 | PCE 客户端 | PSE 服务端 | OBEX 传电话本 |
| AVRCP | 遥控播放 | Controller | Target | AVCTP 传控制命令 |
| MAP | 读短信 | MCE | MSE | OBEX |
| GATT | 读传感器/钥匙 | Central | Peripheral | ATT |
关键认知:每个 profile 都「骑」在一个专用传输协议上(RFCOMM/AVDTP/OBEX/AVCTP),而这些传输协议又都骑在 L2CAP 上(SCO 例外,绕过 L2CAP 直达基带)。这正是 13 讲的「分层复用」。
1. HFP —— 打电话
全称:Hands-Free Profile(免提规范)。 干嘛的:让车机当手机的「免提听筒」——来电时车机喇叭出声、麦克风收音,不用手拿手机。 角色:
- 手机 = AG(Audio Gateway,音频网关):管电话呼叫、音频进出。
- 车机 = HF(Hands-Free,免提单元):放音+收音+按键控制。
数据怎么走(双通道,这是 HFP 最特殊的地方):
flowchart LR subgraph Phone["📱 手机 AG"] MIC["麦克风/通话"] AT["AT 命令<br/>(拨号/接听/挂断)"] end subgraph Car["🚗 车机 HF"] SPK["喇叭/麦克风"] BTN["方向盘按键"] end MIC -- "声音" --> SCO["SCO/eSCO 同步语音链路<br/>(绕过 L2CAP)"] SCO --> SPK AT -- "命令" --> RFCOMM["RFCOMM 串口仿真"] RFCOMM --> L2CAP["L2CAP"] BTN --> AT2["AT 命令"] --> RFCOMM L2CAP --> HCI["HCI → 基带 → 射频"]
为什么 HFP 要两条链路:
- 声音对延迟极敏感、不能重传(重传到了也晚了),所以走 SCO——电路交换、固定速率、绕过 L2CAP 直达基带,保证实时。
- 控制命令(拨号、接听、来电号码、信号强度)是零星小数据,走 RFCOMM(串口仿真,复用 L2CAP),传 AT 命令(就是老式调制解调器那套
ATD13800138000;拨号语法)。
车机真实场景:按方向盘接听键 → 车机发 ATA(接听)AT 命令经 RFCOMM 给手机 → 手机接通 → 双向语音经 SCO 实时传输 → 车机喇叭出对方声音、车机麦克风收你说话。
HFP vs HSP:HSP(Headset Profile)是更老的耳机规范,只支持单声道+基本接挂;HFP 功能全(双工通话、来电号码、语音拨号)。车机用 HFP。缩写差异见 14 §5。
2. A2DP —— 蓝牙放歌
全称:Advanced Audio Distribution Profile(高级音频分发规范)。 干嘛的:单向传立体声音频流——手机把音乐「推」给车机放。 角色:
- 手机 = Source(源,发音频)。
- 车机 = Sink(汇,收音频解码播放)。
数据怎么走:
flowchart LR APP["📱 手机播放器"] -->|"音频帧(SBC/AAC/LDAC)"| SRC["A2DP Source 编码"] SRC --> AVDTP["AVDTP 音视频分发传输<br/>(带时间戳+流管理)"] AVDTP --> L2CAP --> HCI --> RF["射频"] RF -.-> RF2["射频"] RF2 --> HCI2["HCI"] --> L2CAP2["L2CAP"] --> AVDTP2["AVDTP 还原"] AVDTP2 --> SINK["A2DP Sink 解码"] --> OUT["🔊 车机喇叭"]
关键点:
- 传输协议是 AVDTP(音视频分发传输协议),专门为流式音视频设计,带时间戳保证音画同步、带流管理。
- 编码格式:必选 SBC(音质一般、所有设备都支持),可选 AAC/LDAC/aptX(高清)。协商出双方都支持的最高质量编码。
- 单向流:A2DP 只管「发音频」,不能控制播放。想「上一首/暂停」要靠另一个 profile——AVRCP。
车机真实场景:手机开音乐 → A2DP 把音频流推给车机 → 车机解码放喇叭。你在车机屏幕点「下一首」→ 那是 AVRCP 发的命令,不是 A2DP。
A2DP 是「数据量大、能容忍一点延迟」的典型,所以走 ACL(可重传异步链路)+ AVDTP,不像 HFP 走 SCO。这是新人最该对比记住的一组:HFP 声音=SCO(实时不重传),A2DP 音乐=ACL+AVDTP(可重传保质量)。
3. AVRCP —— 遥控播放(A2DP 的搭档)
全称:Audio/Video Remote Control Profile(音视频遥控规范)。 干嘛的:让车机远程控制手机播放——上一首/下一首/暂停/播放、显示歌曲名。 角色:手机 = Target(被控端),车机 = Controller(控制端)。 传输:AVCTP(音视频控制传输协议),骑在 L2CAP 上。
A2DP + AVRCP 是一对黄金搭档:A2DP 负责把声音送过来,AVRCP 负责让你在车机屏幕上控制播放并看到歌名。新车机蓝牙音乐功能 = 这俩 profile 一起工作。
4. PBAP —— 读通讯录
全称:Phonebook Access Profile(电话本访问规范)。 干嘛的:让车机读手机的通讯录(电话本),用于来电显示联系人名字、语音拨号。 角色:
- 手机 = PSE(Phonebook Server Equipment,电话本服务端):存通讯录、响应读取。
- 车机 = PCE(Phonebook Client Equipment,电话本客户端):发起读取。
数据怎么走:
sequenceDiagram participant Car as 🚗 车机 PCE participant Ph as 📱 手机 PSE Car->>Ph: 我要读通讯录(OBEX 连接) Ph-->>Car: 同意,开始传 loop 逐条 Ph->>Car: 联系人 vCard(姓名+号码) end Car->>Car: 存本地数据库 Note over Car: 来电时匹配号码→显示姓名
关键点:
- 传输协议是 OBEX(对象交换协议,原本是红外 IrDA 的,搬上蓝牙传「对象」=文件/记录)。
- 通讯录以 vCard 格式(电子名片标准)逐条传。
- 这是车机详情页唯一有独立开关的 profile(12 §1.3)——因为读通讯录涉隐私,给用户控制权;HFP/A2DP 是基础体验不给开关。
车机真实场景:配对成功后车机自动拉通讯录 → 存本地 → 之后来电,车机屏显示「张三」而不是一串号码;你说「打电话给张三」也能匹配。
5. MAP —— 读短信
全称:Message Access Profile(消息访问规范)。 干嘛的:让车机读手机的短信/通知(用于车机屏显示短信、语音朗读)。 角色:手机 = MSE(消息服务端),车机 = MCE(消息客户端)。 传输:OBEX(和 PBAP 同一套传输,因为都是「读结构化数据」)。
6. GATT / ATT —— 连传感器、钥匙(BLE 侧)
全称:GATT = Generic Attribute Profile;ATT = Attribute Protocol。 干嘛的:BLE 侧的通用数据访问——车机读蓝牙钥匙、胎压传感器、手环的数据。 角色:传感器 = Peripheral(外设/服务端),车机 = Central(中心/客户端)。 数据模型(和经典蓝牙完全不同):
flowchart LR SERV["Service 服务<br/>(如:胎压服务)"] --> CH1["Characteristic 特征值<br/>(如:前胎压数值)"] CH1 --> DESC["Descriptor 描述符<br/>(如:单位/配置)"] SERV --> CH2["Characteristic<br/>(如:后胎压)"]
- ATT 是底层传输(骑在 L2CAP 固定 CID 0x0004 上)。
- GATT 在 ATT 之上规定数据按「服务 → 特征值 → 描述符」的树组织。每个特征值就是一个可读/可写的数据点(如胎压数值)。
- 车机读/写这些特征值,就拿到了传感器的数据。
车机真实场景:蓝牙钥匙(手机/卡片钥匙)每隔一会把自己的「鉴权特征值」给车机读 → 车机验证后开门;胎压传感器把胎压写进特征值 → 车机读取显示。
为什么不用 SDP:BLE 设计目标是省电+简单,经典蓝牙的 SDP 太重,所以重新设计了轻量的 ATT/GATT 属性模型。SDP(经典)和 GATT/ATT(BLE)是同一个活的两套实现(14 §4)。
7. 其它车机可能用到的 profile(速览)
| profile | 干嘛 | 传输 | 车机用不用 |
|---|---|---|---|
| HID | 蓝牙键鼠/手柄 | — | 后排接手柄玩游戏可能用 |
| PAN | 蓝牙共享网络 | BNEP | 手机给车机共享网络(少用) |
| SAP | 车机直接读手机 SIM | RFCOMM | 部分车型(车机用车内天线打电话) |
| OPP | 推名片/文件 | OBEX | 少用 |
| SPP | 把蓝牙当串口 | RFCOMM | 诊断/外设可能用 |
| LeAudio | 新一代 BLE 音频 | ISO 通道(5.2+) | 海外高端/后排蓝牙耳机预留 |
8. 一张总图:每个 profile 骑在什么传输上
flowchart TD subgraph Profiles["应用 / Profile 层"] HFP[HFP 电话] A2DP[A2DP 音乐] AVRCP[AVRCP 遥控] PBAP[PBAP 通讯录] MAP[MAP 短信] GATT[GATT 传感器] end subgraph Transport["传输协议层"] SCO["SCO/eSCO<br/>(语音·绕 L2CAP)"] RFCOMM[RFCOMM 串口] AVDTP[AVDTP 音频流] AVCTP[AVCTP 控制] OBEX[OBEX 对象] ATT[ATT 属性] end L2CAP["L2CAP 管道"] HFP --> SCO HFP --> RFCOMM A2DP --> AVDTP AVRCP --> AVCTP PBAP --> OBEX MAP --> OBEX GATT --> ATT SCO -.直达基带.-> BASE["基带 → 射频"] RFCOMM --> L2CAP AVDTP --> L2CAP AVCTP --> L2CAP OBEX --> L2CAP ATT --> L2CAP L2CAP --> BASE
读这张图的方法:从 profile 往下看,第一跳是「它靠什么传输」,第二跳是「传输靠 L2CAP(或 SCO 直达基带)」。记住两件事:
- 声音类(HFP 通话)走 SCO 直达基带,绕过 L2CAP——因为要实时。
- 其它所有(音乐/通讯录/控制/传感器)走 L2CAP 管道——只是上面的传输协议不同。
9. 常见混淆证伪
| 混淆 | 纠正 |
|---|---|
| 「A2DP 能控制上一首下一首」 | 错。A2DP 只传音频,控制是 AVRCP 的活。 |
| 「HFP 的声音也走 L2CAP」 | 错。HFP 声音走 SCO(绕过 L2CAP 直达基带),命令才走 RFCOMM→L2CAP。 |
| 「PBAP 走 RFCOMM」 | 不准确。PBAP 走 OBEX(OBEX 本身可骑 RFCOMM,但语义层是 OBEX 对象交换,不是串口流)。 |
| 「GATT 是经典蓝牙的」 | 错。GATT/ATT 是 BLE 的服务模型;经典蓝牙用 SDP。 |
| 「车机是 Source」 | 错(默认场景)。车机连手机放歌时车机是 Sink(收音乐);只有车机连外接蓝牙耳机时才反过来当 Source。 |
10. 和已有文档的关系
- 本篇 15:讲协议本身——每个 profile 干嘛、骑什么传输、车机/手机各演啥角。
- 12-Profile体系与车机角色:讲代码实现——这些 profile 在 Android settingslib 里是哪个
*Profile.java类、isAutoConnectable、三 flavor 差异。 - 13-协议栈分层详解:讲整体结构——8 层怎么摞、数据通路。
- 14-缩写词源手册:讲术语——每个缩写全称。
读完这四篇,再去看 01-发现流程 / 02-配对流程 的业务代码,应该不再被术语卡住。
一句话收尾:profile = 功能约定,传输协议 = 它的专用快递,L2CAP = 所有快递共用的公路(SCO 例外,声音走专线)。看到任何 profile,先问「它靠什么传」——答案永远是 RFCOMM/AVDTP/OBEX/AVCTP/ATT 这几个里的一个(HFP 还额外要 SCO 传声音)。