第三章 蓝牙协议栈核心知识问答:HCI / L2CAP / SDP / GATT / GAP
蓝牙协议栈采用分层架构,HCI、L2CAP、SDP、GATT、GAP 是面试高频考查的五层核心。面试官通过这些问题检验你对数据流、控制接口、配置角色的理解深度,以及能否将分层思想迁移到项目排错中。
协议栈核心层速览表
| 协议层 | 全称 | 主要功能 | 协议ID / 信道 | 数据单元 |
|---|---|---|---|---|
| HCI | Host Controller Interface | 主机与控制器间命令/事件/数据 | — | HCI 命令包/事件包 |
| L2CAP | Logical Link Control and Adaptation Protocol | 分段/重组/复用/信令 | 0x0001(信令) | L2CAP PDU(含B-frame等) |
| SDP | Service Discovery Protocol | 服务记录查询与注册 | 0x0001(L2CAP信道) | SDP PDU(请求/响应) |
| GATT | Generic Attribute Profile | 属性层读写、通知、指示 | UUID 16/128bit | Attribute PDU |
| GAP | Generic Access Profile | 设备角色、广播、连接管理 | — | 广播数据/连接参数 |
问题1:请解释蓝牙协议栈中 HCI 层的作用及分层设计目的
面试官考察点:对主机-控制器分离架构的理解;HCI 命令/事件/数据的分类;实际调试 HCI log 的经验。
回答框架:① 定义:HCI 是主机(应用处理器)与蓝牙控制器(芯片)之间的标准接口;② 分成三类:命令(Host→Controller)、事件(Controller→Host)、数据(双向);③ 分层目的:解耦 + 跨平台兼容(同一主机可配不同控制器)。
简短示例回答:HCI 是蓝牙协议栈的分水岭,上层跑在主机上,下层跑在控制器上。三类包:命令设置链路参数,事件上报状态,数据承载 ACL/SCO 业务。分层后,Android/iOS 可以共享同一控制器驱动,一个控制器也可适配不同主机协议栈。
可能追问:HCI 流控如何实现?ACL 数据包格式?如何通过 HCI 分析断连原因?
问题2:L2CAP 的主要功能是什么?如何实现多路复用?
面试官考察点:L2CAP 分段/重组机制;信道 ID(CID)角色;与上层协议(SDP、RFCOMM、ATT)的映射关系。
回答框架:① 核心功能:协议复用(通过 CID)、分段/重组(MTU 协商)、错误检测与重传(ERTM/ECFC);② 复用原理:每个上层协议分配唯一 CID(SDP→0x0001,ATT→0x0004),通过 L2CAP 信令信道建立动态 CID;③ 数据流:应用数据 → L2CAP PDU → HCI → 空中。
简短示例回答:L2CAP 像协议路由器,CID 是管道号。SDP 走 CID 0x0001,ATT 走 0x0004。分段时 L2CAP 头携带长度和 CID,接收端重组后分发给上层。MTU 协商通过配置请求/响应完成,避免 IP 层粘包。
可能追问:L2CAP 面向连接(COC)和无连接?ERTM 与 STREAM 模式区别?MTU 过小会怎样?
问题3:GATT 和 GAP 分别管理的对象是什么?典型应用场景举例
面试官考察点:角色(Client/Server、Central/Peripheral)区分;服务/特征/描述符结构;广播包与扫描响应对 GAP 的应用。
回答框架:① GAP 负责设备级角色、广播、连接、安全初始化;② GATT 负责应用层数据交互,定义服务(Service)、特征(Characteristic)、描述符(Descriptor);③ 场景举例:心率设备(GATT 提供心率服务),手环广播(GAP 广播数据包后等待 Central 扫描连接)。
简短示例回答:GAP 管连接建立前和连接时的角色(Peripheral 广播、Central 扫描),GATT 管连接后的数据读写。例如运动手环:GAP 广播自家 UUID,手机扫描后建立连接,再通过 GATT 读取运动计步特征值,更新显示。
可能追问:GATT 通知(Notification)和指示(Indication)区别? GAP 连接间隔参数如何影响功耗?如何自定义服务 UUID?