RFCOMM概述
概念
RFCOMM 协议提供了对 L2CAP 协议上的串行端口的模拟。该协议基于 ETSI 标准 GSM 07.10。
RFCOMM 采用与 TS07.10 相同的字节序列方式。所有二进制数字都按照从低位到高位的顺序,从左至右读。
两个使用RFCOMM通信的蓝牙设备可以打开多个仿真串行端口。RFCOMM支持多达60个开放仿真端口;但是,设备中可以使用的端口数量是特定于实现的。数据链路连接标识符(Data Link Connection Identifier, DLCI)在GSM 07.10中用于标识客户端和服务器应用程序之间正在进行的连接。dcl由6位表示,但它的可用值范围是2…61;在GSM 07.10中,DLCI 0是专用的控制通道,DLCI 1由于服务器通道的概念而无法使用,保留了dcls 62-63。DLCI在两个设备之间的一个RFCoMM会话中是唯一的。(这将在第2.3.2节中进一步解释)考虑到客户端和服务器应用程序可能驻留在RFcoMM会话的两端,其中任何一方的客户端都相互独立地建立连接,因此划分了DLCI值空间
RFCOMM帧格式
RFCOMM支持SABM,UA,DM,DISC,UIH五种帧
Q:RFCOMM 的 initiator 跟 responser 是什么意思?
A:建立连接的设备(通过在 DLCI 0 上发送 SABM 命令)称为 initiator,响应的设备(通过在 DLCI 0 上发送 UA 响应)称为 responder。
这里有一个注意的点,就是每个一定要 DLC0 的通道上发送的 SABM 帧才能定义角色,在其他 RFCOMM server channel 上发送的不算,一旦定义角色,在断开之前都一直遵循这个角色!
Address Field
EA Field
这部分在蓝牙 RFCOMM 协议中一直为 1
C/R Field
- 对于(SABM,UA,DM,DISC)帧,这些统称为命令帧,initiator 发送给 responder,
C/R=1,response 相应 initiator C/R 也为 1。 - 对于(SABM,UA,DM,DISC)帧,这些统称为命令帧,response 发送给 initiator
C/R 为 0,initiator 响应给 responder,C/R=0. - 对于 UIH 帧,这个称为数据帧,initiator 发送给 responder,C/R=1,response
发送给 initiator C/R 为 0.
D Field(它与server channel共同组成DCL1)
initiator 自己的 D=1,responder 自己的 D=0,所以如果在 DLCI 已经建立连接后,后续 initiator 连接 responder 某一个 profile 的时候(比如 HFP),那么应该是 DCLI=0+ server chanel<<1,如果是 responder 连接 initiator 的某一个 profile,那么应该是 DCLI=1+ server channel<<1后续交互封包的 UIH 的 DCLI 一直不变
server channle
就是上层profile的rfcomm channel
Control Field
Control Field 是 1 个 byte 的数据, 主要是标示 RFCOMM frame type 是什么,
我们来截取 GSM 07.10 一个图示,截图如下:
P/F 是 Poll/Final 位,在 Commands 中,被称为 P(poll)位;而在 Responses中则被称为 F(final)位,总结下:
- 对于(SABM,UA,DM,DISC)帧,这些统称为命令帧,command 跟 response 都设置为 1 就好。
2)对于 UIH 帧,除了给对方 credit 设置为 1 外,UIH user 帧以及 UIH 多路控制帧都设置为 0
SABM:异步平衡模式设置指令 SABM 命令可以用在异步平衡模式下,并且它的控制字段只能有一个字节。设备通过首先发送 UA 应答来确认接收到 SABM 命令,DLC 发送和接收状态变量都必须设定为 0。用大白话讲就是连接命令UA:未加编号的确认应答。 UA 应答用在设备对接收到 SABM 和 DISC 后的确认应答
DM:断开连接模式应答。DM 应答是用来报告设备从数据链路逻辑地断开连接这么一种状态的。在断开模式下,不支持任何命令,直到收到了 SABM 命令,然后停止断开模式。在断开模式下,接收到了 DISC 命令,则要向对方发送一个 DM 应答。
DISC:断开连接指令。用 DISC 命令可以用来结束一个正在运行或者刚刚开始的模式。它就是通知一方另一方悬置操作,设备必须假定一个逻辑断开模式。在执行这个命令之前,接收设备要通过发送 UA 应答来确认接受 DISC 命令。在DLCI0 中 DISC 命令的发送也和其他的 DLCI 具有同意的意思。
UIH:带头校验的未编号信息命令和应答。用 UIH 命令/应答可以通过不影响V(S)或 V®变量来相互发送信息。UIH 是用在传输一些信息的完整性没有它要在正确的 DLCI 上传输重要的情况下的。 FCS 只在地址和控制字段进行计算。UIH,用于对差错码要求不是很高的场合,如语音。
Length Indicator Field
L1 到 L7 位表示数据字段的长度,其默认值为 31 字节。同样,它可以根据 EA位进行扩展。当 EA=0 时,它接下来的字节如下表表示就可以表示 15 个数字。
information field
仅UIH帧有这个
FCS Field
帧校验序列(FCS)根据不同帧类型在不同域集上进行运算.下面列出需要进行帧运算的字段:
对于 SABM、DISC、UA、DM 帧:在地址、控制和长度标志字段上进行运算;
对于 UIH 帧:在地址和控制字段上进行运算。
多路控制通道的控制命令
多路控制通道主要在 DLCI=0 发送的,主要用来控制 RFCOMM 的连接,来协商一些参数,主要基于 UIH control frame 来发送
发送 UIH 给对方 credit card,在这里又回牵扯到一个知识点,credit,如果 UIH 是在 signaling 通道发送,并且 P/F=0 那么就是普通的 user 数据,如果 P/F=1,那么就是给对方 credit,credit给对方 10,那么在我们不补充的情况下,对方只能发送 10 包 rfcomm 数据,同样道理,对方也会给我们 credit
Remote Port Negotiation Command (RPN)
Remote Line Status Command (RLS)
DLC Parameter Negotiation (PN)