一. 声明

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

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

第二篇: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

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

二. 传统蓝牙HCI流控(flow control)

流控制用于在主机和主机控制器之间,避免传送到主机控制器的未应答远程设备的 ACL 数据溢出主机控制器数据缓冲区。主机(蓝牙协议栈)负责管理主机控制器(蓝牙芯片)的数据缓冲区。流控分为两种:

1)蓝牙协议栈到蓝牙芯片的流控

2)蓝牙芯片到蓝牙协议栈的流控

下面我们来一一介绍下:

1. 蓝牙协议栈到蓝牙芯片的流控

从host到Controller的数据流控分为两种:Packet-based Data Flow Control和Data-Block-Based Data Flow Control。通过HCI_Write_Flow_Control_Mode 命令来切换,

但是Packet-based data flow control对于BR/EDR芯片来说是默认的,所以你可以不下这个命令。但是我们既然讲到这个命令,还是看下这个命令的格式,如下图:

这个命令看截图已经很清晰了,一笔带过就好了,我们重点来说下协议栈到蓝牙芯片的流控原理(只说传统蓝牙的Packet-baseddata flow control):

在初始化时,主机将发送 Read_Buffer_Size 指令。通过该指令返回的两参数可以确定从主机发往主机控制器的 HCI ACL 和 SCO 数据分组(不包括报头)的最大长度。另有两返回参数表示主机控制器可以缓存等待传输的 HCI ACL 和SCO 数据分组数。在至少有一个连接或处于本地回送的情况下,主机控制器利用Number Of Completed Packets 事件控制从主机发来的数据流。事件分组包括一个连接句柄列表, 以及自从前一个事件返回后已经完成的 HCI 数据分组的相应数目(如果对于一个特定的连接句柄,没有事件返回发生,就从连接建立的时间算起 )。发送完成是指数据分组的传输、清除和回送至主机。根据该事件返回的信息和

Read Buffer Size 命令返回的参数(该参数决定可以存储在主机控制器中的 HCI ACL 和 SCO 数据分组的总数目)主机决定哪个连接句柄的 HCI 数据分组应该发送。在 HCI 每次发送数据分组后,它就假设在主机控制器上所对应链路类型的存储空间减少一个 HCI 分组的量,当主机收到一个新的能提供关于有多少 HCI 数据分组已经完成的 Number Of Completed Packets 事件后,它就可以得到从上一次事件返回后缓冲器数量的减少信息,并可以计算当前的缓冲器的使用量。当主机控制器在其缓存中存放有 HCI 数据分组时,它必须向主机周期性持续发送Number Of Completed Packets 事件, 直到最终所有 ACL 数据分组都已发送完毕或溢出。事件发送频率由厂商指定。注意:如果 SCO 流控制失效,则 Number OfCompleted Packets 就不能在 SCO 连接句柄中进行报告。

看概念可能我们不会那么清晰,我们就以一个举一个列子,根据btsnoop的flow来说明下吧:

Step 1)协议栈初始化的时候会采用Read_Buffer_Size来读取acl,sco的个数,以及acl,sco的每包size.如图,那此步骤分为切开两个小节:

①协议栈发送给芯片read buffer size command,截图如下

②蓝牙芯片回应协议栈comand complete的event携带acl,sco的个数,以及acl,sco的每包size等信息,截图如下:

Step 2)协议栈发送给蓝牙芯片ACL数据,acl的buffer size-1(注意此部分是维护在协议栈中),

而且只有通过frontline能看到剩余的acl buffer size(我试过ellisys以及Wireshark都不会显示,是因为Frontline的软件工具有算法会自动显示)

如图:在初始化的时候我们读到的acl buffer size是10,所以我们发送了一个acl数据,此部分变为9.

Step 3)蓝牙协议栈收到蓝牙芯片回送的Num of complete packet event后,协议栈更新acl buffer size数量。

可以看到收到后就把acl数据个数+1,重新回到10

Step 4)断开后

当host接收到HCI_Disconnection_Complete后,host应该认为controller里面与相关handle有关的packetbuffer都已经被释放,而且controller也不会发送HCI_Number_Of_Completed_Packets event给host。

2. 蓝牙芯片到蓝牙协议栈的流控

在某种情况下,必须在主机控制器到主机的方向上采用流控制。我们来直接上流程吧:

Step 1)初始化的时候协议栈给蓝牙芯片发送Set Controller To Host Flow Control command命令,决定来开启acl或者sco流控,具体命令如下:

可以看到默认是acl跟sco流控都是关闭的,可以单独打开acl或者sco的流控,也可以把两者同时打开

step 2)初始化的时候通过Host Buffer Size command由蓝牙协议栈发送给芯片acl,sco packet num,以及length,命令如下:

Step 3)协议栈收到acl后发送给芯片Host Number Of Completed Packets command

Step 4)断开后,芯片自己维护重新计数

传统蓝牙HCI流控(HCI flow control)相关推荐

  1. 一篇文章足够你学习蓝牙技术,提供史上最全的蓝牙技术(传统蓝牙/低功耗蓝牙)文章总结,文档下载总结(2020/12/11更新)

    本文章目的: 1)给广大蓝牙爱好者提供蓝牙资料下载渠道 2)给广大蓝牙爱好者增加一个蓝牙学习文章导读 我们的蓝牙书以及CSDN蓝牙系列的书籍以及视频有以下计划,大家可以根据兴趣爱好或者工作需要挑选特定 ...

  2. Spring Cloud Alibaba 实战 | 第十二篇: 微服务整合Sentinel的流控、熔断降级,赋能拥有降级功能的Feign新技能熔断,实现熔断降级双剑合璧(JMeter模拟测试)

    文章目录 一. Sentinel概念 1. 什么是Sentinel? 2. Sentinel功能特性 3. Sentinel VS Hystrix 二. Docker部署Sentinel Dashbo ...

  3. qos 流控功能_怎么设置飞鱼星QoS流量控制中的传统流控

    飞鱼星Volans公司致力于提供智能易用的网络通讯产品与服务,其通过创新技术不断提升网络使用质量,那么你知道怎么设置飞鱼星QoS流量控制中的传统流控吗?下面是学习啦小编整理的一些关于怎么设置飞鱼星Qo ...

  4. 蓝牙LL数据包交互【More Data多数据传输】【Acknowledgement and Flow Control】

    SYD8801是一款低功耗高性能蓝牙低功耗SOC,集成了高性能2.4GHz射频收发机.32位ARM Cortex-M0处理器.128kB Flash存储器.以及丰富的数字接口.SYD8801片上集成了 ...

  5. 蓝牙学习笔记之HCI协议(一)

    目录 协议浅述 HCI简介 HCI协议数据格式 HCI Command Packet HCI ACL Data Packet HCI Synchronous(SCO) Data Packet

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

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

  7. 蓝牙协议栈模组在linux ubuntu 跑蓝牙协议栈 --传统蓝牙搜索演示以及实现原理

    零. 概述 主要介绍下用Linux ubuntu虚拟机外接我们的蓝牙扩展版跑蓝牙协议栈的初始化以及搜索演示 一. 声明 本专栏文章我们会以连载的方式持续更新,本专栏计划更新内容如下: 第一篇:蓝牙综合 ...

  8. 蓝牙协议栈开发板 STM32F1 跑蓝牙协议栈 --传统蓝牙搜索演示以及实现原理

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

  9. linux流控系统,Linux流量控制(TC)之表面

    1.1 流量控制是什么 ​ 流量控制是路由器上报文的接收和发送机制及排队系统的统称.这包括在一个输入接口上决定以何种速率接收何种报文,在一个输出接口上以何种速率.何种顺序输出何种报文. ​ 传统的流量 ...

  10. 传统蓝牙服务问询协议SDP概念

    零.概述 本文主要介绍传统蓝牙SDP的概念,SDP在整个协议栈中的架构,SDP的UUID,服务类,以及服务类属性介绍. 服务发现协议(SDP)为应用程序提供了一种方法来发现哪些服务可用,并确定这些可用 ...

最新文章

  1. 讲解JS的promise,这篇是专业认真的!
  2. oracle 游标小例
  3. python语言软件-mPython(图形化编程软件) V0.5.0 官方版
  4. volte信令流程详解_VOLTE高清语音通话,呼叫时延低于3秒是如何做到的?
  5. SAP UI5 Repository and MongoDB Repository
  6. 一些奇妙的线段树操作
  7. 前端使用正则表达式从接口地址栏取值并将对应的值展示在页面上
  8. 微信小程序uni.switchTab传参获取不到;小程序跳转到tabBar页并传参;uni-app微信小程序获取tabBar页面参数失败;uni-app微信小程序tabBar页面onLoad不执行
  9. 2015.5.21 Core Java Volume 1
  10. pycharm中设置显示行数
  11. python 分类变量xgboost_用于可解释机器学习的四个Python库
  12. iOS10 拍照崩溃问题
  13. 修改手机屏幕刷新率_今年买手机绕不开高刷新率屏幕,144Hz比120Hz更好吗?
  14. 人民币兑换、换硬币 C语言
  15. tablelayout +viewpage+Fragment
  16. Typora官网下载慢,用这个镜像
  17. 【精选】VI手册设计模板合集,附带源文件、预览图、精细分类
  18. android 卡片投影渐变,受Duolingo启发的ViewPager卡片效果
  19. 电容笔和触控笔的区别是什么?好用的电容笔测评
  20. 解决 ArchLinux 下中文 Chinese 不能输入 couldnt input 的问题

热门文章

  1. 2010年10月14日糗事TOP10
  2. 编程还是不要用百度翻译,这里有一款更符合编程的翻译工具
  3. Makfile 应用进阶实例
  4. LaTex在线编辑工具overleaf在英文模板中输入中文
  5. Code3 整数反转
  6. 斐波那契数列(矩阵快速幂)
  7. 2018年计划Review,2019年计划Kick off | 掘金年度征文
  8. 华为鸿蒙家电物联网,华为“鸿蒙”来了:本身是为了做物联网,将比安卓速度快60%...
  9. 关于移动通信网络与互联网的关系
  10. dnplayerext2文件夹删不掉怎么解决