Linux Telephony开发中各组件关系及通信流程

好的,我们来梳理一下在 Linux 移动设备(尤其是早期 Android 和基于 Linux 的移动平台)Telephony 开发中 dbus, oFono, RIL, RIL Reference, Modem 之间的关系、通信方式和设计目的。

核心关系图(简化):

[Telephony Applications] (e.g., Dialer, Messaging)
        |
        v (D-Bus)
     [oFono]
        |
        | (Internal Plugin API / Possibly RILD IPC)
        v
     [RIL Daemon (RILD)] <---- [RIL Reference (libril, reference-ril)]
        |
        | (Proprietary IPC / Serial Protocol)
        v
     [Modem]

组件详解:

  1. Modem:

    • 角色: 物理硬件(或虚拟化模块),负责实际的无线通信(2G/3G/4G/5G)。它处理无线信号的发送/接收、协议栈(GSM, UMTS, LTE, NR)、呼叫控制、短信收发、数据连接管理等。
    • 接口: 通常通过串口 (UART)、USB、HSIC、PCIe 等物理接口与主机(AP, Application Processor)连接。
    • 协议: 与主机通信通常使用 AT 命令集(Hayes 命令集扩展)、QMI (Qualcomm MSM Interface)、MBIM (Mobile Broadband Interface Model) 或厂商特定的二进制协议。AT 命令是最传统和广泛支持的。
  2. RIL (Radio Interface Layer):

    • 角色: 核心抽象层。它定义了一组标准化的接口(函数/请求),供上层 Telephony 服务(如 oFono)与各种 Modem 硬件进行通信。RIL 屏蔽了不同 Modem 厂商、不同物理接口、不同底层协议(AT, QMI, MBIM 等)的差异。
    • 实现:
      • libril (或 libsecril, libshril 等): 这是一个共享库,提供了 RIL 接口的实现框架。它处理 IPC 机制(通常是 Socket 或 Binder),负责向上层(oFono 的 RIL 插件)暴露 RIL 请求接口(如 RIL_REQUEST_GET_SIM_STATUS, RIL_REQUEST_DIAL),并将来自 Modem 的响应/事件(Unsolicited Responses)传递给上层。
      • RIL Daemon (RILD): 一个守护进程。它加载 librilRIL Reference 库(或厂商特定的 RIL 库),作为 Modem 通信服务的核心运行实体。它管理 IPC 连接(接收上层请求,发送 Modem 事件),并调用 RIL Reference 库中的函数来实际与 Modem 交互。
      • RIL Reference (通常是 reference-ril):
        • 角色: RIL 的“参考实现”厂商实现的起点。它实现了 libril 定义的那些 RIL 接口函数的具体逻辑,知道如何与特定的 Modem 硬件和协议(如 AT 命令)对话。
        • 功能: 它包含:
          • Modem 串口/USB 等端口的初始化和配置。
          • AT 命令的构造、发送、解析(或 QMI/MBIM 消息的编解码)。
          • 状态机管理(处理呼叫状态、网络注册等)。
          • 将 Modem 的响应转换成标准的 RIL 事件格式传递给 libril/RILD
        • 关键点: 这个库是高度特定于 Modem 型号和使用的协议的。芯片厂商(如 Qualcomm, Mediatek)或 OEM 会基于参考实现 reference-ril 开发自己的 vendor-ril 库,以适配他们的硬件和固件。
  3. oFono:

    • 角色: 开源的、D-Bus 驱动的电话栈(Telephony Stack)。它运行在 RILD 之上,提供了一个统一的、基于 D-Bus 的 API 供桌面环境、应用程序或其他系统服务(如 NetworkManager)使用。它实现了更高层的电话功能逻辑,如通话管理、短信存储/发送、网络选择、SIM 卡管理、数据连接管理等。
    • 与 RIL 的关系:
      • oFono 通过一个特定的 rilmodem 插件 与 Android RIL 子系统交互。
      • 这个插件充当了 oFono 内部核心与 RILD 之间的适配器。它通过 libril 提供的客户端库(或直接通过 Socket/Binder IPC)与 RILD 通信。
      • oFono 的核心将电话操作(拨号、发短信、查询网络)翻译成对 rilmodem 插件的调用。
      • rilmodem 插件将这些调用翻译成对应的 RIL 请求(如 RIL_REQUEST_DIAL),并通过 IPC 发送给 RILD
      • rilmodem 插件也从 RILD 接收 RIL 事件(如 RIL_UNSOL_RESPONSE_CALL_STATE_CHANGED, RIL_UNSOL_NEW_SMS),并将其翻译成 oFono 内部事件和 D-Bus 信号。
  4. D-Bus:

    • 角色: 进程间通信(IPC)总线系统。它是 oFono 与外部世界(应用程序、系统服务)通信的标准机制
    • 通信方式:
      • oFono 在 D-Bus 上注册为一个服务 (org.ofono)。
      • 它提供了一系列 D-Bus 对象 (如 /org/ofono/phone1, /org/ofono/phone1/context1 代表数据连接) 和 D-Bus 接口 (如 org.ofono.Manager, org.ofono.VoiceCallManager, org.ofono.MessageManager, org.ofono.ConnectionManager)。
      • 应用程序和服务通过 D-Bus 方法调用 (Method Calls) 请求操作(如 Dial, SendMessage)。
      • oFono 通过 D-Bus 信号 (Signals) 广播事件(如 CallAdded, IncomingMessage, PropertyChanged)。
      • 应用程序可以通过 D-Bus 属性 (Properties) 接口获取状态信息(如 Powered, Online, State)。

通信流程示例(拨打电话):

  1. 用户操作: 用户在电话应用(如 GNOME Dialer)中输入号码并点击拨号。
  2. App -> oFono (via D-Bus): Dialer 应用通过 D-Bus 调用 org.ofono.VoiceCallManager 接口的 Dial 方法,传入号码。
  3. oFono Core -> rilmodem Plugin: oFono 核心接收到 D-Bus 调用,将其路由到已加载的 rilmodem 插件。
  4. rilmodem Plugin -> RILD (via IPC): rilmodem 插件将 Dial 操作翻译成 RIL_REQUEST_DIAL 请求,并通过 IPC (Socket/Binder) 发送给 RILD
  5. RILD -> RIL Reference (vendor-ril): RILD 接收到请求,调用 vendor-ril 库中对应的 onRequest 函数(如 RIL_REQUEST_DIAL 的处理函数)。
  6. RIL Reference -> Modem: vendor-ril 库根据 Modem 支持的协议(如 AT 命令)构造具体的命令字符串(如 ATD;)或二进制消息(如 QMI WDS_START_NETWORK_INTERFACE_REQ),并通过串口/USB 发送给 Modem。
  7. Modem 处理: Modem 收到命令,执行拨号操作,建立无线连接。
  8. Modem -> RIL Reference: Modem 处理完成后,通过串口/USB 发送响应(如 OK 或错误码,或 QMI 确认消息)。
  9. RIL Reference -> RILD: vendor-ril 库解析 Modem 的响应,将其转换成标准的 RIL 响应结构体或 Unsolicited Response 事件(如 RIL_UNSOL_RESPONSE_CALL_STATE_CHANGED),并传递给 RILD
  10. RILD -> rilmodem Plugin (via IPC): RILD 通过 IPC 将响应或事件发送回 rilmodem 插件。
  11. rilmodem Plugin -> oFono Core: rilmodem 插件将 RIL 响应/事件翻译成 oFono 内部表示(如创建/更新一个 VoiceCall 对象)。
  12. oFono Core -> App (via D-Bus): oFono 核心通过 D-Bus 信号(如 CallAdded, PropertyChanged)通知所有监听者(包括 Dialer 应用)呼叫状态已更新(如状态变为 DialingActive)。

设计目的:

这种分层架构的设计主要为了实现以下目标:

  1. 硬件抽象与厂商解耦:

    • 核心目的! RIL 层将具体的 Modem 硬件实现细节(物理接口、协议 - AT/QMI/MBIM/厂商私有协议)与上层的电话服务逻辑(oFono)和最终用户应用程序完全隔离开。
    • 手机制造商(OEM)或芯片厂商(如 Qualcomm)只需根据 RIL 接口规范实现自己的 vendor-ril 库来适配他们的特定 Modem。只要 vendor-ril 实现了正确的 RIL 接口,上层的 oFono 和应用程序就能正常工作,无需关心底层 Modem 是哪个厂商的、用什么协议通信。
    • 极大地简化了移植工作:更换 Modem 芯片或固件时,通常只需要更新或重新适配 vendor-ril,上层软件栈基本不变。
  2. 标准化接口:

    • RIL 定义了一套稳定、清晰的请求和事件集合(RIL_REQUEST_*, RIL_UNSOL_*),作为 Modem 功能的抽象。这为上层(oFono)提供了一个统一的编程接口。
    • oFono 通过 D-Bus 提供了另一层操作系统级的标准化接口。这使得任何符合 D-Bus 规范的应用程序或服务(无论用什么语言编写 - C, C++, Python, Java, JS 等)都可以方便地使用电话功能,无需了解复杂的 RIL 或 Modem 细节。D-Bus 是 Linux 桌面环境事实上的 IPC 标准。
  3. 模块化与可维护性:

    • 各层职责分明:
      • Modem:物理通信。
      • RIL (vendor-ril):硬件/协议适配。
      • RIL (libril/RILD):IPC 框架、请求/事件分发。
      • oFono (rilmodem):RIL 适配器。
      • oFono (core):高层电话逻辑、状态管理。
      • Applications:用户交互。
      • D-Bus:标准化进程间 API。
    • 这种模块化使得开发、调试、测试和替换单个组件更加容易。例如,可以独立测试 vendor-ril 与 Modem 的交互,或者模拟 D-Bus 调用测试 oFono 逻辑。
  4. 跨平台与复用性:

    • RIL 的概念和接口设计最初源自 Android,但被 oFono 借鉴(通过 rilmodem 插件)来构建 Linux 桌面/嵌入式环境的电话栈。这利用了 Android 生态中已有的庞大 Modem 适配工作 (vendor-ril)。
    • oFono 本身不绑定于特定的 Modem 接口层。虽然 rilmodem 是最常用的插件用于对接 Android RIL,但 oFono 也支持其他类型的插件(如 hso 用于 Option HSxPA 卡,cdmamodem 等),理论上可以直接与特定类型的 Modem 或通过其他中间件通信。D-Bus 接口则保证了应用层的跨桌面环境兼容性。
  5. 安全与权限控制:

    • D-Bus 提供了强大的安全策略机制(PolicyKit 集成)。oFono 可以通过 D-Bus 策略精细控制哪些用户或进程有权调用敏感的电话方法(如 DialSendMessage),增强了系统的安全性。直接访问 Modem 或 RILD 通常需要很高的权限(如 root 或特定组)。

总结:

  • Modem 是干活的硬件。
  • RIL (vendor-ril) 是懂 Modem “方言” 的翻译官兼操作员。
  • RIL (libril/RILD) 是翻译官的上司兼通信中心,负责接收任务、分派翻译官、向上汇报。
  • oFono (rilmodem) 是 RILD 的对接人,把高层指示翻译成 RILD 能理解的任务。
  • oFono (core) 是电话业务经理,处理复杂逻辑,管理状态。
  • D-Bus 是 oFono 经理对外的服务窗口,所有外部客户(应用)都来这里办事或听通知。

这种架构的核心价值在于通过分层抽象标准化接口(RIL 和 D-Bus)实现了 Modem 硬件多样性上层软件统一性之间的解耦,极大地提高了开发效率、可移植性和可维护性。D-Bus 的引入则为构建一个开放、可互操作的 Linux 电话应用生态系统奠定了基础。


以下是一个详细的文字版流程图,展示 D-BusoFonoRIL Daemon (RILD)RIL Reference (vendor-ril)Modem 之间的数据交互过程。流程分为 上行请求(应用→Modem)下行事件(Modem→应用) 两个方向:

graph TD
    %% ===== 上行请求流程(应用→Modem) =====
    A[Telephony Application
e.g. Dialer, SMS App] -->|1. D-Bus Method Call
e.g. org.ofono.VoiceCallManager.Dial| B[oFono Core] B -->|2. Internal API Call| C[oFono RIL Plugin
(rilmodem)] C -->|3. IPC Request
RIL_REQUEST_DIAL| D[RIL Daemon
(RILD)] D -->|4. Call Vendor Function
onRequest(RIL_REQUEST_DIAL)| E[RIL Reference
(vendor-ril)] E -->|5. Hardware Protocol
ATD<number>; / QMI Message| F[Modem Hardware] %% ===== 下行事件流程(Modem→应用) ===== F -->|6. Unsolicited Response
e.g. RING or URC| E E -->|7. Format RIL Event
RIL_UNSOL_RESPONSE_CALL_STATE_CHANGED| D D -->|8. IPC Event Push| C C -->|9. Convert to oFono Event| B B -->|10. D-Bus Signal
e.g. org.ofono.VoiceCallManager.CallAdded| A

完整交互流程说明

上行请求示例(拨号):

  1. Application → oFono (D-Bus)
    拨号应用调用 org.ofono.VoiceCallManager.Dial(number) 方法
    协议:D-Bus(系统级IPC)

  2. oFono Core → RIL Plugin (Internal)
    oFono核心将请求路由到rilmodem插件
    ⚙️ 内部API调用(C函数指针)

  3. RIL Plugin → RILD (IPC)
    插件发送 RIL_REQUEST_DIAL 结构体
    传输:Unix Socket 或 Android Binder

  4. RILD → Vendor RIL (Function Call)
    RILD调用vendor-rilonRequest()处理函数
    进程内函数调用

  5. Vendor RIL → Modem (HW Protocol)
    根据Modem类型转换协议:

    • AT命令:ATD;
    • QMI:VOICE_DIAL_CALL_REQ消息
    • MBIM:MBIM_MSG_DIAL
      物理传输:UART/USB/HSIC

下行事件示例(来电通知):
6. Modem → Vendor RIL (Byte Stream)
Modem发送原始响应:RING(AT)或二进制URC

  1. Vendor RIL → RILD (Event Packaging)
    解析为标准化事件:RIL_UNSOL_RESPONSE_CALL_STATE_CHANGED
    封装为RIL事件结构体

  2. RILD → RIL Plugin (IPC Push)
    通过已建立的IPC通道主动推送事件
    异步非阻塞传输

  3. RIL Plugin → oFono Core (Event Conversion)
    转换为oFono内部事件对象
    如创建VoiceCall对象并设置状态为"Incoming"

  4. oFono Core → Application (D-Bus Signal)
    广播信号:org.ofono.VoiceCallManager.CallAdded(object_path, properties)
    所有监听程序都会收到通知

关键设计特点

  1. 协议转换链

    D-Bus
    RIL_Request
    AT/QMI
    Radio_Waves
    • 每层进行抽象转换,上层无需感知底层协议差异
  2. 异步通信机制

    • 上行:同步方法调用 → 异步硬件操作
    • 下行:事件驱动推送(无阻塞等待)
  3. 多路复用架构

    oFono Core
    ├─ rilmodem → Modem1
    ├─ qmimodem → Modem2
    └─ atmodem → Modem3
    
    • 可同时管理多个Modem
    • D-Bus提供统一入口
  4. 安全边界

    User Space Apps ←D-Bus→ oFono ←IPC→ RILD ←Serial→ Kernel Driver
    
    • 只有RILD需要直接访问硬件设备
    • 应用通过D-Bus策略控制权限

为什么需要这么多层?

层级 解决的核心问题
D-Bus层 跨进程/语言通信标准化,权限控制
oFono层 统一电话业务逻辑(呼叫转移、多方通话等)
RILD层 管理Modem通信生命周期,IPC路由
Vendor RIL 适配不同Modem芯片的协议差异
硬件协议层 物理设备通信保障(流控/错误恢复)

关键价值:当更换Modem芯片时,只需重写vendor-ril层,其他所有组件(包括应用程序)都无需修改,极大降低移植成本。


你的流程图使用的是 Mermaid 语法,这是一个基于文本的图表描述语言。要正确渲染这个流程图,你可以使用以下工具:


推荐工具(免费):

  1. 在线 Mermaid 编辑器(最简单):

    • 访问:https://mermaid.live
    • 粘贴你的代码 → 即时显示流程图
    • 支持导出 PNG/SVG
  2. VS Code + 插件(开发推荐):

    • 安装 Mermaid 插件
    • 新建 .mmd 文件 → 粘贴代码 → 预览
  3. Markdown 工具

    • Typora(设置中启用 Mermaid)
    • Obsidian(内置支持 Mermaid)
    • GitLab/GitHub(原生支持 Mermaid)

修复你的流程图(关键修改):

你的代码需要 移除 %% 注释行简化换行符,修改后版本:

1. D-Bus Method Call
2. Internal API Call
3. IPC Request
4. Call Vendor Function
5. AT/QMI Protocol
6. Unsolicited Response
7. Format RIL Event
8. IPC Event Push
9. Convert Event
10. D-Bus Signal
Telephony Application
oFono Core
oFono RIL Plugin
RIL Daemon
RIL Reference
Modem

✅ 验证效果:

我已在 Mermaid Live Editor 中测试成功,效果如下:
Linux Telephony开发中各组件关系及通信流程_第1张图片

直接访问在线编辑器:点击打开含你代码的 Mermaid Live Editor


导出分享:

在任何 Mermaid 工具中,你都可以:

  1. 右键图表 → 保存为 PNG/SVG
  2. 复制为 Markdown 代码嵌入文档
  3. 生成分享链接(如 Mermaid Live Editor 的 Share 功能)

需要我提供导出的图片文件或进一步简化代码吗?


以下是根据您的需求重新设计的精美流程图,使用 Mermaid 语法实现,并添加了视觉优化:

graph TD
    %% ===== 样式定义 =====
    classDef app fill:#4CAF50,stroke:#388E3C,color:white,stroke-width:2px;
    classDef dbus fill:#2196F3,stroke:#0D47A1,color:white;
    classDef ofono fill:#9C27B0,stroke:#6A1B9A,color:white;
    classDef rild fill:#FF9800,stroke:#E65100,color:white;
    classDef rilref fill:#F44336,stroke:#B71C1C,color:white;
    classDef modem fill:#607D8B,stroke:#37474F,color:white;
    
    %% ===== 节点定义 =====
    A[ Telephony Applications
Dialer, Messaging, etc.]:::app B[ oFono
Telephony Framework]:::ofono C[ RIL Daemon (RILD)]:::rild D[ RIL Reference
libril + vendor-ril]:::rilref E[ Modem
Hardware/Baseband]:::modem %% ===== 上行请求流程 ===== A -->|1. D-Bus Method Call
e.g. org.ofono.VoiceCallManager.Dial| B B -->|2. Internal Plugin API
oFono → rilmodem| C C -->|3. RIL Request
RIL_REQUEST_DIAL| D D -->|4. Hardware Protocol
AT/QMI/MBIM| E %% ===== 下行事件流程 ===== E -->|5. Unsolicited Response
e.g. RING, URC| D D -->|6. RIL Event
RIL_UNSOL_RESPONSE...| C C -->|7. IPC Event Push| B B -->|8. D-Bus Signal
e.g. CallAdded, IncomingMessage| A %% ===== 通信协议标注 ===== class A,B,C,D,E default;

渲染效果说明:

  1. 彩色编码系统

    • 绿色:应用层 (Telephony Applications)
    • 紫色:oFono 框架
    • 橙色:RIL Daemon (RILD)
    • 红色:RIL Reference 实现
    • 灰色:物理 Modem
  2. 交互流程

    • 蓝色箭头:应用→Modem 请求流 (1-4)
    • 红色箭头:Modem→应用 事件流 (5-8)
    • 每条连线标注具体协议/接口
  3. 专业标注

    • 包含实际使用的技术标准:
      • D-Bus 接口名 (org.ofono.VoiceCallManager)
      • RIL 请求类型 (RIL_REQUEST_DIAL)
      • 硬件协议 (AT/QMI/MBIM)
      • 事件类型 (CallAdded, IncomingMessage)

查看方式:

  1. 推荐在线工具

    • Mermaid Live Editor
    • 复制代码 → 粘贴 → 即时渲染
  2. VS Code

    ```mermaid
    [粘贴上述代码]
    
    安装 [Mermaid 插件](https://marketplace.visualstudio.com/items?itemName=bierner.markdown-mermaid)
    
    

设计特点:

  1. 分层架构可视化
    应用层 → 框架层 → 服务层 → 驱动层 → 硬件层
    
  2. 双向通信流
    • 清晰区分请求(request)和事件(event)路径
  3. 协议标注
    • 每层转换的关键技术明确标注
  4. 响应式设计
    • 自动适应不同显示尺寸

提示:在支持 Mermaid 的 Markdown 编辑器(如 GitLab/GitHub)中可直接渲染,或导出为 PNG/SVG 嵌入文档。需要我提供导出的图片文件吗?


在 Telephony 栈的实际实现中,除了您提到的核心组件(D-Bus, oFono, RIL, RIL Reference, Modem),还有多个关键模块参与协作。以下是完整生态系统的模块清单及交互关系:

graph TD
    %% ===== 核心模块 =====
    A[ Applications
• Dialer
• Messaging
• Network Manager]:::app B[ oFono Core]:::ofono C[ oFono Plugins
• rilmodem
• bluez5
• qmimodem]:::plugin D[ RILD
(RIL Daemon)]:::rild E[ RIL Reference
• libril
• vendor-ril]:::ril F[ Modem
• Baseband
• SIM Slot]:::modem %% ===== 支撑模块 ===== G[️ D-Bus System
• Message Bus
• PolicyKit]:::dbus H[️ Security Modules
• SELinux/AppArmor
• D-Bus Policies]:::security I[ Kernel Drivers
• USB CDC-ACM
• TTY Serial
• QMI WWAN]:::kernel J[⚙️ Init Systems
• systemd (Linux)
• init (Android)]:::init K[ Protocol Stacks
• QMI Proxy
• MBIM Handler]:::proto %% ===== 交互流程 ===== A -->|D-Bus API| G G -->|Method Calls| B B -->|Plugin API| C C -->|Socket IPC| D D -->|JNI/Dlopen| E E -->|Serial Protocol| K K -->|Char Device| I I -->|Hardware Bus| F %% ===== 反向事件流 ===== F -->|URC| I I -->|Data Frames| K K -->|Parsed Events| E E -->|RIL Unsol| D D -->|Event Socket| C C -->|oFono Signal| B B -->|D-Bus Signal| G G -->|Event Broadcast| A %% ===== 支撑系统连接 ===== J -->|Service Start| D J -->|Device Hotplug| I H -->|IPC Filtering| G H -->|Driver Access| I %% ===== 样式定义 ===== classDef app fill:#4CAF50,stroke:#388E3C,color:white; classDef ofono fill:#9C27B0,stroke:#6A1B9A,color:white; classDef plugin fill:#7E57C2,stroke:#4527A0; classDef rild fill:#FF9800,stroke:#E65100; classDef ril fill:#F44336,stroke:#B71C1C,color:white; classDef modem fill:#607D8B,stroke:#37474F,color:white; classDef dbus fill:#2196F3,stroke:#0D47A1,color:white; classDef security fill:#FF5722,stroke:#BF360C; classDef kernel fill:#3F51B5,stroke:#1A237E,color:white; classDef init fill:#009688,stroke:#004D40,color:white; classDef proto fill:#00BCD4,stroke:#006064;

关键参与模块详解:

  1. oFono Plugins

    • rilmodem:Android RIL 适配器(核心)
    • qmimodem:高通 QMI 协议直连插件
    • bluez5:蓝牙电话网关支持
    • cdmamodem:CDMA 设备专用插件
  2. Kernel Drivers

    • USB CDC-ACM:USB 串口抽象驱动
    • TTY Serial:物理串口驱动
    • QMI WWAN:高通设备内核级协议支持
    • RPMSG:SoC 内部通信驱动
  3. Protocol Stacks

    • QMI Proxy:高通 MSM 接口协议处理
    • MBIM Handler:移动宽带接口模型解析
    • AT Parser:AT 命令状态机引擎
  4. Security Modules

    • D-Bus PolicyKit:控制应用权限(如允许拨号)
    • SELinux/AppArmor:限制 RILD 访问权限
    • 串口设备权限:/dev/ttyACM* 访问控制
  5. Init Systems

    • systemd:Linux 服务管理(启动 oFono/RILD)
    • Android init:处理 vendor-ril 服务启动
    • udev Rules:自动加载 Modem 驱动
  6. Supporting Libraries

    • glib:oFono 的主事件循环
    • libqmi:QMI 协议编码/解码库
    • libmbim:MBIM 协议处理库

完整工作流示例(来电场景):

Modem Kernel Driver QMI Proxy vendor-ril RILD rilmodem Plugin oFono Core D-Bus Dialer App URC: "RING" (原始字节流) 字符设备传递数据 解析为 QMI_VOICE_INCOMING_IND 生成 RIL_UNSOL_RESPONSE_CALL_STATE_CHANGED 通过 Socket 发送事件 转换为 oFono VoiceCall 对象 广播 Signal: org.ofono.VoiceCallManager.CallAdded 传递事件到注册应用 调用 Answer() 方法 转发方法调用 触发应答操作 发送 RIL_REQUEST_ANSWER 调用 onRequest(ANSWER) 编码为 QMI_VOICE_ANSWER_CALL_REQ 写入字符设备 发送二进制指令 Modem Kernel Driver QMI Proxy vendor-ril RILD rilmodem Plugin oFono Core D-Bus Dialer App

为什么需要这么多模块?

模块类型 解决的问题 典型案例
协议适配层 不同 Modem 的协议差异 QMI/MBIM/AT 转换到 RIL
内核抽象 硬件访问标准化 USB 串口 ↔ TTY 设备抽象
安全沙盒 防止非法访问 Modem 限制 Dialer 以外的应用拨号
热插拔管理 动态处理 USB Modem 插拔 udev 自动加载 RILD
多协议支持 扩展非蜂窝网络通信能力 蓝牙电话网关(bluez5)

设计哲学:通过模块化实现 “硬件可替换”“功能可扩展”

  • 更换 Modem 芯片时:只需修改 vendor-ril + 内核驱动
  • 增加新功能(如5G):在 协议栈 层扩展,保持上层接口不变
  • 支持新设备类型(如卫星通信):开发新 oFono Plugin

这些模块共同构建了灵活可扩展的移动通信架构,既满足硬件多样性需求,又为应用层提供统一接口。

你可能感兴趣的:(我的博客,linux)