3、BLE基础:蓝牙低功耗协议栈、广播与连接模式、GATT服务与特征值
在TinyML设备的低功耗联网方案中,BLE(Bluetooth Low Energy,蓝牙低功耗)是最常被优先考虑的无线协议之一。它并非传统蓝牙的简单降频版本,而是一套为“极低占空比数据传输”重新设计的协议体系。理解BLE的协议栈分层、广播与连接两种工作模式,以及GATT(Generic Attribute Profile)数据模型,是决定传感器节点能否在纽扣电池下运行数月乃至数年的关键。本章将从工程实践视角,拆解BLE的核心机制,并给出在TinyML场景下的选型与设计建议。
工程提示:BLE的“低功耗”并非来自射频发射功率的降低,而是通过极短的射频活动时间与长时睡眠的占空比机制实现。一个以1s间隔广播的节点,平均电流可低至10µA以下,而连接模式下若配置不当,平均电流可能飙升到数百µA。
3.1 BLE协议栈分层架构与核心原理
BLE协议栈从物理层到应用层分为三层:控制器(Controller)、主机(Host)和应用层(Application)。控制器包含物理层(PHY)和链路层(LL),负责射频收发、信道选择、数据包组装与状态机管理。主机包含逻辑链路控制与自适应协议(L2CAP)、安全管理(SM)、属性协议(ATT)和通用属性规范(GATT)。应用层则直接面向开发者,通过GATT API操作数据。
在TinyML节点中,开发者通常使用SoC厂商提供的协议栈(如Nordic的SoftDevice、Espressif的ESP-BLE)或开源协议栈(如Zephyr、Apache Mynewt)。协议栈运行在MCU的专用内核或RTOS任务中,占用约8~16KB RAM和60~120KB Flash。对于资源受限的TinyML设备,这一开销必须在选型时纳入预算。
| 协议层 | 核心职责 | TinyML相关要点 |
|---|---|---|
| PHY | 2.4GHz GFSK调制,1M/2M/125kbps | 125kbps(Coded PHY)可增加链路预算,适合远距离 |
| LL | 状态机(广播/扫描/连接)、信道跳频 | 广播间隔与连接间隔直接决定功耗 |
| L2CAP | 数据封装与复用,MTU管理 | 默认MTU 23字节,可协商至247字节 |
| ATT/GATT | 属性读写、通知、指示 | 定义服务与特征值的数据模型 |
| SM | 配对与密钥分发 | TinyML场景通常使用Just Works配对 |
3.2 广播模式:无连接的数据发布
广播模式是BLE最省电的工作方式,适用于单向数据上报或设备发现。节点在3个专用广播信道(37/38/39)上周期性地发送数据包,任何处于扫描状态的设备都能接收。广播包最大31字节,其中包含设备地址、广播类型、以及自定义的厂商数据(Manufacturer Specific Data)。
在TinyML场景中,广播模式常用于以下场景:
- 信标(Beacon):广播设备ID和传感器读数,如温湿度标签。
- 事件触发上报:当本地TinyML模型检测到异常时,立即广播一条告警。
- 低功耗传感器节点:以分钟级间隔广播最新测量值,手机或网关被动接收。
广播间隔(Advertising Interval)是功耗的关键参数。间隔越短,数据实时性越高,但平均电流越大。例如,nRF52832在0dBm发射功率下,100ms广播间隔的平均电流约为13µA,而1s间隔则降至约2µA。对于电池容量为200mAh的纽扣电池,1s间隔的理论续航可达11年(忽略电池自放电)。
AD Type 0x01: Flags (0x06 - LE General Discoverable)
AD Type 0x09: Complete Local Name ("TinyML-Temp")
AD Type 0xFF: Manufacturer Specific Data
- Company ID: 0x0059 (Nordic)
- Data: [0x01, 0x2A, 0x1C] // 温度=26.8°C, 电池=3.2V
常见误区:广播模式虽然省电,但没有重传机制,数据包在2.4GHz频段可能因Wi-Fi或微波炉干扰而丢失。对于关键告警,建议在广播包中增加序号字段,接收端据此检测丢包。
3.3 连接模式与GATT数据交互
当需要双向通信或可靠传输时,BLE进入连接模式。连接由Central设备发起,Peripheral设备接受。连接建立后,双方在约定的连接间隔(Connection Interval)内进行数据交换。连接间隔可设置为7.5ms至4s,实际吞吐量取决于连接间隔、数据包大小和从机延迟(Slave Latency)。
GATT定义了连接模式下的数据组织方式。数据以服务(Service)和特征值(Characteristic)的层级结构呈现。每个特征值包含一个值(Value)和若干描述符(Descriptor),并具有读写、通知(Notify)或指示(Indicate)等属性。TinyML节点通常作为GATT服务端,将推理结果写入特征值,并通过通知机制主动推送给Central设备。
| GATT操作 | 方向 | 功耗特征 | 适用场景 |
|---|---|---|---|
| Read | Central → Peripheral | 需等待Central请求 | 低频参数读取 |
| Write | Central → Peripheral | 节点需保持接收窗口 | 配置下发、OTA触发 |
| Notify | Peripheral → Central | 节点主动发送,无需等待 | 传感器数据流、推理结果 |
| Indicate | Peripheral → Central | 需等待ACK,功耗更高 | 关键告警、需确认的数据 |
3.4 实战案例:基于BLE的TinyML振动异常检测节点
我们设计一个用于工业电机振动监测的TinyML节点,要求:纽扣电池供电、连续工作6个月、每10秒上报一次振动特征值、异常时立即告警。
硬件选型:nRF52832 SoC(集成Cortex-M4F,512KB Flash,64KB RAM),ADXL362加速度计(超低功耗,待机电流<10nA)。TinyML模型使用1D-CNN进行振动分类,模型大小约18KB,推理一次耗时约15ms,消耗电流约4mA。
BLE配置策略:
- 正常模式:使用广播模式,广播间隔1s,广播数据包含设备ID、电池电压、最近一次推理结果(正常/异常)。平均电流约5µA。
- 异常模式:当模型检测到异常时,节点切换到连接模式,向网关发起连接请求,通过Notify发送详细振动波形(约200字节)。连接间隔设为30ms,发送完成后立即断开连接。
- 参数计算:正常模式下,节点每10秒唤醒一次采集并推理,每次唤醒耗时约50ms(含传感器读取和推理),平均电流约0.2mA。总平均电流 = 广播5µA + 唤醒0.2mA×(50ms/10s) ≈ 6µA。200mAh电池理论续航约3.8年,远超6个月要求。
实际测试结果:在真实工厂环境中,广播包接收成功率约97%(受金属遮挡影响)。异常检测的响应延迟为:检测到异常到网关收到告警约1.2s(含连接建立时间)。相比始终使用连接模式(平均电流约120µA),该策略将功耗降低了95%。
3.5 常见误区与设计复盘
- 误区一:连接间隔越小越好。连接间隔小虽然降低延迟,但节点必须在每个间隔内唤醒接收数据,功耗线性上升。对于周期性上报场景,建议连接间隔≥100ms,并启用从机延迟。
- 误区二:所有数据都通过Notify发送。Notify虽然无需Central请求,但每次通知都需要一个连接事件。如果数据量小且频率低,使用Read由Central按需读取可能更省电。
- 误区三:忽略MTU协商。默认MTU为23字节,实际有效数据仅20字节。若每次上报需传输100字节,则需5个连接事件。协商MTU至247字节后,只需1个连接事件,功耗降低80%。
- 误区四:广播数据塞满31字节。广播信道是共享的,数据包越长,碰撞概率越高。建议广播包控制在10~15字节以内,只放关键信息。
在TinyML项目中,BLE的配置需要与模型推理频率、数据量大小、电池容量进行联合优化。建议在原型阶段使用电流分析仪(如Nordic Power Profiler Kit)测量不同配置下的实际功耗曲线,而非仅依赖数据手册的理论值。通过合理的协议栈配置和状态机设计,BLE完全能够支撑TinyML节点在严苛功耗预算下的长期稳定运行。