1. 蓝牙基本概念

蓝牙(Bluetooth)是一种用于设备之间短距离通信的无线技术标准。它旨在取代连接外设的物理电缆,允许电子设备在10米(约30英尺)的距离内进行数据交换。蓝牙技术以其低功耗、低成本和易于集成的特点,在消费电子产品和物联网(IoT)设备中得到了广泛应用。工作频段为2.4GHz。协议IEEE802.11。

关键特性

  • 短距离通信:通常工作范围在10米以内,但在某些应用中可以扩展到100米。
  • 低功耗:特别是蓝牙低功耗(BLE)技术,专为需要长时间使用电池运行的设备设计。
  • 鲁棒性:采用跳频扩谱(FHSS)技术来减少来自其他2.4 GHz无线技术的干扰。
  • 网络拓扑
    • 微微网(Piconet):一个蓝牙网络,由一个主设备(Master)和最多七个从设备(Slave)组成。
    • 散射网(Scatternet):由多个相互连接的微微网组成,设备可以在不同的微微网中扮演主设备或从设备的角色。

常见用例

  • 音频流:无线耳机、扬声器和车载音响系统。
  • 数据传输:在手机、笔记本电脑和平板电脑之间传输文件。
  • 外围设备:无线键盘、鼠标、打印机和游戏手柄。
  • 物联网(IoT):智能家居设备、可穿戴健身追踪器、医疗传感器和工业自动化。
  • 定位服务:通过蓝牙信标(Beacons)实现室内导航和邻近感知营销。

2. 蓝牙发展历程

蓝牙技术自1994年由爱立信公司开创以来,经历了多次重大演进。每一次版本的更新都在速率、功耗、范围和功能上带来了显著的提升。蓝牙技术由蓝牙技术联盟(Bluetooth Special Interest Group, SIG)负责维护和推广。

版本 发布年份 关键特性与改进 技术背景与动机
蓝牙 1.0/1.2 1999/2003 基础版本:奠定了基本协议和架构。1.2版本引入了自适应跳频(AFH),提高了抗干扰能力。 消灭“线缆”,替代RS232等短距离有线连接
蓝牙 2.0 + EDR 2004 增强速率(EDR):改变基带层的调制方式,数据传输速率提升至3 Mbps,是之前的三倍,显著改善了音频流体验。 手机/耳机数据量上升
蓝牙 2.1 + EDR 2007 安全简易配对(SSP):大大简化了设备的配对过程,提高了安全性。 手机/耳机数据量上升
蓝牙 3.0 + HS 2009 高速(HS):引入了基于802.11 Wi-Fi的备用MAC/PHY层,理论速率可达24 Mbps,但功耗较高,未被广泛采用。让蓝牙管理连接,但把大数据传输交给 Wi-Fi 来做。 移动多媒体需求爆炸
蓝牙 4.0 (BLE) 2010 蓝牙低功耗(BLE):革命性版本,引入了全新的低功耗协议栈,专为物联网设备设计,开启了可穿戴设备时代。 物联网(IoT)崛起
蓝牙 4.1 2013 IoT优化:改进了与LTE的共存性,允许设备同时扮演中心设备和外围设备角色,为IoT应用提供更多灵活性。 物联网(IoT)崛起
蓝牙 4.2 2014 增强的IoT支持:引入了对IPv6的支持(IPSP),使蓝牙设备能够直接连接到互联网。增强了安全性和隐私保护。 物联网(IoT)崛起
蓝牙 5.0 2016 性能飞跃2倍速率(2 Mbps PHY),4倍范围8倍广播能力。引入了蓝牙Mesh网络,支持大规模设备网络。 IoT成熟 + 室内定位 & 智能家居普及
蓝牙 5.1 2019 测向功能(Direction Finding):通过到达角(AoA)和出发角(AoD)技术,实现了厘米级的精确定位。 IoT成熟 + 室内定位 & 智能家居普及
蓝牙 5.2 2020 下一代音频(LE Audio):引入了LC3编解码器,提供更高质量、更低功耗的音频。支持Auracast™广播音频。 IoT成熟 + 室内定位 & 智能家居普及
蓝牙 5.3/5.4 2021/2023 效率与可靠性:进一步优化了连接、安全性和功耗效率,如连接子事件、加密密钥大小控制等。 IoT成熟 + 室内定位 & 智能家居普及

3. 常见蓝牙架构

蓝牙设备的核心架构通常分为两大部分:控制器(Controller)主机(Host)。这两部分通过一个标准化的接口——主机控制器接口(HCI) 进行通信。

蓝牙架构图
(这是一个占位符,我稍后会寻找或创建一个合适的图片)

蓝牙经典(BR/EDR) vs. 蓝牙低功耗(LE)

蓝牙4.0引入了两种截然不同的物理层和协议栈,以适应不同的应用场景。

  • 蓝牙经典(Classic Bluetooth, BR/EDR)
    • 目标:为需要持续、高带宽连接的应用设计。
    • 特点:面向连接,适用于音频流和文件传输。
    • 功耗:相对较高。
    • 拓扑:基于微微网和散射网。
  • 蓝牙低功耗(Bluetooth Low Energy, BLE)
    • 目标:为需要长时间使用电池供电的短时、低数据量通信而设计。
    • 特点:快速连接,适用于传感器和信标等“发送后即忘”的应用。
    • 功耗:极低,纽扣电池可工作数月甚至数年。
    • 拓扑:基于广播和连接模型。
特性 经典蓝牙 (BR/EDR) 低功耗蓝牙 (BLE)
信道数量与带宽 79个信道,1MHz带宽 40个信道,2MHz带宽 3个广播信道,37个数据信道
跳频速度 固定的1600次/秒 随连接间隔变化,远低于经典蓝牙
跳频算法 基于主设备时钟和地址的伪随机序列 信道选择算法(CSA#1 和 CSA#2)
自适应跳频(AFH) 通过信道评估(如RSSI, PER)动态更新信道图 主设备创建信道图,从设备可反馈信道质量
应用场景 持续数据传输(如音频流、文件传输) 间歇性、低功耗数据传输(如传感器、可穿戴设备)

常见方案

  • SOC蓝牙单芯片方案: esp32等可以作为主控使用.
  • 外置蓝牙方案: 如HC-05/06等, 需要外接蓝牙模块.通过command来通信.主要是串口
  • 蓝牙host + controller方案: 如手机, 笔记本电脑等,然后通过蓝牙协议栈进行通信. 蓝牙芯片作为controller, 手机作为host.

设备类型

根据支持的协议栈,蓝牙设备可以分为三类:

  1. 单模LE设备:仅支持蓝牙低功耗,例如健身手环、心率监测器。
  2. 单模经典设备:仅支持蓝牙经典,例如蓝牙耳机。
  3. 双模设备:同时支持蓝牙经典和低功耗,例如智能手机、笔记本电脑。它们可以通过一套共享的天线和射频前端与两种类型的设备通信。

主机与控制器架构

  • 控制器(Controller)
    • 负责处理与无线电相关的底层任务。
    • 包括物理层(PHY)、链路层(LL)等。
    • 通常实现为一个独立的芯片(SoC),包含CPU、内存和射频前端。
  • 主机(Host)
    • 负责处理高层协议和应用逻辑。
    • 包括L2CAP、ATT、GATT、GAP以及用户应用程序。
    • 通常在设备的主处理器上运行,例如手机的操作系统或微控制器的应用程序。
  • 主机控制器接口(HCI)
    • 定义了主机和控制器之间通信的命令、事件和数据包格式。
    • 这种标准化的分离使得主机和控制器可以由不同的制造商提供,增加了设计的灵活性。例如,一个笔记本电脑可以使用内置的操作系统蓝牙协议栈(主机),并搭配一个来自不同厂商的USB蓝牙适配器(控制器)。

4. 蓝牙协议栈

蓝牙协议栈是一套分层的协议,共同实现了蓝牙通信。理解协议栈是理解蓝牙工作原理的关键。蓝牙协议栈分为两大部分:控制器协议栈主机协议栈,它们通过HCI接口进行交互。

以下是蓝牙低功耗(BLE)的核心协议栈示意图:

┌───────────────────────────┐
│        应用程序 (Application)        │
├───────────────────────────┤
│    通用访问规范 (GAP)     │  通用属性规范 (GATT)  │
├───────────────────────────┤◄───────────────┐
│        属性协议 (ATT)        │               │ 主
├───────────────────────────┤               │ 机
│    安全管理器协议 (SMP)    │               │
├───────────────────────────┤               │
│ 逻辑链路控制与适配协议 (L2CAP) │               │
└────────────┬────────────┘               │
             │ HCI (主机控制器接口)         │
┌────────────┴────────────┐◄───────────────┘
│       链路层 (LL)        │               │ 控
├───────────────────────────┤               │ 制
│       物理层 (PHY)       │               │ 器
└───────────────────────────┘

主机协议栈 (Host Stack)

  • L2CAP (Logical Link Control and Adaptation Protocol):逻辑链路控制与适配协议。它从链路层接收数据,并将其路由到上层协议。主要功能包括协议多路复用、分段和重组。
  • SMP (Security Manager Protocol):安全管理器协议。负责处理配对、加密和密钥分发,确保通信的安全性。
  • ATT (Attribute Protocol):属性协议。它定义了一种客户端/服务器架构,用于在设备之间发现、读取和写入被称为“属性”的数据。这是GATT的基础。
  • GATT (Generic Attribute Profile):通用属性规范。它定义了使用ATT的数据的结构和操作方式。GATT将数据组织成服务(Services)特征(Characteristics),为应用层提供了一种标准化的数据交互方式。
  • GAP (Generic Access Profile):通用访问规范。它定义了设备如何发现彼此、建立连接以及管理连接。GAP规定了设备的角色,如中心设备(Central)外围设备(Peripheral)

控制器协议栈 (Controller Stack)

  • LL (Link Layer):链路层。这是协议栈的核心,负责广播、扫描、建立和维护连接。它定义了设备的状态(如待机、广播、连接等)和角色(主设备/从设备)。
  • PHY (Physical Layer):物理层。负责在2.4 GHz频段上进行无线电信号的发送和接收,处理调制和解调。

5. 物理层 (PHY)

物理层(PHY)是蓝牙协议栈的最底层,直接与无线电硬件交互。它负责将数字数据转换为可以通过无线电波传输的模拟信号。

关键特性与信道设计

蓝牙的物理层定义了通信的基础,包括所用频段、信道划分及其原因。这里对经典蓝牙(BR/EDR)和低功耗蓝牙(Bluetooth Low Energy, BLE)做简要对比,并解读BLE信道设置的设计考量。

  • 工作频段:经典蓝牙和BLE都工作在2.4 GHz工、科、医(ISM)免许可频段,具体范围是2.402 GHz至2.480 GHz。选择这个频段的主要原因是全球通用、无需授权,并且兼容多种无线设备。

  • 信道划分
    • 经典蓝牙(BR/EDR):将整个频段划分为79个信道,每个信道宽度为1 MHz。这种细分可以支持较高的数据吞吐率,并通过跳频技术有效分散干扰。
    • 低功耗蓝牙(BLE):将带宽划分为40个信道,每个信道宽2 MHz。宽信道设计是为了简化射频电路、降低功耗以及减少射频切换损耗,更适合小型、低功耗设备的需求。
      • 其中 3个信道(信道37、38、39,对应中心频率分别为2.402 GHz、2.426 GHz、2.480 GHz)是广播信道,专用于设备发现和连接建立。
      • 其余 37个信道 作为数据信道,用于设备间正式通信。
  • 为何要这样划分广播与数据信道?
    • BLE选择3个相隔较远的广播信道,主要目的是降低与Wi-Fi等2.4 GHz设备的干扰(Wi-Fi常用信道与BLE广播信道几乎没有重叠),提高设备发现的可靠性。
    • 数据信道更多且均匀覆盖,便于跳频分散干扰,实现稳定的点对点传输。
  • 调制方式:主要采用高斯频移键控(GFSK)调制。GFSK调制电路实现简单,有助于降低芯片功耗和实现成本,同时抑制旁带,提高抗干扰能力。

  • 跳频(Frequency Hopping)
    • 经典蓝牙:采用自适应跳频(AFH)技术,在79个信道之间以非常快(1600次/秒)的速度切换,有效规避干扰,提升抗干扰和保密能力。
    • BLE:在连接状态下,在37个数据信道间跳频,仍能获得一定的抗干扰效果,同时简化了跳频序列生成和同步过程,适合低功耗场景。
  • 跳频序列生成
    • 经典蓝牙:跳频序列由主设备时钟和地址生成,具有随机性。
    • BLE:跳频序列由主设备分配,基于一个起始信道和每次事件按步进值循环递增计算下一个信道。
      • 如遇到主机屏蔽了部分信道(bad channel map),则自动跳过不可用的信道。
      • 跳频序列表示意:

        NextChannel = (CurrentChannel + HopIncrement) mod 37
        
      • 假如Hop Increment为7,数据通道总数为37,跳频如下:

        0 -> 7 -> 14 -> 21 -> 28 -> 35 -> 5 (回环) -> 12 -> ...(每次+7,超出37则mod 37循环)
        

BLE中的多种PHY

蓝牙5.0引入了多种物理层选项,允许开发者在速率、范围和功耗之间进行权衡:

  • LE 1M PHY:这是BLE最初的PHY,也是所有BLE设备必须支持的标准PHY。提供1 Mbps的速率,在速率和范围之间取得了很好的平衡。
  • LE 2M PHY:提供2 Mbps的速率,是1M PHY的两倍。这允许在更短的时间内传输相同数量的数据,从而降低了总功耗,但传输范围略有缩减。
  • LE Coded PHY:该PHY通过增加数据冗余(前向纠错编码)来显著增加传输范围(可达1M PHY的4倍),但代价是数据速率降低。它有两个编码方案:S=2(500 kbps)和S=8(125 kbps)。非常适合需要远距离通信的物联网应用。

6. 链路层 (LL)

链路层(Link Layer)是蓝牙控制器的核心,它使用物理层提供的服务来建立和管理设备之间的逻辑链路。

状态和角色

BLE链路层定义了设备可以处于的多种状态,以及在通信中扮演的角色。

五种基本状态

  1. 待机状态 (Standby):设备的初始状态,不发送也不接收任何数据包。
  2. 广播状态 (Advertising):设备周期性地在广播信道上发送广播数据包,以便被其他设备发现。扮演广播者(Broadcaster)角色。
  3. 扫描状态 (Scanning):设备在广播信道上监听来自广播者的广播数据包。扮演观察者(Observer)角色。
  4. 发起连接状态 (Initiating):设备在监听到特定的广播者后,发送连接请求以建立连接。
  5. 连接状态 (Connection):两个设备成功建立连接后进入此状态,可以在数据信道上进行双向通信。

连接中的角色

在连接状态下,设备会扮演以下两种角色之一:

  • 主设备 (Master):发起连接的设备。主设备定义了连接的跳频序列和时序。一个主设备可以同时连接多个从设备。
  • 从设备 (Slave):接受连接请求的设备。从设备在每个连接事件(Connection Event)中与主设备同步。一个从设备在同一时间只能连接一个主设备。

注意:GAP层中的中心设备/外围设备角色与链路层的主设备/从设备角色是对应的。中心设备通常是主设备,外围设备通常是从设备。

空中接口数据包格式

所有BLE通信都通过数据包进行。链路层定义了数据包的基本格式。

┌──────────┬───────────────┬──────────────────┬────────┐
│  前导码  │   访问地址    │   协议数据单元 (PDU)   │  CRC   │
│ (1 Byte) │  (4 Bytes)    │    (2-257 Bytes)     │(3 Bytes)│
└──────────┴───────────────┴──────────────────┴────────┘
  • 前导码 (Preamble):用于接收机进行频率同步和定时。
  • 访问地址 (Access Address)
    • 在广播包中,这是一个固定的值(0x8E89BED6)。
    • 在数据包中,这是为每个连接随机生成的唯一标识符。
  • 协议数据单元 (PDU):这是数据包的有效载荷,其内容取决于数据包的类型(广播PDU或数据PDU)。它包含了链路层控制信息和上层(L2CAP)的数据。
  • 循环冗余校验 (CRC):用于检测数据在传输过程中是否出错。

7. 主机控制器接口 (HCI)

HCI 是主机和控制器之间的标准通信接口。它不是一个无线协议,而是一个逻辑和物理接口(如UART, USB, SDIO),用于在两个芯片或模块之间传递信息。

HCI 的作用

  • 标准化:允许不同厂商的主机和控制器产品互操作。
  • 抽象化:主机不需要了解无线电的具体工作细节,只需通过HCI发送高级命令即可。控制器也无需关心上层应用逻辑。

HCI 数据包格式

HCI通信通过三种主要类型的数据包进行:

  1. 命令包 (Command Packets)
    • 方向:主机 → 控制器
    • 作用:主机使用命令包来控制和查询控制器的行为,例如:启动扫描、建立连接、读取设备地址等。
  2. 事件包 (Event Packets)
    • 方向:控制器 → 主机
    • 作用:控制器使用事件包来通知主机已发生的事件,例如:命令执行完毕、接收到广播包、连接已建立、连接已断开等。
  3. 数据包 (Data Packets)
    • 方向:双向(主机 ↔ 控制器)
    • 作用:用于传输上层(L2CAP)的用户数据。
           主机 (Host)                控制器 (Controller)
                 │                         │
                 ├─────── Command ────────>│ (e.g., Start Scan)
                 │                         │
                 │<───────── Event ─────────┤ (e.g., Command Complete)
                 │                         │
                 │<───────── Event ─────────┤ (e.g., Advertising Report)
                 │                         │
                 ├─────── Data (ACL) ──────>│ (Application Data)
                 │                         │
                 │<──────── Data (ACL) ──────┤ (Application Data)
                 │                         │

8. L2CAP (逻辑链路控制与适配协议)

L2CAP (Logical Link Control and Adaptation Protocol) 是主机协议栈中的一个重要层次,直接位于HCI之上。它为上层协议提供了一种标准的方式来发送和接收数据。

L2CAP 的作用

  • 协议多路复用 (Protocol Multiplexing):L2CAP 允许多个上层协议(如ATT, SMP)共享同一个链路层连接。它通过信道标识符 (CID) 来区分不同的协议数据流。
  • 分段与重组 (Segmentation and Reassembly):上层协议通常希望发送比链路层数据包(PDU)更大的数据块。L2CAP负责将这些大数据块分割成适合链路层传输的小片段(分段),并在接收端将它们重新组合成完整的数据块(重组)。
  • 流量控制 (Flow Control):L2CAP 提供了一种基于信用的流量控制机制,确保接收方有足够的缓冲区来处理传入的数据,防止数据丢失。

L2CAP 数据包格式

┌──────────┬───────────┬──────────────────┐
│  长度    │  信道 ID  │      有效载荷      │
│ (2 Bytes)│ (2 Bytes) │  (Length Bytes)  │
└──────────┴───────────┴──────────────────┘
  • 长度:有效载荷的字节数。
  • 信道 ID (CID):指定数据包应路由到哪个上层协议或逻辑信道。例如:
    • 0x0004:ATT 协议
    • 0x0006:SMP 协议

9. ATT (属性协议)

属性协议(Attribute Protocol, ATT)是专门为BLE设计的轻量级客户端-服务器协议。它是构建所有BLE数据交换的基础。

ATT 的作用和设计

  • 数据模型:ATT 将通信一方(服务器)的数据组织成一个简单的表格,称为属性表。每个属性都有:
    • 句柄 (Handle):一个16位的唯一标识符,用于在属性表中快速定位属性。
    • 类型 (Type):一个UUID(通用唯一标识符),描述了该属性代表什么样的数据(例如,“心率测量值”)。
    • 值 (Value):属性的实际数据。
    • 权限 (Permissions):定义了客户端可以对该属性执行的操作(如读、写、通知)。
  • 客户端-服务器架构
    • 服务器 (Server):持有属性表并提供数据的设备(例如,心率传感器)。
    • 客户端 (Client):访问服务器数据并发起请求的设备(例如,手机App)。
  • 协议操作:ATT 定义了一套简单的原子操作来与服务器上的属性进行交互,例如:
    • 读操作:读取一个或多个属性的值。
    • 写操作:写入一个属性的值。
    • 通知 (Notification):服务器主动向客户端发送属性值,无需客户端请求(无确认)。
    • 指示 (Indication):与通知类似,但需要客户端发送确认。

10. GATT (通用属性规范)

GATT (Generic Attribute Profile) 位于ATT之上,它为数据交换提供了结构化的框架。GATT 并没有定义新的协议操作,而是定义了如何使用ATT来组织和发现数据。可以说,ATT 是“如何”传输数据,而 GATT 是“什么”数据

GATT 协议框架

GATT 将数据组织成一个清晰的层次结构,这种结构被称为一个Profile

Profile
 └── Service 1
 │    ├── Characteristic 1
 │    │    ├── Value
 │    │    ├── Descriptor 1 (e.g., User Description)
 │    │    └── Descriptor 2 (e.g., Client Characteristic Configuration)
 │    └── Characteristic 2
 │         ├── Value
 │         └── Descriptor 3
 └── Service 2
      └── Characteristic 3
           └── Value
  • Profile (配置文件):一个Profile定义了一个特定应用场景所需的服务和特征的集合。例如,“心率Profile”规定了设备必须包含“心率服务”。
  • Service (服务):服务是特征 (Characteristic) 的集合,用于实现设备的一个特定功能。服务由一个UUID来唯一标识。例如,“心率服务”由UUID 0x180D 标识。
  • Characteristic (特征):特征是GATT中最基本的数据单元,它包含了一个值 (Value) 以及描述这个值的描述符 (Descriptors)。例如,“心率测量值”特征由UUID 0x2A37 标识。
  • Descriptor (描述符):描述符是特征的附加信息,例如特征的用户描述、或者用于启用通知的客户端特征配置描述符(CCCD)。

11. 蓝牙核心流程

本节将详细描述BLE中的一些关键通信流程,展示设备如何从初始状态一步步建立连接并交换数据。

蓝牙初始化流程

设备上电后,主机和控制器都需要进行初始化,为后续操作做准备。

   主机 (Host)                    控制器 (Controller)
       │                              │
       ├───── HCI Reset Command ─────>│
       │                              │
       │<──── Command Complete Event ──┤
       │                              │
       ├─ Set LE Event Mask Command ──>│ (启用需要的BLE事件)
       │                              │
       │<──── Command Complete Event ──┤
       │                              │
       ├─ Read BD_ADDR Command ──────>│ (读取蓝牙设备地址)
       │                              │
       │<──── Command Complete Event ──┤ (返回地址)
       │                              │
       └─ (更多配置命令...)

蓝牙广播流程 (Advertising)

设备(外围设备)通过广播来宣告自己的存在,以便被其他设备(中心设备)发现。

  1. 主机配置广播参数:主机通过HCI命令设置广播间隔、广播数据等。
  2. 控制器开始广播:控制器根据主机的配置,在三个广播信道上周期性地发送广播包(ADV_IND)。
   主机 (Host)                    控制器 (Controller)
       │                              │
       ├─ Set Adv Parameters Cmd ────>│ (设置广播间隔等)
       │<──── Command Complete Event ──┤
       │                              │
       ├─ Set Adv Data Cmd ──────────>│ (设置广播包内容)
       │<──── Command Complete Event ──┤
       │                              │
       ├─ LE Set Adv Enable Cmd (On)──>│ (启动广播)
       │<──── Command Complete Event ──┤
       │                              │
       │                      ┌───────┴────────┐
       │                      │ 在广播信道上 │
       │                      │ 发送 ADV_IND 包 │
       │                      └────────┬───────┘
       │                               │

蓝牙扫描流程 (Scanning)

中心设备通过扫描来发现正在广播的设备。

  1. 主机配置扫描参数:主机设置扫描窗口和扫描间隔。
  2. 控制器开始扫描:控制器在广播信道上监听广播包。
  3. 上报扫描结果:每当控制器收到一个广播包,它会通过LE Advertising Report Event事件将信息(如设备地址、RSSI、广播数据)上报给主机。
   主机 (Host)                    控制器 (Controller)
       │                              │
       ├─ Set Scan Parameters Cmd ───>│ (设置扫描窗口/间隔)
       │<──── Command Complete Event ──┤
       │                              │
       ├─ LE Set Scan Enable Cmd (On)─>│ (启动扫描)
       │<──── Command Complete Event ──┤
       │                              │
       │                      ┌───────┴────────┐
       │                      │  在广播信道上  │
       │                      │  监听 ADV_IND  │
       │                      └────────┬───────┘
       │                               │
       │<─ LE Adv Report Event ───────┤ (发现设备)
       │                               │
       │<─ LE Adv Report Event ───────┤ (发现另一个设备)
       │                               │

蓝牙建立连接流程

当一个扫描设备(发起者)决定连接一个广播设备时,它会发送一个连接请求。

   发起者 (Initiator/Central)         广播者 (Advertiser/Peripheral)
           主机 (Host)                      主机 (Host)
               │                              │
(扫描并发现设备) │                              │ (正在广播)
               │                              │
┌──────────────┴──────────────┐   ┌───────────┴─────────────┐
│      控制器 (Controller)      │   │     控制器 (Controller)     │
└──────────────┬──────────────┘   └───────────┬─────────────┘
               │                              │
               │<────── ADV_IND PDU ──────────┤
               │                              │
               ├────── CONNEC_IND PDU ────────>│ (发送连接请求)
               │                              │
(连接建立,切换到数据信道并开始跳频) │                              │ (停止广播, 切换到数据信道)
               │                              │
<─ LE Connection Complete Event ─┤   │<── LE Connection Complete Event ─
               │                              │
  1. 发起者发送连接请求:发起者(扫描方)的控制器在收到广播包后,立即发送一个CONNECT_IND数据包给广播者。
  2. 连接建立:广播者收到CONNECT_IND后,停止广播。双方都切换到数据信道,并根据CONNECT_IND中定义的参数(如连接间隔、跳频算法等)开始同步通信。
  3. 通知主机:双方的控制器都向各自的主机发送LE Connection Complete事件,通知连接已成功建立。

蓝牙数据交互流程 (GATT)

连接建立后,客户端可以通过GATT来读写服务器上的数据。

读取特征值为例:

      客户端 (Client)                   服务器 (Server)
           │                              │
           ├───── ATT Read Request ───────>│ (请求读取句柄 0x0010 的值)
           │                              │
           │<──── ATT Read Response ───────┤ (返回句柄 0x0010 的值)
           │                              │

蓝牙断开流程

连接可以由任何一方(主设备或从设备)发起断开。

     发起方 (Master or Slave)             对方 (Peer Device)
             主机                           主机
              │                              │
              ├─ HCI Disconnect Cmd ────────>│
┌─────────────┴─────────────┐   ┌───────────┴─────────────┐
│         控制器              │   │          控制器           │
└─────────────┬─────────────┘   └───────────┬─────────────┘
              │                              │
              ├──── LL_TERMINATE_IND PDU────>│ (在下一个连接事件中发送)
              │                              │
<─ Disconnection Complete Event ─┤   │<─ Disconnection Complete Event ─
              │                              │
  1. 主机发起断开:一方的主机决定断开连接,并向其控制器发送HCI Disconnect命令。
  2. 控制器发送终止包:控制器在下一个连接事件中,向对方设备发送一个LL_TERMINATE_IND数据包。
  3. 连接终止:双方收到或发送该数据包后,连接立即终止。
  4. 通知主机:双方的控制器都向各自的主机发送Disconnection Complete事件。

链接: 蓝牙开发入门

蓝牙专栏 1 2 3 4 5 6 7 8 9 10 11 12

Bluetooth Low Energy Fundamentals

Linux bluez蓝牙开发的准备工作