首页 > 其他分享 >蓝牙框架介绍

蓝牙框架介绍

时间:2022-09-28 16:23:00浏览次数:84  
标签:协议 框架 蓝牙 request 介绍 response 数据包 连接

1、整体框架图

image

蓝牙核心技术概述.pdf(入门必备)

蓝牙框架可分为两部分,一部分为蓝牙模块(Bluetooth Module)和蓝牙主机(Bluetooth Host),其中蓝牙模块主要包含蓝牙底层协议,如射频(RF)、基带(BB)、链路控制(LC)等,一般来说蓝牙模块和蓝牙主机协议开发是分开的,底层协议由芯片设计制造开发定义,上层协议由产品开发设计定义。蓝牙主机与蓝牙模块通信基本都是通过主机控制接口(HCI),所以对上层协议开发者而言只需要关注高层协议与主机控制接口之间的数据交换。

2、应用层协议栈(个人称呼)

物理链路就是一些数据传输,最终都是通过射频RF进行沟通交互,实际分析需要结合软件架构思路。如 spp<->spp、RFCOMM<->RFCOMM 等。数据收发以及处理要在同一协议层进行分析处理。

1) BR/EDR 协议栈

image

上图来源,查询请点击Blog

上图可以较为清晰的看出各蓝牙协议(BR/EDR)间的数据传输情况。

HSP/HFP:手机(mobile phone)与耳机之间通信的基本功能,如接听、拒接、挂断等

SCO:音频数据一般有两个通道,同步链路(SCO)和异步链路(ACL), SCO 主要用来传输对时间要求很高的数据通信,一般通话使用 SCO 通道; ACL 链路就是定向发送数据包,既支持对称连接也支持不对称连接,多用于音乐等数据通信(直接与 HCI 通讯)

SDP:建立通讯通道,一般在建立连接之前进行寻呼、问询、连接。

SPP:模拟串口定义的蓝牙收发协议,使用 RFCOMM 通道通过 L2CAP 建立一个完整的数据通路。

A2DP:A2DP 协议的音频数据在 ACL Link上传输,这与 SCO 上传输的语音数据要区别。A2DP 不包括远程控制的功能,远程控制的功能参考协议 AVRCP、AVDTP、AVCTP 则定义了蓝牙设备之间数据流句柄的参数协商,建立和传输过程以及相互交换的信令实体形式,该协议是 A2DP 框架的基础协议。

GAP:GAP 协议保证不同 Bluetooth 产品可以互相发现并建立连接,定义了蓝牙设备如何发现对方并建立安全/不安全连接,同时还包括链路、信道的建立

RFCOMM:基于 L2CAP 协议,模拟 RS232 串口。
支持多串口仿真。在一次 RFCOMM 会话中,客户和服务器可以分布在通信的两端,每一端的客户都可以独立发起建立通信连接,因此可使用 RFCOMM 服务器信道的概念将 DLCI 值域空间在两个正在进行通信的设备间进行划分。一个数据链接标识( DLCI: 参考帧格式 Address 字段 D + ServerChannel )标识一对客户和服务器之间的持续连接(在两个设备间的 RFCOMM 会话中保持一致 DLCI 长度为 6 bit,在 RFCOMM 中其可用值区间为 2 ~ 61 0为控制信道 1 由于服务器信道概念不能使用 62 - 63 保留)。所以 RFCOMM 支持最大 60 路。

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

参考Blog

2) BLE 协议栈

image

上图来源,查询请点击Blog

GATT:现有 BLE 连接都是建立在GATT协议之上,GATT 的全名是Generic Attribute Profile,它定义两个 BLE 设备通过Service 和 Characteristic 进行通信。GATT 基于 ATT(Attribute Protocol)协议,把 Service, Characteristic 对应的数据保存在一个查找表中,次查找表使用 16 bit ID 作为每一项的索引。这里需要说明的是,GATT 连接,必需先经过 GAP 协议。

实际上,我们在 Android 开发中,可以直接使用设备的 MAC 地址,发起连接,可以不经过扫描的步骤。这并不意味不需要经过 GAP,实际上在芯片级别已经给你做好了,蓝牙芯片发起连接,总是先扫描设备,扫描到了才会发起连接。GATT 连接需要特别注意的是:GATT 连接是独占的。也就是一个 BLE 外设同时只能被一个中心设备连接。一旦外设被连接,它就会马上停止广播,这样它就对其他设备不可见了。当设备断开,它又开始广播。中心设备和外设需要双向通信的话,唯一的方式就是建立 GATT 连接。

参考Blog

ATT:Client 和 Server 之间是通过 ATT PDU来通信的,ATT PDU主要包括4类:读,写,notify 和 indicate。如果一个命令需要 response,那么会在相应命令后面加上 request;如果一个命令只需要 ACK 而不需要 response,那么它的后面就不会带 request。这里要特别强调一点,BLE 所有命令都是“必达”的,也就是说每个命令发出去之后,会立马等 ACK 信息,如果收到了 ACK 包,发起方认为命令完成;否则发起方会一直重传该命令直到超时导致 BLE 连接断开。换句话说,只要你的 BLE 没有断开,那么你之前发送的数据包,不管它是用什么 ATT PDU 来发送的,它肯定被对方收到了。

我估计很多人对此会产生疑问,因为他们经常碰到丢包的情况,其实大家经常碰到的“丢包”,不是空中把包丢了或者包在空中被干扰了,而是大家发送的代码写得有问题,导致你要发送的包没有被安全送达到协议栈射频 FIFO 中,所以以后大家碰到丢包情况,请先检查你的代码,保证你的数据包正确完整安全地送达到协议栈射频 FIFO 中,只要数据包放到了协议栈射频 FIFO 中,蓝牙协议栈就能保证该数据包“必达”对方。

既然每个 ATT 命令都必达对方,那么还需要 request 做什么?如果一个命令带有 request 后缀,那么发起方就可以收到命令的 response 包,这个 response 包在应用层是有回调事件的,而前述的 ACK 包在应用层是没有回调事件的。所以采用 request/response 方式,应用层可以按顺序地发送一些数据包,这个在很多应用场合是非常有用的。相反,如果你对应用层数据包的顺序没有要求,那么就可以不使用 request/response 形式。另外 Request/response 有一个副作用:大大降低通信的吞吐率,因为 request/response 必须在不同的连接间隔中出现,也就是说,你在间隔 1 中发送了一个 request 命令,那么 response 包必须在间隔 2 或者稍后间隔中回复,而不能在间隔1中回复,这就导致两个连接间隔最多只能发一个数据包,而不带 request 后缀的 ATT 命令就没有这个问题,在同一个连接间隔中,你可以同时发多个数据包,这样将大大提高数据的吞吐率。

常用的带 request 的命令:所有 read 命令,writerequest,indication 等,而常用的不带 request 的命令有 write command,notification 等。

参考Blog

拓展:SBC 是一种音频解码系统,附属于 A2DP 协议,专门为蓝牙 AV 应用程序设计。在 BES2300 中用来做音频数据的处理,只有在播放音乐或者一些系统声音才会打开 SBC 通路,这也是可接触的最底层音频数据通路。

3、 L2CAP 与 HCI

1) L2CAP 只支持 ACL 数据传输,不支持 SCO 数据。 SCO 数据直接与 HCI 层进行数据交互。(猜测为了数据实时性更好)

2) 协议复用:底层传输协议没有提供对高层协议的复用机制,因而 L2CAP 支持高层协议复用, L2CAP 层可以区分其上的 SDP、 RFCOMM、 TCS 等

To be continue

标签:协议,框架,蓝牙,request,介绍,response,数据包,连接
From: https://www.cnblogs.com/FxingJeen/p/16738487.html

相关文章

  • 9月28日——while循环知识不充、for循环、break及continue生效范围和range方法的介绍
    目录今日内容总结一、while循环内容补充1、死循环2、嵌套和全局标志位二、循环结构之for循环概念介绍for循环结构:1、for结构2、for...else结构三、break和continue的生效范......
  • Spring MVC框架:第一章:SpringMVC概述及初步体会SpringMVC使用过程
    第一节SpringMVC在知识体系中的坐标在我们学习框架知识以前,JavaSE+JDBC+JavaWeb+SQL这样的技术组合已经可以实现任何业务逻辑了。为什么还要学习SSM这样的框架呢?很简单,M......
  • 网上关于SAT简单入门的介绍
    网上关于SAT简单入门的介绍1.基于QT实现的数独游戏DPLL的SAT求解器设计基于sat的二进制数独游戏求解程序课程设计https://download.csdn.net2.SATandSMThttps://b......
  • vite入门介绍
    vite的中文镜像官网:https://vitejs.cn/vite3-cn/guide/why.html;vite的英文官网:https://vitejs.dev/;vite的中文镜像官网:https://cn.vitejs.dev/;一,什么是vite?vite是......
  • 分支/合并框架详解
    分支/合并框架详解分支框架的目的是以递归的方式将可以并行的任务拆分成更小的任务,然后将每个子任务的结果合并起来生成整体结果.它是ExecutorService接口的一个实现,他......
  • 7、在Android Studio中调用腾讯开源框架NCNN去实现Yolo-fastest(CPU+GPU)
    基本思想:想测试一下yolo-fast在Android的运行时间,因为不太喜欢(​​https://github.com/dog-qiuqiu/Yolo-Fastest​​​)的源码移植,使用腾讯企鹅的第三方包​​https://gith......
  • UE4框架(转)
    有很多人是从UE3接触到Unreal,如果你也对UE3非常了解,便能很快的上手UE4。但是,UE4的开发模式还是有所不同的。1.谈谈过往,UE1和UE2。我知道在那个时候咱们一样挥......
  • flask框架学习
    以前只整过js的后端,这次网安平台实践大作业打算用python写后端,于是赶紧滚过来学学flask简介与安装Flask是一个轻量级的可定制框架,使用Python语言编写,较其他同类型框架更......
  • Spring MVC框架:第二章:视图解析器和@RequestMapping注解使用在类级别及获取原生Servlet
    SpringMVC使用细节第一节视图解析器通过HelloWorld程序我们看到了handler方法的返回值表示:请求处理完成后,请SpringMVC执行一个请求转发。转发的地址就是handler方法的......
  • 高性价比蓝牙/2.4G芯片PHY6252在智慧照明应用
    在未来的很长一段时间内,智慧照明都将是整个物联网的重要发展领域。现在还只是智慧照明发展的初期,很多应用场景都还处在探索阶段,适应物联网时代需求的芯片必须是远高于目前......