4. eDRX模式深度解析:eDRX周期计算、寻呼窗口与休眠窗口、eDRX与PSM的协同策略

各位同学,咱们今天来啃一块硬骨头——eDRX模式。说实话,我在刚接触NB-IoT那会儿,觉得eDRX就是个“增强版DRX”,没啥大不了的。结果第一次做项目调试,终端死活收不到下行数据,查了三天才发现是eDRX周期配置和基站侧没对齐。嗯,从那以后,我再也不敢小看这个模式了。

eDRX,全称是extended Discontinuous Reception,扩展非连续接收。说白了,就是让终端在大部分时间睡觉,只在特定时间醒来听一听有没有自己的寻呼消息。跟PSM那种“关机式”休眠不同,eDRX还保留着网络连接,只是把监听间隔拉得很长。

4.1 eDRX周期计算:你得知道基站和终端怎么“约时间”

eDRX周期,是终端两次监听寻呼窗口之间的时间间隔。这个值不是随便设的,它由网络侧通过RRC连接重配置消息或者ATTACH ACCEPT消息下发给终端。

我个人习惯把eDRX周期拆成两部分来看:

  • 超帧(Hyper-SFN):eDRX周期以超帧为单位,一个超帧是1024个无线帧,约10.24秒。
  • 寻呼时间窗口(PTW):终端真正醒来的时间段,长度由网络配置。

eDRX周期的计算公式是这样的:

T_eDRX = 2^(eDRX_cycle_param) * 1.28 秒

其中eDRX_cycle_param是网络下发的参数,取值范围是3到11。举个例子:

eDRX_cycle_param T_eDRX(秒) 典型应用场景
3 10.24 智能电表(频繁上报)
6 81.92 智能路灯(分钟级控制)
9 655.36 环境监测(小时级唤醒)
11 2621.44 极低功耗场景(接近PSM)

重要提醒:eDRX周期越长,省电效果越好,但下行响应延迟也越大。比如周期设为655秒,那终端最长可能要等10分钟才能收到下行数据。这在智能门锁场景里是致命的——用户按门铃,结果等10分钟才开门,这谁受得了?

4.2 寻呼窗口与休眠窗口:终端的时间管理艺术

eDRX模式下,终端的时间被分成两个窗口:

  • 寻呼时间窗口(PTW):终端醒来,监听PDCCH,检查是否有自己的寻呼消息。
  • 休眠窗口:终端进入深度睡眠,几乎不耗电。

PTW的长度由网络配置,通常设置为几个到几十个无线帧。我建议PTW不要设得太短,否则容易漏掉寻呼。但也不能太长,否则省电效果打折扣。

这里有个经验值:PTW长度一般设为eDRX周期的1%到5%。比如eDRX周期是81.92秒,PTW设1秒左右就够用了。我在项目中遇到过把PTW设成0.5秒的情况,结果终端经常漏掉寻呼,导致下行数据重传,反而更费电。你想想看,这多冤啊。

调试技巧:用抓包工具看RRC连接重配置消息,找到eDRX-Config-r13字段,里面包含了eDRX周期和PTW长度。我曾经靠这个字段定位了一个终端频繁掉线的问题——原来是PTW太短,终端还没完成小区重选就进入休眠了。

4.3 eDRX与PSM的协同策略:双剑合璧还是二选一?

很多同学问我:eDRX和PSM到底选哪个?我的回答是:小孩子才做选择,成年人两个都要。

eDRX和PSM不是互斥的,它们可以协同工作。典型的策略是这样的:

  1. 终端刚上电或上报数据后:先进入eDRX模式,保持网络可达,等待可能的控制指令。
  2. 如果一段时间内没有下行数据:终端主动请求进入PSM模式,彻底休眠。
  3. PSM定时器到期或主动上报:终端醒来,再次进入eDRX模式。

这种策略的好处是:既保证了短时间内的下行可达性,又实现了长时间的超低功耗。我在智能水表项目里就是这么干的——水表每天上报一次数据,上报后进入eDRX模式等2小时,如果平台没有下发指令,就进入PSM直到第二天。

避坑指南:我曾经在某个项目中,把eDRX周期设得特别长(接近PSM),结果终端进入eDRX后,网络侧以为它还在线,实际上它已经收不到寻呼了。这导致平台一直显示终端在线,但下发指令永远超时。后来我学乖了:eDRX周期不要超过TAU周期的一半,否则网络侧会认为终端失联。

最后说一个我个人的习惯:在代码里把eDRX和PSM的切换逻辑做成状态机,清晰明了。伪代码大概是这样的:

switch (power_mode) {
    case POWER_MODE_ACTIVE:
        // 上报数据,等待指令
        if (no_downlink_data_for(T_eDRX_wait)) {
            request_psm();
            power_mode = POWER_MODE_PSM;
        }
        break;
    case POWER_MODE_EDRX:
        // 监听寻呼,但大部分时间休眠
        if (psm_timer_expired()) {
            power_mode = POWER_MODE_PSM;
        }
        break;
    case POWER_MODE_PSM:
        // 深度休眠,直到TAU或主动上报
        if (tau_timer_expired() || report_timer_expired()) {
            wake_up();
            power_mode = POWER_MODE_ACTIVE;
        }
        break;
}

嗯,这个状态机我用了好几年,基本没出过问题。你们在实际项目中可以直接套用,但记得根据具体场景调整超时参数。

好了,eDRX模式的核心内容就这些。下一节咱们聊聊PSM模式的深度优化,到时候我会分享一个把待机电流压到2微安的实战案例。