传统蓝牙RFCOMM多路控制帧(MULTIPLEXOR FRAMES)介绍

2024-01-02 15:50

本文主要是介绍传统蓝牙RFCOMM多路控制帧(MULTIPLEXOR FRAMES)介绍,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

零. 概述

本文章主要讲下蓝牙RFCOMM协议多路控制通道(MULTIPLEXOR FRAMES),包括一下几种

• 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).

一. 声明

本专栏文章我们会以连载的方式持续更新,本专栏计划更新内容如下:

第一篇:蓝牙综合介绍 ,主要介绍蓝牙的一些概念,产生背景,发展轨迹,市面蓝牙介绍,以及蓝牙开发板介绍。

第二篇:Transport层介绍,主要介绍蓝牙协议栈跟蓝牙芯片之前的硬件传输协议,比如基于UART的H4,H5,BCSP,基于USB的H2等

第三篇:传统蓝牙controller介绍,主要介绍传统蓝牙芯片的介绍,包括射频层(RF),基带层(baseband),链路管理层(LMP)等

第四篇:传统蓝牙host介绍,主要介绍传统蓝牙的协议栈,比如HCI,L2CAP,SDP,RFCOMM,HFP,SPP,HID,AVDTP,AVCTP,A2DP,AVRCP,OBEX,PBAP,MAP等等一系列的协议吧。

第五篇:低功耗蓝牙controller介绍,主要介绍低功耗蓝牙芯片,包括物理层(PHY),链路层(LL)

第六篇:低功耗蓝牙host介绍,低功耗蓝牙协议栈的介绍,包括HCI,L2CAP,ATT,GATT,SM等

第七篇:蓝牙芯片介绍,主要介绍一些蓝牙芯片的初始化流程,基于HCI vendor command的扩展

第八篇:附录,主要介绍以上常用名词的介绍以及一些特殊流程的介绍等。

另外,开发板如下所示,对于想学习蓝牙协议栈的最好人手一套。以便更好的学习蓝牙协议栈,相信我,学完这一套视频你将拥有修改任何协议栈的能力(比如Linux下的bluez,Android下的bluedroid)。

-------------------------------------------------------------------------------------------------------------------------

CSDN学院链接(进入选择你想要学习的课程):https://edu.csdn.net/lecturer/5352?spm=1002.2001.3001.4144

蓝牙交流扣扣群:970324688

Github代码:https://github.com/sj15712795029/bluetooth_stack

入手开发板:https://item.taobao.com/item.htm?spm=a1z10.1-c-s.w4004-22329603896.18.5aeb41f973iStr&id=622836061708

蓝牙学习目录:https://blog.csdn.net/XiaoXiaoPengBo/article/details/107727900

--------------------------------------------------------------------------------------------------------------------------

二. 多路控制帧(MULTIPLEXOR FRAMES)

多路控制通道主要在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来发送,多路控制的数据格式如下,红框为多路控制帧的格式

Type参数格式如下图所示:

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

T位代表类型编码下面我们就来一一说下每个command。

2.1 PN—DLC Parameter Negotiation

在 DLC 建立之前,要用 PN 进行参数协商,整个PN的封包格式如下:

Length一直为8

后续的value格式如下:

其中D1~D6是DLCI

I1~I4定义了在指定 DLC 上传输信息帧的类型,如下,但是我们此部分只选择UIH帧

CL 1~4位定义了在指定 DLCI 上的汇聚层类型,如下表所示:

P1~P6位表示在指定 DLC 上所分配的优先级,范围从 0 到 63,0 的优先级最高:

T 位表示 acknowledgement timer (T1)的值

N 位表示 maximum frame size (N1)的值。

NA-位表示 maximum number of retransmissions (N2)

K 位表示纠错模式下窗口大小

来一个sample后续的value如下:

2 .2 Test Command (Test)

测试命令,类型代码是 000100,长度字节为 0,后面没有参数。

2.3 Flow Control On Command (FCon)

流控开启命令,类型代码为 000101,长度字节为 0,后面没有参数

2.4 Flow Control Off Command (FCoff)

流控关闭命令,类型代码为 000110,长度字节为 0,后面没有参数

2.3/2.4的命令都没有参数,格式如下:

2.5 Modem Status Command (MSC)

用 MSC 命令来传输 V.24 控制信号,它在基本选项下面使用。MSC 命令包含一个 mandatory control signal(强制的控制信号)字节和一个 break signal(暂停信号)字节。在建立了 DLC 之后,发送用户数据之前,发送 MSC 命令。

参数有address以及V.24,address已经在前面介绍,我们来看下V.24的格式

EA:扩展位,功能如前所述。

FC:flow control,当设备不能接受帧数据的时候,设定为 1。

RTC:ready to communicate,当设备准备好通信时,把这位设定为 1。

RTR:ready to receive,设备准备好接收数据时,设定为 1。

IC:incoming call indicator,当有呼入时,设定为 1。

DV:data valid,发送了合法数据,设定为 1。

其他位保留。我们来看个btsnoop截图:

2.6 Non Supported Command Response (NSC)

当接收实体接收到了一个不支持的命令类型时,对发方发送 NSC。其类型代码为 001000,当只有一个不支持的命令类型时,长度字节为 1,后面的参数是代表不支持的命令类型的代码,其格式为:

2.7 Remote Port Negotiation Command (RPN)

我们来贴下

在来贴下从Baud rate的结构:

B1-B7 代表的是波特率,其具体含义见下表:

D1-D2 表示数据位的长度。 00 表示 5bit,01 表示 6bit,10 表示 7bit,11 表示 8bit。

S 表示停止位

P 表示校验,P=0 有校验,P=0 无校验

PT1-PT2 表示校验类型

FLC1-FLC6 D 默认值为 0, 没有流控制

Bit1 XON/XOFF on input

Bit2 XON/XOFF on output

Bit3 RTR on input

Bit4 RTR on output

Bit5 RTC on input

Bit6 RTC on output

XON1-XON8 XON character (default DC1)

XOF1-XOF8 XOFF character.(default DC3)

PM1-PM8 parameter mask

用parameter mask来表示对方的哪个参数需要进行协商。如果是命令, parameter

mask用0表示不改变,1表示要改变。如果是应答,0表示不接受建议值,1表示接

受并并使用建议值

第 7、8 个字节的 bit mask 表示

Bit1 bit rate

Bit2 data bits

Bit3 stop bits

Bit4 Parity

Bit5 parity type

Bit6 XON character

Bit7 XOF character

Bit8 reserved

PM9-PM18: Parameter mask continued

Bit1 XON/XOFF on input

Bit2 XON/XOFF on output

Bit3 RTR on input

Bit4 RTR on output

Bit5 RTC on input

Bit6 RTC on output

所有的参数默认为 0,接收方接到后对此忽略。

Mask整理如下

2.8 Remote Line Status Command (RLS)

类型代码为 001010,长度字节的值为 2,有两个参数。第一个参数为 DCLI的值,具体格式跟一般的 DCLI 格式一样。第二个参数的格式入下表所示:

L1-L4 表示链路状态,如果 L1 为 0,则表示没有错误发生,若 L1=1,则表示发生了错误

如下:

• 0b1100—Overrun error, a received character has overwritten a character which had

not yet been read.

• 0b1010—Parity error, the parity was wrong on a received character.

• 0b1001—Framing error, a character did not end with a stop bit.

这篇关于传统蓝牙RFCOMM多路控制帧(MULTIPLEXOR FRAMES)介绍的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



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

相关文章

Pytest多环境切换的常见方法介绍

《Pytest多环境切换的常见方法介绍》Pytest作为自动化测试的主力框架,如何实现本地、测试、预发、生产环境的灵活切换,本文总结了通过pytest框架实现自由环境切换的几种方法,大家可以根据需要进... 目录1.pytest-base-url2.hooks函数3.yml和fixture结论你是否也遇到过

用js控制视频播放进度基本示例代码

《用js控制视频播放进度基本示例代码》写前端的时候,很多的时候是需要支持要网页视频播放的功能,下面这篇文章主要给大家介绍了关于用js控制视频播放进度的相关资料,文中通过代码介绍的非常详细,需要的朋友可... 目录前言html部分:JavaScript部分:注意:总结前言在javascript中控制视频播放

MySQL中慢SQL优化的不同方式介绍

《MySQL中慢SQL优化的不同方式介绍》慢SQL的优化,主要从两个方面考虑,SQL语句本身的优化,以及数据库设计的优化,下面小编就来给大家介绍一下有哪些方式可以优化慢SQL吧... 目录避免不必要的列分页优化索引优化JOIN 的优化排序优化UNION 优化慢 SQL 的优化,主要从两个方面考虑,SQL 语

Python异步编程中asyncio.gather的并发控制详解

《Python异步编程中asyncio.gather的并发控制详解》在Python异步编程生态中,asyncio.gather是并发任务调度的核心工具,本文将通过实际场景和代码示例,展示如何结合信号量... 目录一、asyncio.gather的原始行为解析二、信号量控制法:给并发装上"节流阀"三、进阶控制

使用DrissionPage控制360浏览器的完美解决方案

《使用DrissionPage控制360浏览器的完美解决方案》在网页自动化领域,经常遇到需要保持登录状态、保留Cookie等场景,今天要分享的方案可以完美解决这个问题:使用DrissionPage直接... 目录完整代码引言为什么要使用已有用户数据?核心代码实现1. 导入必要模块2. 关键配置(重点!)3.

C++中函数模板与类模板的简单使用及区别介绍

《C++中函数模板与类模板的简单使用及区别介绍》这篇文章介绍了C++中的模板机制,包括函数模板和类模板的概念、语法和实际应用,函数模板通过类型参数实现泛型操作,而类模板允许创建可处理多种数据类型的类,... 目录一、函数模板定义语法真实示例二、类模板三、关键区别四、注意事项 ‌在C++中,模板是实现泛型编程

Python实现html转png的完美方案介绍

《Python实现html转png的完美方案介绍》这篇文章主要为大家详细介绍了如何使用Python实现html转png功能,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下... 1.增强稳定性与错误处理建议使用三层异常捕获结构:try: with sync_playwright(

Java使用多线程处理未知任务数的方案介绍

《Java使用多线程处理未知任务数的方案介绍》这篇文章主要为大家详细介绍了Java如何使用多线程实现处理未知任务数,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下... 知道任务个数,你可以定义好线程数规则,生成线程数去跑代码说明:1.虚拟线程池:使用 Executors.newVir

SpringSecurity 认证、注销、权限控制功能(注销、记住密码、自定义登入页)

《SpringSecurity认证、注销、权限控制功能(注销、记住密码、自定义登入页)》SpringSecurity是一个强大的Java框架,用于保护应用程序的安全性,它提供了一套全面的安全解决方案... 目录简介认识Spring Security“认证”(Authentication)“授权” (Auth

python之流程控制语句match-case详解

《python之流程控制语句match-case详解》:本文主要介绍python之流程控制语句match-case使用,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐... 目录match-case 语法详解与实战一、基础值匹配(类似 switch-case)二、数据结构解构匹