2. 蓝牙协议栈架构:Host层、Controller层、HCI接口、L2CAP、SMP、ATT/GATT协议栈分层详解
蓝牙协议栈并非一个单一的软件模块,而是一个高度模块化、分层设计的通信协议体系。理解其分层架构是进行蓝牙驱动开发、中断处理与兼容性调试的基石。本章将深入剖析蓝牙协议栈的核心分层:Controller层、Host层以及连接二者的HCI接口,并详解L2CAP、SMP、ATT/GATT等关键协议。
核心概念: 蓝牙协议栈的分层设计借鉴了OSI模型,每一层都封装了特定的功能,并为上层提供标准化的服务接口。这种设计使得硬件(Controller)与软件(Host)可以分离开发,极大地提高了系统的灵活性和可移植性。
2.1 蓝牙协议栈总体架构
蓝牙协议栈在逻辑上被划分为两大实体:Host(主机)和 Controller(控制器)。这种划分是蓝牙架构的核心特征,尤其是在双模(BR/EDR + LE)芯片中尤为明显。
上图清晰地展示了蓝牙协议栈的两大阵营:
- Controller层:通常由蓝牙芯片的固件(Firmware)实现,负责底层的射频通信、跳频、数据包封装、链路控制等实时性要求极高的任务。它包含物理层(PHY)和链路层(LL)。
- Host层:运行在应用处理器(AP)上,由软件协议栈实现,负责逻辑链路控制、数据封装、安全管理和应用层协议。它包含L2CAP、SMP、ATT/GATT等。
- HCI接口:是Host与Controller之间的桥梁,定义了标准化的命令、事件和数据包格式,使得不同厂商的Controller可以无缝对接任何标准的Host协议栈。
2.2 HCI接口:Host与Controller的通信桥梁
HCI(Host Controller Interface)是蓝牙协议栈中最关键的接口之一。它定义了Host如何向Controller发送命令、Controller如何向Host回复事件,以及二者之间如何传输ACL(异步无连接)和SCO(同步面向连接)数据。
| HCI 数据包类型 | 方向 | 用途 | 示例 |
|---|---|---|---|
| 命令包 | Host → Controller | Host下发指令,如扫描、连接、设置参数 | HCI_LE_SetScanParameters |
| 事件包 | Controller → Host | Controller通知Host状态变化或操作结果 | HCI_LE_AdvertisingReport |
| 数据包 | 双向 | 承载上层协议(L2CAP)的用户数据 | ACL Data Packet |
驱动开发要点: 在Linux内核中,HCI驱动通常位于
drivers/bluetooth/ 目录下。中断处理程序需要快速响应Controller发来的HCI事件包,并将其放入HCI接收队列,然后唤醒内核线程进行协议栈处理。错误的HCI数据包解析是导致蓝牙连接不稳定的常见原因。
2.3 L2CAP:逻辑链路控制与适配协议
L2CAP(Logical Link Control and Adaptation Protocol)位于Host层,位于HCI之上。它为上层协议(如ATT、SMP)提供多路复用、分段重组(SAR)和服务质量(QoS)管理。
L2CAP的关键特性包括:
- 协议多路复用:通过不同的Channel ID(CID)区分来自ATT、SMP等上层协议的数据包。
- 分段与重组(SAR):当上层协议数据单元(PDU)超过HCI数据包的有效载荷时,L2CAP负责将其分段发送,并在接收端重组。
- MTU协商:通信双方在连接建立时协商最大传输单元(MTU),以确保数据包大小在双方都能处理的范围内。
2.4 SMP:安全管理协议
SMP(Security Manager Protocol)负责蓝牙低功耗(BLE)设备间的配对、认证和加密密钥分发。它是保障蓝牙通信安全的核心。
| SMP 功能 | 描述 | 关联的HCI命令/事件 |
|---|---|---|
| 配对 (Pairing) | 交换配对特征(I/O Capabilities),选择配对算法(Just Works, Passkey Entry, OOB) | HCI_LE_StartEncryption |
| 密钥分发 | 分发短期密钥(STK)或长期密钥(LTK)、身份解析密钥(IRK)等 | HCI_LE_LongTermKeyRequest |
| 加密 | 启动链路层加密,确保数据在空中传输的机密性 | HCI_LE_Encrypt |
兼容性调试陷阱: 许多蓝牙连接失败的问题源于SMP配对过程中的密钥协商失败。例如,一方要求MITM保护,而另一方不支持;或者密钥大小(7字节 vs 16字节)不匹配。在调试时,务必检查HCI事件中的
HCI_LE_Encrypt 和 HCI_LE_LongTermKeyRequest 事件序列。
2.5 ATT/GATT:属性协议与通用属性规范
ATT(Attribute Protocol)和GATT(Generic Attribute Profile)是BLE应用层的基础。它们定义了设备如何以“属性”的形式暴露数据,以及如何发现、读取、写入这些属性。
- ATT (属性协议):定义了客户端-服务器架构。服务器(如传感器)维护一组属性,客户端(如手机)通过ATT PDU(如Read Request, Write Command)来操作这些属性。
- GATT (通用属性规范):在ATT之上定义了属性的组织方式,包括服务(Service)、特征(Characteristic)和描述符(Descriptor)。GATT规定了如何发现服务、如何订阅通知(Notification/Indication)等高级行为。
在驱动开发中,理解ATT/GATT至关重要,因为:
- 中断处理程序需要处理来自Controller的HCI数据包,这些数据包最终会被解析为ATT PDU。
- 兼容性调试经常涉及GATT数据库的差异,例如某个特征是否支持“通知”属性,或者MTU大小是否匹配。
- Linux内核中的Bluetooth子系统(BlueZ)提供了完整的GATT API,驱动开发者需要熟悉如何注册服务、处理读写请求。