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
调试要点: 在Linux内核中,HCI层以上(包括L2CAP、RFCOMM、SDP)通常运行在主机端(Host),由内核蓝牙子系统(BlueZ)实现;HCI层以下运行在蓝牙控制器(Controller)中。调试时需明确问题发生在Host侧还是Controller侧。

1.2 蓝牙协议栈分层架构图

下图展示了蓝牙核心协议栈的层次关系,以及RFCOMM在其中的位置:

蓝牙核心协议栈分层架构 应用层 (Application) — OBEX, HFP, SPP, A2DP SDP (服务发现协议) RFCOMM (串口仿真协议) L2CAP (逻辑链路控制与适配协议) HCI (主机控制器接口) Host Controller 链路管理层 (LM) / 基带 (Baseband) / 物理层 (RF) 说明: RFCOMM 位于 L2CAP 之上,SDP 并列,为上层应用提供串口仿真通道。 虚线以上为 Host 侧(Linux 内核 BlueZ 实现),虚线以下为 Controller 侧(蓝牙芯片固件)。

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 的流控机制,防止接收端缓冲区溢出。
RFCOMM 在协议栈中的关键作用: RFCOMM 是蓝牙协议栈中唯一专门为传统串行应用设计的协议。它使得大量已有的串口通信软件(如拨号网络、GPS 接收、工业控制)可以无缝迁移到蓝牙无线链路上,无需修改应用层代码。

1.3.4 SDP(服务发现协议)

SDP 用于查询远端蓝牙设备提供的服务。RFCOMM 应用在建立连接前,通常需要通过 SDP 查询对端设备的 RFCOMM 通道号(Server Channel)。SDP 记录中包含服务 UUID、RFCOMM 通道号、服务名称等属性。

1.4 RFCOMM 在协议栈中的位置与数据流

下图展示了 RFCOMM 数据从应用到物理层的完整流向:

RFCOMM 数据流与协议栈位置 串口应用 (SPP) RFCOMM 层 L2CAP 层 HCI 层 蓝牙控制器 (固件) 数据封装过程: 1. 应用写入串口数据 2. RFCOMM 添加帧头 (DLCI, 控制) 3. L2CAP 添加 L2CAP 头 (CID, 长度) 4. HCI 封装为 HCI ACL 数据包 5. 控制器通过射频发送 调试关注点: • RFCOMM 帧格式是否正确 • L2CAP 分段是否完整 • HCI 流控是否触发 • Credit 流控是否耗尽

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
调试陷阱: RFCOMM 通道号(Server Channel)与应用协议 UUID 的映射关系存储在 SDP 记录中。如果 SDP 查询失败或记录错误,即使 RFCOMM 层正常,应用也无法建立连接。调试时务必使用 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 应用连接成功的前提。