蓝牙RFCOMM 协议

news2024/11/25 12:01:23

蓝牙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,则这是地址的最后一个字节。蓝牙规范规定服务器应用程序可被分配一个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初始化

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

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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/552140.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

OpenCV基础操作(4)颜色空间转换、几何变换、图像二值化操作

OpenCV基础操作(4)颜色空间转换、几何变换、图像二值化操作 import cv2 as cv import numpy as np一、颜色空间转换 1、转换颜色空间 在 OpenCV 中有超过 150 中进行颜色空间转换的方法。但是你以后就会发现我们经常用到的也就两种:BGR↔Gray 和 BGR↔HSV。 我们…

《面试1v1》volatile

基本功 我是 javapub,一名 Markdown 程序员从👨‍💻,八股文种子选手。 面试官: 你能解释一下 volatile 关键字的作用吗? 候选人: 当我们在编写多线程程序时,经常会遇到线程安全的问…

iptables防火墙(一)

iptables防火墙 一、iptables概述1、netfilter 与 iptables 的关系1.netfilter2.iptables 2、四表五链1.四表2.五链3.表的匹配优先级4.规则链之间的匹配顺序5.规则链内的匹配顺序 二、iptables防火墙的安装及配置方法1、iptables防火墙安装2、iptables防火墙的配置方法1.iptabl…

nginx(七十八)日志的深入探究

一 日志 ① nginx与日志相关的指令 access_log log_format error_log rewrite_log log_subrequest debug_connection rewrite_log limit_conn_log_level limit_req_log_level log_not_found open_log_file_cache uninitialized_variable_warn log_not_found …

【重新定义matlab强大系列八】利用matlab求局部值(函数islocalmax求局部最大值+函数islocalmin求局部最小值)

🔗 运行环境:Matlab 🚩 撰写作者:左手の明天 🥇 精选专栏:《python》 🔥 推荐专栏:《算法研究》 #### 防伪水印——左手の明天 #### 💗 大家好🤗&#x1f91…

三控开关接线方式记录

参考原视频 三控开关与双控开关的多种接法,多控开关的工作原理_哔哩哔哩_bilibilihttps://www.bilibili.com/video/BV1Qh4y1J7gC/?spm_id_from333.337.search-card.all.click&vd_sourcee821a225c7ba4a7b85e5aa6d013ac92e原视频讲的不错,大家可以关…

国内好用的免费AI处理工具:Chat8(实现类似ChatGPT功能、TCP/IP通讯问题)

目前国外的ChatGPT比较火,朋友推荐了一个chat8,经过使用,觉得还不错,链接如下: https://ai.chat86.co/go/kl/775283,进去后可以直接用手机注册使用,以下是我问其关于TCP/IP的对话过程&#xff0…

(转载)从0开始学matlab(第11天)—关系运算符和逻辑运算符

选择结构的运算由一个表达式控制的,这个表达式的结果只有 true(1) 和 false(0)。有两种形式的运算符可以在 MATLAB 中关系得到 true/false:关系运算符和逻辑运算符。跟 C 语言一样, MATLAB 没有布尔型和逻辑数据类型。 MATLAB 把 0 …

模块一:k8s集群部署与安全配置

模块一:k8s集群部署与安全配置 目录 1、K8s安全运维概述 [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-PST6trat-1684674016197)(https://bucket-hg.oss-cn-shanghai.aliyuncs.com/img/1665822875941-73d822c8-7bdd-481c-acc1-df97b70c…

python爬虫实战——小说爬取

python爬虫实战——小说爬取 基于requests库和lxml库编写的爬虫,目标小说网站域名http://www.365kk.cc/,类似的小说网站殊途同归,均可采用本文方法爬取。 目标网站:传送门 本文的目标书籍:《我的师兄实在太稳健了》…

软件设计师第4题

首先,我是备考2023年上半年的考试。 一、历年考试题 历年的考题如下,从表中分析可以看出,动态规划法、排序算法、回溯法、分治法是很大概率考察的算法,尤其是动态规划法,本身其理解难度较高,且可以出的题型…

docker:容器的数据卷

1 数据卷概念及作用 1.1 什么是容器数据卷 先来看看Docker的理念: 将应用与运行的环境打包形成容器运行 ,运行可以伴随着容器,但是我们对数据的要求希望是持久化的容器之间希望有可能共享数据 Docker容器产生的数据,如果不通过…

什么是人工智能的知识图谱?知识图谱的组成、构建、应用有哪些?

人工智能(Artificial Intelligence,AI)是一种通过计算机模拟人类智能的技术,其应用范围越来越广泛。知识图谱(Knowledge Graph,KG)则是人工智能技术中的重要组成部分,它是一种结构化…

Redis集群安装之主从集群

1.主从集群 Redis有三种集群模式,分别是:主从模式、哨兵模式、Cluster模式。Rdis最开始使用主从模式做集群,若master宕机需要手动配置slave转为master;后来为了高可用提出来哨兵模式,该模式下有一个哨兵监视master和s…

TCP实现HTTP服务

在之前的篇章中我们已经讲过七层参考模型了,今天我们从传输层实现应用层http服务 使用nodejs原生net模块就可以打通TCP传输层并且提供一个端口号进行监听 创建一个TCP服务 import net from netconst server net.createServer((socket) > {socket.on(data, (da…

【路径规划】基于人工蜂群算法的栅格法路径规划 机器人路径规划【Matlab代码#23】

文章目录 【可更换其他算法,获取资源请见文章第6节:资源获取】1. 原始ABC算法2. 机器人路径规划环境创建3. 路径规划模型建立4. 部分代码展示5. 仿真结果展示6. 资源获取 【可更换其他算法,获取资源请见文章第6节:资源获取】 1. 原…

【实时性】实时性优化的一些参数设置和心得

博主未授权任何人或组织机构转载博主任何原创文章,感谢各位对原创的支持! 博主链接 本人就职于国际知名终端厂商,负责modem芯片研发。 在5G早期负责终端数据业务层、核心网相关的开发工作,目前牵头6G算力网络技术标准研究。 博客…

Deformable DETR 论文学习

1. 解决了什么问题? DETR 去除了目标检测算法中的人为设计,取得了不错的表现。但是其收敛速度很慢,对低分辨率特征识别效果差: 模型初始化时,注意力模块给特征图上所有的像素点分配的权重是均匀的,就需要…

chatgpt赋能Python-python5的阶乘

Python5的阶乘介绍 Python是一门广泛应用于编写脚本、自动化、爬虫、数据分析等方面的编程语言,也是很多科研领域使用的首选。Python的功能和灵活性可以帮助用户解决各种问题,而本文要介绍的是Python中计算阶乘的方法。 阶乘是数学中的一个概念&#x…

fullter 学习记录_01_插件整理

flutter学习记录第一节--搭建项目及路由的设置 1.轮播图: flutter_swiper1.1 用处1.2 导入flutter_swiper库1.3 导入库,运行后可能遇到的问题1.4 属性说明1.5 代码案例 2. flutter_screenutil2.1 用处2.2 引用2.3 使用说明2.4 代码实现按理2.5 ScreenUtl 的封装 1.轮…