【蓝牙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,则这是地址的最后一个字节。蓝牙规范规定服务器应用程序可被分配一个130之间的服务通道号,因此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 也为 12) 对于(SABM,UA,DM,DISC)帧,这些统称为命令帧,response 发送给 initiator,C/R0,initiator 响应给 responder,C/R=0.
3) 对于 UIH 帧,这个称为数据帧,initiator 发送给 responder,C/R=1,response 发送给 initiator C/R0.

请添加图片描述DLCI: 在GSMTS0.10中,这是一个不可分割的字段,但是在RFCOMM中,它被分为 方向位 和 服务通道号。
请添加图片描述

D:启动器始终将方向位设置为1D=1);响应者始终将方向位设置为0D=0)。作为C/R位,发送SABM帧来启动连接的设备称为发起者,否则称为响应者。

Service Channel: 服务通道号有5bit,其范围 0~31,但031是保留的,所以只能分配 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 上所分配的优先级,范围从 063,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命令和响应来配置新连接的参数。

用户数据应该包括MSCsModem Status Commands),用于串口控制信号的状态的通信。
要关闭RFCOMM连接,将发送DISC命令。当最后一个数据链路关闭时,应在DLCI=0上发送DISC以关闭多路复用器。
当然,无论哪个设备关闭多路复用器都要响应L2CAP信道断开连接命令

4.2 Hci log分析

4.1 RFCOMM初始化

请添加图片描述整体时序:

请添加图片描述请添加图片描述

  • 2
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值