蓝牙学习笔记之RFCOMM协议(三)

2023-11-22 12:50

本文主要是介绍蓝牙学习笔记之RFCOMM协议(三),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

目录

RFCOMM协议概览

协议浅述

服务概述

RS-232控制信号

无调制解调器仿真

多串口仿真

RFCOMM帧类型

RFCOMM帧格式

 Address字段

Control字段

Length字段

Data字段

FCS字段

RFCCOMM协议数据分析


RFCOMM协议概览

协议浅述

RFCOMM协议基于L2CAP协议的串行(9针RS-232)仿真。最新规范是V12,支持在两个蓝牙设备间高达60路的通信连接。该协议基于ETSI标准GSM 07.10(该文档在我(序篇)的网盘中可以找到),但不包含全部规范相反,只使用了GSM 07.10标准的一个子集。本文档中指定了该协议的一些修改,此外,还增加了RFCOMM特定的扩展,使其能够强制支持流控。

RFCOMM的目的是覆盖使用其所在设备的串行端口的应用程序,该规范支持两种设备类型的存在:

Type 1: DTE, 设备本身就是通信终端(如计算机,打印机) 

在简单的配置下,通信段是一个从一个设备到另一个设备的蓝牙链接,如下图:

 

 

Type 2: DCE, 通信节点(调制解调器)

当作为通讯节点使,其中通信段是另一个网络,蓝牙无线技术用于设备和网络连接设备(如调制解调器)之间的路径。RFCOMM只关心直接连接情况下设备之间的连接,或者网络情况下设备与调制解调器之间的连接。RFCOMM可以支持其他配置,比如在一端通过蓝牙无线技术通信的模块,在另一端提供有线接口。但是设备并不是真正的调制解调器,而是提供类似的服务。如下图所示:

 

服务概述

如果通过RFCOMM服务接口为特定端口设置波特率,则不会影响RFCOMM中的实际数据吞吐量;即RFCOMM不会导致人为的速率限制或节奏。但是,如果其中一个设备是类型2的设备(将数据中继到其他媒体),或者如果数据踱步在RFCOMM服务接口的任何一端或两端进行,实际吞吐量平均将反映波特率设置

RS-232控制信号

RFCOMM模拟了9针RS-232接口,如下所示

 

无调制解调器仿真

当传递非数据通路的状态信息时,不区分DTE和DCE设备, 而用控制信号来代替相应的信号,对应关系如下图:

 

GSM 07.10传输RS-232控制信号的方式创建了一个隐式零调制解调器,当两个同类设备(如DTE)互联时,GSM 07.10传输控制信号时就会创建零调制解调器。下图显示了通过RFCOMM连接两个DTE时创建的Null Modem :

 

多串口仿真

  • 两个设备间的多串口仿真

两个使用RFCOMM通信的蓝牙设备可以同时打开多个串口仿真 ,RFCOMM支持最多60路,但是一个设备实际能打开的数据依实现而定,具体情况如下图所示:

e1b58f2c556581873085a1b86d14be86.pnguploading.4e448015.gif正在上传…重新上传取消

一个数据链接标识(DLCI: 参考帧格式Address字段D+ServerChannel)标识一对客户和服务器之间的持续连接 。DLCI在两个设备间的RFCOMM会话中保持一致,中其可用值区间为2~61,0为控制信道 ,1由于服务器信道概念不能使用 , 62-63保留。具体请参《3GPP TS 07.10 V7.2.0》第5.6节。

在一次RFCOMM会话中,客户和服务器可以分布在通信的两端,每一端的客户都可以独立发起建立通信连接 
因此可使用RFCOMM服务器信道的概念将DLCI值域空间在两个正在进行通信的设备间进行划分

  • 多仿真串口和多蓝牙设备(Optional)

如果蓝牙设备支持多串口仿真,同时通信连接两端允许使用不同BT设备 
那么RFCOMM实体必须能够运行多路复用会话,每个多路复用使用L2CAP信道标识符(CID)来区分,如下图所示

 

RFCOMM帧类型

RFCOMM支持的帧(Frame)类型如下:

 

 

GSM 07.10 帧类型还有UI不能被RFCOMM所支持,对每个帧具体的意义请参考《3GPP TS 07.10 V7.2.0》5.3节或《3GPP TS 07.10 中文版》第3.3节。

RFCOMM帧格式

RFCOMM帧格式如下所示 

 

 Address字段

Address字段如下图所示,在GSM07.10和RFCOMM中有所区别:

 


EA(Extern Address)字段: 当为1时,表示没有额外的地址段。
C/R(Command/Response)字段: 表示该帧是一个Command还是Response,设置方式如下图所示 :

 


DCLI(或direction bit and server channel), 通常initator将D位(即最低位)设置为1,而Responser则将其设置为0 ,故initator的DCLI的值总是基数(3,5,7,…,61),而Responser则为偶数(2,4,6,…,60)

Control字段

Control字段用来标识帧的类型,下图是相关值 

 


其中,P/F是Poll/Final位,在Commands中,被称为P位;而在Responses中则被称为F位 。当发送的Command需要一个相应时,就将P置1,接收方收到这样的命令时需要马上响应并将F置1 。如果接收到P/F位置为0的SABM或DISC帧,接收方将把它们丢弃 

Length字段

 

 


Length字段由最低位的EA来决定其长度 
当EA为1时,长度为7bits(0~127) 
当EA为0时,长度为15bits(0~32767)

其中,RFCOMM帧的默认长度为127,最大长度为32767

Data字段

Data字段仅仅在UIH帧中存在,其长度限制由L2CAP的MTU所限制

FCS字段

用于接收方校验接收数据是否正确,校验原理采用循环冗余校验CRC-8

对于SABM,DISC,UA和DM帧,FCS计算Address,Control and Length字段 
对于UIH帧,FCS计算Address and Control字段

RFCCOMM协议数据分析

下面我们将对RFCOMM完整的一次建立过程进行数据分析。

以下蓝色为hci部分、绿色为l2cap部分、红色为RFCOMM部分,这里我只针对RFCOMM协议进行解析,如果你对其他协议有兴趣,可以去看我的其他协议的数据分析

1、Master:SABM(Frame Type)

00000010 00000010 00100000 00001000 00000000 00000100 00000000 11000000 00000000 00000011 00111111 00000001 00011100

Address:000000 1 1(此字段可以分为三部分,根据下图所描述,有两种结构,一种是GSM 07.10结构,一种为蓝牙RFCOMM结构)

 

{

DLCI:00000 0

{

D:0(当为RFCOMM时为1,其他都为零)

Server Channel:00000(0x00,服务通道为0)

}

Command/Response(C/R):1(Initiator Started C/R Sequence)

Extension Bit(EA):1(Not Extended)

}

Frame Type:00111111(根据下表可知为SABM(Set Async Balanced Mode))

{

Poll/Final Bit(P/F): 1(bit-4位,当建立Data Link Connection(DLC)时,一般是由TE(Terminal Equipment )发起发送一个SABM,并将该位(Poll)置一,MS(Mobile Station) 确认连接时回复的UA(Unnumbered Acknowledgement)包的该位(Final)也应该被置一)

}

 

Length:0000000(0x00,数据长度为0)

Extension Bit(EA):1(没有额外的字节描述数据长度)

FCS:00011100(0x1c,冗余校验)

2、Slave:UA

00000010 00000010 00100000 00001000 00000000 00000100 00000000 01000011 00000000 00000011 01110011 00000001 11010111

Address:00000011(此字段可以分为三部分,解析如下)

{

DLCI:00000 0

{

D:0(当为RFCOMM时为1,其他都为零)

Server Channel:00000(0x00,服务通道为0)

}

Command/Response(C/R):1(Initiator Started C/R Sequence)

Extension Bit(EA):1(Not Extended)

}

Length:0000000(0x00,数据长度为0)

Extension Bit(EA):1(没有额外的字节描述数据长度)

FCS:11010111(0xd7,冗余校验)

3、Master:UIH

00000010 00000010 00100000 00010010 00000000 00001110 00000000 11000000 00000000 00000011 11101111 00010101 10000011 00010001 00000010 11110000 00000000 00000000 00000000 00000001 00000000 00000111 01110000

Address:000000 1 1(此字段可以分为三部分)

{

DLCI:00000 0

{

D:0(当为RFCOMM时为1,其他都为零)

Server Channel:00000(0x00,服务通道为0)

}

Command/Response(C/R):1(Initiator Started C/R Sequence)

Extension Bit(EA):1(Not Extended)

}

Frame Type:11101111(查表可知为UIH(Unnumbered Info with Header Check))

{

Poll/Final Bit(P/F): 0(bit-4位)

}

Length:0001010(0x0a,数据长度为10)

Extension Bit(EA):1(没有额外的字节描述数据长度)

UIH Command/Response:(多路控制通道消息的格式如下:)

 

Type的格式如下图所示:

 

当EA为1时表示这是最后一个字节,当为0时则表示有扩展的字节表述,如下图:

 

T位代表类型编码,编码与命令的对应关系如下图所示:

 

Type:10000011

Command:100000(0x20,查表可知为PN命令)

Command/Response(C/R):1(Command)

Extension Bit(EA): 1(Not Extended)

Length字段格式如下:

 

当EA为1时表示这是最后一个字节,当为0时则表示有扩展的字节

Length:00010001

Length:0001000(0x08,value的长度为8)

Extension Bit(EA): 1(Not Extended)

Value根据不同的命令有不同的描述,在《3GGP TS 07.10 中文版》第3.4.6.3节有详细介绍,则此处为PN的值的描述,如下图:

 

具体参数介绍,请参考《3GGP TS 07.10 中文版》第3.4.6.3.1节

Value:

DLCI(D):000010(0x02,协商数据传输的DLCI)

Credit Based Flow Control(CL):1111(0x0f,Sender Supports CFC)

Type of Frame for Information(I):0000(0x0,UIH Frames)

Priority(P):000000(0x0,优先级为0,0为最低优先级)

Acknowledgement Timer(T):0(0x0,等待确认时间为0)

Maximum Frame Size(N):00000000 00000001(0x0100,最大帧大小为256)

Maximum Number of Retransmission(NA):00000000(0x0,最大重发次数为0)

Credits(K):111(0x07,窗口大小,即帧数量的的最大值,此处设置为7)

FCS:01110000(0x70,冗余校验)

UIH Command/Response:

Type:10000011

Command:100000(0x20,查表可知为PN命令)

Command/Response(C/R):1(Command)

Extension Bit(EA): 1(Not Extended)

Length:00010001

Length:0001000(0x08,value的长度为8)

Extension Bit(EA): 1(Not Extended)

这篇关于蓝牙学习笔记之RFCOMM协议(三)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/410268

相关文章

利用Python快速搭建Markdown笔记发布系统

《利用Python快速搭建Markdown笔记发布系统》这篇文章主要为大家详细介绍了使用Python生态的成熟工具,在30分钟内搭建一个支持Markdown渲染、分类标签、全文搜索的私有化知识发布系统... 目录引言:为什么要自建知识博客一、技术选型:极简主义开发栈二、系统架构设计三、核心代码实现(分步解析

Nginx中配置HTTP/2协议的详细指南

《Nginx中配置HTTP/2协议的详细指南》HTTP/2是HTTP协议的下一代版本,旨在提高性能、减少延迟并优化现代网络环境中的通信效率,本文将为大家介绍Nginx配置HTTP/2协议想详细步骤,需... 目录一、HTTP/2 协议概述1.HTTP/22. HTTP/2 的核心特性3. HTTP/2 的优

关于WebSocket协议状态码解析

《关于WebSocket协议状态码解析》:本文主要介绍关于WebSocket协议状态码的使用方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录WebSocket协议状态码解析1. 引言2. WebSocket协议状态码概述3. WebSocket协议状态码详解3

Java进阶学习之如何开启远程调式

《Java进阶学习之如何开启远程调式》Java开发中的远程调试是一项至关重要的技能,特别是在处理生产环境的问题或者协作开发时,:本文主要介绍Java进阶学习之如何开启远程调式的相关资料,需要的朋友... 目录概述Java远程调试的开启与底层原理开启Java远程调试底层原理JVM参数总结&nbsMbKKXJx

Qt 中集成mqtt协议的使用方法

《Qt中集成mqtt协议的使用方法》文章介绍了如何在工程中引入qmqtt库,并通过声明一个单例类来暴露订阅到的主题数据,本文通过实例代码给大家介绍的非常详细,感兴趣的朋友一起看看吧... 目录一,引入qmqtt 库二,使用一,引入qmqtt 库我是将整个头文件/源文件都添加到了工程中进行编译,这样 跨平台

Java深度学习库DJL实现Python的NumPy方式

《Java深度学习库DJL实现Python的NumPy方式》本文介绍了DJL库的背景和基本功能,包括NDArray的创建、数学运算、数据获取和设置等,同时,还展示了如何使用NDArray进行数据预处理... 目录1 NDArray 的背景介绍1.1 架构2 JavaDJL使用2.1 安装DJL2.2 基本操

Java如何接收并解析HL7协议数据

《Java如何接收并解析HL7协议数据》文章主要介绍了HL7协议及其在医疗行业中的应用,详细描述了如何配置环境、接收和解析数据,以及与前端进行交互的实现方法,文章还分享了使用7Edit工具进行调试的经... 目录一、前言二、正文1、环境配置2、数据接收:HL7Monitor3、数据解析:HL7Busines

HarmonyOS学习(七)——UI(五)常用布局总结

自适应布局 1.1、线性布局(LinearLayout) 通过线性容器Row和Column实现线性布局。Column容器内的子组件按照垂直方向排列,Row组件中的子组件按照水平方向排列。 属性说明space通过space参数设置主轴上子组件的间距,达到各子组件在排列上的等间距效果alignItems设置子组件在交叉轴上的对齐方式,且在各类尺寸屏幕上表现一致,其中交叉轴为垂直时,取值为Vert

Ilya-AI分享的他在OpenAI学习到的15个提示工程技巧

Ilya(不是本人,claude AI)在社交媒体上分享了他在OpenAI学习到的15个Prompt撰写技巧。 以下是详细的内容: 提示精确化:在编写提示时,力求表达清晰准确。清楚地阐述任务需求和概念定义至关重要。例:不用"分析文本",而用"判断这段话的情感倾向:积极、消极还是中性"。 快速迭代:善于快速连续调整提示。熟练的提示工程师能够灵活地进行多轮优化。例:从"总结文章"到"用

【前端学习】AntV G6-08 深入图形与图形分组、自定义节点、节点动画(下)

【课程链接】 AntV G6:深入图形与图形分组、自定义节点、节点动画(下)_哔哩哔哩_bilibili 本章十吾老师讲解了一个复杂的自定义节点中,应该怎样去计算和绘制图形,如何给一个图形制作不间断的动画,以及在鼠标事件之后产生动画。(有点难,需要好好理解) <!DOCTYPE html><html><head><meta charset="UTF-8"><title>06