3. 蓝牙协议栈核心原理:经典蓝牙与BLE架构、HCI、L2CAP、ATT/GATT

协议栈分层是蓝牙通信的基石,面试中常要求你清晰对比经典蓝牙(BR/EDR)与低功耗蓝牙(BLE)各层职责,并深入理解HCI、L2CAP、ATT/GATT的交互机制。下图为两套协议栈的分层对照,面试时可以此为骨架展开回答。

经典蓝牙 (BR/EDR) 低功耗蓝牙 (BLE) Baseband / LMP HCI L2CAP SDP / RFCOMM / AVDTP … Link Layer (LL) HCI L2CAP (固定信道) ATT / GATT / SM Profile Controller 层 HCI 分界 L2CAP 上层协议/Profile
面试切入点:面试官通常从“经典蓝牙和BLE最大的架构区别”切入,然后追问某一层的具体机制。抓住HCI为Controller/Host分界、L2CAP复用与分段、ATT/GATT服务模型三个核心。

📌 面试问答卡 1

面试问题:请对比经典蓝牙(BR/EDR)与低功耗蓝牙(BLE)的协议栈架构差异。

面试官考察点:

  • 是否理解两套协议栈的分层结构及各自核心协议
  • 能否从功耗、数据模式、连接方式等角度阐述差异
  • 对HCI分界、上层协议栈演进的认知

回答框架:

  • 分层对比:给出经典(BB+LMP→HCI→L2CAP→SDP/RFCOMM)与BLE(LL→HCI→L2CAP→ATT/GATT)的路线图
  • 关键差异:BLE采用属性协议(ATT)与通用属性配置文件(GATT)替代SDP;BLE无SCO/eSCO语音通道;BLE使用广播和连接
  • 功耗根源:BLE Controller只有Link Layer,无LMP复杂状态机;PHY简化(GFSK,1Mbps/2Mbps)

简短示例回答(85字):经典蓝牙协议栈包括Baseband、LMP、HCI、L2CAP、SDP、RFCOMM等;BLE则使用Link Layer、HCI、L2CAP、ATT、GATT、SM。核心差异在于BLE用ATT/GATT基于属性进行服务发现与数据交互,替代SDP/RFCOMM;同时去掉语音通道,专注低功耗数据通信。

可能追问:

  • BLE为什么不需要RFCOMM?如何替代串口通信?
  • 经典蓝牙的SCO和eSCO在音视频场景下的优势是什么?
  • BLE的广播包在协议栈中如何生成和解析?
避坑提醒:不要只说“BLE更省电”而不解释协议栈差异;注意区分LMP(经典)与LL(BLE)的角色;避免混淆ATT和GATT的层级关系。

📌 面试问答卡 2

面试问题:HCI(Host Controller Interface)在蓝牙协议栈中扮演什么角色?请描述HCI命令、事件和数据流的工作机制。

面试官考察点:

  • 是否清楚HCI是Host与Controller之间的标准化接口
  • 能否准确区分命令包(Host→Controller)、事件包(Controller→Host)以及数据包(双向)
  • 是否有HCI log或抓包的实际调试经验

回答框架:

  • 角色定义:HCI是Host(SoC/AP)与Controller(Bluetooth芯片)之间的协议边界
  • 报文类型:HCI命令(如LE Create Connection)、HCI事件(如Connection Complete)、HCI ACL数据、HCI SCO/eSCO数据
  • 传输层:UART、USB、SDIO等,需要处理流控与分包
  • 调试价值:通过HCI trace可分析蓝牙连接、配对、数据交互全流程

简短示例回答(95字):HCI定义Host与Controller通信的标准化接口。Host下发命令(如扫描、连接)通过HCI命令包;Controller异步返回事件包(连接完成、断开等);ACL/SCO数据通过数据包双向传输。UART是常用传输层,需要实现HCI流控。实际开发中利用HCI log可快速定位连接失败或配对异常。

可能追问:

  • HCI命令的同步语义如何保证(Command Complete vs Command Status)?
  • HCI UART流控(CTS/RTS)不当时会出现什么问题?
  • BLE扩展广播中HCI命令是如何变化的?
避坑提醒:不要混淆HCI命令与Controller内部的LMP或LL命令;注意HCI事件是异步的,不能假设“命令发送就立即收到事件”;确认HCI数据包的最大长度(ACL 256/251等)。

📌 面试问答卡 3

面试问题:请解释BLE协议栈中L2CAP与ATT/GATT的层次关系,并说明它们如何协同实现BLE服务发现与数据交互。

面试官考察点:

  • 是否理解L2CAP提供复用与分段重组(SAR),ATT/GATT构建服务模型
  • 能否讲清GATT的Service、Characteristic、Descriptor三层结构
  • 是否熟悉MTU协商、通知/指示、信用流控等机制

回答框架:

  • L2CAP职责:为上层提供逻辑信道(固定信道如ATT CID 0x0004),支持分段重组、MTU协商;BLE特有信用流控(LE Credit Based Flow Control)
  • ATT属性协议:定义属性(UUID、handle、permissions),支持Read/Write/Notify/Indicate操作,Client-Server模型
  • GATT组织:基于ATT定义服务(Service)、特征(Characteristic)及其描述符,构成Profile
  • 协同流程:GATT Client(主动端)通过L2CAP信道发送ATT请求,Server响应;数据经过L2CAP分段/重组后转发给Controller发送

简短示例回答(98字):L2CAP为ATT提供固定信道(CID 0x0004),负责ATT数据包的分段与重组,并支持MTU协商。ATT基于属性表实现客户端-服务器读写操作。GATT利用ATT构建服务(Service)、特征(Characteristic)描述符层次。例如电池服务包含电量百分比特征(Notify属性),通知时通过L2CAP传递ATT手通知包,Controller空口发送。

可能追问:

  • BLE L2CAP的信用流控如何避免拥堵?
  • ATT通知与指示在可靠性上的差异是什么?
  • MTU协商失败后流程如何?
避坑提醒:不要混淆L2CAP与ACL层;注意ATT和GATT不是同一层——GATT构建在ATT之上;描述L2CAP分段时需强调MTU与PDU的关系(ATT MTU ≠ L2CAP MPS)。