文章目录
- 经典蓝牙电缆替代协议层(RFCOMM)详解
-
- 一、概述
- 二、协议定位
- 三、设计目标
- 四、核心机制
-
- [4.1 多路复用(Multiplexing)](#4.1 多路复用(Multiplexing))
- [4.2 帧格式](#4.2 帧格式)
- [4.3 流控机制](#4.3 流控机制)
- 五、连接建立流程
-
- [5.1 阶段一:L2CAP 连接](#5.1 阶段一:L2CAP 连接)
- [5.2 阶段二:RFCOMM 数据信道建立](#5.2 阶段二:RFCOMM 数据信道建立)
- [六、关键参数协商(PN 命令)](#六、关键参数协商(PN 命令))
- 七、典型应用场景
- [八、RFCOMM 与 BLE UART 的对比](#八、RFCOMM 与 BLE UART 的对比)
- 九、总结
经典蓝牙电缆替代协议层(RFCOMM)详解
一、概述
RFCOMM (Radio Frequency Communication,射频通信协议)是经典蓝牙(BR/EDR)协议栈中专用的电缆替代协议层 (Cable Replacement Protocol)。它基于 GSM TS 07.10 标准设计,核心目标是在蓝牙无线链路上模拟传统 RS-232 串口,使原有基于串口的应用程序无需修改即可通过蓝牙传输数据。
二、协议定位
┌─────────────────────────────────────────────┐
│ 应用层 Profiles │
│ SPP / HFP / HSP / DUN / OPP / OBEX ... │
├─────────────────────────────────────────────┤
│ ┌─────────────────────────────────────┐ │
│ │ 电缆替代协议层(Cable Replacement) │ │
│ │ ┌─────────┐ ┌─────────────────┐ │ │
│ │ │ RFCOMM │ │ TCS │ │ │
│ │ │(串口模拟)│ │(电话控制协议) │ │ │
│ │ └────┬────┘ └─────────────────┘ │ │
│ └───────┼─────────────────────────────┘ │
├──────────┼──────────────────────────────────┤
│ ┌───────┴─────────────────────────────┐ │
│ │ L2CAP(逻辑链路控制与适配层) │ │
│ │ - 提供面向连接的可靠信道 │ │
│ │ - 分段重组、QoS、多路复用 │ │
│ └─────────────────────────────────────┘ │
├─────────────────────────────────────────────┤
│ HCI / Baseband / Radio │
└─────────────────────────────────────────────┘
| 属性 | 说明 |
|---|---|
| 全称 | Radio Frequency Communication |
| 标准依据 | ETSI GSM TS 07.10 |
| OSI 映射 | 传输层 ~ 会话层 |
| 承载层 | L2CAP 面向连接信道(PSM = 0x0003) |
| 核心能力 | 可靠字节流、多路复用、流控、Modem 状态模拟 |
三、设计目标
RFCOMM 的设计围绕**"无线替代有线串口"**这一核心场景展开:
| 有线串口特性 | RFCOMM 对应实现 |
|---|---|
| 物理 RS-232 线缆 | 蓝牙 L2CAP 无线链路 |
| 单一数据流 | 多路复用(最多 60 路逻辑信道) |
| RTS/CTS 硬件流控 | 基于信用的软件流控(Credit-Based) |
| DTR/DSR 状态信号 | Modem Status 命令模拟 |
| 波特率配置 | 端口参数协商(PN 命令) |
四、核心机制
4.1 多路复用(Multiplexing)
RFCOMM 在一条 L2CAP 连接上复用多条独立的数据链路:
┌─────────────────────────────────────┐
│ 一条 L2CAP 链路 │
├─────────┬─────────┬─────────┬───────┤
│ DLCI 0 │ DLCI 2 │ DLCI 4 │ ... │
│ (控制) │ (数据A) │ (数据B) │ │
└─────────┴─────────┴─────────┴───────┘
- DLCI(Data Link Connection Identifier):数据链路连接标识符
- DLCI 0:控制信道,用于建立/释放数据信道、参数协商、Modem 状态传输
- DLCI 1:保留(GSM 07.10 兼容)
- DLCI 2~59 :数据信道,最多 30 路双向数据流(每方向 30 路)
- DLCI 60~63:保留
DLCI 的计算公式:
DLCI = (Server Channel << 1) | Direction_Bit
4.2 帧格式
RFCOMM 帧基于 GSM 07.10 的 UIH(Unnumbered Information with Header check)帧:
┌────────┬────────┬────────┬────────┬────────┬────────┬────────┐
│ Flag │ Address│ Control│ Length │ Info │ FCS │ Flag │
│ (0xF9) │ │(UIH=EF)│ │ │ │ (0xF9) │
├────────┼────────┼────────┼────────┼────────┼────────┼────────┤
│ 1 byte │ 1 byte │ 1 byte │1/2 byte│0~32767B│ 1 byte │ 1 byte │
└────────┴────────┴────────┴────────┴────────┴────────┴────────┘
- Address 字段:包含 DLCI、C/R 位、EA 位
- Control 字段 :固定为
UIH (0xEF),表示无连接号的无编号信息帧 - Length 字段:信息字段长度(支持 EA 扩展,最大 32767 字节)
- FCS:帧校验序列(仅校验 Address + Control + Length)
4.3 流控机制
RFCOMM 采用基于信用的流控(Credit-Based Flow Control):
| 方向 | 机制 |
|---|---|
| RFCOMM → L2CAP | 依赖 L2CAP 的流控(L2CAP 本身支持基于信用的流控) |
| RFCOMM 内部 | 发送方分配初始信用值,接收方消耗信用,耗尽后暂停发送 |
| 上层应用 | 通过 Modem Status 命令模拟 RTS/CTS 信号 |
五、连接建立流程
RFCOMM 会话的建立分为两个阶段:L2CAP 连接建立 → RFCOMM 数据信道建立。
5.1 阶段一:L2CAP 连接
设备A 设备B
│ │
│ L2CAP_Connect_Req (PSM=3) │
│ ───────────────────────────> │
│ │
│ L2CAP_Connect_Resp (Success)│
│ <─────────────────────────── │
│ │
- PSM(Protocol/Service Multiplexer)= 0x0003,标识 RFCOMM 服务
5.2 阶段二:RFCOMM 数据信道建立
设备A (Initiator) 设备B (Responder)
│ │
│ SABM (DLCI=0, 建立控制信道) │
│ ───────────────────────────> │
│ │
│ UA (DLCI=0, 确认) │
│ <─────────────────────────── │
│ │
│ PN (Parameter Negotiation) │
│ ───────────────────────────> │
│ │
│ PN Response │
│ <─────────────────────────── │
│ │
│ SABM (DLCI=N, 建立数据信道) │
│ ───────────────────────────> │
│ │
│ UA (DLCI=N, 确认) │
│ <─────────────────────────── │
│ │
│ MSC (Modem Status Command) │
│ <──────────────────────────> │
│ │
│ ===== 数据通信开始 ===== │
│ │
| 命令 | 全称 | 作用 |
|---|---|---|
| SABM | Set Asynchronous Balanced Mode | 建立异步平衡模式连接 |
| UA | Unnumbered Acknowledgement | 无编号确认 |
| PN | Parameter Negotiation | 协商最大帧长、窗口大小、流控等 |
| MSC | Modem Status Command | 模拟 DTR/DSR/RTS/CTS 等 Modem 信号 |
| DISC | Disconnect | 断开连接 |
| DM | Disconnected Mode | 拒绝连接或已断开 |
六、关键参数协商(PN 命令)
建立数据信道前,双方通过 PN 命令协商以下参数:
| 参数 | 说明 | 典型值 |
|---|---|---|
| Maximum Frame Size | 最大帧长度 | 127 ~ 32767 字节 |
| Convergence Layer | 汇聚层类型 | Type 1(无汇聚) |
| Priority | 优先级 | 0~63 |
| Credit-Based Flow Control | 是否启用信用流控 | 是(RFCOMM 强制) |
| Initial Credits | 初始信用值 | 通常 7 |
七、典型应用场景
RFCOMM 是多个经典蓝牙 Profile 的核心承载协议:
| Profile | 用途 | RFCOMM 角色 |
|---|---|---|
| SPP(Serial Port Profile) | 串口透传 | 直接承载串口数据 |
| HFP(Hands-Free Profile) | 车载免提 | 传输 AT 命令(接听/挂断/拨号) |
| HSP(Headset Profile) | 耳机通话 | 传输 AT 命令 |
| DUN(Dial-Up Networking) | 拨号上网 | 模拟 Modem AT 命令集 |
| OPP(Object Push Profile) | 文件推送 | OBEX 可基于 RFCOMM 传输 |
SPP(串口协议) 是 RFCOMM 最典型、最广泛的应用,几乎所有蓝牙串口模块(如 HC-05、RN-42)都基于 SPP + RFCOMM 实现。
八、RFCOMM 与 BLE UART 的对比
| 特性 | 经典蓝牙 RFCOMM/SPP | BLE UART(自定义 GATT) |
|---|---|---|
| 协议层级 | 电缆替代层,基于 L2CAP | 应用层自定义(GATT Characteristic) |
| 连接方式 | 传统配对 + 连接 | 广播 + 直连(无需配对) |
| 数据吞吐 | 较高(~1-3 Mbps 理论) | 较低(~125 Kbps ~ 2 Mbps) |
| 功耗 | 较高(持续连接) | 极低(可休眠) |
| 兼容性 | 成熟稳定,设备广泛支持 | 需双方支持 BLE + 自定义服务 |
| 多路复用 | 原生支持 60 路 DLCI | 需应用层自行实现 |
| 流控 | 基于信用的内置流控 | 需应用层或 GATT 通知机制实现 |
| 典型芯片 | HC-05、BC04、CSR8670 | nRF52832、CC2640、ESP32 |
九、总结
RFCOMM 是经典蓝牙协议栈中的电缆替代协议层,它基于 GSM TS 07.10 标准,在 L2CAP 可靠传输之上实现了 RS-232 串口的无线模拟。通过 DLCI 多路复用、基于信用的流控、Modem 状态模拟等机制,RFCOMM 为 SPP、HFP、DUN 等上层 Profile 提供了透明、可靠的字节流通信能力,是经典蓝牙"替代物理线缆"这一核心愿景的关键实现层。