4. Thread低功耗设计原理

Thread网络中的终端设备(End Device)之所以能实现长时间电池供电,核心在于它并不需要像路由器那样持续保持射频收发能力。Thread将设备角色划分为Router、REED、FED、MED、SED、SSED等类型,其中真正承担低功耗使命的是休眠终端设备(SED,Sleepy End Device)以及同步休眠终端设备(SSED)。理解低功耗设计,本质上要回答一个问题:设备在“不监听”的时间里,网络如何保证它仍然可达、仍然能收到属于自己的数据?答案由四个机制共同支撑——休眠机制、父节点缓存、数据轮询、异步通信。

休眠机制:把射频占空比压到最低

SED在大部分时间里处于休眠状态,射频收发器关闭,MCU进入低功耗模式,只有定时器在运行。它并不会完全脱离网络,而是周期性地“醒来”一次,完成必要的网络维护动作后再睡回去。这个周期性醒来的间隔,就是轮询间隔(Poll Period)。

从功耗角度看,设备平均电流近似由三部分构成:休眠电流、唤醒期间的收发电流、以及唤醒动作本身的固定开销。设休眠电流为 I_sleep,唤醒时平均电流为 I_active,占空比为 D,则平均电流约为 I_avg ≈ I_sleep + D × (I_active − I_sleep)。举例来说,若某SED休眠电流约 2 µA,唤醒收发时平均电流约 8 mA,轮询间隔为 5 秒、每次唤醒约 8 ms,则占空比约为 0.16%,平均电流大致在 15 µA 量级。这个数量级说明:轮询间隔每拉长一倍,平均电流大致减半,但代价是下行时延变大。

父节点缓存:让“睡着”的设备仍然可达

SED在入网时会选择一个父节点(Parent),通常是附近的Router或FED。父节点为每个子设备维护一份“间接数据队列”。当网络中有其他节点要向这个SED发送数据时,数据不会直接空口发给正在休眠的SED,而是先被父节点缓存起来。父节点在收到目的地址为该SED的IPv6数据包时,将其放入该子设备对应的缓存队列,并等待子设备下一次轮询时取走。

缓存能力是有限的。Thread规范要求父节点至少为每个子设备缓存一定数量的数据,实际实现中常见为若干条消息或若干KB。如果缓存溢出,父节点会丢弃最旧或无法容纳的数据,表现为下行丢包。因此,父节点缓存深度与轮询间隔必须匹配:轮询间隔越长,单位时间内可能堆积的下行数据越多,对缓存深度的要求越高。

Thread 低功耗终端:休眠—缓存—轮询—异步通信关系 父节点 Router / FED 始终在线,射频常开 间接数据缓存队列 为每个 SED 单独维护 缓存深度有限,溢出即丢包 休眠终端 SED / SSED 射频大部分时间关闭 休眠 / 唤醒 周期 定时器驱动,Poll Period 醒来仅做必要收发 上行数据(随时可发) 下行数据先入父节点缓存 数据轮询 Data Poll(醒来时发起) SED 时间轴与功耗分布 休眠 I_sleep 唤醒 休眠 唤醒 休眠 唤醒 休眠 轮询间隔 Poll Period 轮询间隔 Poll Period 功耗与时延的权衡 轮询间隔短 → 时延低、功耗高 轮询间隔长 → 功耗低、时延高 缓存深度需匹配轮询间隔

数据轮询:SED主动“取件”

数据轮询是SED与父节点之间的一种请求—响应交互。SED醒来后,向父节点发送一条Data Poll消息(在IEEE 802.15.4层表现为Data Request),父节点收到后检查该子设备的缓存队列:如果有数据,就立即下发;如果没有,则回复一个空确认。SED收到响应后即可回到休眠。

轮询间隔的取值直接决定下行时延的上界。若轮询间隔为 T_poll,则下行数据从到达父节点到被SED取走,最坏情况约等于 T_poll。对于需要快速下发的场景,T_poll 通常取几百毫秒到数秒;对于抄表、传感器上报这类容忍分钟级时延的场景,T_poll 可以取到数十秒甚至更长。Thread允许通过Child Update和轮询周期协商来调整这一参数。

异步通信:不依赖轮询的即时下行

如果所有下行都必须等SED轮询,时延就会受限于轮询间隔。为此Thread引入了异步通信机制:当父节点有数据要发给SED时,可以主动发送一条唤醒消息(如IEEE 802.15.4的Data Pending指示或Thread的异步唤醒),提示SED“有数据待取”。SED收到后立即发起一次数据轮询,把数据取走。这样,下行时延不再受轮询间隔约束,而是由唤醒消息的到达时刻决定。

异步通信的代价是SED必须保持一定程度的“可被唤醒”能力。SSED(同步休眠终端)通过周期性监听父节点的广播或信标来接收唤醒指示,其监听窗口比完整轮询更短,但比纯SED更频繁。因此SSED的功耗通常高于SED,但下行时延显著更低。选择SED还是SSED,本质上是在“平均功耗”和“下行响应速度”之间做取舍。

参数配置示例与判断依据

下面给出一组教学示例参数,用于说明轮询间隔、缓存深度与功耗之间的关系。这些数值属于合理假设,实际应以芯片手册和实测为准。

场景:电池供电温湿度传感器,每 60 s 上报一次
设备角色:SED
休眠电流 I_sleep:约 2 µA
唤醒收发平均电流 I_active:约 8 mA
单次唤醒时长:约 8 ms

轮询间隔 T_poll = 5 s:
  占空比 D = 8 ms / 5000 ms = 0.16%
  平均电流 ≈ 2 µA + 0.0016 × (8000 − 2) µA ≈ 14.8 µA

轮询间隔 T_poll = 30 s:
  占空比 D = 8 ms / 30000 ms ≈ 0.027%
  平均电流 ≈ 2 µA + 0.00027 × 8000 µA ≈ 4.2 µA

判断依据:
  若下行命令要求 5 s 内到达 → 选 T_poll ≤ 5 s
  若下行仅需分钟级到达 → 可放宽到 30 s 甚至更长
  父节点缓存深度应 ≥ 一个轮询周期内可能到达的下行消息数

从这组示例可以看到,轮询间隔从5秒放宽到30秒,平均电流从约15 µA降到约4 µA,降幅接近四倍。但若此时有下行命令,最坏时延也从5秒变成30秒。因此在实际工程中,通常先根据业务对下行时延的要求确定 T_poll 的上限,再在该上限内尽量取大值以省电;同时检查父节点缓存深度是否足以容纳一个轮询周期内的下行流量,避免因缓存溢出造成丢包。

如果设备既需要低功耗,又需要较快的下行响应,可以优先考虑SSED角色,或使用异步唤醒机制,而不是一味缩短轮询间隔。缩短轮询间隔会成比例增加平均电流,而异步唤醒只在有数据时才触发额外唤醒,通常更划算。
轮询间隔设置过长时,除了时延增大,还要注意父节点缓存溢出风险。若父节点缓存已满,新到达的下行数据会被丢弃,且SED在下次轮询时无法感知“曾经有数据来过”。对可靠性要求高的下行命令,应配合应用层确认与重传机制。

综合来看,Thread低功耗设计并不是单一参数决定的,而是休眠机制、父节点缓存、数据轮询和异步通信四者协同的结果。休眠机制决定了功耗下限,轮询间隔决定了平均功耗与下行时延的平衡点,父节点缓存决定了在两次轮询之间能暂存多少下行数据,异步通信则提供了突破轮询间隔限制的快速下行通道。理解这四者的关系,才能在实际项目中为不同业务选择合适的设备角色和参数组合。