Bluetooth
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.
设备类型
根据支持的协议栈,蓝牙设备可以分为三类:
- 单模LE设备:仅支持蓝牙低功耗,例如健身手环、心率监测器。
- 单模经典设备:仅支持蓝牙经典,例如蓝牙耳机。
- 双模设备:同时支持蓝牙经典和低功耗,例如智能手机、笔记本电脑。它们可以通过一套共享的天线和射频前端与两种类型的设备通信。
主机与控制器架构
- 控制器(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链路层定义了设备可以处于的多种状态,以及在通信中扮演的角色。
五种基本状态
- 待机状态 (Standby):设备的初始状态,不发送也不接收任何数据包。
- 广播状态 (Advertising):设备周期性地在广播信道上发送广播数据包,以便被其他设备发现。扮演广播者(Broadcaster)角色。
- 扫描状态 (Scanning):设备在广播信道上监听来自广播者的广播数据包。扮演观察者(Observer)角色。
- 发起连接状态 (Initiating):设备在监听到特定的广播者后,发送连接请求以建立连接。
- 连接状态 (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通信通过三种主要类型的数据包进行:
- 命令包 (Command Packets)
- 方向:主机 → 控制器
- 作用:主机使用命令包来控制和查询控制器的行为,例如:启动扫描、建立连接、读取设备地址等。
- 事件包 (Event Packets)
- 方向:控制器 → 主机
- 作用:控制器使用事件包来通知主机已发生的事件,例如:命令执行完毕、接收到广播包、连接已建立、连接已断开等。
- 数据包 (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)
设备(外围设备)通过广播来宣告自己的存在,以便被其他设备(中心设备)发现。
- 主机配置广播参数:主机通过HCI命令设置广播间隔、广播数据等。
- 控制器开始广播:控制器根据主机的配置,在三个广播信道上周期性地发送广播包(
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)
中心设备通过扫描来发现正在广播的设备。
- 主机配置扫描参数:主机设置扫描窗口和扫描间隔。
- 控制器开始扫描:控制器在广播信道上监听广播包。
- 上报扫描结果:每当控制器收到一个广播包,它会通过
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 ─
│ │
- 发起者发送连接请求:发起者(扫描方)的控制器在收到广播包后,立即发送一个
CONNECT_IND数据包给广播者。 - 连接建立:广播者收到
CONNECT_IND后,停止广播。双方都切换到数据信道,并根据CONNECT_IND中定义的参数(如连接间隔、跳频算法等)开始同步通信。 - 通知主机:双方的控制器都向各自的主机发送
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 ─
│ │
- 主机发起断开:一方的主机决定断开连接,并向其控制器发送
HCI Disconnect命令。 - 控制器发送终止包:控制器在下一个连接事件中,向对方设备发送一个
LL_TERMINATE_IND数据包。 - 连接终止:双方收到或发送该数据包后,连接立即终止。
- 通知主机:双方的控制器都向各自的主机发送
Disconnection Complete事件。
链接: 蓝牙开发入门
蓝牙专栏 1 2 3 4 5 6 7 8 9 10 11 12
