RFCOMM 协议 基本流程
一、连接建立流程(附 BTsnoop 实例解析)
1. L2CAP 通道建立
- BTsnoop 表现:
L2CAP_Connection_Request (PSM=0x0003) // 请求建立RFCOMM专用通道L2CAP_Connection_Response (Success) // 对方同意
- 作用:相当于先搭好"通信管道",PSM=0x0003 是 RFCOMM 的固定标识。
2. RFCOMM 控制信道协商
- 关键帧:
RFCOMM SABM (DLCI=0) // 设备A发送控制信道请求
RFCOMM UA (DLCI=0) // 设备B确认
- DLCI=0:控制信道专用编号,类似电话的"0号客服通道"。
3. 参数协商(PN 命令)
- 协商内容(关键参数):
参数 | 示例值 | 作用 |
---|---|---|
最大帧大小 (N1) | 32767 bytes | 单次传输最大数据量 |
初始信用值 (K1-K3) | 7 | 流控:允许对方连续发7个帧 |
收敛层类型 (CL) | 0xF (信用流控) | 启用现代流控机制 |
- BTsnoop 示例:
RFCOMM PN_Command (DLCI=2, N1=32767, K=7, CL=0xF) // 设备A提议
RFCOMM PN_Response (DLCI=2, N1=1024, K=5, CL=0xE) // 设备B调整参数
- 注意:双方最终以较小值生效(如 N1 取 1024)。
二、数据传输过程(结合抓包分析)
1. 数据帧结构
- UIH 帧示例(BTsnoop 格式):
RFCOMM UIH (DLCI=2, Credits=5, Data=[Hello])
- DLCI=2:数据通道编号
- Credits=5:剩余可接收帧数(信用流控)
- Data:实际负载(如"Hello"字符串)
2. 流控交互
- 场景:设备B缓冲区快满时
RFCOMM MSC (DLCI=2, FC=1) // 设备B发送"流控暂停"信号...(设备A暂停发送)...RFCOMM MSC (DLCI=2, FC=0) // 设备B恢复接收
- 等效RS-232信号:FC=1 相当于 CTS 信号拉低。
3. 错误处理
- BTsnoop 错误日志:
RFCOMM RLS (DLCI=2, Error=0b1010) // 报告奇偶校验错误RFCOMM UA (DLCI=2) // 设备A确认错误
三、连接断开流程(抓包视角)
1. 数据通道关闭
RFCOMM DISC (DLCI=2) // 设备A请求关闭通道2
RFCOMM UA (DLCI=2) // 设备B确认
2. 控制信道关闭
RFCOMM DISC (DLCI=0) // 关闭控制信道
RFCOMM UA (DLCI=0) // 最终确认
L2CAP_Disconnect // 底层通道释放
四、关键协议交互图示
设备A 设备B| --L2CAP_Connect--> || <--L2CAP_Confirm-- || --SABM(DLCI=0)--> || <--UA(DLCI=0)--- || --PN(DLCI=2,N1=32767)--> || <--PN(DLCI=2,N1=1024)--- || --SABM(DLCI=2)--> || <--UA(DLCI=2)--- || --UIH(DLCI=2,Data)--> || <--UIH(DLCI=2,Ack)--- || --DISC(DLCI=2)--> || <--UA(DLCI=2)--- || --DISC(DLCI=0)--> || <--UA(DLCI=0)--- |
五、通俗总结
-
连接像打电话:
- 先拨号(L2CAP连接)→ 找客服(DLCI=0)→ 商量通话质量(PN协商)→ 正式通话(DLCI>0)
-
传数据像快递:
-
每个包裹(UIH帧)有编号(DLCI)和校验码(FCS)
-
快递站会喊"暂停发货"(MSC流控)或"包裹破损"(RLS错误)
-
-
断连像挂电话:
- 先挂断分机(DLCI>0)→ 最后挂总机(DLCI=0)→ 拆电话线(L2CAP断开)
通过 BTsnoop 分析:就像看通话记录,每条日志对应协议的一个动作,组合起来就是完整会话!