Advertisement

蓝牙BLE协议讲解

阅读量:

目录

  • 一、概述

    • 1、发展历史
    • 2、BLE
    • 3、蓝牙简介
    • 4、蓝牙技术分类
  • 第二部分 介绍BLE的特点

  • 第三部分 详细说明BLE的工作流程

    • 1. 角色
    • 2. 广播
    • 3. 扫描
    • 4. 连接
      • 4.1 连接参数
      • 4.2 连接参数更新请求
      • 4.3 有效连接间隔
      • 4.4 连接参数的优化考量

      • 5、通信

      • 6、断开

  • 四、BLE 协议栈

    • 其功能框图
      • 其协议栈层次
        • 其中控制层为Controller
          • 主机为Host
          • 应用层为Application
  • 第五章 GAP与 GATT

    • 第一节 GAP与 GATT之区别

      • 第二节 通用访问配置文件(GAP)
        • 第二 subsection 建立联系(Connecting)
          • 第二 subsection 1 连接后(Connected)
    • 3、通用属性配置文件(GATT)

      • 3.1 模型角色
      • 3.2 客户端与服务端的关系
    • 六、协议栈分层协作

      • 1、发送数据包
      • 2、广播方式
      • 3、连接方式

一、概述

从爱立信于1994年提出的方案开始发展

1、发展历史

  • 第一代蓝牙技术主要涵盖的是上世纪90年代V1.0至V1.2版本。
  • 第二代蓝牙技术则是在20世纪9十年代中期推出的V2.0至V2.1版本。
  • 第三代蓝牙技术于二十世纪末期发布V3.0版本。
  • 第四代蓝牙技术起源于二十一世纪初的某段时间,并采用了一系列新的规范。
  • 第五代蓝牙技术则是在二千零一十六年之后被提出并采用新的传输标准。

后续的分析都建立在 V4.1 版本的基础上,并且便于新手快速上手掌握许多核心协议的基本设计思路

2、BLE

通过第一小节的内容介绍就可以知道 BLE 是低功耗蓝牙技术中的英文缩写( Bluetooth Low Energy ),即从蓝牙4.0版本开始逐渐支持这一新的、低功耗版的技术规范。

Bluetooth技术联盟(Bluetooth SIG)于2010年推出了革命性的跨时代蓝牙4.0标准,这一标准并非仅仅是基于蓝牙3.0的简单升级,而是采用了全新的技术架构,其中的主要创新在于其支持的不同设备连接能力。

主流的 Bluetooth 扬声器采用双模式技术,并且通常会接收并处理大量音频信息。而像这样的设备通常采用的是低功耗技术。在行业内很少提及这类技术,并统一称为低功耗 Bluetooth。

如今蓝牙5.0已全面推出并得到广泛应用,并在物联网领域展现出显著的技术优势。其中通信速度提升了约400%、距离提升了约200%且支持Mesh组网特性这些显著的技术优势将进一步巩固蓝牙技术在物联网领域的领先地位

3、蓝牙简介

蓝牙是一种近距离无线通信技术,在2.4 GHz免费频段已经广泛应用于移动终端、物联网、健康医疗以及智能家居等多个行业领域。在上一小节中提到,在后来版本中蓝牙分为单模与双模两种模式

  • 单模蓝牙主要采用低功耗蓝牙模式
    • 这一技术属于 Bluetooth 4.0 的核心技术之一
    • 其特点包括短距离通信和大范围通信
    • 双模式蓝牙技术支持同时实现低功耗蓝牙连接以及与经典 Bluetooth 协作
    • 经典 Bluetooth 在传输速度和数据量方面具有显著优势
    • 主要用于音频文件和视频流的高效传输

在音箱、耳机、汽车电子及传统数传行业领域中,默认情况下受限于苹果对经典蓝牙数据传输接口的认证要求(MFI认证),加之其能源消耗较大,在目前移动互联应用中逐渐被边缘化。

随后低功耗蓝牙应运而生,在能够兼容苹果4S及以上版本及安卓4.3及以上版本的设备上实现使用的同时具备极低能耗特点。

蓝牙双模则综合了两者的优点与不足,在满足功耗要求不高的前提下成为更为理想的解决方案。

但需要注意的是:该技术仅能支持数据传输功能,并不具备音频传输能力。

4、蓝牙技术分类

Basic Rate/AMP:最初的蓝牙技术最初包含可选性地支持增强数据率的技术,并通过交替使用的MAC层和PHY层扩展来实现AMP功能。

蓝牙技术最初采用的是 BR 技术,在这一阶段其传输速率较低且逐渐失去了支持能力。随后的技术发展却落后于时代要求,在这一阶段还未对软硬件架构进行过调整。但随后的技术发展却落后于时代要求,在此阶段还未对软硬件架构进行过调整。尽管如此,在此之后 BR/EDR 技术只能与 AMP 协议进行兼容使用。

  1. Low Energy(LE):蓝牙低功耗则主要关注于以降低能源损耗为目标的技术方案,在这种模式下我们不再聚焦于具体的通信速度而是通过优化电路设计等手段来实现整体系统的能耗节省

二、BLE 特点

低功耗蓝牙技术被广泛应用于多个领域,并特别关注移动智能终端、智能家居以及互联设备等;其主要特点包括:

  • 耗电少 ,一个小电池即可使用几个月至几年。
  • 高速连接 ,以毫秒为单位的速度进行通信;相比之下,传统蓝牙最多只能保持几分钟的连接。
  • 长距离通信 可实现数百米的距离;相比之下,在10米左右的距离范围内,在相同条件下表现最佳。

Bluetooth联盟遵循经典蓝牙的技术规范,并为低功耗蓝牙制定了若干标准Profile。只要遵循该规范协议,则任何品牌生产的蓝牙设备均可相互连接与数据传输。例如无线蓝牙键盘鼠标、无线蓝牙鼠标以及无线智能手表等设备均支持即插即用功能。以下是一些常见的标准Profile:

  1. 智能设备互操作性配置文件(CSIC)
  2. 短距离配置文件(S short-range)
  3. 高能效配置文件(E-CEP)

该设备采用Human Interface Device (HID) 技术,在此基础之上实现了对无线鼠标、键盘和其他遥控设备的支持。
该系统包含一个专门的 BatteryServices 模块(也称为电池管理模块),其主要职责是提供关于电池电量状态的信息。
此外,在健康监测功能中还引入了一个 Heart Rate Profile (HRP) 模块(也称为心率追踪模块),该模块负责记录并分析用户的瞬时心跳速率数据。

另外,在智能手机快速发展的背景下

  • 提供定制化配置选项,并支持传输多种数据格式(如二进制数据、文本信息等),其中具体示例包括标识符形式为 0100 的两种常见类型。
  • 该模块具备完整的硬件兼容性设计,并通过多端互联能力实现不同电子设备间的便捷通信(例如兼容主流智能家居设备如智能蓝牙插座)。

注意:低功耗蓝牙的各种配置均基于GATT规范之上,并遵循GATT下的HID通信(HID over GATT)。具体而言,在经典蓝牙和低功耗蓝牙中使用的HID规范是不同的通信通道。

三、BLE 工作流程

1、角色

BLE设备角色主要分为两类:主设备(采用MasterCentral模式)与副设备(采用Peripheral模式)。唯有主设备与副设备建立连接后才能实现数据传输

  • 主设备 ,主设备能够主动向从设备发出扫描请求以建立通信链接。例如手机,则是蓝牙(BLE)通信中常用的主端装置。
    • 从端装置 ,该类装置仅能发送数据包并等待主端装置的响应信号。例如智能手环,则是蓝牙(BLE)通信中常见的副端工具

除此之外 还有 ObserverBroadcaster 这两种角色较少应用 但非常有帮助 比如 iBeacon 就能使用广播者角色来做 只需广播特定内容即可

  • 观察方(接收方)负责接收上层网络的广播信息,并与主机保持唯一区别在于无法主动发起连接关系。
    • 发送方能够持续发送数据流,并与下层设备存在显著差异在于无法被主机直接连接

蓝牙协议栈并未对设备的角色范围设定限制,在同一个 BLE 设备中既可充当主设备也可充当从设备。为此我们将其称为 主从一体。其优点在于每个 BLE 设备都是平等的无论能否发起连接亦或是接受连接请求都能实现相互通讯更具实用性。

2、广播

该系统采用了一种定时发送数据包的方式实现广域网中的信息传播功能。其中定义为:每当路由器(Broadcaster)每隔指定的时间周期发送一次广播数据包的那个固定时间间隔即被称为broadcast interval;而完成这一过程的具体操作则被定义为:完成一次广播数据包传输的行为则被称为broadcast event;只有当路由器(Broadcaster)持续保持在正常运行状态下的时候相关接收端设备(如主机)才有可能接收到来自其他节点的广播信息流

在每个广播事件中,广播包会分别在 37、38 和 39 三个信道上依次广播,如下图所示。

广播时间间隔从20ms到10.24秒之间...对连接建立时间产生影响。当广播间隔更大时...持续时间被决定。

此外,在BLE链路层中,在两个广播事件之间会插入一个 0~10ms 的随机时延以确保多个设备同时广播时不会一直发生碰撞。具体而言,在配置100ms的广播间隔时两次广播事件的时间间隔可能会落在 100~110ms 这个区间内。

在这里插入图片描述

广播数据包通常会包含31个字节的数据内容:这些数据通常包括设备标识码以及设备连接状态及相关参数。

当主机接收到来自从机的广播数据包时

该技术下最大承载容量为31个字节;相比之下,在蓝牙5.0标准中这一数值提升至255个字节

3. 扫描

该过程包括:设备接收来自从机的广播数据包,并发送相应的扫描请求;通过接收广播数据包和响应数据包来实现对目标设备的信息采集;根据检测结果,设备可主动发起连接请求;最终实现与目标设备的通信连接。

扫描动作涉及两个关键的时间参数:即扫描窗口和扫描间隔;当这两个参数相等时,则表示主机会始终保持在一直接收从机发送的广播包的状态中,并对该过程进行持续监控。

  • 被动式扫描 ,设备会对广播信道进行数据捕获和监控,在接收到广播数据包时触发相关处理流程。
    • 主动式扫描不仅完成与被动式扫描类似的功能外还能够向目标节点发送scan request以实现互相确认。
      收到scan request后目标节点会回复一个scan response broadcast packet以完成通信初始化。

4. 连接

在BLE连接中采用跳频技术,在指定时间段与信道内互相发送与接收数据;这些设备随后会在协议栈链路层处理通道切换后的新通道上,在预定的时间内会合;此次的数据传输交接行为被定义为连接事件;当没有需要的数据传输时,则通过交换链路层数据来维持连接状态;两个连续会合之间的时间间隔则被称为连接时距,并按1.25毫秒划分单元范围从最低7.5毫秒到最长4秒钟。

跳频是一种无线通信技术,在传输数据的过程中,并非固定在一个特定的频率上而是频繁转换至其他频率。

在跳频通信中,发送端与接收端预先设定一组频率转换顺序,在发送数据时会按照这一组预设的转换顺序切换至不同的频率。

4.1 连接参数

其时间跨度被称为(Connection Interval)。该参数采用1.25 ms作为单位,并允许设置的范围是从最小值7.5 ms到最大值4.0秒。
当主站没有数据传输请求时,则可以跳过当前的建立会话操作而保持处于休眠状态以节省电量。
其时间跨度被称为(Supervision Time-out)。这一最长等待时间决定了设备在两次连续成功的建立会话之间所能容忍的最大停滞时间。如果设备在此段时间内未能成功建立新的会话,则将终止当前的建立会话并返回到休眠状态以避免出现空闲状态。
为了避免出现空闲状态,在设置参数时必须确保监控超时时间超过有效的时间跨度。

4.2 连接参数更新请求

当主机启动连接过程时,在此过程中传递给从机的连接参数;当从机对这些参数提出特殊需求时(例如希望实现较低功耗传输),可以通过从机端向主机发送相应的更新数据来完成这一过程。

从机可以在主数据源与客户端建立连接后的任何一个时间点发出连接参数更新请求。然而,在主从端端口建立连接之后立即发起这样的请求并不明智。建议等待约5秒后再发送相关命令以确保网络稳定性

4.3 有效连接间隔

The effective connection interval (ECI) is defined as the time span between two consecutive connection events, assuming that the micro-oscillator skips the maximum number of connection events and allows for micro-oscillator delay (if the micro-oscillator delay is set to 0, then the effective connection interval equals the actual connection interval).

从机延迟表示可省略的最大事件数量是一个区间(见下方公式),其取值范围是从最小值0(表示无法省略连接事件)至最大值499. 最大允许数值会限定有效连接间隔不超过16秒. 间隔的具体计算方法如下所列公式:

\text{Effective Duration of Connection equals (Connection Interval multiplied by (1 plus [Slave Latency]))}

例:

现在有:Connection Interval: 80 (100 ms,单位为 1.25ms,故 80*1.25 = 100ms)、Slave Latency: 4

则:Effective Connection Interval: (100 ms) × (1 + 4) = 500 ms

当没有数据从从机发送到主机时,从机就每 500ms 一个连接事件交互一次。

4.4 连接参数的优化考量

在众多应用场景中, 忽略关键连接事件数量。正确选择连接参数组对低功耗蓝牙设备的功率优化起到了关键作用。该列表列举了不同设置间权衡关系的整体情况。

在众多应用场景中, 忽略关键连接事件数量。正确选择连接参数组对低功耗蓝牙设备的功率优化起到了关键作用。该列表列举了不同设置间权衡关系的整体情况。

  • 降低连接间的空闲时间如下:

  • 提升两台设备的能耗

  • 增加双向传输速率

  • 分别减少了单向发送数据所需的时间

  • 提升连接间距设置如下:

    • 减少两台设备的能耗水平
    • 优化双向传输速率
    • 延长任一端发送数据所需时间长度
  • 降低从机延迟(或将其设置为零)如下:

  • 提升外围设备的功耗

  • 优化处理时间以减少外围设备接收数据的时间。

  • 为提升主机外设的响应效率,请详细说明以下措施:

  • 当主机外设处于空闲状态时(即周边没有任何数据传输的情况下),可将功耗控制在较低水平。

  • 延长主机外设接收数据的时间间隔。

5、通信

通俗的说,我们将从机具有的数据或者属性特征,称之为 Profile

在设备中对配置文件进行添加操作(包括定义Profile并进行存储),使其成为GATT协议的服务器端,并使主机成为GATT协议的客户端端

Profile由一个或多个Service组成,其中每个Service内部又包含一个或多个Characteristic.当主机运行时,它能够识别并获取客户端的Service以及Characteristic,进而与其建立通信连接.需要注意的是,Characteristic是主从通信的基本构成单位.

  • 主机能够主动将数据通过Write指令写入或通过Read指令读取到从机。
  • 当从机需向主机发送数据时可通过Notify指令实现这一功能。

注意,在此处引用了系统组件 Service 和 属性参数 Characteristic 的理论基础。每一个服务和特征值都均拥有自己的标识符 UUID ,遵循标准格式规定为128位编码;但在蓝牙协议栈中这一规范则简化为两个字节的形式表示(即总长度仅为16位)。

  • 服务(Service)是一种抽象概念,在其唯一标识符(UUID)下包含多个特征(Characteristics),并通过include机制连接至其他服务。
  • 特征(Characteristic)是一个设备通信的基本属性单位,在其唯一标识符下由Properties(值规范定义与访问规范)、Value(实际取值)以及Descriptor(相关描述信息)三部分构成。
  • 每个特征都具有独特的标识符:
    • 16位:经官方认证收费的标准 UUID 格式为Bluetooth_BASE_UUID00000000-0000-1000-8000-00805F9B34FB
    • 16位转为128位:格式为0000xxxx-xxxx-xxxx-xxxx-xxxxxx xxxx xxxB34FB
    • 32位转为128位:格式为xxxxxxxx-xxxx-xxxx-xxxx-xxxxxx xxxx xxxB34FB

一种从机设备由一个或多个服务构成;每个服务可能包含一条或多个特征值。每个特征值都具有特定的属性 {Property}。其属性取值包含可读 {Read}、可写 {Write} 和 通知 {Notify} 等几种类型。

  • 该特征量不仅具备读取能力且具有写入功能,
    • 而在主动发起方面,则通过发送通知数据与主机实现了交互。
    • 这就是主从机之间两种典型的通信手段。

此图表展示了此类设备的典型架构,在其核心组件中包含了以下关键要素:一个功能完善的Profile模块组成了系统的整体运行框架,并嵌入了两个服务模块与五个关键特性指标作为支撑层架构基础。在这一基础之上我们需要首先阐述这些特征值的功能定位与作用机制接着探讨实现特征间通信的方式方法

  1. 服务 0x180A

180A 是蓝牙协议里标准的服务 UUID,用来描述设备信息( Device Information ),可以通过该服务,来提供从机设备的相关说明,例如硬件版本,软件版本,序列号等信息。这样,主机就可以获取从机的设备信息。上图中我们添加了三个提供具体设备信息的特征值,他们分别是:

  • 特征值 0x2A24:该字段用于标识产品型号( Model Number String ),例如某智能锁的产品型号为:“DSL-C07”。
  • 特征值 0x2A25:该字段用于记录序列号信息( Serial Number String ),例如某智能锁的序列号为:“lkjl0016190502500269”。
  • 特征值 0x2A26:该字段用于表示固件版本信息( Firmaware Revision String ),例如某智能锁的固件版本号为:“2.7.2.0”。

上述特征值仅有 Read 属性,因此主机只能读,不能执行写操作。

  1. 服务 0xFFF0

FFF0 是我们自定义的服务 UUID,它包含两个特征值,用来发送和接收数据。

  • 特征值 0xFFF1 是一个定制的数据传输通道,在具备读写权限的情况下可由设备向客户端发送数据的具体设置。
  • 特征值 0xFFF2 具备通知属性,在具备接收功能的情况下可由客户端主动向设备发送数据。

用于编码特征值的协议栈函数名称为 int\ GATT\_WriteCharValue(uuid\_t\ UUID,\ uint8\ *\ pValue,\ uint8\ len)

在协议栈中进行设备间通知传输的功能实现体为 int GATT\_Notification(uuid\_t UUID, uint8 \*pValue, uint8 len)

为了使信息顺利传递至目标设备,可以通过协议栈调用相应的功能模块:GATT_WriteCharValue(0xFFF1,"Hello",5)

驱动侧设备将数据1234发送至主设备之前,请调用协议栈中的函数GATT_Notification(0xFFF2, "1234", 4)

6、断开

无论是作为主计算机还是从计算机,在发起断开连接请求时都会被发送出去;接收方接收到该请求后会失去当前的网络连接,并回复到连接断开前的状态。

四、BLE 协议栈

1、功能框图

BLE 协议栈主要由芯片厂家基于 Bluetooth SIG 发布的 Bluetooth Core Specification (核心规范)进行实现,并包含功能接口以便于芯片内部程序调用以支撑上一阶段的BLE工作流程等相关操作。

常见的协议栈有德州仪器 TI 的 ble-stack 和 Nordic 的 SoftDevice

下图是 TI 的 CC26 系列芯片协议栈结构图,

下图是 Nordic 的 nRF52 系列芯片的协议栈结构图。

2、协议栈结构

通过上一节展示的两张协议栈功能框图可以看出,在BLE协议栈方面无论哪一个芯片厂商实现的其结构都具有明显的相似性包括三个部分:

  • 底层:Controller
  • 中层:Host
  • 顶层:Application

然后每一层又分成若干个子模块。我们现在由下而上,逐层介绍。

我们归入了位于顶层的应用层 Application 到协议栈的描述中,并非应用层属于协议栈本身;相反地,在应用层中会利用协议栈提供的接口来实现蓝牙功能。

2.1 控制器 Controller

Physical LayerPHY物理层 )。该层用于确定BLE所使用的无线频段、调制解调方式及具体实现方法等技术参数。该层性能的优化直接关系到整个BLE芯片在功耗、灵敏度以及性能等方面的射频指标表现。

Link LayerLL ,链路层)。在BLE协议栈中占据核心地位的是LL层,在整个协议体系中既是关键又是难点的部分。Nordicblestack能够同时支持20个连接(link),这一成就归功于LL层的专业设计与优化工作。具体而言,在这个过程中需要完成多项重要任务:包括但不限于选择合适的射频通道用于通信、解析接收到的数据包、确定最佳发送时机、确保传输过程中的数据完整性、处理ACK信号以及采用怎样的重传策略等工作中都需要涉及到位的工作安排与执行管理。此外,在完成上述功能的同时 LL层还需要负责对链路进行管理与控制并将数据的解析工作分配给上一层协议即GAP或ATT层面

LL 中的信道设计:BLE 系统基于特定通信场景,在40个物理信道中选择3个作为广播专用通道来处理数据量较小且传输频率较低且时延不受限的场景;该系统所存在的问题是存在不可靠性问题以及效率低下和安全性不足的问题;而另一个通信场景则从剩余的37个信道中选择1个专用通道用于双方直接通信,并采用跳频技术以提高抗干扰能力

为此,LL 为通信双方实体定义了以下状态及切换条件:

  • 待机模式(Standby) :仅接收数据未发送或接收/发送任何信号响应上层命令以切换模式
    • 广告模式(Advertising) :向广播发送控制报文以建立连接可随后进入通信模式(Connection)
    • 扫描模式(Scanning) :等待广播扫描所有已知地址并响应相应回应报文的状态
    • 特殊接收模式(Initiating) :类似于 Advertiser 发出的扫描报告接收到后立即建立专用通信通道进入通信模式(Connection)
    • 通信模式(Connection) :已经建立了专用通信通道具备独立的数据传输能力

在协议栈开发过程中,HCI常作为关键组件出现。它为上层主机提供控制功能接口,并将Layer级功能整合为一组命令/事件机制。因此被称为 Host Controller Interface

  • 这些 Command/Event 涵盖广播操作、扫描操作以及连接建立过程等。
  • Command 格式:
  • OCF( Opcode Command Field)标识特定的 HCI 指令
    • OGF(Group Code)标识该 HCI 指令所属的组别
    • 它们共同构成一个16位的操作码字段;Parameter Total Length 表示所有参数的总长度
      • 所有与BLE相关的HCI指令均具有OGF字段值为0x08

      • Event 格式:

2.2 主控 Host

  • Logical Link Control Adaptation ProtocolL2CAP逻辑链路控制和适配协议 )。L2CAP 对 LL 进行了一次简单封装,LL 只关心传输的数据本身,L2CAP 就要区分是加密通道还是普通通道,同时还要对连接间隔进行管理。它实现逻辑信道的多路复用( multiplexing ),对上层数据进行分割和重组,以及后续的流控、错误控制和重传等

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

    • 为每个 Attribute 定义了三个属性:
      • Type,即 Attribute 的类型,使用 UUID 区分
      • Handle,服务端用来唯一标识 Attribute 的 16-bit 数值
      • Value,Attribute 的值
  • 对于每个属性(Attribute),我们划分了一组权限设置(permission configurations),以便于服务端管理客户端的操作流程(operation flows),具体涉及访问控制(access control)、加密机制(encryption)、认证验证(authentication)以及权限授权(permission assignment)。

    • 在不同的属性下(Attribute),客户端对服务端的访问权限也有所不同(access permissions),具体包括数据查找(Find)、读取数据(Read)和写入数据(Write)三种基本操作。

    • 传输过程采用了L2CAP协议作为基础,并结合了多路通道复用技术(multi-path channel multiplexing),其信道识别码CID设置为0x0004。

    • Security ManagerSM安全管理协议 )。SMP 用来管理 BLE 连接的加密和安全的,如何保证连接的安全性,同时不影响用户的体验,这些都是 SMP 要考虑的工作。

    • Generic Access ProfileGAP通用访问配置文件 )。GAP 是对 LL 层 payload(有效数据包)如何进行解析的两种方式中的一种。GAP 简单的对 LL payload 进行一些规范和定义,因此 GAP 能实现的功能极其有限。GAP 目前主要用来进行广播,扫描和发起连接等。GAP 定义了蓝牙设备的通用的访问功能,与 GATT 的数据通信过程对应,处理无连接及连接建立过程的通信,也就是为广播、扫描、发起连接这些过程定义统一规范。

      • 定义了用户接口的基本参数,包括蓝牙地址、名称、pincode、class 等概念
      • 定义了设备的角色:
        • Broadcaster Role:正在发送 advertising events 的设备
        • Observer Role:正在接收 advertising events 的设备
        • Peripheral Role:接受 Link Layer 连接的设备(对应 Link Layer 的 slave 角色)
        • Central Role:发起 Link Layer 连接的设备(对应 Link Layer 的 master 角色)

阐述了通信过程及各操作模式;

  • Broadcast mode 和 observation procedure:阐述了单向且无连接的通信机制;
  • Discovery methods 和 operational steps:阐述了蓝牙设备发现操作的技术路径;
  • Connection protocols 和 operation sequences:阐述了蓝牙设备连接过程的具体步骤;
  • Bonding mechanisms 和 pairing steps:阐述了蓝牙配对过程的技术细节。
  • Generic Attribute Profile(即 GATT ,通用属性配置文件)。它通过定义属性数据内容并采用分组概念对属性进行分类管理。仅凭BLE协议栈运行是可行的,但缺乏互联互通时的问题解决方案正是由于有了GATT以及多种多样的应用profile的存在,BLE实现了对ZigBee等无线协议的突破性超越,成为目前出货量最大的2.4 GHz无线通信产品。
  • 虽然Attribute仅将信息进行抽象处理,但真正实现对抽象信息实施分类管理的是GATT。
  • GATT提供了一种通用的信息存储与共享框架,实现了双向通信。
  • 实际上,几乎所有基于BLE的应用都采用了GATT作为核心机制。

下图为 GATT 的层次结构:

2.3 应用Application

应用层是用户实现实际蓝牙应用开发场所, 包括必要的协议栈参数配置, 同时也涉及各种功能函数的调用. 我们主要从蓝牙从机与蓝牙主机两种设备类型出发进行详细分析.

  • 蓝牙从机
  1. 初始化相关硬件并配置基础服务
  2. 配置广播参数(包括广播数据、广播间隔以及扫描响应等参数或数据)
  3. 配置Profile:添加从机服务并指定特征(如绑定管理参数可选),并设置回调函数用于接收主机的数据
  4. 配置绑定管理参数(可选)
  5. 启动广播过程
  6. 等待并处理相关事件(包括接收到主机发送的数据以及被连接等操作)
  • 蓝莓莓设备
  1. 完成硬件配置与基础服务的初始化设置
  2. 配置扫描参数设置
  3. 设定连接参数配置
  4. 配置绑定管理参数(可选)
  5. 激活协议栈并开始执行其工作流程
  6. 等待相关事件及其处理流程完成并进行相应的操作

五、GAP和GATT

蓝牙协议系统主要包含两大功能模块:控制器模块(\textbf{Controller})负责协调设备间的通信流程;主机模块(\textbf{Host})则负责接收并处理来自其他设备的数据)。各类别内部又划分出多个细分类型;每个细分类型都有其独特的功能定位)。其中最为关注的是通用访问配置文件(\textbf{GAP})与通用属性配置文件(\textbf{GATT}),这两个核心组件构成了整个蓝牙数据链的基本框架)。

  • Gap:Gap 核心访问配置文件。
    • Gatt:Gatt 核心属性配置文件。

1、GAP和GATT区别

  • GAP 规定了 BLE 网络堆栈的基本架构。
  • GATT 在设备连接建立后具体规定了如何传输相关的数据信息。

GATT 尤其注重按照其描述的规则规范打包与发送数据的具体方式,在BLE网络层架构中, 属性协议(ATT)紧跟GATT布局,实际上,GATA借助 ATT 来阐述两个相连设备间的数据交换机制

2、通用访问配置文件(GAP)

BLE 设备能够通过广播或连接的方式与外界通信。这些机制遵循通用访问配置文件(GAP)所设定的规定。GAP决定了 how a device can become available and how two devices can directly communicate with each other.

2.1 建立联系(Connecting)

设备可以通过采用 GAP 中指定的以下角色来加入 BLE 网络:

A、广播Broadcasting ):这些角色不必显式地相互连接即可传输数据。

  • 广播器(\textbf{Broadcaster})能够发布并传输公共数据包
    • 观察器(\textbf{Observer})侦听并解析这些数据包的内容

B、连接Connecting):这些角色必须通过明确建立连接并进行握手操作来实现数据的传递。与广播角色相比,这类角色更为常见。

  • 从机设备(Peripheral devices):通过广播通知其他设备的存在信息,在此基础之上帮助主机完成连接操作。当两个端点建立通信后,在后续的数据传输过程中主端不再主动发送数据信息给其他主机端点,并维持与主端的持续通信联系。

  • 由于它们仅需定期发送信号就可完成基本功能,在设计时功耗消耗较低;同时由主端发起实现与从端点的数据交互。

  • A smartwatch is an example of a BLE accessory.

  • 主控端口(Central ):一种通过捕获广播信号来启动与从属端口进行通信的装置。主控端口能够同时连接至多个从属端口。

    • 当主控端口欲实现通信时,它会发出数据包至从属端口。若从属端口接收到自主控端口的数据包,则完成通信过程。
    • 当智能手机与智能腕带之间发生通信时,则属于BLE Central配置的一个典型实例。

2.2 连接后(Connected)

该类设备能够调整网络连接参数:一般在与自身之间的机制下执行常规设置操作。仅此类型可以通过特定的配置流程进行修改。然而,在这种情况下可以从机装置要求主机更改相关设置,并允许从机端发送更新请求以维持网络状态的一致性。

相关主机或主控型终端具备切断本地端口的能力:可能存在多种原因导致本地通信中断的情况发生;举例来说,在电池电量耗尽的情况下或者因网络干扰导致无法建立稳定的通信;此外,在必要时相关终端还可以主动与其他对等型终端断开通信。

3、通用属性配置文件(GATT)

3.1 模型角色

GATT 分为两种类型,注意与从机或主机无关。

  • 客户端(Client):客户端能够向GATT服务端提交请求。客户端能够读取/写入GATT服务端的属性,并通过这些属性实现数据通信。
  • 服务端(Server):用于存储GATT相关的属性信息。每当客户端向GATT发送请求时,服务器会相应处理这些请求。

3.2 客户端与服务端的关系

一个示例如下:手环采集了心跳数据,并期望计算机获取这些数据。手环作为服务端并提供数据给计算机处理。手机作为客户端接收并处理这些心率数据。

GAP 和 GATT 模型角色在很大程度上相互独立;客户端/服务器端设备既可以充当服务端设备也可以作为客户端设备,并根据数据流动的方式进行配置。

在主从机之间的常规通信场景中,在线程层面实现了一个机制使得宿主系统能够通过读取或设置从设备的信息来完成接收来自设备的信息以及传递相关数据给对方;而作为客户端的一方(即宿主设备),则通过主动向另一方(即服务端的一方)发布操作指令来完成通信;通常情况下,在GATT协议体系中,在这种交互模式下一般将设备角色分为两类:其中一类由服务端承担其功能而另一类则由相应的服务端角色则由宿主设备承担其功能

六、协议栈分层协作

为了阐述协议栈中各分层的作用和必要性,请问您是否了解?例如,在无线网络环境下如何发送一个数据包?实际上,在实现协议栈时需要考虑的因素更为复杂。

1、发送数据包

假设存在两台设备 A 和 B,在这种情况下,请问如何进行数据传输操作才能达到目标?具体来说,请问设备 A 应当将电量状态传输至设备 B,并确保数据格式正确。

作为一名开发者,在追求尽可能简单的解决方案方面他表现得非常出色。他的目标是通过一个简单的API来完成任务,并且这个API的设计非常直观——例如 send(0x53)就可以实现这一功能。实际上我们的 BLE 协议栈正是这样设计的——它允许开发者通过调用 send(0x53)来直接发送数据而不必担心其他细节问题。许多人会疑问:BLE协议栈是否直接在底层发送数据?如图所示:

这种方案乍一看似乎良好。然而因诸多细节未被纳入考量而显得不可行。它未能考虑到如何利用哪个射频信道来进行传输,在无需更改API的情况下只能对协议栈进行分层处理。为此我们不得不引入LL层来实现这一目标。开发人员仍需使用原有的接口 send(0x53) 来发起请求 该函数会进一步调用LL层的 send_LL(0x53,2402M) 来完成数据发送(注:2402M 为信道频率)。

此外还存在一个问题:设备 B 如何确定这个数据包是为自己发送还是由他人发送?为此BLE引入了access address的概念。其中特别的是0x8E89BED6这个access address具有特殊功能——它表示要发送给周边所有设备即广播型通信(而BLE协议将其称为广播连接)。如果需要一对一定期通信(即连接型通信),例如设备 A 的数据包只能被设备 B 收到反之亦然那么必须为两者分配独特的随机access address以实现这种特定的通信关系。

广播的协议层次如下:

  • GAP:遵循应用程序视角对功能进行封装设计,并遵循统一且通用的广播规范进行规范性描述。
  • HCI:作为LL提供的上层接口规范性地定义了Command/Events的形式。
  • LL:全面负责广播通信相关功能的定义与实现工作,并包含信道选择在内的多项具体功能项如链路状态定义、PDU 定义以及设备过滤机制等。

2、广播方式

让我们首先分析简单的广播场景。我们可以将设备A称为 advertiser (广播者),而设备B则被称为 scannerobserver ,分别扮演扫描者或观察者的角色。在广播状态下,则要求设备A的LL层API会转换为 send_LL(0x53, 2402M, 0x8E89BED6)

因为设备 B 能够接收大量广播数据,
所以为了确保数据包确实来自设备 A,
它必须包含该设备的 deviceId(...)
这要求 send_LL 参数被设置为 ...

LL层还需对数据进行完整性检查, 即确认数据在传输过程中是否发生篡改. 为此采用了CRC24算法对数据包进行检验(假设校验码值为0xB2C78E). 同时为了提高调制解调电路的工作效率, 每个数据包在前端添加1个字节作为前导帧(Preamble), 其中Preamble通常采用0x550xAA两种值. 这样这样一来整个空闲时间就会被划分为多个空闲区间用于同步编码等操作.

不过上面这个数据包还有如下问题:

未对数据包进行分类整理,则导致设备B难以获取所需数据0x53。为了解决这一问题,在访问地址后增加两个字段:LL前缀和长度字段。其中LL前缀用于标识数据包的类型信息而长度字段则用于指示payload的大小。

当设备 B 收收到数据编码为 0x53 后,请详细说明如何进行解码?该数据究竟代表什么含义?GAP 层正是负责此类解析工作的核心模块。
GAP 层采用了 LTVLength-Type-Value )结构来进行数据编码与解码操作。例如 020105:其中 02 表示长度、01 表示类型(强制字段)以及 05 表示具体值。
受限于广播包的最大容量限制(最多可携带 31 字节),GAP 层无法直接定义大量特定类型的数据。因此对于像电量这样的动态参数而言目前 GANP层也无法提供相应的支持。
此外由于广播包的最大容量限制导致 GANP层无法直接定义大量特定类型的数据进而使得对于像电量这样的动态参数目前 GANP层也无法提供相应的支持。
对于像电量这样的动态参数目前 GANP层无法直接定义相应的数据类型因此必须采用供应商自定义的特殊编码方式以实现对电量等参数的传输与接收

最终空中传输的数据包将变成:

\text{AA D6BE898E 60 0E 3B75AB2A02E1 02010504FF590053 8EC7B2}

  • AA – 前导帧(preamble)
  • D6BE898E – 访问地址(access address)
  • 60 – LL帧头字段(LL header)
  • 0E – 有效数据包长度(payload length)
  • 3B75AB2A02E1 – 广播者设备地址(advertiser address)
  • 02010504FF590053 – 广播数据
  • 8EC7B2 – CRC24值

具备PHY、LL以及GAP这三个参数后, 即可实现发送广播包的功能。然而, 广播包所包含的信息量相对较为有限。此外, 它们还受到以下几方面的严格限制:

  1. 无法实现一对一双向的数据传输。
  2. 因受组包与拆包功能限制而难以传输大体积数据。
  3. 不可靠性源于过多的广播信道可能导致扫描端效率降低。
    具体而言,在蓝牙LE协议中仅开放使用频率范围中的三个子频道(分别为37 MHz, 38 MHz, 和 39 MHz)来实现广播与扫描操作,
    因此不具备跳频能力,
    并且受限于单向的一对多通信模式,
    此外还缺乏ACK确认机制,
    这些因素共同导致了广播通信系统的不可靠性。
  4. 扫描端存在较高的功耗消耗问题:
    因为设备在不知何时启动广播,
    并且选择哪个频道未知,
    扫描端需延长扫描窗口时间并同时监测多个子频道,
    这种做法必然会导致较大的能量消耗。

而良好的连接则能够有效地解决上述问题,在此之后我们就可以很清楚地看到:通过怎样的机制与流程可以让编号为0x53的任务被成功发送出去?

3、连接方式

UART技术作为一种基础通信方式相对容易理解,在其基本实现中主要通过物理通道(如Rx和Tx)将两个设备进行连接即可完成通信过程;这种通信方式的关键在于为两个设备提供一个共同的媒介,并确保它们的运行时钟能够保持同步;而蓝牙连接本质上遵循的是同样的通信原理:即在双方建立一对一的同步关系时需要完成一系列的具体工作步骤:包括双方时钟的精确同步、数据传输协议的确立以及数据的安全加密传输;此外还需要对可能出现的通信异常进行有效的检测和处理机制以保证通信过程的稳定性和可靠性

设备A与设备B就即将使用的物理信道达成了共识。
双方将时间原点统一至同一个基准点。
通过时钟同步机制实现了双方对时间的一致认知。
连接成功后, 设备A与设备B之间的通信流程如下所述:

如上图所示,在设备 A 和 B 连网成功的情况下(在此情况下我们称 A为主从端或中心节点称 B 为主机或外围节点),主从端计算机每隔 CI 时间段发送一次数据块到主从节点而主从节点每隔 CI 时间段开启射频收机以便接收来自主从端的数据块

同时按照蓝牙 spec 要求:

  • 设备 B 接收到设备A的数据包150us后转为发送状态,并将数据输出给设备A。
    • 设备 A 转为接收状态以接收来自设备B的数据。

由此可见,在连接状态下,设备 A 和设备 B 的射频发送与接收窗口均按照周期性和预先设定的程序进行开闭操作,并且每次开启的时间极为短暂。这不仅能够有效降低系统的能耗水平,并且显著提升了整体运行效率。

在连接状态下, 我们可以观察到数据 0x53 的发送过程是怎样的?从中大家能够体会到蓝牙协议栈分层结构带来的便利

  • 对开发者来说,很简单,他只需要调用 send(0x53)
  • GATT 层定义数据的类型和分组,方便起见,我们用 0x0013 表示电量这种数据类型,这样 GATT 层把数据打包成 130053(小端模式)
  • ATT 层用来选择具体的通信命令,比如 read/write/notify/indicate 等,这里选择 notify 命令 0x1B,这样数据包变成了:1B130053
  • L2CAP 用来指定 connection interval(连接间隔),比如每 10ms 同步一次(CI 不体现在数据包中 ),同时指定逻辑通道编号 0004(表示 ATT 命令),最后把 ATT 数据长度 0x0004 加在包头,这样数据就变为:040004001B130053
  • LL 层要做的工作很多:
    1. 首先 LL 层需要指定用哪个物理信道进行传输(物理信道不体现在数据包中 ),
    2. 然后再给此连接分配一个 Access address(0x50655DAB)以标识此连接只为设备 A 和设备 B 直连服务,
    3. 然后加上 LL header 和 payload length 字段,LL header 标识此 packet 为数据 packet,而不是 control packet 等,payload length 为整个 L2CAP 字段的长度,
    4. 最后加上 CRC24 字段,以保证整个 packet 的数据完整性,所以数据包最后变成:
      • AA AB5D6550 1E 08 04000400 1B 1300 53 D550F6
    • AA – 前导帧(preamble)
    • 0x50655DAB – 访问地址(access address)
    • 1E – LL帧头字段(LL header)
    • 08 – 有效数据包长度(payload length)
    • 04000400 – ATT数据长度,以及L2CAP通道编号
    • 1B – notify command
    • 0x0013 – 电量数据handle
    • 0x53 – 真正要发送的电量数据
    • 0xF650D5 – CRC24值

全部评论 (0)

还没有任何评论哟~