第二章 协议栈概览:BLE/Wi-Fi/Zigbee协议栈对比、各层功耗占比分析

做无线低功耗设计,第一件事是什么?

我个人习惯,不是先看芯片手册,而是先搞清楚协议栈。为什么?因为功耗的命门,就藏在协议栈的每一层里。你想想看,一个蓝牙包发出去,从应用层一路走到物理层,每一层都在吃电。搞不清楚这些,你连功耗从哪漏的都不知道。

2.1 三大协议栈的宏观对比

先看一张总表,我这些年做项目,每次选型都会拿出来对照一遍。

特性 BLE Wi-Fi Zigbee
标准组织 Bluetooth SIG IEEE 802.11 / Wi-Fi Alliance Zigbee Alliance (现CSA)
物理层速率 1Mbps / 2Mbps (LE) 最高数Gbps (Wi-Fi 6/7) 250kbps
典型通信距离 10-100m 30-100m (室内) 10-100m
网络拓扑 星型、Scatternet 星型 (AP-STA) 星型、树型、Mesh
峰值电流 ~15mA (TX 0dBm) ~300mA (TX) ~30mA (TX)
待机电流 ~1μA ~100μA (DTIM) ~1μA
应用场景 穿戴、传感器、Beacon 视频流、大文件传输 智能家居、工业控制

嗯,这里要注意。这张表只是宏观对比。真正做低功耗设计时,你会发现——协议栈的每一层,都在悄悄吃掉你的电池

2.2 BLE协议栈分层与功耗分析

BLE协议栈,我拆成三层来看:Controller、Host、Application。每一层的功耗占比,我在项目中实测过多次。

2.2.1 物理层 (PHY) — 功耗大头

物理层是吃电大户。发射功率每增加3dB,电流大约翻倍。但很多人忽略了一点:接收功耗往往比发射更可怕。为什么?因为发射是瞬间的,接收却要一直开着射频窗口。

我曾经在一个穿戴项目中,发现设备待机电流比预期高了20μA。查了三天,最后发现是物理层的接收窗口开得太宽了。射频一直处于RX状态,电流自然下不来。

关键数据: BLE 1M PHY模式下,TX电流约8-15mA (0dBm),RX电流约10-15mA。但RX持续时间往往是TX的10倍以上。

2.2.2 链路层 (LL) — 连接间隔的陷阱

链路层决定了什么时候收发数据。连接间隔设得越小,功耗越高。我见过有人把连接间隔设成7.5ms,结果设备一天就没电了。

说白了,链路层就是你的「开关」。开关次数越多,功耗越大。我建议:非实时数据,连接间隔至少设到100ms以上

2.2.3 L2CAP / ATT / GATT — 数据打包的学问

这一层很多人不重视。其实MTU大小直接影响功耗。MTU太小,同样的数据要拆成多个包发,每个包都有协议开销。MTU太大,一次传输时间长,容易受干扰重传。

我个人习惯,BLE应用层数据尽量打包发送。比如传感器数据,攒够20个字节再发,比一次发1个字节省电得多。

2.3 Wi-Fi协议栈分层与功耗分析

Wi-Fi的协议栈比BLE复杂得多。它的功耗大头,往往不在数据传输,而在——保持连接

2.3.1 物理层 — OFDM的代价

Wi-Fi物理层用了OFDM调制,峰值电流轻松上300mA。但好消息是,Wi-Fi有省电模式。802.11n/ac/ax都支持PS-Poll和U-APSD。

我记得有个项目,客户要求Wi-Fi设备用电池供电。一开始直接跑标准模式,电池撑不过8小时。后来启用了DTIM=3的省电模式,待机电流从50mA降到了2mA。嗯,这就是协议栈的威力。

2.3.2 MAC层 — 竞争窗口的隐形成本

Wi-Fi的MAC层用CSMA/CA。设备在发送前要监听信道,如果信道忙,就要退避。这个退避过程,射频一直在工作。你想想看,如果周围Wi-Fi设备多,退避时间可能比发送时间还长。

避坑指南: 我曾经在智能家居项目中,发现设备在Wi-Fi密集区域功耗异常。后来抓包发现,设备每次发送前平均退避了5ms。解决方案是:改用802.11ax的OFDMA,或者干脆错峰发送。

2.3.3 网络层 — DHCP和ARP的陷阱

很多人不知道,DHCP续租和ARP广播也会吃电。Wi-Fi设备每隔一段时间要发DHCP请求续租IP,还要响应ARP广播。这些看似不起眼,但积少成多。

我建议:固定IP可以减少DHCP开销,静态ARP表可以减少广播响应。当然,这要看你的网络环境是否支持。

2.4 Zigbee协议栈分层与功耗分析

Zigbee天生为低功耗设计。它的协议栈比BLE和Wi-Fi都精简,但陷阱也不少。

2.4.1 物理层 — 250kbps的取舍

Zigbee物理层速率只有250kbps,但换来的是极低的接收灵敏度(-100dBm以上)。这意味着同样的发射功率,Zigbee可以传得更远。

但要注意:低速率意味着长传输时间。一个128字节的数据包,Zigbee要传4ms,而BLE只要1ms。所以Zigbee的功耗优势,更多体现在待机,而不是传输。

2.4.2 MAC层 — 信标使能 vs 非信标

Zigbee的MAC层有两种模式:信标使能和非信标。信标使能模式下,设备按信标周期同步唤醒,功耗可控。非信标模式下,设备要一直监听父节点的数据指示。

我做过一个Zigbee传感器项目,一开始用非信标模式,电池寿命只有3个月。后来改成信标使能模式,信标间隔设为1秒,电池寿命直接延长到1年。差别就在MAC层的调度策略上。

2.4.3 网络层 — 路由发现的代价

Zigbee Mesh网络的路由发现,是功耗的隐形杀手。当一个节点发起路由发现时,整个网络都要参与广播。这个过程的功耗,可能比正常通信高10倍。

注意: 我曾经在Zigbee Mesh项目中,因为路由表老化导致频繁路由发现,整个网络的电池寿命缩短了40%。解决方案是:合理设置路由表超时时间,或者用树型拓扑代替Mesh

2.5 各层功耗占比总结

好了,说了这么多,我直接给结论。这是我多年实测的典型数据,供你参考。

协议栈 物理层 MAC/链路层 网络/传输层 应用层
BLE 60-70% 20-25% 5-10% 5%
Wi-Fi 50-60% 25-35% 10-15% 5%
Zigbee 40-50% 30-40% 15-20% 5%

看到没?物理层永远是功耗大头。但MAC/链路层的优化空间最大。我见过太多人只盯着发射功率调,却忽略了协议栈上层的调度策略。说白了,低功耗设计不是「省着用」,而是「用对地方」。

核心观点: 协议栈的每一层都有功耗优化的空间。物理层管「吃多少」,MAC/链路层管「吃多久」,网络层管「要不要吃」。三层都优化到位,才是真正的低功耗设计。

下一章,我会带你深入BLE的链路层,看看连接间隔、事件长度、跳频算法这些参数,到底怎么调才能省电。嗯,那才是真正见功夫的地方。