BLE协议栈的解析
目录
概述
1 BLE协议栈层次结构
1.1 控制器(Controller)
1.2 主机(Host)
1.3 应用层(Application)
1.3.1 业务层功能
1.3.2 实现方法
2 重要属性介绍
2.1 GATT属性
2.2 服务(Service)
2.3 特征值(Characteristic)
2.4 描述符(Descriptor)
2.5 数据交互方式
3 蓝牙设备角色
3.1 BLE 广播者(Broadcaster)
3.2 BLE 观察者(Observer)
3.3 BLE 中心设备(Central)
3.4 BLE 外设(Peripheral)
4 应用总结
4.1 组件功能列表
4.2 使用要点
概述
蓝牙低功耗(BLE)协议栈是实现蓝牙无线通信功能的分层架构,本文将从核心组成、各层功能到实际应用进行全面介绍。包括协议的层次结构,主要属性,以及设备角色等内容。
1 BLE协议栈层次结构
BLE协议栈主要分为三个部分:控制器(Controller),主机(Host),应用层(Application)
1.1 控制器(Controller)
控制之包括3个部分:
物理层PHY:
工作在2.4GHz ISM频段(2402-2480MHz)
采用40个信道,信道间隔2MHz
使用高斯频移键控(GFSK)调制
传输速率: 1Mbps(蓝牙5.0后支持2Mbps)
链路层Link Layer:
负责广播、扫描、建立和维护连接
管理5种状态:
待机(Standby)
广播(Advertising)
扫描(Scanning)
发起(Initiating)
连接(Connected)
处理数据包格式、时序和信道跳频
直接测试模式Direct Test Mode:用来测试射频性能,比如发射功率、接收灵敏度。
1.2 主机(Host)
主机(Host)层主要包含4个部分:
主机控制器接口HCI:
控制器与主机之间的标准通信接口
可通过UART、USB或三线协议传输
提供命令、事件和数据三种数据包类型
逻辑链路控制与适配协议L2CAP:
提供逻辑信道复用功能
负责协议/信道多路复用
处理数据包的分割和重组
提供基本L2CAP模式和LE信用流控制模式
安全管理器Security Manager:
负责配对和密钥分发
提供认证和加密功能
支持四种安全模式
实现LE安全连接和传统配对
属性协议ATT:
定义客户端-服务器结构的通信协议
服务器存储数据(属性),客户端请求数据
属性由句柄、UUID和值组成
支持查找、读取和写入等操作
通用访问规范(GAP):
定义设备角色:广播者、观察者、外围设备和中央设备
管理设备发现、连接建立和安全
控制广播和连接参数
通用属性规范(GATT):
建立在ATT之上的服务框架
定义服务(Service)、特征(Characteristic)和描述符(Descriptor)
规范了数据如何组织和交换
支持预定义和自定义服务
1.3 应用层(Application)
1.3.1 业务层功能
BLE应用层是蓝牙低能耗协议栈的最上层,直接面向用户和开发者,负责实现具体的业务逻辑和功能。以下是BLE应用层的详细功能解析:
1)业务逻辑实现
定义设备的具体功能和行为
实现用户需求的实际应用场景
处理来自下层协议栈的数据和事件
2) 数据管理
组织和管理应用数据
定义数据格式和解析规则
实现数据缓存和处理机制
1.3.2 实现方法
1) 应用配置文件(Profile)
预定义的标准功能集合(如心率监测、血压监测等)
由多个服务(Service)组成
确保不同厂商设备的互操作性
2.)自定义服务/特征
开发者根据需求定义的服务和特征
通过自定义UUID实现
灵活满足特定应用场景需求
3) 用户接口
提供与用户交互的接口
包括状态显示、参数配置等
可以是物理按钮、LED指示灯或移动应用界面
4)数据处理模块
数据加密/解密
数据压缩/解压缩
数据格式转换
2 重要属性介绍
2.1 GATT属性
1)GATT 的作用
定义 数据如何组织(服务、特征值、描述符)
规定 数据如何交互(读、写、通知、指示)
确保不同厂商设备之间的 互操作性
2)GATT 角色
角色 | 说明 |
---|---|
GATT 服务器(Server) | 存储数据(如传感器数据、设备状态),并允许客户端访问。例如:心率监测器、智能灯泡。 |
GATT 客户端(Client) | 向服务器发起请求(读/写数据)。例如:手机APP、中央设备。 |
注意:一个设备可以同时是 Client 和 Server(例如:智能手表既可以接收手机数据,也可以向耳机发送数据)。
2.2 服务(Service)
1)服务的定义
服务是 一组相关功能 的集合,例如:
心率服务(Heart Rate Service):包含心率测量、传感器位置等数据。
电池服务(Battery Service):包含电池电量、充电状态等数据。
每个服务由 UUID(通用唯一标识符) 标识:
标准 UUID(16-bit):如
0x180D
(心率服务)。自定义 UUID(128-bit):开发者可自定义,如
0000XXXX-0000-1000-8000-00805F9B34FB
。
2) 服务的层次结构
GATT Server
│
├── Service 1 (UUID: 0x180D) // 心率服务
│ ├── Characteristic 1 (心率测量)
│ └── Characteristic 2 (传感器位置)
│
└── Service 2 (UUID: 0x180F) // 电池服务├── Characteristic 1 (电池电量)└── Descriptor (通知使能)
2.3 特征值(Characteristic)
1)特征值的定义
特征值是 服务中的具体数据项,例如:
心率服务中的 当前心率值(如
72 BPM
)。电池服务中的 剩余电量(如
85%
)。每个特征值包含:
UUID(标识数据类型,如
0x2A37
表示心率测量)。Value(数据值,如
0x48
表示 72 BPM)。Permissions(读/写/通知权限)。
Descriptors(额外配置信息,如通知开关)。
2) 特征值的属性
属性 | 说明 |
---|---|
Read(可读) | 客户端可读取数据(如读取电池电量)。 |
Write(可写) | 客户端可写入数据(如调节灯光亮度)。 |
Notify(通知) | 服务器主动推送数据(无需客户端请求),例如持续发送心率数据。 |
Indicate(指示) | 类似 Notify,但要求客户端确认(更可靠)。 |
2.4 描述符(Descriptor)
1)描述符的作用
其主要作用是提供额外配置信息,例如:
Client Characteristic Configuration Descriptor (CCCD):控制 Notify/Indicate 是否启用。
Characteristic User Description:人类可读的描述(如 "Heart Rate Measurement")。
2)常见描述符
UUID | 名称 | 功能 |
---|---|---|
0x2902 | CCCD | 启用/禁用通知(Notify)或指示(Indicate)。 |
0x2901 | User Description | 提供特征值的文本描述(如 "Battery Level")。 |
2.5 数据交互方式
1)主要操作
操作 | 说明 | 示例 |
---|---|---|
Read(读取) | 客户端读取特征值 | 读取电池电量 |
Write(写入) | 客户端写入特征值 | 调节灯光亮度 |
Notify(通知) | 服务器主动推送数据(无确认) | 持续发送心率数据 |
Indicate(指示) | 服务器主动推送数据(需客户端确认) | 重要警报消息 |
2)典型应用场景
-
心率监测器(HRM)
-
服务:
0x180D
(心率服务) -
特征值:
0x2A37
(心率测量,Notify 模式) -
客户端订阅后,服务器持续发送心率数据。
-
-
智能灯泡
-
服务:自定义 UUID(如
0000AAAA-...
) -
特征值:
-
0xAAAA
(亮度,Write 模式) -
0xAAAB
(颜色,Write 模式)
-
-
3 蓝牙设备角色
3.1 BLE 广播者(Broadcaster)
广播者的核心特点主要如下:
1)工作模式
仅发送数据,不接收响应(单向通信)。
不建立连接(Connectionless),适用于一对多通信。
使用 广播信道(37/38/39) 发送数据包。
2)典型应用场景
信标(Beacon)(如 iBeacon、Eddystone)
传感器数据广播(温度、湿度等)
设备发现(让扫描设备感知广播者的存在)
低功耗标签(资产跟踪、室内定位)
3.2 BLE 观察者(Observer)
观察者(Observer)是 BLE(蓝牙低功耗)中的一种设备角色,专门用于 扫描并接收广播数据,但不主动发起连接。它在 BLE 通信中扮演"监听者"的角色,适用于数据采集、设备发现等场景。
1. 观察者的核心特点
1)工作模式
仅接收广播数据,不发送连接请求(被动监听)
不建立双向连接(Connectionless)
在 3个广播信道(37/38/39) 上扫描数据
2) 典型应用场景
信标(Beacon)接收(如商场导航、室内定位)
环境传感器数据收集(温度、湿度等)
设备发现与监控(如资产跟踪)
广播数据抓包与分析
2. 观察者的工作流程
1) 扫描方式
扫描类型 | 特点 | 功耗 |
---|---|---|
被动扫描(Passive Scanning) | 只接收广播数据,不发送扫描请求 | 更低功耗 |
主动扫描(Active Scanning) | 发送扫描请求(SCAN_REQ)获取更多数据(Scan Response) | 功耗略高 |
2) 数据接收机制
监听广播信道(37/38/39)
解析广播数据(如设备名称、服务UUID、厂商数据等)
可选:发送扫描请求(SCAN_REQ)获取扩展信息(Scan Response)
3. 观察者的关键特性
1)低功耗优化
可调节扫描间隔(Scan Interval)和 扫描窗口(Scan Window)
例:间隔100ms,窗口10ms → 每100ms扫描10ms
支持后台扫描(如手机APP在后台发现Beacon)
2) 数据过滤能力
基于MAC地址过滤
基于广播数据类型过滤(如只接收iBeacon数据)
RSSI阈值过滤(忽略信号过弱的设备)
3)无连接管理
不处理配对、加密等流程
无法直接控制广播设备(仅接收数据)
3.3 BLE 中心设备(Central)
中心设备(Central)是 BLE(蓝牙低功耗)通信中的核心角色,负责 主动扫描、发起连接 并 管理数据通信。它是构建 BLE 系统的"大脑",在大多数 BLE 应用中起主导作用。
1. 中心设备的核心特点
1) 核心功能
扫描发现外围设备(扫描广播数据)
发起和管理连接
作为GATT客户端(读写服务/特征值)
管理多个连接(部分设备支持)
2)典型设备示例
智能手机/平板电脑
笔记本电脑
智能家居网关
医疗监护仪主控端
2. 工作流程
1)设备发现阶段
2) 连接建立阶段
3. 关键技术特性
1)连接管理
参数 | 说明 | 典型值 |
---|---|---|
连接间隔 | 两次数据交互间隔 | 7.5ms-4s |
从机延迟 | 允许从设备跳过的连接事件 | 0-499 |
监控超时 | 判定连接丢失时间 | 100ms-32s |
优化建议:
低功耗场景:增大间隔(如100ms)
实时性要求高:减小间隔(如15ms)
2) 多设备连接
分时复用机制:在不同连接间隔处理不同设备
连接参数协商:为不同设备设置独立参数
资源限制:受芯片RAM/处理能力限制
3 中心设备 vs 外围设备
特性 | 中心设备(Central) | 外围设备(Peripheral) |
---|---|---|
角色 | 主动方/控制端 | 被动方/被控端 |
功耗 | 相对较高 | 优化更好 |
连接能力 | 可连接多个设备 | 通常只连1个中心 |
典型设备 | 智能手机、网关 | 传感器、穿戴设备 |
3.4 BLE 外设(Peripheral)
外设(Peripheral)是 BLE(蓝牙低功耗)通信中的关键角色,作为 数据提供方 和 被控制端,在蓝牙生态系统中承担着终端数据采集和设备控制的重要功能。
1. 外设的核心特点
1)基本特性
广播自身存在(Advertising)
接受中心设备连接请求
作为GATT服务器(存储并提供数据)
低功耗优化设计
2)典型设备示例
智能手环/手表
医疗传感器(心率、血氧)
智能家居设备(灯泡、门锁)
信标(Beacon)设备
2. 工作流程
1)广播阶段
2) 连接建立
3. 关键技术特性
1) 广播配置
参数 | 说明 | 典型值 |
---|---|---|
广播间隔 | 两次广播间隔时间 | 20ms-10.24s |
广播类型 | ADV_IND/ADV_NONCONN_IND等 | 根据需求选择 |
广播数据 | 设备名称/服务UUID等 | 31字节限制 |
2) 连接管理
参数 | 外设控制能力 | 说明 |
---|---|---|
连接参数更新 | 可请求修改 | 协商最佳参数 |
安全请求 | 可发起配对 | 提升安全性 |
断连处理 | 可重新广播 | 恢复可发现状态 |
4. 外设 vs 中心设备
特性 | 外设(Peripheral) | 中心设备(Central) |
---|---|---|
角色 | 数据提供者 | 数据消费者 |
连接能力 | 通常单连接 | 多连接支持 |
功耗优化 | 深度睡眠支持 | 相对较高 |
典型功耗 | μA级待机 | mA级工作 |
4 应用总结
4.1 组件功能列表
组件 | 作用 | 示例 |
---|---|---|
GATT | 定义数据组织方式 | 客户端-服务器架构 |
Service | 功能分组 | 心率服务(0x180D)、电池服务(0x180F) |
Characteristic | 具体数据项 | 心率值(0x2A37)、电池电量(0x2A19) |
Descriptor | 额外配置 | CCCD(0x2902,控制通知开关) |
4.2 使用要点
-
GATT 是数据组织的框架,服务是功能模块,特征值是具体数据。
-
Notify/Indicate 适用于实时数据推送(如传感器数据)。
-
CCCD(0x2902)是 Notify/Indicate 的关键,客户端必须写入
0x01
启用通知。