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不是互斥的,它们可以协同工作。典型的策略是这样的:
- 终端刚上电或上报数据后:先进入eDRX模式,保持网络可达,等待可能的控制指令。
- 如果一段时间内没有下行数据:终端主动请求进入PSM模式,彻底休眠。
- 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微安的实战案例。