• 蓝牙协议栈分层


    一、分层

    BLE协议栈主要用来对你的应用数据进行层层封包,以生成一个满足BLE协议的空中数据包,也就是说,把应用数据包裹在一系列的帧头(header)和帧尾(tail)中。 

    BLE协议栈主要由如下几部分组成:

    1、PHY(Physical layer物理层)

    PHY层用来指定BLE所用的无线频段,调制解调方式和方法等。PHY层做得好不好,直接决定整个BLE芯片的功耗,灵敏度以及selectivity等射频指标。

    BLE的调制方式为GFSK,BLE定义在信道中传输的是二进制符号(波形),即1个符号(波形)表示1个比特,其中相对频点正偏代表数字基带信号1,相对频点负偏的代表数字基带信号0。

                                    1M PHY和2M PHY在2404频点发送数据0b1010的对比图  

    频段:2400MHz~2483.5MHz

    通道:一共 40 个通道,37个自适应自动调频数据通道(0-36) ,3个广播通道:37 38 39

     为什么ch是这么分布呢?因为大部分设备是使用1,6,11 ch,ble使用37,38,39 ch和这几个ch没有耦合,有利于抗干扰。

    通道带宽: 

    2、LL(Link Layer链路层)

    此层为RF控制器,用于控制设备的射频状态,控制设备会处于5种状态之一:standby(准备)、advertising(广播)、scanning(监听/扫描), initiating(发起连接)、connected(已连接) 。LL层要做的事情非常多,比如具体选择哪个射频通道进行通信,怎么识别空中数据包,具体在哪个时间点把数据包发送出去,怎么保证数据的完整性,ACK如何接收,如何进行重传,以及如何对链路进行管理和控制等等。LL层只负责把数据发出去或者收回来,对数据进行怎样的解析则交给上面的GAP或者GATT。

    3、HCI(Host controller interface)

    HCI是可选的(具体请参考文章: 三种蓝牙架构实现方案(蓝牙协议栈方案)),HCI主要用于2颗芯片实现BLE协议栈的场合,用来规范两者之间的通信协议和通信命令等。

    4、GAP(Generic access profile)

    GAP是对LL层payload(有效数据包)如何进行解析的两种方式中的一种,而且是最简单的那一种。GAP简单的对LL payload进行一些规范和定义,因此GAP能实现的功能极其有限。GAP目前主要用来进行广播,扫描和发起连接等。

    5、L2CAP(Logic link control and adaptation protocol)逻辑链路控制及自适应协议层

    L2CAP对LL进行了一次简单封装,LL只关心传输的数据本身,L2CAP就要区分是加密通道还是普通通道,同时还要对连接间隔进行管理。

    蓝牙协议到这个层次的时候,就清爽多了:

    对下,它在用户类XXX-U Logical Link的基础上,抽象出和具体技术无关的数据传输通道(包括单播和广播两类),至此用户就不再需要关心繁杂的蓝牙技术细节。

    对上,它以L2CAP channel endpoints的概念(类似TCP/IP中的端口),为具体的应用程序(profile)提供独立的数据传输通道(当然,也是一个逻辑通道)。

    6、SMP(Secure manager protocol)

    SMP用来管理BLE连接的加密和安全的,如何保证连接的安全性,同时不影响用户的体验,这些都是SMP要考虑的工作。该层定义了配对和密钥分配方式。

    7、ATT(Attribute protocol)属性协议层

    简单来说,ATT层用来定义用户命令及命令操作的数据,比如读取某个数据或者写某个数据。BLE协议栈中,开发者接触最多的就是ATT。BLE引入了attribute概念,用来描述一条一条的数据。Attribute除了定义数据,同时定义该数据可以使用的ATT命令,因此这一层被称为ATT层。

    允许设备向其它设备展示一块特定的数据,称之为“属性(attribute)”。在ATT环境中,展示“属性”的设备称之为服务器,与之配对的设备称之为客户端。链路层状态(主机和从机)与设备的ATT角色是相互独立的。例如,主机设备既可以是ATT服务器,也可以是ATT客户端。从机设备可以是ATT客户端,也可以是ATT服务端。
     

    8、GATT(Generic attribute profile )通用属性配置文件层

    GATT用来规范attribute中的数据内容,并运用group(分组)的概念对attribute进行分类管理。没有GATT,BLE协议栈也能跑,但互联互通就会出问题,也正是因为有了GATT和各种各样的应用profile,BLE摆脱了ZigBee等无线协议的兼容性困境,成了出货量最大的2.4G无线通信产品。

    二、BLE链路层的状态机

    standby(准备)、advertising(广播)、scanning(监听/扫描), initiating(发起连接)、connected(已连接) 。

     

    五种状态的切换描述为:

    advertising(广播)不需要连接就可以发送数据(告诉所有人,我来了);
    scanning(监听/扫描)来自广播的数据;

    initiator(发起人)将携带 connection request(连接请求)来响应广播者,如advertiser(广播者)同意该请求, 那么广播这和发起者都会进入已连接状态, 发起连接的设备变为 master(主机),接收连接请求的设备变为 slave(从机)。

    Master:从Initiating state进入Connection state

    Slave:从Advertising state进入Connection state

    1. 广播和扫描

    广播的目的:让别人能发现自己,对于一个不广播的设备,周围设备感觉不到其存在的,因此,要让别的设备能发现,则必须向外广播,在广播中可以带上丰富的数据,比如设备的能力,设备名字以及其他自定义的数据,这也就有了第二种可能:给不需要建立连接的应用发送数据。比如一个BLE温度计,其本身可以不接收任何连接,而可以选择通过广播将温度发送出去。检测者只要监听广播就能获取当前的温度。

    扫描者只有在收到广播数据后,才能去与广播者建立连接。广播是周期性的将广播数据广播通道上发送出去,这里有如下几个问题:

    •  广播通道:广播数据是在37/38/39通道上将广播出去,设备可以选择广播在其中的任何一个,两个或全部三个通道
    • 广播数据:即广播类型的PDU,广播所携带的信息。
    • 周期性:即广播间隔(advertising interval),为了改善设备的兼容性, 在两个广播时间间隔之间,还有加上一个随机的0-10ms的delay时间。
      Advertising event的周期= advertising interval +  delay

      advertising interval的范围:20ms – 10.24s,并且要求是0.625ms的整数倍。

    一个广播包在37,38,39分别广播出去为一个广播事件(Advertising event), 

     

    扫描是为了获取设备信息,发现周围设备,分两种情况:

    被动扫描(Passive scan):这种情况,扫描者不发送任何信息,只监听广播数据,扫描者能收到广播,广播者并不知道扫描设备的存在;

    主动扫描:扫描者在接到广播数据(ADV_IND)后,主动发起扫描请求(SCAN_REQ),广播者接到扫描请求回应扫描(SCAN_RSP),扫描回应(SCAN_RSP)也可以携带广播者数据。但需要注意的是,扫描者发送SCAN_REQ请求无法携带有效用户数据(参考扫描类型的PDU Payload),因此广播和扫描者之间是单向通信,扫描者能知道广播者信息,但广播者无法知道扫描者信息。

    广播者只是在广播通道发送广播数据,并不知道任何scanner的存在,advertiser和 scanner之间也不存在任何同步方式,只有广播和扫描所在的通道随机重合时,广播包才能被扫描设备收到,因此,和广播设备一样,扫描设备也有一些时间参数要求。

    扫描有两个重要的参数:scan interval 和scan window

    Scan interval:定义多久发送一次扫描请求,取值范围是:2.5ms-10.24s

    Scan window:定义扫描持续的时间是多长

     

    2. 初始化连接(Initiating)

    当接到广播数据后,scanner可以发起建立连接请求,建立连接请求的数据包(CONNECT_REQ)是在广播通道上发起的。如下所示:

    CONNECT_REQ请求中会带上重要的连接参数,包括连接时间间隔,supervision timeout,以及和跳频相关的参数,并且在建立连接后,切换到数据通道上交互数据。

    3. 连接

    建立连接后,两个设备会在相等的连接间隔(Connection interval)之间交换数据,每一次的数据交换称之为连接事件(connection event),数据的发送和接收都是通过连接事件完成的,在连接事件之外,BLE设备处于休眠状态,因此进一步降低了功耗。

     

    Connection  Interval:

    • Connection interval = sleep + connection event
    • master和slaver数据交换的间隔,当没有应用数据交互,两个设备链路层仍会交换数据(空PDU)来维持连接,当有应用数据时,数据通过连接间隔中的连接事件发送和接收.
    • 连接间隔是1.25ms的整数倍,范围是 6 - 3200,即7.5ms– 4s

    Slave  Latency:

    • master每个tx数据,slave接到后都要回复,否则连接可能会被认为断开,Slave  latency则定义了slave在没有数据要发的情况下,可以跳过一定数目的连接事件(Connection events), 在这些连接事件中不必回复Master(主设备)的包(空包),而不会被认为连接断开
    • 取值范围是 0 - ((connSupervisionTimeout /(connInterval*2)) - 1),并且要小于500;

    Connection supervision timeout:

    • 如果双方设备在超过timeout时间后,没有数据交互,则连接被认为已断开。
    • 常用于异常断开流程,由于链路异常,BLE设备之间没有了数据,则在timeout时间到后,连接被断开,而不会一直保持,
    • 10ms的整数倍,取值范围是 10 – 3200,即100ms – 32s,并且要大于(1+ connSlaveLatency) * connInterval * 2

    这几个参数是BLE连接中重要参数,直接决定了速率和异常情况的处理:

    ·       Connection interval决定了传输速率,越小,发送数据越快,但功耗也会越大

    ·       Slave Latency为0,数据发送速度回提高,增大,则会减小功耗

    ·       Timeout:异常情况时能否尽快断开。

    对与IOS设备的BLE相连接时,对这几个参数的设置有明确的要求:

    https://developer.apple.com/hardwaredrivers/BluetoothDesignGuidelines.pdf

     

    ref:

    蓝牙广播和扫描理解_老衲开心用飘柔的博客-CSDN博客_蓝牙广播

    深入浅出低功耗蓝牙(BLE)协议栈 - iini - 博客园

    蓝牙协议栈结构 - 简书

    蓝牙协议分析(2)_协议架构

    低功耗蓝牙BLE协议栈简介 - 简书

    BLE蓝牙协议简介_哔哩哔哩_bilibili

    核心规范 -Bluetooth® 科技网站

    蓝牙传输速率(BR/EDR, LE 1M, LE 2M, LE Coded) - 知乎

    BLE蓝牙学习笔记总结 - 小龙1356 - 博客园

    BLE入门 20 蓝牙5速率分析 - 简书

    BLE5.3 使用1M 2M 500K或者 125Kbps通讯 - debugdabiaoge - 博客园

    浅谈BLE吞吐量 | Jayden's Blog

    BLE低功耗蓝牙技术详解

    https://www.cnblogs.com/someone-device/p/12213452.html

  • 相关阅读:
    java基础讲义03
    PMP项目管理证书的含金量有多高?
    SPA项目之主页面--Mock.js以及组件通信(总线)的运用
    MongoDB相关基础操作(库、集合、文档)
    面试高频手撕算法 - 01背包系列
    redis setnx分布锁使用
    Hi3861 OpenHarmony嵌入式应用入门--点灯
    Java面试题03
    【复古数码】轻律U1头戴式耳机,让你感受音乐的魔力!
    关于B+树
  • 原文地址:https://blog.csdn.net/wwwlyj123321/article/details/128018827