睿诚科技协会

ble低功耗蓝牙技术开发指南

BLE低功耗蓝牙技术开发指南

第一章:BLE 基础概念

在开始编码之前,必须理解BLE的核心概念,BLE与传统蓝牙(BR/EDR)在设计理念上完全不同。

ble低功耗蓝牙技术开发指南-图1
(图片来源网络,侵删)

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。
  • ATT (Attribute Protocol - 属性协议): GATT的基础,它定义了如何通过“读、写、通知”等命令来操作Service和Characteristic中的数据。
  • Discoverable (可发现): Peripheral设备的一种状态,允许Central设备通过扫描发现它。
  • Bonding (配对/绑定): 两个设备之间建立安全连接的过程,通常会交换密钥,以便后续可以快速重新连接,并进行加密通信。

第二章:BLE 通信架构

理解了核心概念,我们来看一下BLE通信的完整流程,这个架构对于开发两端(Central和Peripheral)都至关重要。

1. Peripheral (外设) 端 开发者需要定义并提供一个或多个 Service,每个Service包含一个或多个 Characteristic

ble低功耗蓝牙技术开发指南-图2
(图片来源网络,侵删)

2. Central (中心) 端 Central设备的工作流程是“发现-连接-交互”。

  1. 扫描: Central设备在空中监听广播包,寻找感兴趣的Peripheral设备。
  2. 连接: 发现目标后,Central发起连接请求,建立与Peripheral的连接。
  3. 发现服务: 连接成功后,Central通过查询,获取Peripheral提供的服务列表。
  4. 发现特征值: 针对感兴趣的服务,Central进一步获取该服务下的所有特征值列表。
  5. 交互:
    • 读取: 读取某个特征值的值。
    • 写入: 向某个特征值的值写入数据。
    • 通知: Peripheral可以主动向Central推送数据,但需要Central先“订阅”该特征值。
    • 指示: 类似于通知,但需要Central收到后回复一个确认包,可靠性更高。

第三章:开发流程与实践

这部分是指南的核心,我们将分别从 PeripheralCentral 两个角色的角度来介绍开发步骤。

1. Peripheral (外设) 开发流程

目标: 创建一个设备,它能广播自己,并提供可读写的服务和特征值。

步骤 1: 硬件准备

ble低功耗蓝牙技术开发指南-图3
(图片来源网络,侵删)
  • 选择一个支持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
    • 特征值B: LED控制 (可写)
      • UUID: F0E1D2C3-B5A4-4321-89AB-CDEF01234568 (自定义)
      • 权限: WRITE
    • 特征值C: 传感器数据 (可通知)
      • UUID: F0E1D2C3-B5A4-4321-89AB-CDEF01234569 (自定义)
      • 权限: READ | NOTIFY

步骤 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): 使用 BluetoothAdapterBluetoothGatt API。
  • 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() 方法,将数据写入特征值,注意,有些写入是“无响应”的,有些需要等待回复。
  • 订阅通知:
    1. 调用 setCharacteristicNotification(true) 启用通知。
    2. (在Android上) 还需要通过 descriptor 来启用通知,通常写入 0x2902 这个描述符的值。
    3. 之后,每当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" 即可。
  • 官方文档:

3. 开源项目与社区

  • Zephyr Project: 一个功能强大的开源RTOS,对BLE支持非常好,跨平台。
  • Mynewt / Apache NimBLE: Apache孵化的开源BLE协议栈,资源占用小。
  • GitHub: 搜索 "BLE peripheral example" 或 "BLE central app" 可以找到大量参考代码。

BLE开发是一个理论与实践紧密结合的过程,本指南为您提供了一个从理论到实践的完整路线图。

给初学者的建议:

  1. 先跑通示例: 从官方SDK或RTOS提供的最简单的BLE示例(如一个广播名字的Peripheral)开始。
  2. 用手机App调试: 使用 nRF Connect 等App去连接你的设备,观察数据交互,这比直接看代码更直观。
  3. 从简单到复杂: 先实现单向通信(如读),再实现双向(如写),最后实现通知。
  4. 深入理解GATT: 花时间彻底搞懂Service和Characteristic的定义,这是所有BLE交互的基础。

遵循这个指南,并多动手实践,您将能够顺利地开发出各种创新的BLE应用,祝您开发顺利!

分享:
扫描分享到社交APP
上一篇
下一篇