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

综上
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

日志
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 的索引。
知识介绍
参考:
