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遥控播放ControllerTargetAVCTP 传控制命令
MAP读短信MCEMSEOBEX
GATT读传感器/钥匙CentralPeripheralATT

关键认知:每个 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 格式(电子名片标准)逐条传。
  • 这是车机详情页唯一有独立开关的 profile12 §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车机直接读手机 SIMRFCOMM部分车型(车机用车内天线打电话)
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 直达基带)」。记住两件事:

  1. 声音类(HFP 通话)走 SCO 直达基带,绕过 L2CAP——因为要实时。
  2. 其它所有(音乐/通讯录/控制/传感器)走 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 传声音)。