蓝牙RFCOMM
- 1.RFCOMM
- 1.1 服务定义模型
- 1.2 字节排序
- 2 RFCOMM数据帧
- 2.1 选项和模式
- 2.2 帧类型
- 2.3 帧格式
- 2.3.1 Address
- 2.3.2 Control(帧类型)
- 2.3.3 Length
- 2.3.4 InfoData
- 2.3.5 FCS
- 2.4 多路复用控制命令(DLCI 0)
- 2.4.1 DLC parameter negotiation (PN)
- 2.4.2 Test Command (Test)
- 2.4.3 Flow Control On Command (FCon)
- 2.4.4 Flow Control On Command (FCoff)
- 2.4.5 Modem Status Command (MSC)
- 2.4.6 Non Supported Command Response (NSC)
- 2.4.7 Remote Port Negotiation Command (RPN)
- 2.4.8 Remote Line Status Command(RLS
- 3.连接断开
- 4.2 Hci log分析
- 4.1 RFCOMM初始化
蓝牙RFCOMM协议通过L2CAP协议提供串行端口仿真,两个采用RFCOMM通信的BT设备有可能同时打开多个串口,RFCOMM支持同时打开60个端口。在蓝牙协议中DLCI channel 占5位,所以最多31路。该协议基于ETSI标准GSM07.10。 本文档不包含 完整的规范。
1.RFCOMM
1.1 服务定义模型
1.2 字节排序
RFCOMM 采用与 TS07.10 相同的字节序列方式。所有二进制数字都按照从低位到高位的顺序,从左至右读(小端排序)。
2 RFCOMM数据帧
2.1 选项和模式
RFCOMM使用GSM07.10的基本选项
2.2 帧类型
蓝牙RFCOMM中只有5种类型:
Frame Types | 说明 |
---|---|
Set Asynchronous Balanced Mode (SABM ) command | 设置异步平衡模式 |
Unnumbered Acknowledgement (UA) response | 未编号确认(UA)响应 |
Disconnected Mode (DM) response | 断开模式响应 |
Disconnect (DISC) command | 断开命令 |
Unnumbered information with header check (UIH) command and response | 带有标头检查(UIH)命令和响应的未编号信息 |
SABM、UA、DM、DISC是 底层控制帧,在DLCI 0上传递控制.
UIH帧: DLCI为0的UIH帧用来传递控制信息,DLCI不为0的UIH帧用来传递数据.
2.3 帧格式
这个小节我们来介绍下 RFCOMM 的帧格式,RFCOMM 跟 GSM 07.10 差别不大
GSM 07.10 的帧格式:
RFCOMM格式: 抛弃了帧头帧位的 Flag Field 如下图:
RFCOMM Sample 格式:
RFCOMM 格式组成:Address, Control, Length(根据内部EA bit位分为1byte,或2byte,InfoData, FCS,
2.3.1 Address
Q:RFCOMM 的 initiator 跟 responser 是什么意思?
建立连接的设备(通过在 DLCI 0 上发送 SABM 命令)称为 initiator,响应的设备(通过在 DLCI 0 上发送 UA 响应)称为 responder。
这里有一个注意的点,就是每个一定要DLC0的通道上发送SAB帧才能定义角色,在其他RFCOMM server channel上发送的不算,一旦定义角色,在断开之前都一直遵循这个角色
Address组成:1个字节 = EA(1 bit) + C/R(1 bit) + DLCI(D(1 bit)+ Server Channel(5 bit))
EA: 默认为1
扩展地址 字段可用于对地址的扩展。如果EA=0,则其后有更多的地址字节;如果EA=1,则这是地址的最后一个字节。蓝牙规范规定服务器应用程序可被分配一个1到30之间的服务通道号,因此RFCOMM地址帧分配有 5bit 用于服务通道,因为从来不需要使用扩展寻址,所以在RFCOMM地址字段中EA位始终设置设置为1。
C/R:
表示是命令帧还是响应帧。它的值不仅取决于帧是命令帧或响应帧,同时也包括是在哪个通道发送的帧。
发起连接的设备(在DLCI 0上发送SABM命令)称为发起者,响应设备(在DLCI 0上发送UA响应)称为响应者。
只要交互流程遵循这个基本模式,C/R bit是1,来自发起方的命令和来自响应者的响应C/R=1;将方向交换后,C/R bit为0,即来自响应者的命令和来自发起者的响应C/R=0。UIH帧发送数据时,发起方设置C/R=1,响应方设置C/R=0。
以上进行总结:
1) 对于(SABM,UA,DM,DISC)帧,这些统称为命令帧,initiator发送给responder,C/R=1,response 相应 initiator C/R 也为 1。
2) 对于(SABM,UA,DM,DISC)帧,这些统称为命令帧,response 发送给 initiator,C/R 为 0,initiator 响应给 responder,C/R=0.
3) 对于 UIH 帧,这个称为数据帧,initiator 发送给 responder,C/R=1,response 发送给 initiator C/R 为 0.
DLCI: 在GSMTS0.10中,这是一个不可分割的字段,但是在RFCOMM中,它被分为 方向位 和 服务通道号。
D:启动器始终将方向位设置为1(D=1);响应者始终将方向位设置为0(D=0)。作为C/R位,发送SABM帧来启动连接的设备称为发起者,否则称为响应者。
Service Channel: 服务通道号有5bit,其范围 0~31,但0和31是保留的,所以只能分配 1~30 作为服务的服务通道号。通道0用于发送控制信息; 通道31为TS07.10预留。蓝牙避免使用TS 07.10预留的通道,以保持与TS 07.10应用程序的兼容性。
DLCI是在建立数据链路连接之前计算一次。响应设备中的RFCOMM服务通道号用于DLCI。由于服务通道号1~30可用,因此一个设备最多有30个可使用RFCOMM的服务
SABM,UA,DM,DISC 只能在DLCI 0 上进行传输命令帧
UIH:在DLCI 0 上传输命令帧,在其他通道上传输数据帧。
2.3.2 Control(帧类型)
控制字段。这是用来识别帧的类型
蓝牙中没有UI 帧
P/F是Poll/Final位,在命令中,它被称为P (Poll)位; 在响应中,它被称为F(Final)位。
总结如下:
1.对于(SABM,UA,DM,DISC)帧,这些统称为命令帧,command 跟 response 都设置为 1 就好。
2.对于UIH帧,除了给对方credit设置为1外,UIH user帧以及UIH多路控制帧都设置为0就好了
2.3.3 Length
代表整个帧数据的长度,占用的字节为 1~2
L1 到 L7 位表示数据字段的长度,其默认值为 31 字节。同样,它可以根据 EA 位进行扩展。
当 EA=0 时,它接下来的字节就可以表示 15 个数字。
当 EA= 1 时,表示1个字节
数据长度不超过32767字节。大小限制是由L2CAP数据包上的最大传输单元(Maximum Transmission Unit, MTU)设置的,如果系统具有较小的L2CAP MTU, RFCOMM数据的大小同样受到限制。
2.3.4 InfoData
UIH 帧数据,只对 UIH 帧有效. 后面详细讲解
UIH在DLCI=0 上传递的是控制命令
UIH在DLCI≠0 上传递的是数据
2.3.5 FCS
计数k, FCS将被计算的比特数。对于SABM、DISC、UA和DM帧,帧检查序列是根据地址控制和长度字段计算的。对于UIH帧,它是根据地址和控制字段计算的。
接着:
(a)计算Xk (X7 + X6 X5 + X4 + X3 + X2 + X1 + 1)模2除以生成多项式(X8 + X2 + X + 1)的余数。
(b)在插入任何启动和停止元素之前,以及在插入任何其他额外位之前,取FCS计算的帧内容。乘以X8并除以生成器多项式(X8 + X2 + X + 1)。
©将(a)和(b)的结果取2的模,取1的补,得到FCS。
因为UIH帧只计算地址和控制字段上的FCS,它们的数据字段不受FCS的保护。这可能是可靠数据传输的一个缺点,但它的优点是可以为所有正在使用的DLCI预先计算FCS模式。此预计算可在通道建立时进行。
2.4 多路复用控制命令(DLCI 0)
多路控制通道主要在 DLCI=0 发送的,主要用来控制 RFCOMM 的连接,来协商一些参数,主要有以下类型:
- PN—DLC parameter negotiation.
- Test—Checks communication link.
- FCon / FCoff—Aggregate flow control on all connections.
- MSC—Modem status, used for flow control per connection.
- RPN—Remote Port Negotiation.
- RLS—Remote Line Status.
- NSC—Non-Supported Command (response only).
主要基于 UIH control frame 来发送,多路控制的数据格式如下:
Length 格式如下:
当 EA 为 1 时 表示这是最后一个字节,当为 0 时则表示有扩展的字节表述
2.4.1 DLC parameter negotiation (PN)
在 DLC 建立之前,要用 PN 进行参数协商,整个 PN 的封包格式如下:
Type:
Length: 8
后续value如下:
D1~D6 是 DLCI
I1~I4 定义了在指定 DLC 上传输信息帧的类型,蓝牙中默认为 UIH 帧:
`
P1 ~ P6 位表示在指定 DLC 上所分配的优先级,范围从 0 到 63,0 的优先级最高。
T 位表示 acknowledgement timer (T1)的值:
确认等待时间,单位为百分之1秒, 默认为100ms,最小为10ms,醉倒可以使用2.55s时间。
N 位表示 maximum frame size (N1)的值。 范围1~32768
NA-位表示 最大重传次数 maximum number of retransmissions (N2)
K 位表示纠错模式下窗口大小,默认为2,范围1~7
PN整体数据格式如下:
2.4.2 Test Command (Test)
测试命令,类型代码是 000100,长度字节为 0,后面没有参数。
2.4.3 Flow Control On Command (FCon)
流控开启命令,类型代码为 000101,长度字节为 0,后面没有参数
2.4.4 Flow Control On Command (FCoff)
流控关闭命令,类型代码为 000110,长度字节为 0,后面没有参数
2.4.5 Modem Status Command (MSC)
用 MSC 命令来传输 V.24 控制信号,它在基本选项下面使用。MSC 命令包含一个 mandatory control signal(强制的控制信号)字节和一个 break signal(暂停信号)字节。在建立了 DLC 之后,发送用户数据之前,发送 MSC 命令.
• EA扩展地址,设置为1表示只有1个字节的命令。
• FC流控制位,当设备无法接受任何RFCOMM帧时设置为1。当设备能够再次接收时,它发送另一个流控制位设置为0的MSC。
• RTC准备通信位,当设备准备通信时设置为1。
• RTR准备接收位,当设备无法接收数据时设置为0,当设备可以接收数据时设置为1。
• IC来电,1表示来电。
• DV数据有效,设置为1表示正在发送有效数据。
2.4.6 Non Supported Command Response (NSC)
当接收实体接收到了一个不支持的命令响应类型时,向发方发送 NSC。其类型代码为001000,长度字节为 1,后面的参数是代表不支持的命令类型的代码,其格式为:
type:
value:
EA:1
C/R: 设置为与不支持的命令帧的类型字段相同
Command Type:对端发送的命令
2.4.7 Remote Port Negotiation Command (RPN)
远程端口协商(RPN)命令用于在数据链路连接的远程端设置通信设置。如果在连接过程中需要更改任何通信设置,可以重新发送RPN命令来更改。
不常用,暂不讲解
2.4.8 Remote Line Status Command(RLS
当设备需要将错误告知链路的另一端时,它会发送远程线路状态(RLS)命令。
不常用,暂不讲解
3.连接断开
因为RFCOMM的帧承载于L2CAP数据包中的有效载荷中,在RFCOMM连接建立之前,L2CAP的连接必须建立.
RFCOMM为L2CAP有一个保留的协议和服务多路复用器(PSM)值,这在蓝牙核心规范中定义为0x0003。任何在L2CAP接收帧的PSM字段中使用此值将被发送到RFCOMM进行处理。
3.1 拒绝连接:
在RFCOMM信道上发送的第一帧是 SABM帧;这是个开始异步平衡模式命令。
如果响应设备的RFCOMM已经连接,则会进入异步平衡模式(ABM),并发回一个UA帧。
如果响应设备的RFCOMM没有连接,它将通过发送DM帧来拒绝连接。RFCOMM信道设置拒绝的方式。
如下图:
3.2 SABM 超时未响应:
当发送RFCOMM命令后会启动一个60秒的定时器,如果定时器超时时未收到确认信息,则连接将被关闭。这与GSM 07.10不同,GSM 07.10在定时器超时时重新发送命令。
在RFCOMM机制中,蓝牙基带提供了可靠的链路,因此如果第一次未被确认,第二次也不会被确认。对于SABM命令,超时时间可以延长,因为安全程序可能意味着此命令的处理时间比其他命令长。如果RFCOMM超时断开连接时,为防止另一侧认为它还处于活动状态,它必须在原来的SABM帧上发送与服务器相同的 DLCI 的 DISC(断开连接)命令。图下图 显示了初始化超时通道被关闭。
3.3 初始连接流程:
如果连接成功,响应方用UA帧回复SABM帧,此时在初始方和响应方,开始参数协商的流程,如图下图所示:
一旦DLCI=0的连接建立,就可以用于RFCOMM signalling信道。
要传输数据,必须建立其他RFCOMM信道。图10-4所示。
建立的第二个RFCOMM信道用来传输数据。在这种情况下,信道需要身份验证,因此在SABM命令帧和UA响应帧之间,有一个暂停以进行LMP身份验证和加密,一旦收到UA帧,模式状态命令被转换成控制信号通信状态。然后可以立即传输数据并显示,也可以进行转换的PN命令和响应来配置新连接的参数。
用户数据应该包括MSCs(Modem Status Commands),用于串口控制信号的状态的通信。
要关闭RFCOMM连接,将发送DISC命令。当最后一个数据链路关闭时,应在DLCI=0上发送DISC以关闭多路复用器。
当然,无论哪个设备关闭多路复用器都要响应L2CAP信道断开连接命令
4.2 Hci log分析
4.1 RFCOMM初始化
整体时序: