AOSP Android 16卫星通信原理

0 阅读14分钟
架构

卫星通信框架遵循“能力查询 -> 请求权限 -> 发送消息”的严格流程,其核心是隐私与资源保护。

  1. SatelliteManager:入口点,用于查询能力、状态和发送消息。
  2. SatelliteCapabilities:描述设备卫星能力(支持的消息类型、最大长度等)。
  3. 权限模型:除了常规的INTERNET权限,新增USE_SATELLITE权限。关键点:首次使用会触发系统弹窗,明确告知用户此操作可能收费、耗时且仅用于紧急情况。
  4. 消息限制:消息长度极短(初期可能限制在几十到几百字节),且内容需为纯文本或预定义的紧急数据结构。禁止传输媒体文件或任意二进制流。

暂时无法在飞书文档外展示此内容

卫星消息的类型
类型示例传输机制是否需要 IP
SMS over Satellite天通短信、北斗短报文控制平面信令通道不需要
Datagram 消息SOS 报警、位置分享独立数据报协议不需要
IP 应用层消息微信、邮件(经 Starlink)用户面 IP 数据包需要
Android 16 中的"Satellite Connected"状态

根据 SatelliteSessionController.java 的实现:

private class ConnectedState extends State {
    @Override
    public void enter() {
        mPreviousState = mCurrentState;
        mCurrentState = SATELLITE_MODEM_STATE_CONNECTED;  // ← 这不是 data call!
        notifyStateChangedEvent(SATELLITE_MODEM_STATE_CONNECTED);
    }
}

SATELLITE_MODEM_STATE_CONNECTED 的真实含义 :

  • 表示 卫星网络附着/注册完成 (类似蜂窝网络的 Registered 状态)

  • 不等于 PDN 连接建立

  • 不分配 IP 地址

  • 仅表示控制面链路可用,可以收发信令和 datagram

流程
建立链路

| 阶段1:应用发起请求触发方式 :应用通过 ConnectivityManager.requestNetwork() 发起网络请求,指定 TRANSPORT_SATELLITE 传输类型。``` // 应用层典型请求方式 NetworkRequest request = new NetworkRequest.Builder()     .addCapability(NetworkCapabilities.NET_CAPABILITY_INTERNET)     .addTransportType(NetworkCapabilities.TRANSPORT_SATELLITE)     .removeCapability(NetworkCapabilities.NET_CAPABILITY_NOT_RESTRICTED)  // 卫星通     常为受限网络     .build(); connectivityManager.requestNetwork(request, networkCallback);

| --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| 阶段2:ConnectivityService 分发请求系统服务:ConnectivityService 负责管理所有网络请求和可用网络。动作:收到 NetworkRequest 后,ConnectivityService 调用 onNetworkNeeded(),将该请求分发给已注册的 NetworkProvider。关键 Provider:对于卫星传输,对应的 Provider 是 TelephonyNetworkProvider(因为卫星通信在 Android 框架中常作为蜂窝的一种特殊承载)。结果:请求从通用网络管理层进入电话/数据链路专用层。                                                                                                                                                                                                                                                                                                                   |
| 阶段3:Telephony 层请求评估与路由组件:PhoneSwitcher 负责选择当前激活的 Phone 对象(多卡场景下选正确的 SIM/卫星模组)。动作:TelephonyNetworkProvider 通过 addNetworkRequest() 将请求传递给 DataNetworkController。作用:确定该卫星请求应由哪个物理或逻辑 Phone 实例处理,并准备进入数据链路建立流程。                                                                                                                                                                                                                                                                                                                                                                                               |
| 阶段4:卫星数据策略与 APN 选择检查点:调用 canConnectivityTransportSatisfyRequest() 判断当前注册的卫星网络是否满足请求(如信号、授权、漫游策略等)。数据配置选择:若满足,则选择对应的 DataProfile。该配置中通常包含:APN(如 satellite.com)协议类型(IPv4v6)承载类型标记为 INFRASTRUCTURE_SATELLITE策略影响:可能还会检查是否允许在无地面蜂窝时启用卫星数据、是否仅限紧急呼叫等。                                                                                                                                                                                                                                                                                                                                                          |
| 阶段5:DataNetwork 状态机建立数据呼叫状态迁移:DataNetworkController 驱动状态机进入 ConnectingState。关键调用:setupData() → DataServiceManager.setupDataCall()底层通信:DataServiceManager 通过 AIDL 或 HIDL 调用 Modem 的 IRadioData.setupDataCall() 接口。传递参数:包括 APN、鉴权信息、PDN 类型、卫星特有参数(如波束 ID、频率、网关地址等)。                                                                                                                                                                                                                                                                                                                                         |
| 阶段6:Modem 响应与状态转换响应回调:Modem 完成卫星链路的 RRC 连接、PDP 上下文激活后,返回 setupDataCallResponse。成功分支:解析 Modem 分配的 IP 地址、DNS 服务器、网关地址。状态机切换到 ConnectedState,数据链路可用。失败分支:获取失败原因码(例如 ERROR_NO_SERVICE、ERROR_RADIO_NOT_AVAILABLE)。状态机进入 DisconnectedState,并根据策略触发重试(退避计时、重新选网等)。                                                                                                                                                                                                                                                                                                                                               |
| 阶段7:网络能力注册与路由配置注册网络:NetworkAgent 调用 markConnected(),将新建的卫星网络注册到 ConnectivityService。能力通告:携带传输类型 TRANSPORT_SATELLITE 以及卫星特有的能力集(如高延迟、低带宽、按流量计费等)。系统配置:ConnectivityService 据此配置:路由表(添加卫星接口的默认路由)防火墙规则(允许特定应用或端口)DNS 设置(将卫星分配的 DNS 写入系统)通知上层:通过 onConnected() 回调通知应用网络已就绪,应用可以开始收发数据。                                                                                                                                                                                                                                                                                                                        |

###### 发送卫星消息(基于 Datagram 机制)

完整时序图

![](https://p9-xtjj-sign.byteimg.com/tos-cn-i-73owjymdk6/7781bab83e1e420883c06cf1e06e12a8~tplv-73owjymdk6-jj-mark-v1:0:0:0:0:5o6Y6YeR5oqA5pyv56S-5Yy6IEAg55So5oi3MzQxNDA4MTk5MTI1:q75.awebp?rk3s=f64ab15b&x-expires=1776998011&x-signature=sCZmTMR5swFvv%2BJpeArp6eBDm4k%3D)

App: SatelliteManager.sendDatagram(SMS, datagram, true, callback) │ [Binder IPC] ▼ SatelliteController.sendDatagram() │ ├── evaluateOemSatelliteRequestAllowed() → 权限检查 ├── 若需对星: PointingAppController.startPointingUI() │ ▼ DatagramController.sendSatelliteDatagram() │ ▼ DatagramDispatcher.sendDatagram() │ ├── 排入发送队列 (LinkedHashMap) ├── CMD_SEND_SATELLITE_DATAGRAM │ ▼ SatelliteModemInterface.sendSatelliteDatagram() │ [Binder IPC] ▼ ISatellite.sendSatelliteDatagram(datagram, isEmergency, callback) │ [厂商RIL → Modem] ▼ Modem 通过卫星上行链路发送 │ ▼ EVENT_SEND_SATELLITE_DATAGRAM_DONE │ ├── 成功:更新发送状态 → SEND_SUCCESS │ → 通知 DatagramController → 回调 App │ └── 失败:保留在队列 → 等待 retrySendingDatagrams() → 超时:SATELLITE_RESULT_MODEM_TIMEOUT


1、应用层发起

Messages App (Gateway App) → SatelliteManager.sendSatelliteDatagram(subId, DATAGRAM_TYPE_SOS_MESSAGE, datagram, needFullScreenPointingUI, executor, callback)


2、SatelliteManager 通过 ITelephony 转发

3、框架服务层处理

SatelliteController.sendSatelliteDatagram() → DatagramController.sendSatelliteDatagram() → DatagramDispatcher.sendSatelliteDatagram() → 封装 SendSatelliteDatagramArgument(datagramId, datagramType, datagram, ...) → 发送 CMD_SEND_SATELLITE_DATAGRAM 消息


4、Dispatcher 发送处理

DatagramDispatcher.handleMessage(CMD_SEND_SATELLITE_DATAGRAM) → 检查 mIsDemoMode: ├─ Demo模式:延迟模拟发送成功 └─ 真实模式: → SatelliteModemInterface.sendSatelliteDatagram(datagram, isSosMessage, needFullScreenPointingUI, onCompleted) → 启动发送响应超时计时器


5、HAL 层交互

SatelliteModemInterface.sendSatelliteDatagram() → ISatellite.sendSatelliteDatagram( // AIDL 调用 SatelliteServiceUtils.toSatelliteDatagram(datagram), isSosMessage, needFullScreenPointingUI, IIntegerConsumer callback) → Vendor SatelliteService → Satellite HAL (HIDL/AIDL) → 卫星 Modem 固件 → 射频发送


6、结果回调

Modem 发送完成 → HAL 回调 → ISatelliteListener (Vendor Listener) → SatelliteModemInterface.mSatelliteDatagramsReceivedRegistrants → DatagramDispatcher.handleMessage(EVENT_SEND_SATELLITE_DATAGRAM_DONE) → 更新 mPendingEmergencyDatagramsMap / mPendingNonEmergencyDatagramsMap → DatagramController.updateSendStatus() → SatelliteSessionController.onDatagramTransferStateChanged() → PointingAppController.updateSendDatagramTransferState() → callback.accept(error) // 回调应用层


7、会话状态流转

SatelliteSessionController 状态变化: IdleState → TransferringState (开始发送) → ListeningState (发送完成,等待接收) → 启动 Listening 超时计时器 (180s from sending) → 超时或收到新数据 → IdleState


  


###### 接收卫星消息流程

Modem 收到卫星下行数据 │ ▼ ISatelliteListener.onPendingDatagrams(count) │ [Binder IPC 回调] ▼ SatelliteModemInterface → SatelliteController.EVENT_PENDING_DATAGRAMS │ ▼ DatagramController → DatagramReceiver.pollPendingSatelliteDatagrams() │ ▼ SatelliteModemInterface.pollPendingSatelliteDatagrams() │ [Binder IPC] ▼ ISatellite.pollPendingDatagrams(callback) │ [厂商RIL → Modem] ▼ Modem 返回待接收数据报 │ ▼ EVENT_POLL_PENDING_SATELLITE_DATAGRAMS_DONE │ ├── 解析 SatelliteDatagram ├── 若为SMS类型:写入 Telephony Provider (content://sms) ├── 通知 ISatelliteDatagramCallback 注册者 └── 更新接收状态 → RECEIVE_SUCCESS


  


###### 卫星模式开关流程

用户点击"开启卫星" │ ▼ SatelliteManager.requestSatelliteEnabled(true, false, false, callback) │ [Binder IPC] ▼ SatelliteController.handleRequestSatelliteEnabled() │ ├── evaluateOemSatelliteRequestAllowed() → 权限检查 ├── 检查 Radio 状态 (mIsRadioOn) ├── 检查卫星是否已启用 ├── 禁用冲突无线电 (BT/WiFi/NFC/UWB per Settings.Global.SATELLITE_MODE_RADIOS) ├── selectBindingSatelliteSubscription() → 选择卫星订阅 │ ▼ SatelliteController.handleSatelliteEnabled() │ ├── SatelliteSessionController.onSatelliteEnablementStarted(true) │ → 状态机转入 EnablingState │ ├── SatelliteModemInterface.requestSatelliteEnabled(attributes, onCompleted) │ │ [Binder IPC] │ ▼ │ ISatellite.requestSatelliteMode(attributes, callback) │ │ [厂商RIL → Modem] │ ▼ │ Modem 启用卫星射频 → 上报状态变化 │ ▼ EVENT_SET_SATELLITE_ENABLED_DONE │ ├── 成功: │ ├── 更新卫星启用状态 │ ├── 启动信号上报 (updateNtnSignalStrengthReporting) │ ├── 通知 SessionController │ └── callback.accept(SUCCESS) │ └── 失败: ├── abortSatelliteEnableAttributesUpdateRequest() ├── 通知 SessionController └── callback.accept(errorCode)


###### Modem 上报卫星信号变化通知流程

Android 16 中卫星信号变化通知存在 两条并行路径 ,分别服务于不同的卫星通信模式:

| 路径             | 模式                         | 触发源                               | 通知链路                                                |
| -------------- | -------------------------- | --------------------------------- | --------------------------------------------------- |
| 路径A:OEM卫星模式    | 独立卫星(如SOS紧急通信)             | ISatellite HAL → SatelliteService | ISatelliteListener.onNtnSignalStrengthChanged()     |
| 路径B:运营商NTN漫游模式 | Carrier Roaming NB-IoT NTN | IRadio AIDL → RILJ → Phone        | SignalStrengthController → TelephonyRegistryManager |

总体信号流(路径A - OEM卫星模式):

Modem固件 ──[QMI/AT/共享内存]──► Vendor RIL (rild) │ │ │ 卫星信号测量值变化 │ 解析为 stub.NtnSignalStrength │ ▼ │ SatelliteService (厂商实现) │ │ │ [Binder IPC] │ │ │ ▼ │ ISatelliteListener.onNtnSignalStrengthChanged() │ │ │ ▼ │ SatelliteModemInterface.VendorListener │ │ │ [Registrant.notifyResult] │ │ │ ▼ │ SatelliteController.EVENT_NTN_SIGNAL_STRENGTH_CHANGED │ │ │ ┌──────────────┴──────────────┐ │ ▼ ▼ │ handleEventNtnSignalStrengthChanged() updateLastNotifiedCarrierRoaming │ (缓存+回调INtnSignalStrength NtnSignalStrengthAndNotify() │ StrengthCallback注册者) │ │ ▼ │ Phone.notifyCarrierRoamingNtnSignalStrengthChanged() │ │ │ ▼ │ DefaultPhoneNotifier → TelephonyRegistryManager │ │ │ [Binder IPC] │ │ │ ▼ │ TelephonyRegistry (系统服务进程) │ │ │ [Binder回调] │ │ │ ▼ │ ITelephonyListener.onCarrierRoamingNtnSignalStrengthChanged() │ │ │ ┌─────────────┼─────────────┐ │ ▼ ▼ ▼ │ SystemUI 卫星应用 ConnectivityService

总体信号流(路径B - 运营商NTN漫游模式):

Modem固件 ──[IRadio AIDL]──► RILJ (RIL.java) │ │ │ 3GPP R17 NTN信号测量 │ RIL_UNSOL_SIGNAL_STRENGTH │ ▼ │ SignalStrengthController │ │ │ [Registrant通知] │ │ │ ┌───────────────┼───────────────┐ │ ▼ ▼ │ SatelliteController Phone.notifySignalStrength() │ EVENT_SIGNAL_STRENGTH_CHANGED │ │ │ ▼ │ ▼ TelephonyRegistryManager │ updateLastNotifiedCarrierRoaming │ │ NtnSignalStrengthAndNotify() [Binder IPC] │ │ │ ▼ │ TelephonyRegistry → 应用层


  


###### 卫星网络与地面网络切换

切换决策因素:

![](https://p9-xtjj-sign.byteimg.com/tos-cn-i-73owjymdk6/891fff8c84fb4385a5e91c18e48edeac~tplv-73owjymdk6-jj-mark-v1:0:0:0:0:5o6Y6YeR5oqA5pyv56S-5Yy6IEAg55So5oi3MzQxNDA4MTk5MTI1:q75.awebp?rk3s=f64ab15b&x-expires=1776998011&x-signature=tPRRXtqlW7mU35awYVAR0RGdAVU%3D)

切换流程 :

地面网络恢复 → ISatelliteListener.onTerrestrialNetworkAvailableChanged(true) → SatelliteController → 评估是否应关闭卫星 → 若 CarrierConfig 允许自动切换: → requestSatelliteEnabled(false) → SatelliteSessionController 状态机回退到 PowerOff → 若需手动确认: → 发送通知提示用户


并发地面扫描 :在 IdleState 中,若 isConcurrentTnScanningSupported() 为 true,Framework 会调用 enableCellularModemWhileSatelliteModeIsOn(true) 允许 Modem 同时扫描地面网络。

###### 语音通话

AOSP Android 16 原生不支持卫星语音通话 ,框架仅支持数据报模式的短消息。主要原因在于Android 16的原生卫星通信框架,是为 “窄带非地面网络 (NB-NTN)” 设计的,这种技术专为发送小数据包优化,带宽低、延迟高,只适合短信和紧急求救信号,无法承载高质量、低延迟的双向实时语音

###### 短信收发

基于 Android 16 代码分析, 卫星短信不走传统 SmsDispatcher 路径 ,而是通过 SatelliteManager.sendDatagram() 以 Datagram(数据报) 方式收发。这意味着卫星短信与地面 SMS 是 完全独立的通道 。

核心特点:

-   Datagram 承载 :短信被编码为 SatelliteDatagram (byte[]),通过 sendDatagram() 发送,而非 SmsManager.sendTextMessage()
-   高延迟 :卫星 RTT 500ms~数秒,Android 引入 SATELLITE_MODEM_STATE_DATAGRAM_RETRYING 状态处理重试
-   受限长度 : SatelliteCapabilities.maxBytesPerOutgoingDatagram 限制每条数据报最大字节数
-   需要指向 : isPointingRequired 标识是否需要用户对准卫星
-   存储转发 :支持 pollPendingDatagrams() 主动拉取待接收消息

App (Gateway/短信应用) │ │ 1. SatelliteManager.sendDatagram(DATAGRAM_TYPE_SMS, datagram, ...) ↓ SatelliteManager │ │ 2. ITelephony.sendDatagram(datagramType, datagram, needFullScreenPointingUI, callback) ↓ Telephony Service (ITelephony AIDL) │ │ 3. 调用 ISatellite.sendSatelliteDatagram(datagram, isEmergency, resultCallback) ↓ SatelliteImplBase (Vendor Service) │ │ 4. 厂商实现:调用 Vendor HAL / Modem ↓ Satellite Modem │ │ 5. 卫星链路发送(NAS PDU / 专用通道) ↓ 卫星 │ │ 6. 返回发送结果 ↓ ISatelliteListener → Framework → App


  


  


卫星 │ │ 1. 下发 SMS 数据报 ↓ Satellite Modem │ │ 2. ISatelliteListener.onSatelliteDatagramReceived(datagram, pendingCount) ↓ SatelliteImplBase (Vendor Service) │ │ 3. 回调到 Telephony Framework ↓ Telephony Service │ │ 4. ISatelliteDatagramCallback.onSatelliteDatagramReceived(datagramId, datagram, pendingCount, ack) ↓ SatelliteManager → SatelliteDatagramCallback │ │ 5. App 收到数据报,5分钟内必须 ack ↓ App (Gateway/短信应用)


##### 关键类及接口

packages/modules/Connectivity提供通用的网络连接管理服务

packages/services/Telephony电话应用的“壳”,是业务的“总指挥部”。它编译生成 TeleService.apk,运行在独立的 com.android.phone 进程中。这个进程是Android电话业务的总入口,负责初始化整个Telephony框架,并向上层应用(如拨号器)提供服务

  


卫星网络接入:packages/modules/Connectivity 中的 SatelliteAccessController 负责卫星网络的角色管理和偏好设置。该模块会根据网络类型(蜂窝 vs 卫星)进行评分和选择,判断何时启用卫星链路。

  


卫星数据传输:frameworks/opt/telephony 通过 RILJ 将上层数据请求封装为特定指令,通过Socket下发给Modem。对 RILJ 进行扩展是支持私有卫星通信协议的关键。

  


卫星应用调度:packages/services/Telephony 运行在 com.android.phone 进程中,负责初始化 RILJ 并处理卫星通信相关的上层业务调度(如卫星短信收发)

###### 连接管理层

路径:packages/modules/Connectivity

SatelliteAccessController.java

管理卫星网络的访问权限,并跟踪哪些应用有权使用卫星服务

关键接口

| requestIsCommunicationAllowedForCurrentLocation(result, shouldIgnoreAllowedStateCache) | 检查当前区域是否允许卫星通信 |
| -------------------------------------------------------------------------------------- | -------------- |
| requestSatelliteAccessConfigurationForCurrentLocation(result)                          | 获取当前区域的卫星访问配置  |
| updateSystemSelectionChannels(result)                                                  | 向Modem更新系统选择通道 |

###### 公共API层

路径:frameworks/base/telephony

SatelliteManager:为上层提供卫星通信的API接口

这是卫星通信的主入口类,通过 Binder IPC 与 com.android.phone 进程中的 SatelliteController 通信,提供以下功能:

| 功能类别     | 主要方法                                                         | 说明           |
| -------- | ------------------------------------------------------------ | ------------ |
| **状态管理** | `requestEnabled()`, `requestIsEnabled()`                     | 启用/禁用卫星modem |
| **能力查询** | `requestCapabilities()`                                      | 获取卫星服务能力     |
| **消息传输** | `sendSatelliteDatagram()`, `pollPendingSatelliteDatagrams()` | 发送/接收卫星数据报   |
| **定位指向** | `startSendingSatellitePointingInfo()`                        | 开始卫星指向信息更新   |
| **配置管理** | `provisionSatellite()`, `deprovisionSatellite()`             | 卫星服务开通/注销    |
| **订阅管理** | `requestSatelliteAccessConfigurationForCurrentLocation()`    | 获取当前卫星接入配置   |

关键状态定义:

// 卫星modem状态 SATELLITE_MODEM_STATE_IDLE = 0 // 空闲 SATELLITE_MODEM_STATE_LISTENING = 1 // 监听中 SATELLITE_MODEM_STATE_DATAGRAM_TRANSFERRING = 2 // 数据传输中 SATELLITE_MODEM_STATE_OFF = 4 // 关闭 SATELLITE_MODEM_STATE_CONNECTED = 7 // 已连接

// 数据报传输状态 SATELLITE_DATAGRAM_TRANSFER_STATE_IDLE = 0 // 空闲 SATELLITE_DATAGRAM_TRANSFER_STATE_SENDING = 1 // 发送中 SATELLITE_DATAGRAM_TRANSFER_STATE_RECEIVING = 4 // 接收中


支持的无线技术:

NT_RADIO_TECHNOLOGY_NB_IOT_NTN = 1 // NB-IoT over NTN NT_RADIO_TECHNOLOGY_NR_NTN = 2 // 5G NR over NTN NT_RADIO_TECHNOLOGY_EMTC_NTN = 3 // eMTC over NTN NT_RADIO_TECHNOLOGY_PROPRIETARY = 4 // 专有技术


  


  


  


###### 框架服务层

路径:frameworks/opt/telephony

SatelliteController.java

SatelliteController 是 Android 卫星通信的 中央控制器 ,运行在 com.android.phone 进程,是 SatelliteManager 公共 API 的后端实现,负责协调所有卫星相关的操作。它接收来自上层的请求,协调 DatagramController 、 SatelliteModemInterface 、 SatelliteSessionController 等组件完成卫星通信的完整流程。

核心设计 :

  继承 Handler ,所有请求通过消息队列串行处理

  单例模式( sInstance )

  管理 90+ 种消息类型(CMD_xxx / EVENT_xxx / REQUEST_xxx)

关键接口:

  请求开启/关闭卫星模式:requestSatelliteEnabled(boolean enable, boolean enableDemoMode, ...)

  发送数据报:sendDatagram(int datagramType, SatelliteDatagram, ...)

  获取卫星能力(支持的技术、频段等):requestSatelliteCapabilities(ResultReceiver)

关键状态管理 :

![](https://p9-xtjj-sign.byteimg.com/tos-cn-i-73owjymdk6/390135818a254501977768f259c7ab04~tplv-73owjymdk6-jj-mark-v1:0:0:0:0:5o6Y6YeR5oqA5pyv56S-5Yy6IEAg55So5oi3MzQxNDA4MTk5MTI1:q75.awebp?rk3s=f64ab15b&x-expires=1776998011&x-signature=836Z%2B59JnoDAjLi%2BLg1CVgfHhFU%3D)

SatelliteModemInterface.java

职责 :Framework 与厂商 SatelliteService 之间的 Binder IPC 客户端代理。是 Android 卫星通信架构中的 "翻译官" ,它将 Framework 层的调用转换为 Binder IPC 请求,并将 Modem 的事件回调分发给上层感兴趣的组件。SatelliteModemInterface 通过 ISatellite.aidl 接口与厂商服务通信。

核心机制 :

1.  服务绑定 :通过 SatelliteServiceConnection 绑定厂商 SatelliteService
1.  指数退避重连 : ExponentialBackoff (初始2秒,最大64秒,倍数21.  双监听器 : VendorListener(真实模式)和 DemoListener (演示模式),通过notifyResultIfExpectedListener() 过滤
1.  RegistrantList 模式 :将 AIDL 回调转换为 Android Registrant 通知模式

关键方法 :

![](https://p9-xtjj-sign.byteimg.com/tos-cn-i-73owjymdk6/1fc92cefda4d4fec8ea96e01256c5397~tplv-73owjymdk6-jj-mark-v1:0:0:0:0:5o6Y6YeR5oqA5pyv56S-5Yy6IEAg55So5oi3MzQxNDA4MTk5MTI1:q75.awebp?rk3s=f64ab15b&x-expires=1776998011&x-signature=eGxukC8A%2BBZN7yw10BgAFppVWGY%3D)

  


bindService流程

┌──────────────┐ ┌───────────────────┐ ┌─────────────────┐ │ AP │ │ SatelliteModem │ │ Satellite │ │ Framework │ │ Interface │ │ Service │ └──────┬───────┘ └─────────┬─────────┘ └────────┬────────┘ │ │ │ │ bindService() │ │ │───────────────────────────│ │ │ │ onServiceConnected() │ │ │<───────────────────────────│ │ │ │ │ │ setSatelliteListener() │ │ │───────────────────────────>│ │ │ ✓ 注册成功 │ │ │ │ │ │onSatelliteServiceConnected() │<──────────────────────────│ │ │ │ │ │ │ ... 正常通信 ... │ │ │<──────────────────────────>│ │ │ │ │ │ onBindingDied() │ │ │<───────────────────────────│ │ │ │ │ │ 启动指数退避重连 │ │ │ unbindService() │ │ │───────────────────────────>│


  


关键 AIDL 接口调用链路:

  


SatelliteModemInterface → ISatellite (AIDL) → Vendor SatelliteService → Satellite  HAL → Modem


  


  


SatelliteSessionController.java

卫星会话状态机,定义了 9 个状态:

                ┌─────────────┐
                │ Unavailable │ ← 设备不支持卫星
                └─────────────┘
                      │
                ┌─────▼──────┐
                │  PowerOff  │ ← 卫星关闭
                └─────┬──────┘
                      │ requestSatelliteEnabled(true)
                ┌─────▼──────┐
                │  Enabling  │ ← 正在启用
                └─────┬──────┘
                      │ Modem上报CONNECTED
                ┌─────▼──────┐
                │ Connected  │ ← 已连接
                └──┬───┬───┬─┘
                   │   │   │
      ┌────────────┘   │   └────────────┐
      ▼                ▼                ▼

┌─────────────┐ ┌──────────┐ ┌──────────────┐ │NotConnected │ │ Idle │ │Transferring │ └─────────────┘ └────┬─────┘ └──────────────┘ │ ┌──────▼──────┐ │ Listening │ ← 等待接收 └─────────────┘


关键状态说明 :

-   UnavailableState :设备不支持卫星
-   PowerOffState :卫星 Modem 关闭,清理资源、解绑 SatelliteGatewayService
-   EnablingState :正在启用卫星,通知 SATELLITE_MODEM_STATE_ENABLING_SATELLITE
-   IdleState :卫星已启用但无数据传输
-   TransferringState :正在传输数据报
-   ListeningState :监听模式,等待传入页面,有超时机制(发送后 180s,接收后 30s)
-   NotConnectedState / ConnectedState :NB-IoT NTN 特有,表示卫星网络连接状态
-   DisablingState :正在关闭卫星

不活动计时器体系 :

-   ESOS 不活动超时 :默认 600 秒( KEY_SATELLITE_ROAMING_ESOS_INACTIVITY_TIMEOUT_SEC_INT )
-   P2P SMS 不活动超时 :默认 180 秒
-   屏幕关闭不活动超时 :默认 30 秒
-   NB-IoT 不活动超时 :由配置决定

DatagramController / DatagramDispatcher / DatagramReceiver

数据报三件套

-   DatagramController.java : 协调器 ,管理发送/接收状态,维护 mSendDatagramTransferState 和 mReceiveDatagramTransferState
-   DatagramDispatcher.java : 发送引擎 ,基于 Handler 消息机制,维护 mPendingEmergencyDatagramsMap 和 mPendingNonEmergencyDatagramsMap 两个优先级队列,紧急消息优先
-   DatagramReceiver.java : 接收引擎 ,通过 pollPendingSatelliteDatagrams 主动拉取模式获取数据报,并通过 SatelliteDatagramListenerHandler 分发给注册的回调

  


  


###### AIDL 接口层 (stub 目录)

ISatellite.aidl - 卫星服务接口

主要方法:

-   `setSatelliteListener()` - 注册卫星事件监听器
-   `requestSatelliteEnabled()` - 请求启用/禁用卫星
-   `requestSatelliteCapabilities()` - 请求卫星能力
-   `sendSatelliteDatagram()` - 发送卫星数据报
-   `pollPendingSatelliteDatagrams()` - 轮询待接收数据报
-   `startSendingSatellitePointingInfo()` - 开始发送指向信息
-   `setSatellitePlmn()` - 设置卫星PLMN列表

ISatelliteListener.aidl - 事件回调接口

回调方法:

-   onSatelliteDatagramReceived() - 收到卫星数据报
-   onSatellitePositionChanged() - 卫星位置变化
-   onSatelliteModemStateChanged() - modem状态变化
-   onNtnSignalStrengthChanged() - NTN信号强度变化
-   onSatelliteCapabilitiesChanged() - 卫星能力变化

###### Vendor Service 层

Vendor Service 层 是指 OEM 厂商在 vendor 分区实现的服务层 ,这些服务由厂商编写,运行在厂商自己的进程中,通过 AIDL 与 AOSP Framework 通信。j

SatelliteImplBase.java

SatelliteService 是 Android 系统服务基类 ,作为卫星服务的入口点被 Framework 绑定。

Framework 通过 Intent Action ( android.telephony.satellite.SatelliteService ) 绑定到此服务:

public static final String SERVICE_INTERFACE = "android.telephony.satellite.SatelliteService";


当 Framework 绑定时,返回 SatelliteImplBase 的 Binder,这样 Framework 就能通过 AIDL 调用卫星服务的方法。

@Override public IBinder onBind(Intent intent) { if (SERVICE_INTERFACE.equals(intent.getAction())) { return new SatelliteImplBase(Runnable::run).getBinder(); } return null; }


OEM 厂商需要:

  


1.  创建一个继承 SatelliteService 或 SatelliteImplBase 的 Service
1.  在 AndroidManifest.xml 中注册,声明 BIND_SATELLITE_SERVICE 权限
1.  配置为 config_satellite_service_package 的默认值

  


SatelliteImplBase.java

SatelliteImplBase 是卫星服务的 抽象基类 ,为 OEM 厂商提供了实现卫星功能的框架。

SatelliteService (android.app.Service) ↓ extends SatelliteImplBase (核心实现类) ↓ OEM 厂商实现类 (继承并重写所有 stub 方法)


SatelliteImplBase 是 Framework 提供的桩实现 ,OEM 厂商通过继承并实现这些空方法来接入自己的卫星通信能力。这是 Android 卫星服务架构的 核心抽象层

###### HAL抽象层

基于现有Radio HAL,用于底层通信。卫星通信的特殊指令集通过扩展RIL实现