5G模组控制协议之QMI和MBIM简介

概述

在 4G/5G 蜂窝模组(尤其是 Qualcomm 平台)与主机(Host)的通信中,MHI/PCIe/USB 解决的是“底层数据怎么搬运”的问题,而 QMIMBIM 解决的是“上层业务怎么控制”的问题。

简单来说:QMI 和 MBIM 是主机用来控制 Modem(如查询信号、配置 APN、发起拨号、获取 IP 地址)的控制面协议。


1. 控制面协议的演进背景

早期 3G 时代,模组控制主要靠 AT 命令(如 AT+CGDCONT, ATD*99#)。
到了 4G/5G 时代,网络变得极其复杂(涉及 IPv4v6 双栈、多 PDN、QoS、复杂的漫游和载波聚合),AT 命令的文本解析效率和扩展性已无法满足需求。因此诞生了两大二进制控制协议:

  1. **QMI (Qualcomm MSM Interface)**:高通私有协议,事实上的行业标准。
  2. **MBIM (Mobile Broadband Interface Model)**:微软牵头、USB-IF 制定的开放标准,旨在统一各厂商接口。

2. QMI 详解 (Qualcomm MSM Interface)

2.1 QMI 的核心架构

QMI 采用客户端-服务端 (Client-Server)服务化 (Service-oriented) 的架构。
Modem 内部运行着多个 QMI 服务(Service),Host 作为客户端向这些服务发送请求(Request),Modem 返回响应(Response),或者 Modem 主动上报指示(Indication)。

核心 QMI 服务 (Service ID)

服务名称 Service ID 作用
CTL (Control) 0x00 客户端分配、版本协商、同步
WDS (Wireless Data Service) 0x01 最核心:数据会话管理(拨号、挂断、获取 IP、配置 APN)
DMS (Device Management Service) 0x02 设备管理:获取 IMEI、MEID、固件版本、设备状态、PIN 码管理
NAS (Network Access Service) 0x03 网络接入:查询/注册网络、信号强度、小区信息、PLMN
WMS (Wireless Messaging Service) 0x05 短信收发
PDS (Position Determination Service) 0x06 GPS/GNSS 定位数据
UIM (User Identity Module) 0x0B SIM 卡管理:读取 IMSI、ICCID、SIM 卡状态
WDA (Wireless Data Admin) 0x1A 数据链路协议配置(如设置 Raw IP 或 802.3 以太网模式)

2.2 QMI 消息格式 (TLV 模型)

QMI 消息高度依赖 TLV (Type-Length-Value) 结构。一个 QMI 消息由 Header 和多个 TLV 组成。

+----------------+----------------+----------------+
| QMI Header     | TLV 1 (Mandatory)| TLV 2 (Optional) | ...
+----------------+----------------+----------------+

QMI Header (标准 7 字节):

  • Control Flag: 标识是控制消息还是数据消息。
  • Transaction ID: 事务 ID,用于匹配 Request 和 Response。
  • Message ID: 消息 ID(如 Start Network, Get Signal Strength)。
  • Length: 后续 TLV 的总长度。

TLV 结构:

  • Type (1 Byte): 参数类型(如 0x01 代表 APN 字符串,0x11 代表 IP 类型)。
  • Length (2 Bytes): Value 的长度(小端序)。
  • Value (N Bytes): 实际数据。

2.3 QMI 的典型拨号流程

  1. 初始化:Host 发送 CTL_GET_VERSION_INFO 获取 Modem 支持的 QMI 版本。
  2. 分配客户端:Host 为需要的服务(如 WDS, NAS)发送 CTL_ALLOCATE_CID,获取 Client ID。
  3. 查卡与注网:通过 UIM 和 NAS 服务查询 SIM 卡状态和信号,等待注册成功。
  4. 配置 APN:通过 WDS 服务发送 WDS_SET_PROFILE_SETTINGS 或直接在 Start Network 中携带 APN。
  5. 发起拨号:Host 发送 WDS_START_NETWORK_INTERFACE (携带 APN, 用户名, 密码, IP 类型)。
  6. 获取 IP:Modem 返回 Packet Data Handle,Host 发送 WDS_GET_CURRENT_SETTINGS 获取分配的 IP 地址、DNS、Gateway。
  7. 数据通信:控制面完成,数据面通过 MHI/USB 的 IP 通道开始传输。

3. MBIM 详解 (Mobile Broadband Interface Model)

3.1 MBIM 的核心架构

MBIM 由微软主导,设计初衷是解耦控制与数据,并标准化 USB 宽带设备的接口。
在 MBIM 架构中:

  • 控制面:使用 MBIM 协议(基于 USB CDC 或 MHI 控制通道)。
  • 数据面:强制使用 NCM (Network Control Model) 或 Raw IP,不使用传统的 RNDIS 或 PPP。

MBIM 没有 QMI 那种细粒度的“服务 (Service)”概念,而是采用设备能力 (Device Capabilities)上下文 (Context/Session) 的概念。

3.2 MBIM 消息格式

MBIM 消息分为两类:Control Message (控制消息) 和 **Data Message (数据消息,用于分片)**。

MBIM Control Message Header (12 字节):

+-------------+--------------+----------------+----------------+
| MessageType | MessageLen   | TransactionId  | FragmentHeader |
+-------------+--------------+----------------+----------------+
  • MessageType: 如 MBIM_MSG_TYPE_COMMAND, MBIM_MSG_TYPE_FUNCTION_ERROR
  • FragmentHeader: 用于大消息的分片(Total Fragments, Current Fragment)。

InformationBuffer (载荷):
MBIM 的载荷通常不是纯 TLV,而是**预定义的 C 结构体 (Struct)**,辅以少量的 TLV 扩展。
例如,设置 IP 类型的结构体:

struct mbim_data_class {
    uint32_t data_class; // 如 MBIM_DATA_CLASS_PACKET_SWITCHED
};

3.3 MBIM 的核心命令集 (CID - Command ID)

MBIM 的命令通过 UUID 来划分功能集,常用的包括:

  • Basic Connect (基本连接): 设备能力、注册状态、信号强度、**Session 管理 (Connect/Disconnect)**。
  • Phonebook (电话本): 读写联系人。
  • SMS (短信): 短信收发。
  • USSD: 非结构化补充数据业务。
  • Device Services (设备服务): 厂商自定义扩展(如 Intel 的 SAR 控制,高通的扩展信号查询)。

3.4 MBIM 的典型拨号流程 (Session 管理)

  1. 能力协商:Host 发送 MBIM_CID_DEVICE_CAPS 查询 Modem 能力(支持的最大 Session 数、IP 类型等)。
  2. 查询状态:发送 MBIM_CID_SUBSCRIBER_READY_STATUS (SIM 状态) 和 MBIM_CID_REGISTER_STATE (注网状态)。
  3. 配置与连接:Host 发送 MBIM_CID_CONNECT,在 InformationBuffer 中填入:
    • Session ID (通常是 0)
    • Access String (APN)
    • Auth Protocol (PAP/CHAP)
    • IP Type (IPv4/IPv6/IPv4v6)
  4. 获取 IP 配置:Modem 响应 MBIM_CID_CONNECT 的 Response,直接包含 IP 地址、DNS、MTU 等信息(不需要像 QMI 那样再发一次 Get Settings)。
  5. 数据通信:通过 NCM 网络接口传输数据。

4. QMI vs MBIM 深度对比

维度 QMI (Qualcomm MSM Interface) MBIM (Mobile Broadband Interface Model)
主导者 高通 (Qualcomm) 微软 (Microsoft) / USB-IF
开放性 私有协议(部分逆向工程/开源) 公开标准
数据结构 纯 TLV (Type-Length-Value) 固定 Struct + 少量 TLV 扩展
服务模型 细粒度 Service (WDS, NAS, DMS…) 粗粒度 UUID 集合 (Basic Connect…)
消息分片 依赖底层传输层(如 QRTR/MHI) 协议原生支持 Fragment 分片
数据面协议 支持 Raw IP, 802.3, QMAP (多路复用) 强制 NCM (Network Control Model) 或 Raw IP
多 PDN 支持 通过分配多个 WDS Client ID 实现 通过不同的 Session ID (0~255) 实现
Linux 生态 libqmi, qmicli, qrtr libmbim, mbimcli, umbim
适用场景 高通平台首选,性能极高,特性最全 跨平台、非高通平台、Windows 认证强制要求

结论

  • 如果模组是高通芯片强烈建议使用 QMI(或基于 QMI 的 QMAP 多路复用),因为特性支持最完整,性能最好。
  • 如果模组是联发科、紫光展锐、Intel,或者需要严格兼容 Windows 默认驱动,通常使用 MBIM

5. 在 PCIe / MHI 环境下的承载方式

在 USB 接口下,QMI 和 MBIM 有标准的 USB Class 定义(如 CDC-ACM, CDC-MBIM)。但在 PCIe / MHI 接口下,它们是如何传输的呢?

5.1 MBIM over MHI

MBIM 在 MHI 上的承载相对直接:

  • MHI 控制器会暴露一个名为 MBIM 的 MHI Channel。
  • Linux 内核中的 mhi_wwan_mbim 驱动会绑定到这个 Channel。
  • 该驱动将 MHI 通道注册为一个标准的 Linux wwan 子系统控制端口(如 /dev/wwan0mbim0)。
  • 用户态的 mbimcliModemManager 直接通过标准的 MBIM IOCTL 与该字符设备交互。

5.2 QMI over MHI (QRTR 机制)

在较新的 5G 模组(如 SDX55/SDX62/SDX65)中,QMI 不再直接裸跑在 MHI channel 上,而是被封装在 QRTR (Qualcomm Router) 协议中。

  • QRTR 是高通内部的一种 IPC(进程间通信)路由协议。
  • MHI 控制器会暴露一个名为 IPCRQMI 的 MHI Channel。
  • Linux 内核中的 qrtr-mhi 驱动绑定该通道,将 MHI 数据注册为 QRTR 节点。
  • QMI 消息被封装在 QRTR 报文中传输。
  • 用户态通过 libqrtrlibqmi 与 QRTR 守护进程 (qrtr-ns) 交互,最终路由到 Modem 的 QMI 服务。

注意:在较老的 4G PCIe 模组(如 SDX24)中,可能仍然存在直接的 QMI MHI channel,由 qmi_wwan 或类似驱动直接处理。


6. Linux 下的工具

6.1 QMI 工具链 (libqmi / qmicli)

安装

sudo apt install libqmi-utils

常用 qmicli 命令(假设设备节点为 /dev/cdc-wdm0/dev/wwan0qmi0):

# 1. 获取设备固件版本和 IMEI (DMS 服务)
qmicli -d /dev/wwan0qmi0 --dms-get-ids

# 2. 查询 SIM 卡状态 (UIM 服务)
qmicli -d /dev/wwan0qmi0 --uim-get-card-status

# 3. 查询网络注册状态和信号 (NAS 服务)
qmicli -d /dev/wwan0qmi0 --nas-get-signal-strength
qmicli -d /dev/wwan0qmi0 --nas-get-serving-system

# 4. 配置 APN 并拨号 (WDS 服务)
# 注意:需要指定 IP 类型,且通常需要 --wds-follow-network 保持会话
qmicli -d /dev/wwan0qmi0 \
       --device-open-net=rmnet \
       --wds-start-network="apn='internet',ip-type=4" \
       --client-no-release-cid

# 5. 获取分配的 IP 地址
qmicli -d /dev/wwan0qmi0 --wds-get-current-settings

6.2 MBIM 工具链 (libmbim / mbimcli)

安装

sudo apt install libmbim-utils

常用 mbimcli 命令(假设设备节点为 /dev/cdc-wdm1/dev/wwan0mbim0):

# 1. 查询设备能力
mbimcli -d /dev/wwan0mbim0 --query-device-caps

# 2. 查询 SIM 卡状态
mbimcli -d /dev/wwan0mbim0 --query-subscriber-ready-status

# 3. 查询注网状态和信号
mbimcli -d /dev/wwan0mbim0 --query-registration-state
mbimcli -d /dev/wwan0mbim0 --query-signal-state

# 4. 拨号连接 (Session ID 0, APN=internet)
mbimcli -d /dev/wwan0mbim0 \
        --connect="apn=internet,ip-type=default"

# 5. 断开连接
mbimcli -d /dev/wwan0mbim0 --disconnect

6.3 终极神器:ModemManager

在实际生产环境中,极少有人手动敲 qmiclimbimcli 来拨号。通常使用 **ModemManager (MM)**。
MM 是一个守护进程,它会自动探测底层是 QMI 还是 MBIM,并抽象出统一的 D-Bus 接口。

# 查看 Modem 列表
mmcli -L

# 查看 Modem 0 的详细信息(会自动显示是 QMI 还是 MBIM)
mmcli -m 0

# 使用 MM 创建 Bearer 并拨号
mmcli -m 0 --simple-connect="apn=internet,ip-type=ipv4"

# 查看连接状态和 IP
mmcli -b 0  # 假设 bearer 索引为 0

更多可见之前关于 ModemManager 介绍的文章:https://z-dd.online/2025/03/25/Linux%E7%A7%BB%E5%8A%A8%E5%AE%BD%E5%B8%A6%E4%B9%8BModemManager/