Advertisement

Android Telephony 网络状态中的 NAS 信息

阅读量:

引言

上层如何拿到 NAS 信息?那么首先要知道什么是 NAS。

领域知识

术语表

通信网络术语 | 英文缩写| 英文全称| 中文含义 |

--- --- ---
RRC Radio Resource Control 无线资源控制层
PDCP Packet Data Convergence Protocol 分组数据汇聚协议层
RLC Radio Link Control 无线链路控制层
MAC Medium Access Control 媒体接入控制层
UE User Equipment 用户设备
MME 移动性管理实体
AMF 移动性管理功能
RAN 无线电接入网络
SMF 会话管理功能
EPC Evolved Packet Core 演进分组核心
EPS Evolved Packet System 演进的分组系统(第4代移动通信) 可认为 EPS = UE+LTE+EPC
ESM EPS Session Management EPS会话管理
EMM EPS Mobility Management EPS移动性管理协议 (有Deregistered注销和Registered注册两种状态)
SA-AP Service Access Application Protocol 流控制传输协议
NR-AP NG Application Protocol 下一代应用协议?(早期文档或草稿可称SA-AP)
SCTP Stream Control Transmission Protocol 服务访问应用协议
IP Internet Protocol 网络层,L3
L2 / 数据链路层,即Data Link Layer
L1 / 物理层
E-UTRAN Evolved Universal Terrestrial Radio Access Network 演进的通用陆地无线接入网络

NAS 介绍

NAS属于协议范畴内容,NAS只有控制面,且是控制面最高层 ,它与MME直通信(通过RRC在空口上传送。

在无线通信网络中,NAS 作为非接入层是演进分组系统或 5G 核心网中的一组协议。NAS用于在UE 和移动管理实体(MME/AMF)之间传送非无线电信令,以实现 NR/LTE/E-UTRAN 接入。

NAS协议分组中可以将其分为两部分:分别是EPS移动性管理(EMM)和EPS会话管理(ESM)。

协议栈分层结构

  • LTE控制面层级自上而下依次为:NAS - RRC - PDCP - RLC - MAC - L1(PHT物理层)
  • 5G(NR)控制面(C-plane)信令在 gNB(基站)和AMF(核心网)间的协议栈结构:NAS -> SA-AP -> SCTP -> IP -> L2 -> L1

图示格式化:

复制代码
 NAS      ← 控制面最高层(核心网MME/UE间管理/控制消息,非接入层)

    
 RRC      ← 无线资源控制层(承载NAS信令/无线链路控制,接入层)
    
 PDCP     ← 分组数据汇聚(安全加密,头压缩,承载RRC等)
    
 RLC      ← 无线链路控制(重传、分片合并等)
    
 MAC      ← 多路复用/调度/优先级/ARQ
    
 PHY      ← 物理层(调制、解调、信道编解码等)

参考3GPP官方(TS 36.300)结构图,简化如下:

复制代码
  |   控制面(Control Plane)            用户面(User Plane)
    
||

    
  |   +---------+                  +-------------+
    
|NAS|应用/IP|||

    
  |   +---------+                  +-------------+
    
|RRC|(无RRC)|||

    
  |   +---------+------------------+-------------+
    
|PDCP|PDCP|||

    
  |   +---------+------------------+-------------+
    
|RLC|RLC|||

    
  |   +---------+------------------+-------------+
    
|MAC|MAC|||

    
  |   +---------+------------------+-------------+
    
|PHY|PHY|||

    
  +--------------------------------+-------------+
    
       UE            无线接口           eNodeB
![](https://ad.itadn.com/c/weblog/blog-img/images/2025-08-17/B1WkXpngSdQM58bx90zuTUijAIyo.png)

综上

LTE 协议栈组成部分(自上而下) | 控制面层级| 用户面层级 |

--- ---
RRC
PDCP PDCP
RLC RLC
MAC MAC
PHY PHY

相关代码

DataNetworkController

复制代码
     /** * Called when service state changed.
    
      */
    
     // Note that this is only called when data RAT or data registration changed. If we need to know
    
     // more "changed" events other than data RAT and data registration state, we should add
    
     // a new listening ServiceStateTracker.registerForServiceStateChanged().
    
     private void onServiceStateChanged() {
    
     // Use the raw service state instead of the mPhone.getServiceState().
    
     ServiceState newServiceState = mPhone.getServiceStateTracker().getServiceState();
    
     StringBuilder debugMessage = new StringBuilder("onServiceStateChanged: ");
    
     boolean evaluateNetworkRequests = false, evaluateDataNetworks = false;
    
  
    
     if (!mServiceState.equals(newServiceState)) {
    
         log("onServiceStateChanged: changed to " + newServiceState);
    
         for (int transport : mAccessNetworksManager.getAvailableTransports()) {
    
             NetworkRegistrationInfo oldNri = mServiceState.getNetworkRegistrationInfo(
    
                     NetworkRegistrationInfo.DOMAIN_PS, transport);
    
             NetworkRegistrationInfo newNri = newServiceState.getNetworkRegistrationInfo(
    
                     NetworkRegistrationInfo.DOMAIN_PS, transport);
    
             debugMessage.append("[").append(
    
                     AccessNetworkConstants.transportTypeToString(transport)).append(": ");
    
             debugMessage.append(oldNri != null ? TelephonyManager.getNetworkTypeName(
    
                     oldNri.getAccessNetworkTechnology()) : null);
    
             debugMessage.append("->").append(
    
                     newNri != null ? TelephonyManager.getNetworkTypeName(
    
                             newNri.getAccessNetworkTechnology()) : null).append(", ");
    
             debugMessage.append(
    
                     oldNri != null ? NetworkRegistrationInfo.registrationStateToString(
    
                             oldNri.getRegistrationState()) : null);
    
             debugMessage.append("->").append(newNri != null
    
                     ? NetworkRegistrationInfo.registrationStateToString(
    
                     newNri.getRegistrationState()) : null).append(", ");
    
             debugMessage.append(oldNri != null ? NetworkRegistrationInfo
    
                     .isNonTerrestrialNetworkToString(oldNri.isNonTerrestrialNetwork()) : null);
    
             debugMessage.append("->").append(newNri != null ? NetworkRegistrationInfo
    
                     .isNonTerrestrialNetworkToString(newNri.isNonTerrestrialNetwork()) : null)
    
                     .append("] ");
    
             if (shouldReevaluateDataNetworks(oldNri, newNri)) {
    
                 if (!hasMessages(EVENT_REEVALUATE_EXISTING_DATA_NETWORKS)) {
    
                     sendMessage(obtainMessage(EVENT_REEVALUATE_EXISTING_DATA_NETWORKS,
    
                             DataEvaluationReason.DATA_SERVICE_STATE_CHANGED));
    
                     evaluateDataNetworks = true;
    
                 }
    
             }
    
             if (shouldReevaluateNetworkRequests(mServiceState, newServiceState, transport)) {
    
                 if (!hasMessages(EVENT_REEVALUATE_UNSATISFIED_NETWORK_REQUESTS)) {
    
                     sendMessage(obtainMessage(EVENT_REEVALUATE_UNSATISFIED_NETWORK_REQUESTS,
    
                             DataEvaluationReason.DATA_SERVICE_STATE_CHANGED));
    
                     evaluateNetworkRequests = true;
    
                 }
    
             }
    
         }
    
         mServiceState = newServiceState;
    
     } else {
    
         debugMessage.append("not changed");
    
     }
    
     debugMessage.append(". Evaluating network requests is ").append(
    
             evaluateNetworkRequests ? "" : "not ").append(
    
             "needed, evaluating existing data networks is ").append(
    
             evaluateDataNetworks ? "" : "not ").append("needed.");
    
     log(debugMessage.toString());
    
     }
    
    
    
    
    java
    
    
![](https://ad.itadn.com/c/weblog/blog-img/images/2025-08-17/LHsTJtF1fbXqudyoZ7A5lDNj4pz6.png)

日志

06-30 16:34:51.163 2250 2250 I RRT : onServiceStateChanged ServiceState = {mVoiceRegState=1(OUT_OF_SERVICE), mDataRegState=1(OUT_OF_SERVICE), mChannelNumber=0, duplexMode()=0, mCellBandwidths=[], mOperatorAlphaLong=null, mOperatorAlphaShort=null, isManualNetworkSelection=false(automatic), getRilVoiceRadioTechnology=0(Unknown), getRilDataRadioTechnology=0(Unknown), mCssIndicator=unsupported, mNetworkId=0, mSystemId=0, mCdmaRoamingIndicator=0, mCdmaDefaultRoamingIndicator=0, mIsEmergencyOnly=false, isUsingCarrierAggregation=false, mArfcnRsrpBoost=0, mNetworkRegistrationInfos=[], mNrFrequencyRange=0, mOperatorAlphaLongRaw=null, mOperatorAlphaShortRaw=null, mIsDataRoamingFromRegistration=false, mIsIwlanPreferred=false, mIsUsingNonTerrestrialNetwork=false}

06-30 16:34:51.574 2250 2250 D DNC-1 : onServiceStateChanged: changed to {mVoiceRegState=3(POWER_OFF), mDataRegState=3(POWER_OFF), mChannelNumber=-1, duplexMode()=0, mCellBandwidths=[], mOperatorAlphaLong=null, mOperatorAlphaShort=null, isManualNetworkSelection=false(automatic), getRilVoiceRadioTechnology=0(Unknown), getRilDataRadioTechnology=0(Unknown), mCssIndicator=unsupported, mNetworkId=-1, mSystemId=-1, mCdmaRoamingIndicator=-1, mCdmaDefaultRoamingIndicator=-1, mIsEmergencyOnly=false, isUsingCarrierAggregation=false, mArfcnRsrpBoost=0, mNetworkRegistrationInfos=[NetworkRegistrationInfo{ domain=CS transportType=WWAN registrationState=UNKNOWN networkRegistrationState=UNKNOWN roamingType=NOT_ROAMING accessNetworkTechnology=UNKNOWN rejectCause=0 emergencyEnabled=false availableServices=[] cellIdentity=null voiceSpecificInfo=null dataSpecificInfo=null nrState=NONE rRplmn= isUsingCarrierAggregation=false isNonTerrestrialNetwork=TERRESTRIAL}, NetworkRegistrationInfo{ domain=PS transportType=WWAN registrationState=UNKNOWN networkRegistrationState=UNKNOWN roamingType=NOT_ROAMING accessNetworkTechnology=UNKNOWN rejectCause=0 emergencyEnabled=false availableServices=[] cellIdentity=null voiceSpecificInfo=null dataSpecificInfo=null nrState=NONE rRplmn= isUsingCarrierAggregation=false isNonTerrestrialNetwork=TERRESTRIAL}, NetworkRegistrationInfo{ domain=PS transportType=WLAN registrationState=UNKNOWN networkRegistrationState=UNKNOWN roamingType=NOT_ROAMING accessNetworkTechnology=UNKNOWN rejectCause=0 emergencyEnabled=false availableServices=[] cellIdentity=null voiceSpecificInfo=null dataSpecificInfo=null nrState=NONE rRplmn= isUsingCarrierAggregation=false isNonTerrestrialNetwork=TERRESTRIAL}], mNrFrequencyRange=0, mOperatorAlphaLongRaw=null, mOperatorAlphaShortRaw=null, mIsDataRoamingFromRegistration=false, mIsIwlanPreferred=false, mIsUsingNonTerrestrialNetwork=false}
06-30 16:34:51.574 2250 2250 D DNC-1 : onServiceStateChanged: [WWAN: UNKNOWN->UNKNOWN, UNKNOWN->UNKNOWN, TERRESTRIAL->TERRESTRIAL] [WLAN: UNKNOWN->UNKNOWN, UNKNOWN->UNKNOWN, TERRESTRIAL->TERRESTRIAL] . Evaluating network requests is not needed, evaluating existing data networks is not needed.

将上面的日志格式化,得到 SS 变化完整信息,也就是 ServiceState 对象内容

Q:如何感知状态变化,触发 VoPS 和 EmergencyAccessBarred 信息记录?

A:SS变化的时候,包含了mVopsSupport 和 mEmcBearerSupport 信息,应该可以作为 PS 和 EmergencyAccessBarred 的索引。

知识介绍

参考:

AS(接入层)和NAS(非接入层)_nas和as-博客

NAS非接入层协议学习(二)_nas协议(非接入层协议)处理之间信息的传输-博客

全部评论 (0)

还没有任何评论哟~