一、概述:卫星通话的特点与挑战
1.1 AOSP 卫星通话的现状
关键发现:当前 AOSP 卫星框架(Android 14-16)原生不支持卫星语音通话。框架仅支持数据报(Datagram)模式的短消息通信。卫星语音通话的实现依赖于两条路径:
| 路径 | 机制 | 现状 |
|---|---|---|
| 运营商 NTN 漫游 | 3GPP NR-NTN / LTE-NTN 的 VoNR/VoLTE | Modem/RRC 层面支持,Android 框架复用现有 IMS/VoLTE 流程 |
| OEM 卫星模式 | 厂商私有方案(天通、铱星等) | 完全由厂商实现,AOSP 仅提供紧急呼叫切换(T911/SOS) |
AOSP 中的语音相关代码主要体现在:
- SatelliteSOSMessageRecommender.java:紧急呼叫→卫星消息切换推荐
- SatelliteController.java 中的
EMERGENCY_CALL_TO_SATELLITE_HANDOVER_TYPE:紧急呼叫到卫星的切换类型 - SatelliteNetworkInfo.java:
mAllowedServicesInfo包含"voice"服务类型映射 getSatelliteVoiceServicePolicyForPlmn():按 PLMN 查询语音服务策略
1.2 卫星通话的核心挑战
| 挑战 | 地面网络 | 卫星网络 | 影响 |
|---|---|---|---|
| 传播延迟 | 1-10ms (地面) | 20-40ms (LEO) / 250-600ms (GEO) | 信令超时、通话感知延迟 |
| 多普勒频移 | 可忽略 | ±50kHz (LEO) | 上行频率偏移、接收机失锁 |
| 定时提前量 | 静态/慢变 | 快速变化(km/s级卫星移动) | 上行同步丢失 |
| 带宽受限 | 10-100Mbps | 几十kbps-几Mbps | 编解码选择受限 |
| 波束覆盖 | 固定小区 | 移动波束/卫星 | 频繁切换 |
| 功耗 | 中等 | 高(发射功率大) | 通话时长受限 |
二、主叫通话建立流程
2.1 运营商 NTN 漫游模式(VoNR/VoLTE over NTN)
此模式下,终端通过 3GPP NTN 网络附着,复用标准 IMS/VoLTE 流程。Android 框架层无需特殊修改。
┌─────────────────────────────────────────────────────────────────────────────┐
│ 主叫流程 (VoNR over NTN) │
├─────────────────────────────────────────────────────────────────────────────┤
│ │
│ ① 用户拨号 │
│ Dialer App │
│ │ TelecomManager.placeCall(uri) │
│ ▼ │
│ TelecomService │
│ │ → TelephonyConnectionService.createConnection() │
│ ▼ │
│ TelephonyConnection │
│ │ → GsmCdmaPhone.dial() │
│ ▼ │
│ RILJ │
│ │ → RIL.dial(address, clirMode, uusInfo) │
│ │ [IRadio AIDL: dial()] │
│ ▼ │
│ ② RRC 连接建立(卫星增强) │
│ Modem │
│ │ PRACH Preamble → 卫星基站 │
│ │ [NTN增强: 扩展PRACH格式, 多普勒预补偿] │
│ │ RRCSetup → RRCSetupComplete │
│ │ [NTN增强: T300 = 2000ms (地面400ms)] │
│ ▼ │
│ ③ NAS 信令交互 │
│ UE → 卫星基站 → 核心网 │
│ │ CM_SERVICE_REQUEST │
│ │ [NTN增强: 含卫星位置信息] │
│ │ SETUP (含SDP offer: AMR-WB 12.65kbps) │
│ │ CALL_PROCEEDING │
│ │ ALERTING │
│ │ CONNECT │
│ │ [NTN增强: 总延迟 ≈ 1-3s (LEO) / 3-8s (GEO)] │
│ ▼ │
│ ④ 专用承载建立 │
│ 核心网 → 卫星基站 → UE │
│ │ RRCReconfiguration (QCI=1, GBR=32kbps) │
│ │ [NTN增强: 半静态调度(SPS) 或 动态调度] │
│ │ IMS SIP 200 OK (SDP answer) │
│ ▼ │
│ ⑤ 通话接通 │
│ Modem → RILJ │
│ │ RIL_UNSOL_CALL_STATE_CHANGED │
│ │ → CallTracker.handleCallStateChanged() │
│ │ → Phone.notifyPreciseCallStateChanged() │
│ │ → TelephonyConnection.updateState() = ACTIVE │
│ │ → InCallService.onCallStateChanged() │
│ │ → UI 显示通话中 │
│ └─────────────────────────────────────────────────────────────────────────┘
2.2 OEM 卫星模式(天通/铱星等)
此模式下,语音通话完全由厂商私有实现。AOSP 框架仅参与紧急呼叫到卫星消息的切换。
┌─────────────────────────────────────────────────────────────────────────────┐
│ OEM卫星主叫流程(以天通为例) │
├─────────────────────────────────────────────────────────────────────────────┤
│ │
│ ① 用户拨号(卫星模式已开启) │
│ Dialer App │
│ │ TelecomManager.placeCall() │
│ ▼ │
│ TelephonyConnectionService │
│ │ → TelephonyConnection │
│ │ → GsmCdmaPhone.dial() │
│ │ → RIL.dial() │
│ ▼ │
│ 厂商 RIL (QCRIL/MTK RIL) │
│ │ → 转换为厂商私有卫星呼叫命令 │
│ │ 高通: qmi_sat_call_setup() │
│ │ 天通: AT+CCALL=<number> │
│ ▼ │
│ ② 卫星注册检查 │
│ Modem │
│ │ 检查卫星注册状态 │
│ │ 检查波束锁定状态 │
│ │ 若未注册: 返回 SATELLITE_RESULT_INVALID_MODEM_STATE │
│ ▼ │
│ ③ 卫星呼叫信令 │
│ Modem → 卫星 │
│ │ 天通: TDM/FDMA 随路信令 │
│ │ 铱星: TDMA 时隙分配 + 呼叫请求 │
│ │ [延迟: 2-5s (LEO) / 5-15s (GEO)] │
│ ▼ │
│ ④ 语音信道分配 │
│ 卫星网关 │
│ │ 分配卫星信道(频率/时隙/码道) │
│ │ 建立卫星回程链路到 PSTN │
│ ▼ │
│ ⑤ 通话接通 │
│ Modem → RILJ → Phone → InCallService │
│ │ RIL_UNSOL_CALL_STATE_CHANGED (ACTIVE) │
│ └─────────────────────────────────────────────────────────────────────────┘
2.3 紧急呼叫到卫星切换(AOSP 原生实现)
这是 AOSP 中最接近"卫星语音通话"的功能——当紧急呼叫无法通过地面网络完成时,推荐用户切换到卫星消息。
关键类:SatelliteSOSMessageRecommender.java
┌─────────────────────────────────────────────────────────────────────────────┐
│ 紧急呼叫→卫星切换流程 │
├─────────────────────────────────────────────────────────────────────────────┤
│ │
│ ① 紧急呼叫发起 │
│ TelephonyConnectionService │
│ │ → SatelliteSOSMessageRecommender.onEmergencyCallStarted(connection) │
│ ▼ │
│ ② 监控紧急呼叫状态 │
│ SatelliteSOSMessageRecommender │
│ │ → handleEmergencyCallStartedEvent() │
│ │ → 启动超时定时器 (30s 默认) │
│ │ → 注册 IMS 注册状态变化监听 │
│ │ → 注册 ServiceState 变化监听 │
│ ▼ │
│ ③ 评估是否应推荐卫星 │
│ evaluateSendingConnectionEventDisplayEmergencyMessage() │
│ │ 条件: 定时器超时 + 卫星接入限制检查完成 │
│ │ → updateAndGetProvisionState() │
│ │ → 检查卫星是否在当前区域可用 │
│ ▼ │
│ ④ 确定切换类型 │
│ getEmergencyCallToSatelliteHandoverType() │
│ │ │
│ ├── EMERGENCY_CALL_TO_SATELLITE_HANDOVER_TYPE_T911 │
│ │ → 启动默认短信应用 → 打开 T911 对话线程 │
│ │ → Intent: ACTION_SENDTO, smsto:911 │
│ │ → 携带 EXTRA_SIM_SLOT_ID (卫星订阅所在卡槽) │
│ │ │
│ └── EMERGENCY_CALL_TO_SATELLITE_HANDOVER_TYPE_SOS │
│ → 启动 OEM 卫星消息应用 │
│ → Intent: 从 overlay config 获取 │
│ │
│ ⑤ 发送切换事件到拨号器 │
│ Connection.sendEvent(EVENT_DISPLAY_EMERGENCY_MESSAGE, bundle) │
│ │ bundle 包含: │
│ │ EXTRA_EMERGENCY_CALL_TO_SATELLITE_HANDOVER_TYPE │
│ │ EXTRA_EMERGENCY_CALL_TO_SATELLITE_LAUNCH_INTENT (PendingIntent) │
│ ▼ │
│ ⑥ 拨号器显示卫星切换提示 │
│ Dialer App (InCallService) │
│ │ → 显示"切换到卫星消息"按钮 │
│ │ → 用户点击 → 启动 PendingIntent │
│ │ → 打开卫星消息应用 │
│ └─────────────────────────────────────────────────────────────────────────┘
切换类型由 CarrierConfig 决定:
// SatelliteController.java L6568-6587
protected int getCarrierRoamingNtnEmergencyCallToSatelliteHandoverType(int subId) {
// 优先从 PLMN 级别配置获取
SatellitePerPlmnConfiguration config = mCurrentSatellitePerPlmnConfigurations.get(subId);
if (config != null) {
return config.handoverType;
}
// 回退到全局 CarrierConfig
return getConfigForSubId(subId).getInt(
KEY_CARRIER_ROAMING_NTN_EMERGENCY_CALL_TO_SATELLITE_HANDOVER_TYPE_INT);
}
关键配置:
| 配置键 | 说明 |
|---|---|
KEY_CARRIER_ROAMING_NTN_EMERGENCY_CALL_TO_SATELLITE_HANDOVER_TYPE_INT | 切换类型(SOS/T911) |
KEY_EMERGENCY_CALL_TO_SATELLITE_T911_HANDOVER_TIMEOUT_MILLIS_INT | T911 切换超时 |
KEY_SATELLITE_ROAMING_TURN_OFF_SESSION_FOR_EMERGENCY_CALL_BOOL | 紧急呼叫时是否关闭卫星会话 |
KEY_SATELLITE_ESOS_SUPPORTED_BOOL | 是否支持紧急SOS |
2.4 RILJ 构造呼叫控制消息
标准地面 VoLTE 流程中,RILJ 通过 IRadio AIDL 接口下发 dial() 命令:
// RIL.java
public void dial(String address, int clirMode, UUSInfo uusInfo, Message result) {
IRadio radio = getRadio();
Dial dialInfo = new Dial();
dialInfo.address = convertNullToEmptyString(address);
dialInfo.clir = clirMode;
// ... 设置 uusInfo
radio.dial(RIL.serialNo(dialInfo), dialInfo);
}
卫星场景下的差异:
- 运营商 NTN:RILJ 无需修改,Modem 内部处理卫星 RRC 增强
- OEM 卫星:厂商 RIL 扩展
dial()方法,检测到卫星模式时转换为私有命令
三、被叫通话建立流程
3.1 运营商 NTN 漫游模式
┌─────────────────────────────────────────────────────────────────────────────┐
│ 被叫流程 (VoNR over NTN) │
├─────────────────────────────────────────────────────────────────────────────┤
│ │
│ ① 核心网发起寻呼 │
│ AMF/MME │
│ │ → Paging (TAI list) │
│ │ [NTN增强: 卫星小区覆盖巨大,寻呼范围优化] │
│ │ - 3GPP R17: 引入 "NTN Tracking Area" 概念 │
│ │ - 基于 UE 位置信息缩小寻呼范围 │
│ │ - 波束索引寻呼 (beam-specific paging) │
│ ▼ │
│ ② 终端接收寻呼 │
│ Modem │
│ │ → RRC Paging 消息 │
│ │ → 检查是否为本终端的 TMSI/IMSI │
│ │ [NTN增强: 扩展 Paging DRX 周期适应卫星轨道] │
│ ▼ │
│ ③ 随机接入响应 │
│ UE → 卫星 │
│ │ PRACH Preamble │
│ │ [NTN增强: 多普勒预补偿 + TA 预补偿] │
│ │ RAR (Random Access Response) │
│ │ RRCSetupComplete │
│ ▼ │
│ ④ NAS 信令交互 │
│ UE ↔ 核心网 │
│ │ PAGING_RESPONSE │
│ │ SETUP (来电号码) │
│ │ CALL_CONFIRMED │
│ │ ALERTING (振铃) │
│ │ CONNECT (接听) │
│ ▼ │
│ ⑤ Android 框架通知 │
│ Modem → RILJ │
│ │ RIL_UNSOL_CALL_STATE_CHANGED (INCOMING) │
│ │ → CallTracker.handleCallStateChanged() │
│ │ → Phone.notifyNewRingingConnection() │
│ │ → TelephonyConnection.onRinging() │
│ │ → TelecomManager.addNewIncomingCall() │
│ │ → InCallService.onCallAdded() │
│ │ → UI 显示来电界面 │
│ └─────────────────────────────────────────────────────────────────────────┘
3.2 卫星寻呼优化
卫星小区覆盖范围巨大(LEO 波束直径约 50-500km,GEO 波束直径约 200-2000km),传统寻呼方式效率极低。3GPP R17/R18 引入以下优化:
| 优化方案 | 机制 | 3GPP 参考 |
|---|---|---|
| NTN Tracking Area | 基于卫星轨道定义 TA,而非地理区域 | TS 38.300 |
| UE 位置辅助寻呼 | UE 上报 GNSS 位置,核心网缩小寻呼范围 | TS 23.501 |
| 波束索引寻呼 | 在 Paging 消息中携带波束 ID | TS 38.331 |
| 扩展 Paging DRX | 支持 32-1024 帧 DRX 周期 | TS 38.304 |
| eDRX | 扩展不连续接收,降低待机功耗 | TS 38.304 |
3.3 OEM 卫星模式被叫
OEM 卫星模式(如天通)的被叫流程完全由厂商实现:
卫星网关收到PSTN来电
→ 通过卫星信令信道下发呼叫通知
→ Modem 接收 → RIL_UNSOL_CALL_STATE_CHANGED (RINGING)
→ RILJ → Phone → InCallService → UI 来电界面
→ 用户接听 → RIL.answer() → Modem → 卫星接听信令
→ 语音信道建立 → 通话开始
四、通话中的动态处理
4.1 多普勒频移补偿
问题:LEO 卫星相对地面速度约 7.5km/s,产生 ±50kHz 的多普勒频移。
3GPP R17 解决方案:
| 机制 | 描述 | 实现位置 |
|---|---|---|
| 开环预补偿 | UE 根据卫星星历和自身 GNSS 位置计算频偏,上行预补偿 | Modem 固件 |
| 闭环频率调整 | 网络侧下发频率调整指令(NIA/NRA) | 卫星基站 |
| 公共 TA 补偿 | 卫星广播公共定时提前量,UE 补偿传播延迟 | SIB19 |
| 星历下发 | SIB19 携带卫星星历(轨道参数、时间戳) | RRC System Information |
Android 框架层:多普勒补偿完全在 Modem 内部处理,Android 框架不参与。但 SatelliteModemInterface 中的 updateSystemSelectionChannels() 可用于下发卫星频点信息辅助 Modem 快速搜索。
// SatelliteController.java
public void updateSystemSelectionChannels(
@NonNull List<SystemSelectionSpecifier> specifiers, ...) {
mSatelliteModemInterface.updateSystemSelectionChannels(specifiers, onCompleted);
}
4.2 定时提前量(TA)管理
问题:卫星移动导致传播距离快速变化,TA 需要频繁更新。
3GPP R17 混合 TA 机制:
┌─────────────────────────────────────────────┐
│ TA 管理架构 │
│ │
│ 开环 TA(UE 自主) │
│ ├── UE 根据 GNSS 位置 + 卫星星历计算 │
│ ├── 公共 TA(SIB19 广播) │
│ └── 更新频率:每次发射前 │
│ │
│ 闭环 TA(网络控制) │
│ ├── 初始 TA:RAR 中 TA Command │
│ ├── 动态 TA:MAC CE TA Command │
│ └── 更新频率:每 2-10ms(取决于卫星速度) │
│ │
│ TA 验证 │
│ ├── UE 上报 TA 验证结果 │
│ └── 网络侧校验 UE 的开环 TA 估计 │
└─────────────────────────────────────────────┘
Android 框架层:TA 管理完全在 Modem 内部,Android 框架不直接参与。
4.3 波束/卫星切换
4.3.1 运营商 NTN 波束切换
┌─────────────────────────────────────────────────────────────────────────────┐
│ 通话中波束切换流程 (3GPP NTN) │
├─────────────────────────────────────────────────────────────────────────────┤
│ │
│ ① 测量与上报 │
│ UE (Modem) │
│ │ 周期性测量当前波束和邻波束的 RSRP/RSRQ │
│ │ → MeasurementReport (RRC) │
│ │ [NTN增强: 含卫星特定测量量 - 仰角、传播时延] │
│ ▼ │
│ ② 切换决策 │
│ 卫星基站 │
│ │ 基于测量报告 + 卫星轨道预测 + 负载均衡 │
│ │ → 决定切换目标波束/卫星 │
│ ▼ │
│ ③ 切换执行 │
│ 源波束 → 目标波束 │
│ │ RRCReconfiguration (handoverType = intra-satellite) │
│ │ [同卫星波束切换: 仅需频率/时隙重配] │
│ │ RRCReconfiguration (handoverType = inter-satellite) │
│ │ [跨卫星切换: 需要重新随机接入] │
│ │ → RACH → RAR → RRCReconfigurationComplete │
│ ▼ │
│ ④ 专用承载切换 │
│ 核心网 │
│ │ → Path Switch Request │
│ │ → 语音承载路径更新 │
│ │ → 通话继续(可能短暂中断 50-200ms) │
│ └─────────────────────────────────────────────────────────────────────────┘
Make-Before-Break(先建后断):
- 3GPP R18 引入 DAPS(Dual Active Protocol Stack)切换
- UE 同时维持与源波束和目标波束的连接
- 切换中断时间 < 0ms(零中断)
- 代价:UE 需要两套射频链路
4.3.2 Android 框架对切换的处理
Android 框架对卫星波束切换的处理是透明的——Modem 内部完成切换,框架仅通过 ServiceState 变化感知:
// SatelliteController.java L2897-2909
// 卫星会话可能需要为紧急呼叫关闭
if (!isDisableSatelliteWhileEnableInProgressSupported()) {
// 某些运营商希望在紧急呼叫时禁用卫星以优先处理紧急呼叫
return;
}
4.4 地面与卫星网络切换
当前 3GPP 标准支持情况:
| 切换方向 | 3GPP R17 | 3GPP R18 | 实际支持 |
|---|---|---|---|
| 地面 → 卫星 | ❌ (仅重选) | ⚠️ (NITNHO) | 有限 |
| 卫星 → 地面 | ❌ (仅重选) | ⚠️ (NTNHO) | 有限 |
| 卫星 → 卫星 | ✅ (波束间) | ✅ (卫星间) | 支持 |
NITNHO (Non-terrestrial Network to Terrestrial Network Handover):R18 引入的卫星→地面切换,但需要终端同时维持两个网络的连接。
Android 框架处理:
// SatelliteController.java
// 地面网络可用性变化处理
EVENT_TERRESTRIAL_NETWORK_AVAILABLE_CHANGED
→ 评估是否应关闭卫星
→ 若 CarrierConfig 允许自动切换:requestSatelliteEnabled(false)
→ 若需手动确认:发送通知
4.5 QoS 与拥塞控制
卫星语音 QoS 保障:
| 机制 | 地面 VoLTE | 卫星 VoNR/VoLTE | 说明 |
|---|---|---|---|
| QCI | QCI=1 (GBR) | QCI=1 (GBR) | 相同 |
| GBR | 32-64kbps | 16-32kbps | 卫星更低 |
| AMR 速率 | AMR-WB 12.65/23.85kbps | AMR 5.9-12.65kbps | 卫星用更低速率 |
| 调度方式 | SPS (半静态) | SPS 或动态 | 卫星更倾向动态 |
| 优先呼叫 | ARP 优先级 | ARP + 卫星专用优先级 | 紧急呼叫优先 |
AOSP 中的语音服务策略:
// SatelliteController.java L10223-10236
public int getSatelliteVoiceServicePolicyForPlmn(int subId, String plmn) {
Map<String, Integer> voiceServicePolicy =
mEntitlementVoiceServicePolicyMapPerCarrier.get(subId);
if (voiceServicePolicy != null && voiceServicePolicy.containsKey(plmn)) {
return voiceServicePolicy.get(plmn);
}
return 0; // Restricted (默认受限)
}
SatelliteNetworkInfo 中的语音服务:
// SatelliteNetworkInfo.java
// mAllowedServicesInfo: key=service type, value=service policy
// Possible Service Type: "data" and "voice"
// Possible Service Policy: "constrained" and "unconstrained"
五、通话释放流程
5.1 正常释放
┌─────────────────────────────────────────────────────────────────────────────┐
│ 正常通话释放流程 │
├─────────────────────────────────────────────────────────────────────────────┤
│ │
│ ① 用户挂机 │
│ InCallService.disconnect() │
│ │ → TelephonyConnection.hangup() │
│ │ → GsmCdmaPhone.hangup() │
│ │ → RIL.hangupForegroundResumeBackground() │
│ │ [IRadio AIDL: hangup()] │
│ ▼ │
│ ② Modem 发送释放信令 │
│ UE → 卫星基站 → 核心网 │
│ │ DISCONNECT (cause: normal) │
│ │ RELEASE │
│ │ RELEASE COMPLETE │
│ │ [NTN增强: 释放延迟 ≈ 0.5-3s (LEO) / 2-8s (GEO)] │
│ ▼ │
│ ③ 专用承载释放 │
│ 核心网 → 卫星基站 → UE │
│ │ RRCReconfiguration (释放 QCI=1 承载) │
│ │ 或 RRCConnectionRelease (完全释放) │
│ ▼ │
│ ④ Android 框架更新 │
│ Modem → RILJ │
│ │ RIL_UNSOL_CALL_STATE_CHANGED (IDLE) │
│ │ → CallTracker.handleCallStateChanged() │
│ │ → Phone.notifyPreciseCallStateChanged() │
│ │ → TelephonyConnection.updateState() = DISCONNECTED │
│ │ → InCallService.onCallRemoved() │
│ │ → UI 返回拨号器 │
│ ▼ │
│ ⑤ 卫星会话状态更新 │
│ SatelliteSessionController │
│ │ → 若无更多活动: TransferringState → ListeningState │
│ │ → ListeningTimer 超时 → IdleState │
│ │ → 不活动定时器超时 → ConnectedState → NotConnectedState │
│ │ → 最终可能回退到 PowerOffState │
│ └─────────────────────────────────────────────────────────────────────────┘
5.2 异常释放
| 异常场景 | Modem 行为 | Android 框架处理 |
|---|---|---|
| 信号丢失 | RLF (Radio Link Failure) → T310 超时 | CallTracker 检测到 IDLE → 通知 UI 掉话 |
| 定时器超时 | T300/T301 超时 → 释放 RRC | 同上 |
| 切换失败 | T304 超时 → RRC 连接重建 | 重建成功则通话继续,失败则掉话 |
| 卫星过境 | LEO 卫星离开覆盖区 | Modem 搜索下一颗卫星 → 可能重建 |
| 资源不足 | 网络拒绝承载建立 | SATELLITE_RESULT_MODEM_ERROR |
呼叫重建:
掉话后 Modem 尝试重建
→ RRC Reestablishment Request
→ 若成功: 恢复专用承载 → 通话继续
→ 若失败:
→ RIL_UNSOL_CALL_STATE_CHANGED (IDLE)
→ Phone.notifyDisconnectCause() = RADIO_LOST
→ InCallService 显示"通话已断开"
→ SatelliteSOSMessageRecommender 不再监控(非紧急)
卫星会话的异常处理(AOSP 原生):
// SatelliteController.java
// 紧急呼叫进行中不允许启用卫星
if (enableSatellite && mIsEmergency.get()) {
plogd("requestSatelliteEnabled: reject as emergency call is ongoing.");
sendErrorAndReportSessionMetrics(
SatelliteManager.SATELLITE_RESULT_EMERGENCY_CALL_IN_PROGRESS, result);
return;
}
// 某些运营商要求紧急呼叫时关闭卫星会话
if (!isDisableSatelliteWhileEnableInProgressSupported()) {
// 不支持在启用过程中禁用卫星
return;
}
六、与地面 VoLTE 的对比表格
| 对比维度 | 地面 VoLTE | 运营商 NTN VoNR/VoLTE | OEM 卫星语音 |
|---|---|---|---|
| 呼叫建立时延 | 1-3秒 | 3-10秒 (LEO) / 8-25秒 (GEO) | 5-30秒 |
| 语音编解码 | AMR-WB (12.65-23.85kbps) | AMR-WB (6.6-12.65kbps) | AMR/AMR-WB (4.75-12.65kbps) |
| 语音质量 (MOS) | 3.8-4.2 | 3.2-3.8 | 2.8-3.5 |
| 掉话率 | <0.5% | 1-5% | 2-10% |
| 切换成功率 | >99% | 90-95% (波束间) | N/A (通常无切换) |
| 并发业务 | 语音+数据 | 语音 only 或受限数据 | 语音 only |
| 功耗 | 中等 (~200mA) | 高 (~500mA-1A) | 极高 (~1-2A) |
| 最大通话时长 | 不限 | 10-30分钟 (受限) | 5-15分钟 |
| RRC 定时器 | T300=400ms | T300=2000ms | 厂商自定义 |
| DRX 周期 | 32-256帧 | 32-1024帧 | 厂商自定义 |
| 寻呼范围 | 单小区/TA | 卫星波束/NTN TA | 全波束 |
| 多普勒补偿 | 不需要 | 开环+闭环 | 厂商私有 |
| TA 更新频率 | 秒级 | 毫秒级 | 厂商私有 |
| Android 框架 | 标准 IMS/VoLTE | 复用 IMS/VoLTE | 厂商私有 |
| 3GPP 标准 | TS 24.229/23.228 | TS 24.229 + R17 NTN | 无标准 |
七、关键协议与代码索引
7.1 3GPP 协议参考
| 协议 | 内容 | 卫星增强章节 |
|---|---|---|
| TS 38.300 | NR 总体描述 | 第 16 章 NTN |
| TS 38.331 | RRC 协议 | SIB19 (卫星星历)、NTN 相关 IE |
| TS 38.304 | 空闲模式过程 | NTN 寻呼、eDRX |
| TS 38.213 | 物理层控制 | NTN PRACH 格式、TA |
| TS 24.008 | NAS CC 协议 | 无特殊修改 |
| TS 24.301 | NAS EMM/ESM | 无特殊修改 |
| TS 24.229 | IMS SIP | 无特殊修改 |
| TS 23.501 | 5G 系统架构 | NTN 架构增强 |
| TS 36.300 | LTE 总体描述 | LTE-NTN |
7.2 Android 代码索引
| 类/文件 | 路径 | 卫星通话相关 |
|---|---|---|
| SatelliteSOSMessageRecommender | satellite/SatelliteSOSMessageRecommender.java | 紧急呼叫→卫星切换推荐 |
| SatelliteController | satellite/SatelliteController.java | 卫星会话管理、语音服务策略 |
| SatelliteNetworkInfo | satellite/SatelliteNetworkInfo.java | 语音服务类型映射 |
| SatelliteSessionController | satellite/SatelliteSessionController.java | 通话后不活动定时器 |
| NtnCapabilityResolver | satellite/NtnCapabilityResolver.java | NTN 网络能力解析 |
| GsmCdmaPhone | telephony/GsmCdmaPhone.java | dial()/hangup()/answer() |
| RIL | telephony/RIL.java | IRadio AIDL dial()/hangup() |
| CallTracker | telephony/CallTracker.java | 呼叫状态管理 |
| TelephonyConnection | telecom/TelephonyConnection.java | 通话连接管理 |
| ImsPhone | telephony/imsphone/ImsPhone.java | IMS 呼叫处理 |
7.3 关键 CarrierConfig 索引
| 配置键 | 语音通话相关 | 说明 |
|---|---|---|
KEY_CARRIER_ROAMING_NTN_EMERGENCY_CALL_TO_SATELLITE_HANDOVER_TYPE_INT | ✅ | 紧急呼叫切换类型 |
KEY_EMERGENCY_CALL_TO_SATELLITE_T911_HANDOVER_TIMEOUT_MILLIS_INT | ✅ | T911 切换超时 |
KEY_SATELLITE_ROAMING_TURN_OFF_SESSION_FOR_EMERGENCY_CALL_BOOL | ✅ | 紧急呼叫时关闭卫星 |
KEY_SATELLITE_ESOS_SUPPORTED_BOOL | ✅ | 紧急SOS支持 |
KEY_SATELLITE_DATA_SUPPORT_MODE_INT | 间接 | 数据模式影响并发语音 |
KEY_SATELLITE_CONFIGS_PER_PLMN_BUNDLE | ✅ | 按 PLMN 配置(含 handoverType) |
总结:当前 AOSP 卫星框架(Android 16)原生不支持卫星语音通话,仅支持数据报模式的短消息。卫星语音通话的实现依赖于两条路径:
-
运营商 NTN 漫游:复用标准 IMS/VoLTE 流程,Modem 内部处理卫星 RRC 增强(多普勒补偿、TA 管理、波束切换),Android 框架层无需修改。
-
OEM 卫星模式:完全由厂商私有实现,AOSP 仅通过
SatelliteSOSMessageRecommender提供紧急呼叫到卫星消息的切换推荐(SOS/T911),以及通过SatelliteNetworkInfo.mAllowedServicesInfo和getSatelliteVoiceServicePolicyForPlmn()预留了语音服务策略的配置接口。
3GPP R17/R18 的 NTN 标准已为卫星语音通话定义了完整的 RRC/NAS 增强规范,预计 Android 17+ 将逐步在框架层增加对卫星语音的原生支持。
报告已完成。核心结论是:AOSP Android 16 原生不支持卫星语音通话,框架仅支持数据报模式的短消息。卫星语音通话的实现分两条路径——运营商 NTN 漫游复用标准 IMS/VoLTE 流程(Modem 内部处理卫星增强),OEM 卫星模式完全由厂商私有实现。AOSP 的贡献主要体现在 SatelliteSOSMessageRecommender 的紧急呼叫→卫星消息切换推荐机制(SOS/T911),以及 SatelliteNetworkInfo 和 getSatelliteVoiceServicePolicyForPlmn() 预留的语音服务策略配置接口。