1. 蓝牙协议栈概述:核心架构与RFCOMM定位
1.1 蓝牙协议栈整体架构
蓝牙协议栈是蓝牙无线通信技术的软件实现核心,采用分层架构设计。每一层封装特定的功能,并为上层提供标准化的服务接口。理解协议栈的分层结构,是调试RFCOMM数据传输的前提。
蓝牙核心协议栈从下至上主要包含以下层次:
| 层次 | 全称 | 主要功能 | 典型协议/组件 |
|---|---|---|---|
| 物理层 | Physical Layer | 射频收发、跳频、调制解调 | 2.4GHz ISM频段、GFSK |
| 基带层 | Baseband | 链路控制、数据包组帧、流控 | ACL/SCO链路 |
| 链路管理层 | Link Manager (LM) | 连接建立、鉴权、加密、功率控制 | LMP |
| 主机控制器接口 | HCI | 主机与蓝牙控制器之间的命令/事件/数据通道 | UART、USB、SDIO |
| 逻辑链路控制与适配协议 | L2CAP | 协议复用、分段重组、服务质量 | L2CAP |
| 串口仿真协议 | RFCOMM | 模拟RS-232串口,承载传统串行应用 | RFCOMM |
| 服务发现协议 | SDP | 发现远端设备提供的服务 | SDP |
| 应用层 | Application | 用户应用(拨号网络、文件传输、蓝牙耳机) | OBEX、HFP、SPP |
1.2 蓝牙协议栈分层架构图
下图展示了蓝牙核心协议栈的层次关系,以及RFCOMM在其中的位置:
1.3 核心协议详解
1.3.1 HCI(主机控制器接口)
HCI 是主机(Host)与蓝牙控制器(Controller)之间的标准通信接口。在 Linux 中,HCI 层通过 UART、USB、SDIO 等物理总线传输命令、事件和 ACL/SCO 数据。调试 RFCOMM 时,HCI 日志(如 hcidump 或 btmon)是定位底层数据包丢失或异常的关键工具。
1.3.2 L2CAP(逻辑链路控制与适配协议)
L2CAP 位于 HCI 之上,提供以下核心功能:
- 协议复用: 多个上层协议(RFCOMM、SDP、ATT 等)共享同一条 ACL 链路。
- 分段与重组: 将上层大包拆分为 HCI 数据包,接收端重组。
- 服务质量(QoS): 支持流控和优先级管理。
RFCOMM 使用 L2CAP 的面向连接通道(Connection-Oriented Channel),每个 RFCOMM 会话对应一个 L2CAP 通道。
1.3.3 RFCOMM(串口仿真协议)
RFCOMM 是蓝牙协议栈中最重要的串行数据传输协议,其核心特性包括:
- 串口仿真: 模拟 RS-232 控制信号(RTS/CTS、DTR/DSR 等)和数据传输。
- 多路复用: 在单条 L2CAP 通道上支持最多 60 个虚拟串口会话(通过 DLCI 区分)。
- 帧结构: 使用类似 GSM 07.10 的帧格式,包含地址、控制、长度和校验字段。
- 流控: 支持基于 Credit 的流控机制,防止接收端缓冲区溢出。
1.3.4 SDP(服务发现协议)
SDP 用于查询远端蓝牙设备提供的服务。RFCOMM 应用在建立连接前,通常需要通过 SDP 查询对端设备的 RFCOMM 通道号(Server Channel)。SDP 记录中包含服务 UUID、RFCOMM 通道号、服务名称等属性。
1.4 RFCOMM 在协议栈中的位置与数据流
下图展示了 RFCOMM 数据从应用到物理层的完整流向:
1.5 RFCOMM 与上层协议的关系
RFCOMM 本身不定义应用层语义,而是作为传输载体。常见的基于 RFCOMM 的协议包括:
| 应用协议 | UUID | 典型用途 | RFCOMM 通道号 |
|---|---|---|---|
| SPP (Serial Port Profile) | 0x1101 | 通用串口通信 | 1~30(动态协商) |
| DUN (Dial-Up Networking) | 0x1103 | 拨号上网 | 1~30 |
| FAX | 0x1102 | 传真传输 | 1~30 |
| OBEX (Object Exchange) | 0x1105 | 文件传输、名片交换 | 1~30 |
| HFP (Hands-Free Profile) | 0x111E | 蓝牙耳机/车载免提 | 1~30 |
sdptool browse 或 btmon 验证 SDP 记录是否正确。
1.6 Linux 内核中 RFCOMM 的实现位置
在 Linux 内核源码中,RFCOMM 协议栈的实现位于 net/bluetooth/rfcomm/ 目录下,主要文件包括:
net/bluetooth/rfcomm/
├── core.c # RFCOMM 核心逻辑:会话管理、DLCI 分配、帧处理
├── sock.c # 与用户态 BlueZ 库的 socket 接口
├── tty.c # 与 Linux TTY 子系统的集成(生成 /dev/rfcomm* 设备)
└── rfcomm.h # 内部数据结构与宏定义
用户态通过 BlueZ 库(libbluetooth)创建 RFCOMM socket,内核中的 rfcomm_sock 模块负责将 socket 操作映射为 RFCOMM 帧,并通过 L2CAP 层发送。
1.7 本章小结
- 蓝牙协议栈采用分层架构,RFCOMM 位于 L2CAP 之上,SDP 并列。
- RFCOMM 的核心作用是模拟 RS-232 串口,支持多路复用和流控。
- HCI 是 Host 与 Controller 的分界线,调试时需区分两侧问题。
- Linux 内核中 RFCOMM 实现位于
net/bluetooth/rfcomm/,通过 socket 和 TTY 接口与用户态交互。 - SDP 记录的正确性是 RFCOMM 应用连接成功的前提。