蓝牙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~32768NA-位表示 最大重传次数 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初始化

整体时序:

【蓝牙RFCOMM 协议】相关推荐

  1. 传统蓝牙RFCOMM协议(Bluetooth rfcomm)流程介绍

    零. 概述 本文章主要讲下蓝牙协议栈RFCOMM协议部分流控介绍 一. 声明 本专栏文章我们会以连载的方式持续更新,本专栏计划更新内容如下: 第一篇:蓝牙综合介绍 ,主要介绍蓝牙的一些概念,产生背景, ...

  2. 蓝牙—RFCOMM协议

    2019独角兽企业重金招聘Python工程师标准>>> RFCOMM是一个简单的协议,其中针对9针RS-232串口仿真附加了部分条款.可支持在两个蓝牙设备之间同时保持高达60路的通信 ...

  3. 蓝牙协议栈开发板 STM32F1 跑蓝牙协议栈 --传统蓝牙串口协议SPP演示以及实现原理

    零. 概述 主要介绍下蓝牙协议栈开发板跑传统蓝牙串口协议SPP AT指令以及上位机操作步骤,以及原理 一. 声明 本专栏文章我们会以连载的方式持续更新,本专栏计划更新内容如下: 第一篇:蓝牙综合介绍 ...

  4. linux蓝牙串口 rfcomm,蓝牙RFCOMM通信

    最近需要在某个开发板上面通过蓝牙和手机蓝牙连接,并通过RFCOMM通信.还没有做过蓝牙RFCOMM相关工作,因此先在linux PC上面调试一下流程,并在此记录调试过程. 一.说明 RFCOMM协议基 ...

  5. 蓝牙 BLE 协议学习: 有关概念介绍

    背景 在学校内就用过蓝牙技术参加过比赛(并拿了奖):而蓝牙作为物联网中比较常见的协议,有必要进行深入的学习.此后的文章会以 ble(v4.0) 进行学习. 介绍 蓝牙技术最初由电信巨头爱立信公司于 1 ...

  6. 蓝牙音频协议双剑客(一)--音视频频分布传输协议(AVDTP)概念

    零. 概述 主要介绍下蓝牙协议栈(bluetooth stack)传统蓝牙音频协议之 音视频分布传输协议的概念,包含AVDTP概念,AVDTP组件,AVDTP传输服务,AVDTP的属于介绍. 一. 声 ...

  7. RK3568平台开发系列讲解(蓝牙篇)蓝牙通讯协议PhoneBookAccessProfile(PBAP)同步通讯录

    文章目录 <font color=#0990d9>一.PBAP描述 <font color=#0990d9>二.通讯录获取流程 <font color=#0990d9&g ...

  8. 【低功耗蓝牙】⑤ 蓝牙HID协议

    摘要 本文章主要介绍了蓝牙HID协议的实现方法,基于ESP32平台实现了蓝牙键盘,蓝牙鼠标,蓝牙自拍杆和蓝牙游戏手柄等设备,是初学者学习BLE HID协议很好的参考文章. HID设备 HID(Huma ...

  9. 蓝牙核心协议学习 -- 基带协议(Baseband)翻译最终版

    2021-10-27 蓝牙核心协议学习 -- 基带协议(Baseband) 剩余篇章已上传到资源分享,链接如下: baseband翻译.pdf-其它文档类资源-CSDN下载 baseband翻译.pd ...

最新文章

  1. 特征值与特征向量 matlab数值解,用MATLAB和numpy求解特征值和特征向量,matlab,与
  2. python zipfile_Python 学习入门(16)—— zipfile
  3. 【TensorFlow】tf.nn.softmax_cross_entropy_with_logits的用法
  4. python翻译成matlab_matlab语言转译成python
  5. css3中的BFC,IFC,GFC和FFC(转载)
  6. 第11章-img特征,vertical-align,cursor,opacity
  7. android 主线程调用,Android 主线程和线程之间相互发送消息
  8. python enumeration_如何在python中将int转换为Enum?
  9. OA,ERP等源码一部分演示
  10. MySQL快速生成大量测试数据1000万
  11. 机器学习之--数据构造,函数图显示
  12. 【Sublime】Mac下Sublime代码自动换行
  13. mysql+web日志分析工具_用Python+MySQL实现2017年web日志分析报告
  14. g标签 怎么设置svg_svg g标签的运用
  15. Jmeter使用Dubbo插件测试RPC接口
  16. 流式数据传输 php,PHP录制实时流式传输到文件
  17. webpack 处理网页小图标favicon
  18. MiniGUI中的几个画线函数
  19. python基础练习2(学python的多多少少听说过)
  20. android 区分平板,加量不加价!台电首款基于Android 11的平板终上市

热门文章

  1. 项目背景怎么描述_如何写项目的设计说明?
  2. 微信小程序的按钮怎么添加图标icon?
  3. linux美国华盛顿时间,centos系统时间与硬件时间不一致
  4. 麒麟OS(Kylin OS)操作系统minikube+docker安装使用及遇到的问题
  5. 【物联网】20.物联网传感器信号处理 - 数模转换(DA)
  6. JAVA文件读取和写入(内附简单的代码实现)
  7. 服务器下查看硬件配置,查询服务器基本硬件配置信息
  8. 关于gmail无法访问的问题
  9. BCGControlBar使用入门指南
  10. python计算两字符串中的位置_Python计算两个特定字符串之间的字符数