1. 课程导论与硬件准备:为什么需要GATT服务?为什么需要休眠唤醒?

各位同学好,欢迎来到《从零搭建GATT服务与休眠唤醒机制》的第一课。

我是你们的讲师,一个在嵌入式蓝牙领域摸爬滚打了十来年的老工程师。今天咱们不聊虚的,直接切入正题:为什么你的蓝牙设备需要GATT服务?为什么又要费劲心思去做休眠唤醒?

这两个问题,说白了就是蓝牙产品的“灵魂”和“寿命”。

1.1 为什么需要GATT服务?

想象一下,你做了一个智能灯泡。手机要控制它开关、调色、读取功耗。如果没有一个标准的数据交互协议,你打算怎么传数据?

  • 手机发个字节 0x01 表示开,0x00 表示关?
  • 那调色温呢?发三个字节?还是发一个字符串 "color:3000K"?

这样做,你的App只能配你的灯。换个厂家的灯,App就废了。整个行业就乱套了。

GATT(通用属性协议)就是来解决这个问题的。

它定义了一套标准的“数据容器”模型:Service(服务) 和 Characteristic(特征)。

  • Service:好比一个功能模块。比如“灯控服务”、“电池服务”。
  • Characteristic:模块里的具体数据点。比如“开关状态”、“当前色温”、“电池电量”。

每个Characteristic都有UUID(唯一标识符)。手机通过UUID就能知道这个数据是干嘛的,该怎么读写。

核心思想: GATT把蓝牙设备变成了一个“属性数据库”。手机通过读写这些属性,就能控制设备、获取数据。这就是BLE应用层的基石。

我个人习惯把GATT比作一个“乐高积木”。你只需要按照标准接口,把Service和Characteristic拼装起来,你的设备就能被任何支持BLE的手机、平板、甚至另一个蓝牙设备识别和控制。

避坑指南: 我曾经在一个项目中,为了省事,自己定义了一套私有协议,用自定义Service UUID。结果客户要求对接他们的通用App,发现完全不兼容。最后花了整整一周时间重构GATT服务,血泪教训啊。所以,能用标准Service(如电池服务、设备信息服务)就用标准的,实在不行再自定义。

1.2 为什么需要休眠唤醒?

好,现在你的灯能通过GATT被控制了。但问题来了:电池能用多久?

BLE设备大多是电池供电的。一个纽扣电池,如果让芯片一直全速运行,可能几个小时就耗光了。用户买回去,三天两头换电池,这产品谁受得了?

休眠唤醒机制,就是蓝牙设备的“节能开关”。

它的逻辑很简单:

  1. 没事干的时候,就睡大觉。 关闭大部分外设时钟,只留一个低功耗定时器或者唤醒引脚在工作。此时电流可以降到微安(µA)级别。
  2. 有事了,再叫醒。 比如定时器到了、外部按键按下、或者蓝牙连接断开需要重连,芯片迅速醒来,处理完事情,继续睡。

你想想看,一个智能手环,大部分时间都在待机,只有你抬腕看时间或者收到消息时才工作。如果没有休眠,它可能撑不过一天。有了休眠,续航可以做到一周甚至一个月。

注意: 休眠不是简单的“睡死过去”。在休眠期间,蓝牙协议栈必须能维持连接状态(如果连接着的话)。否则,手机那边会认为设备断连了。这就是“连接事件”和“唤醒窗口”的概念,我们后面会详细讲。

1.3 BLE协议栈概览

聊完了为什么,咱们简单看看BLE协议栈长什么样。你不用现在就记住所有层,有个印象就行。

BLE 协议栈分层架构 应用层 (Application) 你的业务逻辑:灯控、传感器读取、数据上报 主机层 (Host) GATT / GAP / SMP / L2CAP 定义数据如何组织、如何连接、如何加密 控制器层 (Controller) LL (链路层) / PHY (物理层) 负责射频收发、连接状态机、包处理 硬件层 (SoC / Radio) nRF52840 / ESP32 芯片及射频前端 我们课程的重点

这张图很直观。我们这门课,主要聚焦在应用层和主机层的GATT部分,以及如何让控制器层配合实现休眠唤醒。底层的射频细节,我们交给芯片厂商的SDK去处理。

1.4 常用开发板介绍与选型建议

光说不练假把式。咱们得选块板子动手。目前市面上最主流的两款BLE芯片方案,就是Nordic nRF52840 和 乐鑫 ESP32。

我该怎么选?看下面这个表,你就明白了。

特性 nRF52840 ESP32
核心架构 ARM Cortex-M4F Xtensa LX6 双核
BLE 协议栈 SoftDevice (S140) - 成熟稳定,性能极致 Bluedroid / NimBLE - 功能全,但功耗略高
功耗 极低 (休眠可达 0.4µA) 较低 (休眠约 5µA)
处理能力 64MHz, 1MB Flash, 256KB RAM 240MHz, 4MB Flash, 520KB RAM (更强)
外设丰富度 丰富 (USB, NFC, 多路ADC/PWM) 非常丰富 (WiFi, 蓝牙, 以太网, 触摸)
开发难度 中等 (需要理解SoftDevice调度) 较低 (Arduino/ESP-IDF生态好)
典型应用 低功耗传感器、可穿戴、医疗设备 智能家居、物联网网关、音视频传输
价格 较贵 (约 80-150 元/模块) 便宜 (约 20-40 元/模块)

我的选型建议:

  • 如果你做的是纽扣电池供电、对续航要求极高的产品(如智能手环、温湿度标签), 我建议你选 nRF52840。它的休眠功耗和射频性能,目前依然是行业标杆。
  • 如果你做的是需要联网、或者需要较强算力的产品(如智能音箱、WiFi蓝牙网关), 或者你刚入门,想快速出原型,我建议你选 ESP32。它的生态和性价比无敌。

个人经验: 我最早接触BLE用的是nRF51822,那时候SoftDevice的调度机制让我头疼了好一阵。后来用ESP32,发现用Arduino库写个蓝牙服务,几行代码就搞定了。但真到了做量产的低功耗产品,我还是老老实实回到了Nordic的怀抱。所以,没有最好的板子,只有最适合你项目的板子。

嗯,这节课的内容就到这里。我们搞清楚了GATT和休眠唤醒的必要性,也看懂了BLE协议栈的骨架,最后选定了我们接下来要用的开发板。这些基础打牢了,后面我们才能盖起高楼。