BLE低功耗蓝牙技术开发指南
第一章:BLE 基础概念
在开始编码之前,必须理解BLE的核心概念,BLE与传统蓝牙(BR/EDR)在设计理念上完全不同。

1. 核心特点:低功耗
- 快速连接: 设备可以在3毫秒内完成连接,大部分时间处于睡眠状态,只在需要通信时唤醒。
- 低占空比: 数据传输非常短暂,通信间隙设备可以进入深度睡眠,功耗极低。
- 峰值功耗低: 通信时的电流消耗远小于传统蓝牙。
2. 关键术语
- Central (中心设备): 主动发起连接、读取数据、写入数据的设备,通常是手机、平板、电脑等,一个Central可以同时连接多个Peripheral。
- Peripheral (外设设备): 被动等待连接、提供数据的设备,通常是各种传感器、手环、智能灯等。
- GAP (Generic Access Profile - 通用访问配置文件): 定义了设备如何被发现、如何建立连接、如何断开连接等基本流程,它负责设备的“身份”和“连接管理”。
- GATT (Generic Attribute Profile - 通用属性配置文件): 定义了数据在两个设备之间是如何交换的,它负责数据的“内容”和“结构”,所有BLE数据交互都基于GATT。
- Service (服务): 一个功能的集合,用于收集一组相关的数据,一个“电池服务”包含了电池电量的数据。
- Characteristic (特征值): 服务中的一个数据项,可以包含一个值,并可以定义对该值的操作权限(读、写、通知、指示)。
- UUID (Universally Unique Identifier): 一个128位的唯一标识符,用于在全球范围内标识不同的Service和Characteristic。
- 基础UUID:
0000xxxx-0000-1000-8000-00805F9B34FB(xxxx部分是16位短UUID,用于节省空间)。 - 官方UUID: Bluetooth SIG(蓝牙技术联盟)定义了许多标准Service和Characteristic的UUID(如心率服务
0x180D)。 - 自定义UUID: 开发者可以自己生成UUID,用于自定义的Service和Characteristic。
- 基础UUID:
- ATT (Attribute Protocol - 属性协议): GATT的基础,它定义了如何通过“读、写、通知”等命令来操作Service和Characteristic中的数据。
- Discoverable (可发现): Peripheral设备的一种状态,允许Central设备通过扫描发现它。
- Bonding (配对/绑定): 两个设备之间建立安全连接的过程,通常会交换密钥,以便后续可以快速重新连接,并进行加密通信。
第二章:BLE 通信架构
理解了核心概念,我们来看一下BLE通信的完整流程,这个架构对于开发两端(Central和Peripheral)都至关重要。
1. Peripheral (外设) 端 开发者需要定义并提供一个或多个 Service,每个Service包含一个或多个 Characteristic。

2. Central (中心) 端 Central设备的工作流程是“发现-连接-交互”。
- 扫描: Central设备在空中监听广播包,寻找感兴趣的Peripheral设备。
- 连接: 发现目标后,Central发起连接请求,建立与Peripheral的连接。
- 发现服务: 连接成功后,Central通过查询,获取Peripheral提供的服务列表。
- 发现特征值: 针对感兴趣的服务,Central进一步获取该服务下的所有特征值列表。
- 交互:
- 读取: 读取某个特征值的值。
- 写入: 向某个特征值的值写入数据。
- 通知: Peripheral可以主动向Central推送数据,但需要Central先“订阅”该特征值。
- 指示: 类似于通知,但需要Central收到后回复一个确认包,可靠性更高。
第三章:开发流程与实践
这部分是指南的核心,我们将分别从 Peripheral 和 Central 两个角色的角度来介绍开发步骤。
1. Peripheral (外设) 开发流程
目标: 创建一个设备,它能广播自己,并提供可读写的服务和特征值。
步骤 1: 硬件准备

- 选择一个支持BLE的微控制器,如:
- Nordic nRF52系列 (nRF52832, nRF52840) - 业界标杆,使用SDK和Zephyr RTOS。
- TI CC2640R2F / CC2650 - SimpleLink平台,功耗极佳。
- ESP32 - 集成Wi-Fi和BLE,性价比高。
- STM32WB系列 - STM32 + BLE SoC。
步骤 2: 软件环境搭建
- 安装IDE (如 Segger Embedded Studio, VS Code + PlatformIO)。
- 安装厂商提供的SDK或RTOS (如 nRF5 SDK, Zephyr, TI BLE-Stack)。
- 配置开发板和调试器。
步骤 3: 定义服务和特征值 这是最关键的一步,你需要在代码中定义你的设备“有什么”。
- 选择或创建Service UUID: 自定义一个
F0E1D2C3-B5A4-4321-89AB-CDEF01234567。 - 定义特征值:
- 特征值A: 设备名称 (只读)
- UUID:
00002A00-0000-1000-8000-00805F9B34FB(标准) - 权限:
READ
- UUID:
- 特征值B: LED控制 (可写)
- UUID:
F0E1D2C3-B5A4-4321-89AB-CDEF01234568(自定义) - 权限:
WRITE
- UUID:
- 特征值C: 传感器数据 (可通知)
- UUID:
F0E1D2C3-B5A4-4321-89AB-CDEF01234569(自定义) - 权限:
READ | NOTIFY
- UUID:
- 特征值A: 设备名称 (只读)
步骤 4: 实现应用逻辑
- 初始化BLE堆栈: 调用SDK函数启动BLE协议栈。
- 设置设备名称和广播数据:
- 设备名称会包含在广播包中,方便Central识别。
- 广播数据可以包含一些关键信息,如主要服务UUID、制造商数据等。
- 添加GATT服务: 将你在步骤3中定义的服务和特征值注册到GATT服务器中。
- 实现回调函数:
- 写入回调: 当Central写入“LED控制”特征值时,此函数被调用,在函数中解析写入的数据,并控制板载LED亮灭。
- 读取回调: 当Central读取“设备名称”时,返回预设的字符串。
- 通知回调: 当传感器数据更新时,调用函数将新数据通过“传感器数据”特征值发送给已订阅的Central。
- 处理连接事件:
- 连接建立后,可以停止广播(节省功耗)或继续广播。
- 断开连接后,可以重新开始广播。
步骤 5: 编译、烧录和调试
- 编译代码并烧录到开发板。
- 使用逻辑分析仪(如 Nordic Sniffer)或串口打印调试信息,观察广播包和数据交互。
2. Central (中心) 开发流程
目标: 创建一个手机App或PC软件,能扫描、连接到Peripheral,并与之交互。
步骤 1: 选择开发平台
- Android (Java/Kotlin): 使用
BluetoothAdapter和BluetoothGattAPI。 - iOS (Swift/Objective-C): 使用
CoreBluetooth框架。 - Windows (C++/C#): 使用 Windows Runtime API (
Windows.Devices.Bluetooth)。 - Web (JavaScript): 使用 Web Bluetooth API (目前仅在Chrome等部分浏览器支持)。
步骤 2: 扫描和发现设备
- 请求权限: 在Android 6.0+和iOS上,需要动态申请位置权限,因为BLE扫描需要用到定位硬件。
- 开始扫描: 调用平台API开始扫描,扫描回调会接收到发现的设备列表,包含设备名称、信号强度、广播数据等。
步骤 3: 连接设备
- 从扫描结果中选择目标设备,调用连接方法。
- 连接成功后,系统会返回一个代表该连接的
BluetoothGatt(Android) 或CBPeripheral(iOS) 对象。
步骤 4: 发现服务
- 连接成功后,调用
discoverServices()方法。 - 当服务发现完成后,回调函数会返回一个服务列表,你需要遍历这个列表,找到你关心的服务(通过UUID匹配)。
步骤 5: 发现和操作特征值
- 对于每个找到的服务,调用
discoverCharacteristicsForService()方法。 - 当特征值发现完成后,回调函数会返回该服务下的特征值列表,同样,通过UUID匹配你需要的特征值。
- 读取: 调用
readCharacteristic()方法,结果会在回调中返回。 - 写入: 调用
writeCharacteristic()方法,将数据写入特征值,注意,有些写入是“无响应”的,有些需要等待回复。 - 订阅通知:
- 调用
setCharacteristicNotification(true)启用通知。 - (在Android上) 还需要通过
descriptor来启用通知,通常写入0x2902这个描述符的值。 - 之后,每当Peripheral推送数据,你的回调函数就会被触发。
- 调用
步骤 6: 管理连接和断开
- 在应用进入后台或不需要通信时,应该主动调用
disconnect()方法断开连接,以节省电量。 - 可以实现自动重连逻辑,当设备断开后自动尝试重新连接。
第四章:高级主题
1. 功耗优化
- Peripheral端:
- 广播间隔: 适当延长广播间隔(如从100ms改为1s),可以显著降低功耗。
- 连接间隔: 与Central协商使用较长的连接间隔(如100ms或更长),让设备有更多时间睡眠。
- 数据发送频率: 不要频繁发送通知,只在数据有变化时发送。
- 善用睡眠模式: 在空闲时让MCU进入深度睡眠。
- Central端:
- 及时断开: 连接后尽快完成数据交互并断开。
- 后台扫描优化: 如果需要在后台持续扫描,要遵循系统的后台限制,并尽量延长扫描间隔。
2. 安全性
- 配对模式:
- Just Works: 最简单,无安全性,但易受中间人攻击,适用于设备对安全性要求不高的场景。
- Passkey Entry: 输入6位数字进行配对,安全性较高。
- Numeric Comparison: 手机和设备上显示相同的6位数字,用户确认配对。
- Out of Band (OOB): 通过其他通道(如NFC)交换配对信息,安全性最高。
- 数据加密: 配对成功后,可以建立加密的通信链路,防止数据被窃听或篡改。
3. OTA (Over-The-Air) 固件升级
- 这是BLE设备的一项重要功能,允许通过无线方式为设备更新固件。
- 通常需要一个特殊的 OTA Service,包含一个或多个用于传输固件数据的特征值。
- 流程一般包括:Central请求固件信息 -> 分块传输固件数据 -> Peripheral写入Flash -> Peripheral重启并验证。
第五章:开发工具与资源
1. 硬件工具
- BLE开发套件: Nordic nRF52 DK, TI CC2640R2F LaunchPad, ESP32-DevKitC。
- 调试/分析工具:
- Nordic nRF Connect for Mobile: 手机上的“瑞士军刀”,可以扫描、连接、读写几乎所有BLE设备,是调试必备。
- Wireshark + Nordic Sniffer: 抓取和分析BLE空中数据包,是深入分析协议问题的利器。
- 逻辑分析仪: 如Saleae,可以抓取UART等调试信息。
2. 软件工具
- BLE协议分析工具: LightBlue (iOS), nRF Connect for Mobile (Android/iOS), BlueZ (Linux)。
- UUID生成器: 在线搜索 "UUID Generator" 即可。
- 官方文档:
- Bluetooth SIG: bluetooth.com (获取核心协议规范)
- Nordic Semiconductor: devzone.nordicsemi.com (丰富的教程、SDK、示例代码)
- Texas Instruments: software-dl.ti.com (CC2640 SDK和文档)
- Espressif: docs.espressif.com (ESP32 BLE开发文档)
3. 开源项目与社区
- Zephyr Project: 一个功能强大的开源RTOS,对BLE支持非常好,跨平台。
- Mynewt / Apache NimBLE: Apache孵化的开源BLE协议栈,资源占用小。
- GitHub: 搜索 "BLE peripheral example" 或 "BLE central app" 可以找到大量参考代码。
BLE开发是一个理论与实践紧密结合的过程,本指南为您提供了一个从理论到实践的完整路线图。
给初学者的建议:
- 先跑通示例: 从官方SDK或RTOS提供的最简单的BLE示例(如一个广播名字的Peripheral)开始。
- 用手机App调试: 使用 nRF Connect 等App去连接你的设备,观察数据交互,这比直接看代码更直观。
- 从简单到复杂: 先实现单向通信(如读),再实现双向(如写),最后实现通知。
- 深入理解GATT: 花时间彻底搞懂Service和Characteristic的定义,这是所有BLE交互的基础。
遵循这个指南,并多动手实践,您将能够顺利地开发出各种创新的BLE应用,祝您开发顺利!
