【蓝牙协议栈】【BR/EDR】传统蓝牙 command/event/acl/sco/iso 命令格式解析

1. 精讲蓝牙协议栈(Bluetooth Stack):SPP/A2DP/AVRCP/HFP/PBAP/IAP2/HID/MAP/OPP/PAN/GATTC/GATTS/HOGP等协议理论 

2. 欢迎大家关注和订阅,【精讲蓝牙协议栈】、【精讲BLE协议栈】和【Android Bluetooth Stack】专栏会持续更新中.....敬请期待! 

目录

1. 蓝牙核心系统架构

2. 核心传输承载架构

3.传统蓝牙命令格式(command/event/acl/sco/iso)

3.1 蓝牙 command 格式

3.2 蓝牙 event 格式

3.3 蓝牙 acl 格式

3.4 蓝牙 sco 格式

3.5 蓝牙 iso 格式

4. SCO/ACL/eSCO的区别 


1. 蓝牙核心系统架构

        CORESYSTEM ARCHITECTURE

        黑色的为用户数据通路,灰色的为命令/事件通道。

       上图为蓝牙的核心模块,每个核心模块都有相关联的通信协议。 BR/EDR Controller由链路管理,链路控制器和BR/EDR无线模块构成。AMP Controller由AMP PAL,AMP MAC和AMP PHY构成。LE Controller由链路管理,链路控制器和LE无线模块构成。上图可以看出host和controller进行信息交互需通过特定的通道。SCO(SCO,eSCO),ACL用来传输用户数据,称之为U-plane。SCO与eSCO用来传输时间敏感的数据,比如音频数据,而eSCO支持重传机制,ACL不支持重传机制。C/E用来传输命令和事件,称之为C-plane。

2. 核心传输承载架构

        CORE TRAFFIC BEARERS

        蓝牙核心系统为服务协议和应用数据的传输提供了很多的传输载体,如下图所示:

  

      蓝牙传输实体结构(TRANSPORT ARCHITECTURE ENTITIES)如下图所示:

3.传统蓝牙命令格式(command/event/acl/sco/iso)

3.1 蓝牙 command 格式

        HCI 命令包用于从协议栈发送给芯片的命令

        HCI 命令包的格式如下图所示

我们来一一介绍下每个字段的意思! Opcode:每个命令被分配一个 2 字节的操作码(opcode),用来唯一地识别不同

类型的命令,操作码(opcode)参数分为两个字段,称为操作码组字段(Opcode Group Field, OGF)和操作码命令字段(Opcode Command Field, OCF)。其中 OGF 占用高 6bit 字节,OCF 占用低 10bit 字节。所以算法是这样:

一共有以下几组 OGF:

1)Link Control commands, the OGF is defined as 0x01. 此组 Command 集合是用于连接控制的,比如搜索啦,连接啦等等

2)Link Policy commands, the OGF is defined as 0x02 此组 Command 集合是用于连接策略的,比如进入 Sniffer mode/角色切换等!

3)HCI Control and Baseband commands, the OGF is defined as 0x03 此组 Command 集合是用于控制本地 Controller 跟基带的,比如复位,设置连接 超时等!

4)Informational Parameters commands, the OGF is defined as 0x04 此组 Command 集合是设置或者获取信息参数的,比如读取蓝牙地址

5)Status parameters commands, the OGF is defined as 0x05 此组 Command 集合是状态参数的,比如读取信号强度等

6)Testing commands, the OGF is defined as 0x06 此组 Command 集合是测试命令,比如让设备进度 DUT(Device under Test)模 式的

7)LE Controller commands, the OGF code is defined as 0x08 此组 Command 集合是 BLE 的 command

8)vendor-specific debug commands,the OGF code is defined as 0x3F,此 部分是 vendor 定义的,也就是芯片厂商为了扩展 core 文档的 HCI command 定义 OCF 众多,在每个 OGF 下都有一堆的 OCF 定义,我们在下个小节进行详细介绍

Parameter Total Length:后续参数的长度

Parameter:每个 command 的 para,下个小节做说明

下面我们来截图举例下,我们以 HCI reset 为例,在介绍前,我们先看下 HCI reset 的 command, 这个命令是上电第一条发给芯片的 command(bcsp,h5 transport 除外,这两个需 要额外的 hex data 来启动 link 等,详细见 Transport 介绍)

HCI reset 的 OGF 为 3,OCF 也为 3,根据以上算法我们算下:

Opcode[0] = OCF & 0xff = 0x03

Opcode[1] = (OCF >> 8) | (OGF << 2) = 0x0c

我们在组合封包的时候代码如下

3.2 蓝牙 event 格式

        HCI event 是蓝牙芯片发送给协议栈的事件。

        HCI 事件包的格式如下图所示,每 个字段的定义如下所示:

Event code:唯一 event 编码,在后续的小节会介绍

Parameter Total Length:后续参数的长度

Parameter:event 参数

Event header 结构体代码如下:

以一个 event 来做说明,event 在后续的小节会介绍,在这里大概了解下就 OK 了 以 HCI_Command_Complete 格式为例,格式如下:

Btsnoop 如下:

raw data 分析:

0x0E -> command complete event code

0x04 -> para len,也就是后面参数的长度

0x01 -> num HCI command pacekets 0x03

0x0c -> HCI reset command opcode

0x00 -> status success

3.3 蓝牙 acl 格式

        ACL (Asynchronous Connection-Less)

        HCI acl 用于从协议栈跟蓝牙芯片双向交互上层协议的数据。HCI acl 的格式如 下图所示,每个字段的定义如下所示:

Handle:连接句柄,用于蓝牙连接后跟 remote 交互 acl 数据用

PB flag:此部分就是用于上层数据(L2CAP),是否是分隔数据,具体 bit 的定 义如下  

BC flag:此部分定义是是否为广播,每个 bit 定义如下:

Data total length:后续 payload 的长度

举一个例子

3.4 蓝牙 sco 格式

        ScO (Synchronous Connection-0riented):SCO链路是一种面向连接的同步传输模式,适用于对实时传输要求较高的音频数据等场景。在传统的SCO链路中,主从设备之间的通信是以固定帧长和固定帧速率的方式进行的。SCO链路通过传输时间间隙实现数据的可靠传输,但是由于固定帧长和速率的限制,其带宽利用率较低。

        HCI sco 用于从协议栈跟蓝牙芯片双向交互音频数据,主要用于传统蓝牙HFP

        HCI sco 的格式如下图所示,每个字段的定义如下所示:

Handle:连接句柄,用于蓝牙连接后跟 remote 交互 sco 数据用

Packet_Status_Flag:此部分协议栈发送给芯片的设置为 0x00,芯片发送给协议栈的如下图

Data_Total_Length:SCO 数据长度

3.5 蓝牙 iso 格式

        此部分是从 core5.2 开始增加,主要是蓝牙协议栈跟蓝牙芯片交互同步数据,主要用来传输 BLE Audio 的数据

        HCI iso 的格式如下图所示,每个字段的定义如下所示:

Handle:连接句柄,用于蓝牙连接后跟 remote 交互 iso 数据用 PB_Flag:是否为分隔数据,定义如下  

4. SCO/ACL/eSCO的区别 

        eSCO(Enhanced Synchronous Connection Oriented):eSCO链路是蓝牙核心规范4.0版本引入的改进型SCO链路,旨在提供更高的带宽和灵活性。eSCO链路在传输上具有更高的灵活性,可以根据实际需求动态调整帧长和速率。此外,eSCO链路还引入了更好的信道编码和差错控制机制,提高了链路的可靠性。

1. SCO 是一种同步连接,用于实时音频传输(如电话),其带宽固定,传输延迟较低,但不支持数据流传输,
2. ACL是一种异步连接,用于传输数据流,其带宽可变,传输延迟较高,但支持数据流传输。
3. eSCO 是一种增强的同步连接,可以在实时音频传输的同时支持数据流传输,其带宽和传输延迟介于 SCO 和 ACL 之间


        总的来说,SCO 适用于实时音频传输,ACL适用于数据流传输,eSC0 则是二者的折中方案,可以同时支持实时音频传输和数据流传输。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Java进阶-Java Stream API详解与使用

本文全面介绍了 Java Stream API 的概念、功能以及如何在 Java 中有效地使用它进行集合和数据流的处理。通过详细解释和示例&#xff0c;文章展示了 Java Stream API 在简化代码、提高效率以及支持函数式编程方面的优势。文中还比较了 Java Stream API 与其他集合处理库的异同&…

【氮化镓】GaN器件在航天器高可靠正向转换器中应用

文章是发表在《IEEE Journal of Emerging and Selected Topics in Power Electronics》2022年10月第10卷第5期上的一篇关于GaN(氮化镓)器件在航天器高可靠性正向转换器中应用的研究。文章的作者是匹兹堡大学电气与计算机工程系的Aidan Phillips, Thomas Cook和Brandon M. Gra…

c#word文档:3.向Word文档中插入表格/4.读取Word文档中表格

--向Word文档中插入表格-- &#xff08;1&#xff09;在OfficeOperator项目的WordOperator类中定义向Word文档插入换页的函数NewPage &#xff08;2&#xff09;在WordOperator类中定义向Word文档插入表格的函数InsertTable using Microsoft.Office.Interop.Word;// 引入Mic…

Day27:阻塞队列、Kafka入门、发送系统通知、显示系统

阻塞队列BlockingQueue BlockingQueue 解决线程通信的问题。阻塞方法:put、take。 生产者消费者模式 生产者:产生数据的线程。消费者:使用数据的线程。 &#xff08;Thread1生产者&#xff0c;Thread2消费者&#xff09; 实现类 ArrayBlockingQueueLinkedBlockingQueuePr…

MATLAB 数据导入

MATLAB 数据导入&#xff08;ImportData&#xff09; 在MATLAB中导入数据意味着从外部文件加载数据。该importdata功能允许加载不同格式的各种数据文件。它具有以下五种形式 序号 功能说明 1 A importdata(filename) 从filename表示的文件中将数据加载到数组A中。 2 A i…

Electron+Vue3+Vite+ElectronForge整合-全部ts开发 - 一键启动两个服务 一键打包两个服务

说明 本文介绍一下 Electron Vue3 Vite Electron Forge 的高级整合操作。vue3 : 使用 TS 的语法开发&#xff1b; Electron : 使用 TS 的语法开发。 补充 &#xff1a; 目前Electron的开发还是以JS为主&#xff0c;不过我们可以直接使用TS开发&#xff0c;在执行和打包时&a…

UE5 蓝图入门

基础节点创建&#xff1a; 常量&#xff1a; 按住 1 &#xff0c;点击鼠标左键&#xff0c;创建常量 二维向量&#xff1a; 按住 2 &#xff0c;点击鼠标左键&#xff0c;创建二维向量 三维向量&#xff1a; 按住 3 &#xff0c;点击鼠标左键 按 c 键打出一个注释框 参考视…

C# Winform父窗体打开新的子窗体前,关闭其他子窗体

随着Winform项目越来越多&#xff0c;界面上显示的窗体越来越多&#xff0c;窗体管理变得更加繁琐。有时候我们要打开新窗体&#xff0c;然后关闭多余的其他窗体&#xff0c;这个时候如果一个一个去关闭就会变得很麻烦&#xff0c;而且可能还会出现遗漏的情况。这篇文章介绍了三…

HR招聘测评,如何进行人才测评?

说起“人才测评”几个字&#xff0c;相信大家都不会陌生&#xff0c;很多人&#xff0c;尤其是求职者来说&#xff0c;则更加熟悉。在求职应聘中&#xff0c;已经有越来越多的企业开始采用人才测评进行人员选拔。了解人才测评的含义&#xff0c;知道人才测评如何进行&#xff0…

打破失联困境:门店如何利用AI智能名片B2B2C商城小程序重构与消费者的紧密连接?

在如今这个消费者行为日益碎片化的时代&#xff0c;门店经营者们时常感叹&#xff1a;消费者进店如同一场不期而遇的缘分&#xff0c;然而一旦离开门店&#xff0c;就仿佛消失在茫茫人海中&#xff0c;难以再觅其踪迹。这种“进店靠缘分&#xff0c;离店就失联”的困境&#xf…

本地大语言模型LLM的高效运行专家 | Ollama

Ollama简介 Ollama是一个开源的大型语言模型服务工具&#xff0c;它帮助用户快速在本地运行大模型。通过简单的安装指令&#xff0c;用户可以执行一条命令就在本地运行开源大型语言模型&#xff0c;如Llama 2。Ollama极大地简化了在Docker容器内部署和管理LLM的过程&#xff0…

平面模型上提取凸凹多边形------pcl

平面模型上提取凸凹多边形 pcl::PointCloud<pcl::PointXYZ>::Ptr PclTool::ExtractConvexConcavePolygons(pcl::PointCloud<pcl::PointXYZ>::Ptr cloud) {pcl::PointCloud<pcl::PointXYZ>::Ptr cloud_filtered(new pcl::PointCloud<pcl::PointXYZ>);p…

政安晨:【Keras机器学习示例演绎】(二十八)—— 使用 卷积神经网络与循环神经网络 架构进行视频分类

目录 数据收集 设置 定义超参数 数据准备 序列模型 推论 政安晨的个人主页&#xff1a;政安晨 欢迎 &#x1f44d;点赞✍评论⭐收藏 收录专栏: TensorFlow与Keras机器学习实战 希望政安晨的博客能够对您有所裨益&#xff0c;如有不足之处&#xff0c;欢迎在评论区提出指正…

Android Handler用法

Android Handler用法 为什么要设计Handler机制&#xff1f;Handler的用法1、创建Handler2、Handler通信2.1 sendMessage 方式2.2 post 方式 Handler常用方法1、延时执行2、周期执行 HandlerThread用法主线程-创建Handler子线程-创建Handler FAQMessage是如何创建主线程中Looper…

微服务保护和分布式事务(Sentinel、Seata)笔记

一、雪崩问题的解决的服务保护技术了解 二、Sentinel 2.1Sentinel入门 1.Sentinel的安装 &#xff08;1&#xff09;下载Sentinel的tar安装包先 &#xff08;2&#xff09;将jar包放在任意非中文、不包含特殊字符的目录下&#xff0c;重命名为 sentinel-dashboard.jar &…

Docker容器---Harbor私有仓库部署与管理

一、搭建本地私有仓库 1、下载registry镜像 [rootlocalhost ~]#docker pull registry Using default tag: latest latest: Pulling from library/registry 79e9f2f55bf5: Pull complete 0d96da54f60b: Pull complete 5b27040df4a2: Pull complete e2ead8259a04: Pull comp…

vulnhub靶场之FunBox-1

一.环境搭建 1.靶场描述 Boot2Root ! This is a reallife szenario, but easy going. You have to enumerate and understand the szenario to get the root-flag in round about 20min. This VM is created/tested with Virtualbox. Maybe it works with vmware. If you n…

NASA数据集——NASA 标准二级(L2)暗目标(DT)气溶胶产品每 6 分钟在全球范围内对陆地和海洋上空的气溶胶光学厚度(AOT)产品

VIIRS/NOAA20 Dark Target Aerosol 6-Min L2 Swath 6 km 简介 NOAA-20&#xff08;前身为联合极地卫星系统-1&#xff08;JPSS-1&#xff09;&#xff09;--可见红外成像辐射计套件&#xff08;VIIRS&#xff09;NASA 标准二级&#xff08;L2&#xff09;暗目标&#xff08;D…

集合的基本操作

集合&#xff1a; 在java当中&#xff0c;含有着一些不同的存储数据的相关集合。分为单列集合&#xff08;Collection&#xff09;和双列集合(Map)。 Collection 首先学习Collection来进行展示&#xff1a; 以框框为例子&#xff0c;蓝色的代表的是接口&#xff0c;而红色的…

【Linux极简教程】常见实用命令不断更新中......

【Linux极简教程】常见实用命令不断更新中...... 常见问题1.Waiting for cache lock: Could not get lock /var/lib/dpkg/lock. It is held by process xxxx(dpkg) 常见问题 1.Waiting for cache lock: Could not get lock /var/lib/dpkg/lock. It is held by process xxxx(dp…
最新文章