4. UE状态与迁移:IDLE态、CONNECTED态、PSM态、eDRX态的定义与状态迁移条件

各位好,这一章我们来聊聊NB-IoT终端的状态机。说实话,很多刚入行的朋友容易把状态迁移搞混,尤其是PSM和eDRX这两个省电模式,经常有人问我:“它们到底有啥区别?”

嗯,咱们今天就把这四个状态彻底讲清楚。我习惯把UE的状态比作一个人的一天——有工作、有休息、有深度睡眠、还有打盹儿。你想想看,是不是挺形象的?

4.1 四大状态定义

NB-IoT的UE(终端)有四个核心状态,分别是:IDLE态CONNECTED态PSM态eDRX态。每个状态都有它存在的意义,说白了就是为了在功耗和响应速度之间找个平衡点。

状态 英文全称 核心特征 典型功耗
IDLE态 Idle State 可寻呼、可移动、可发起业务 ~3mA
CONNECTED态 Connected State 数据传输中、占用无线资源 ~50-200mA
PSM态 Power Saving Mode 深度休眠、不可寻呼 ~3-5μA
eDRX态 Extended Discontinuous Reception 扩展不连续接收、可寻呼但周期长 ~0.5-2mA

我个人习惯把这张表贴在工位上,每次排查功耗问题时,先看一眼UE当前在哪个状态,问题就解决了一半。

4.2 状态迁移条件详解

状态迁移不是随便跳的,它有一套严格的触发条件。我画了个迁移图在脑子里,咱们一步步拆解。

4.2.1 IDLE态 → CONNECTED态

触发条件很简单:UE有上行数据要发,或者网络侧有下行数据要收

  • 上行触发:UE主动发起RRC连接请求(比如传感器上报数据)
  • 下行触发:网络侧寻呼UE,UE响应后建立连接

关键点:从IDLE到CONNECTED,UE需要完成随机接入过程(RACH)。我在项目中遇到过,有些模块在弱信号下反复重试RACH,导致功耗飙升。嗯,这里要注意,RACH失败次数多了,UE会退避,不是一直死磕。

4.2.2 CONNECTED态 → IDLE态

数据传完了,网络侧会释放RRC连接。触发条件包括:

  • 数据不活动定时器超时(通常配置为10-20秒)
  • 网络侧主动释放(比如核心网发RRC Release)
  • 无线链路失败(RLF)后回退

说白了,就是“没事干了,别占着茅坑不拉屎”。

4.2.3 CONNECTED态 → PSM态

这个迁移有点特殊。UE在CONNECTED态结束后,会先进入IDLE态,然后根据网络配置的TAU周期Active Time来决定是否进入PSM。

我的经验:Active Time这个参数很关键。我曾经帮一个客户排查功耗问题,发现他们的UE每隔几分钟就唤醒一次,就是因为Active Time设得太短,UE还没来得及进入PSM就被唤醒了。建议Active Time设置成5-10秒,给UE一个缓冲窗口。

PSM态的进入条件:

  • UE在IDLE态下,TAU定时器未超时
  • UE没有待发送的数据
  • 网络侧在Attach Accept或TAU Accept中携带了PSM参数

4.2.4 IDLE态 → eDRX态

eDRX是IDLE态的一种特殊子状态。UE在IDLE态下,如果网络支持eDRX且UE也支持,就会协商进入eDRX模式。

触发条件:

  • UE在Attach Request或TAU Request中携带eDRX能力
  • 网络侧在响应中确认eDRX参数(寻呼周期、超帧长度等)

避坑指南:我曾经遇到过,有些运营商网络不支持eDRX,但UE硬要协商,结果网络侧直接忽略,UE就退回到普通DRX模式。所以,别以为配置了eDRX就一定能用,先确认网络侧支持不支持。

4.2.5 PSM态 → IDLE态

PSM态的唤醒条件有两个:

  • TAU周期超时:UE必须定期醒来做TAU,否则网络侧会认为UE失联
  • 有上行数据要发:比如传感器采集到了新数据

注意,PSM态的UE是不可寻呼的。你想想看,如果服务器想下发指令,UE却在深度睡眠,那只能等它自己醒来。这就是为什么很多NB-IoT应用采用“上行触发+下行缓存”的模式。

4.3 状态迁移完整流程图

我习惯用代码来模拟状态机,这样更直观。下面是一个简化的状态迁移逻辑:

// 伪代码:NB-IoT UE状态迁移
enum UEState {
    IDLE,
    CONNECTED,
    PSM,
    eDRX
}

void stateMachine(Event event) {
    switch (currentState) {
        case IDLE:
            if (event == DATA_TO_SEND || event == PAGING_RECEIVED) {
                // 发起RRC连接
                currentState = CONNECTED;
            } else if (event == eDRX_NEGOTIATED) {
                currentState = eDRX;
            }
            break;
        case CONNECTED:
            if (event == DATA_COMPLETE || event == INACTIVITY_TIMEOUT) {
                // 进入IDLE,等待Active Time
                startActiveTimer();
                currentState = IDLE;
            }
            break;
        case PSM:
            if (event == TAU_TIMER_EXPIRED || event == DATA_TO_SEND) {
                // 唤醒,发起TAU或数据发送
                currentState = IDLE;
            }
            break;
        case eDRX:
            if (event == DATA_TO_SEND || event == PAGING_RECEIVED) {
                // 退出eDRX,进入CONNECTED
                currentState = CONNECTED;
            } else if (event == eDRX_TIMEOUT) {
                // 回到普通IDLE
                currentState = IDLE;
            }
            break;
    }
}

4.4 实际项目中的状态迁移问题

我记得有一次,一个做智能水表的客户反馈,他们的设备电池只能用3个月,而设计目标是5年。我一看日志就发现问题了——UE几乎一直处于CONNECTED态,根本没进入PSM。

排查下来,原因是数据上报频率太高(每5分钟一次),而且每次上报后网络侧释放连接太慢。我建议他们把上报间隔改成1小时,同时调整了Inactivity Timer从20秒降到10秒。结果电池寿命直接提升到了4年半。

所以,状态迁移的优化,说白了就是三个字:控节奏

4.5 各状态下的关键参数配置建议

参数 影响的状态 推荐值 说明
Active Time IDLE → PSM 5-10秒 给UE足够时间进入PSM
TAU周期 PSM → IDLE 24小时(典型) 根据业务需求调整,越长越省电
eDRX周期 eDRX 20.48秒(NB-IoT典型) 平衡寻呼延迟和功耗
Inactivity Timer CONNECTED → IDLE 10-20秒 数据传完后尽快释放资源

小技巧:如果你不确定参数怎么配,可以先从运营商默认值开始。我习惯用抓包工具(比如Wireshark)看Attach Accept消息里的参数,网络侧配了什么,UE就跟着走。别自己瞎改,容易出问题。

好了,这一章的内容就到这里。状态迁移是NB-IoT功耗优化的核心,你只要把IDLE、CONNECTED、PSM、eDRX这四个状态搞明白,再配合参数调优,基本上就能解决80%的功耗问题。下一章咱们聊聊具体的注册流程,到时候会用到这些状态知识。