MB 多 SIM 操作

桌面多调制解调器多执行程序支持

传统上,非手机 Windows 设备未配置为使用多 SIM 卡调制解调器,因为它们的物理空间限制比手机少。 这使得他们能够真正同时利用多个有源无线电,而不是像手机那样拥有一个调制解调器和多个 SIM 卡:但是,由于企业中 eSIM 和场景的兴起,对非手机设备上每调制解调器多 SIM 卡支持的需求有所增加。

大多数典型的多 SIM 卡手机设备具有双 SIM 卡插槽,但仅限于一个主要 SIM 卡卡支持数据,而另一个仅支持语音功能。 此类限制在非手机电脑模型中不存在,因为所有 SIM 卡都用于数据连接。

虽然此规范中定义的框架理论上可以支持无限数量的调制解调器和 SIM 卡,但Windows 10版本 1703 及更高版本仅支持端到端双 SIM 卡/单活动 (DSSA) 方案。

NDIS 调制解调器接口规范

现有接口和功能差距

可以使用多个独立调制解调器支持双 SIM 卡/双主动功能,其中每个调制解调器都是独立的设备,并且完全独立运行。 但是,这超出了本文档的范围,它侧重于能够向主机呈现多个同时手机堆栈的 WWAN 微型端口调制解调器。 本部分定义各种对象,并建立与多 SIM 卡功能相关的所有 MB 文档中使用的术语。

硬件的进步导致设备可以保持与多个手机网络同时注册。 在此类设备中,假设有并行运行的“手机网络堆栈的多个实例”,每个实例都能够维护注册、监视信号强度、执行交接和侦听传入页面。 对于本文档的其余部分,此“手机网络堆栈”的每个实例都将称为 执行程序 。 例如,在能够同时维护两个网络注册的设备中,调制解调器硬件被视为具有两个执行程序。

执行程序是硬件的逻辑表示形式,实际上可能是多路复用的单个硬件收发器。 确切的硬件细节被视为供应商实现详细信息,并且不在此规范范围内。 对于 NDIS 微型端口驱动程序,执行程序作为 WWAN 微型端口适配器的多个实例公开。 对于 MBIM 调制解调器,执行程序由枚举复合设备上的多个 MBIM 函数表示。

以下两个图像演示了双 SIM 卡调制解调器的逻辑视图。 每个都显示执行程序与 UICC 的可能组合。

说明双 SIM 调制解调器逻辑视图的示意图。

执行程序内的手机网络堆栈主要被视为自包含的,但在双待机调制解调器实现的情况下,执行程序 (语音和/或数据) 可能会阻止另一个执行程序保持注册。

下图演示了双待机调制解调器的逻辑视图。 执行程序 0(电话呼叫)上的流量会导致执行程序 1 丢失注册。

描述双待机调制解调器逻辑视图的示意图。

NDIS 6.7 中的 Windows 桌面调制解调器接口模型不适合此类体系结构,因为它基于几个隐式假设:

  • 该模型假定调制解调器中有一个执行程序。
  • 该模型假定有一个与调制解调器硬件直接关联的 UICC 卡。
  • UICC 被视为单应用程序 SIM 卡。

相比之下,Windows Mobile 上的 Microsoft 无线电接口层 (RIL) 接口显式公开了这些假设的多重性。 Windows Mobile 中的移动宽带接口公开了通过单独的微型端口独立注册的功能,并假定设备的某些基本配置已通过 RIL 接口完成。 若要提供等效功能,Windows 桌面必须提供机制来发现执行器和槽的数量、独立访问执行程序、定义执行程序与槽之间的映射,以及定义每个执行程序将使用的映射 UICC 卡中的应用程序。

有关手机网络体系结构以及Windows 10 移动版与桌面之间的差异的详细信息,请参阅手机网络体系结构和实现

主要对象和操作

下图显示了调制解调器的抽象模型。

显示调制解调器、执行器和槽之间的关系的关系图。

每个调制解调器由一个全局唯一标识符 (GUID) 标识,并包含一组一个或多个执行程序,每个执行程序能够在移动电话网络上进行独立注册。 每个执行程序都有一个关联的执行程序索引(一个整数),对于第一个执行程序,从 0 开始。 此外,调制解调器公开一个或多个可能包含 UICC 卡的槽。 假定槽数大于或等于执行程序数。 每个槽都有一个关联的索引(也从 0 开始),并且与槽中的电源状态和槽中卡的可用性状态相关的当前状态 ((如果有任何) )。

为了保持与现有调制解调器的兼容性,每个执行程序都使用 UICC 卡在单个槽中提供的信息进行操作。 执行程序与槽之间的关联由槽映射定义,该映射将每个执行程序映射到恰好一个槽。

槽可能包含 UICC 卡;每个卡包含一个或多个 UICC 应用程序,例如 USIM、CSIM、ISIM,或者可能包含其他电话和非电话应用程序(如 PKCS#15 或 NFC 安全元素的 Global Platform 应用程序)。 这些单独的 UICC 应用程序的寻址和使用是未来规范和本文档范围外的主题。

调制解调器的 Windows 桌面 NDIS 接口的特点是交换 OID 和 NDIS 通知。 在大多数情况下,这些 OID 会定向到单个执行程序;但是,一些命令和通知的范围限定为调制解调器。

对于非 Windows Mobile 操作系统,多执行程序调制解调器显示为具有多个物理 WWAN 微型端口实例的一台设备。 每个物理微型端口实例都表示一个可执行程序,该执行程序可以保持注册为 NDIS 实例。 可以在运行时创建其他虚拟实例,以管理特定于上下文的数据包数据和设备服务会话。 执行程序特定的命令和通知通过表示该执行程序的 WWAN 微型端口 NDIS 物理实例进行交换。 特定于调制解调器的命令 (换言之,那些不是执行程序特定的) 及其相应通知可能会发送到或来自任何物理微型端口实例。

以下两个关系图显示了特定于执行程序的命令和通知 (第一个关系图) 的差异,其中命令和通知通过并来自同一执行程序,而特定于调制解调器的命令和通知 (第二个关系图) ,其中命令可能通过任何执行程序,来自任何执行程序。

显示执行程序特定的命令和通知的关系图。

说明特定于调制解调器的命令和通知的示意图。

向微型端口实例发出的所有 OID 集或查询请求都针对与微型端口实例关联的调制解调器和执行程序执行。 同样,从微型端口实例发送的所有未经请求的通知和未经请求的设备服务事件都适用于与微型端口实例关联的调制解调器和执行程序。 例如,来自微型端口的未经请求的NDIS_STATUS_WWAN_REGISTER_STATE或NDIS_STATUS_WWAN_PACKET_SERVICE通知仅指示关联调制解调器和执行程序的注册 (或数据包服务状态) ,并且与其他调制解调器 () 或其他执行程序 () 的状态无关。

当设备中有多个调制解调器和/或多个执行程序时,与该调制解调器和执行程序组合关联的物理微型端口适配器会发出与特定调制解调器和执行程序组合相关的非上下文特定的未经请求的通知。

同样,如果设备具有多个调制解调器和/或多个执行程序,则与特定调制解调器和执行程序组合关联的物理微型端口适配器实例可以接收与该调制解调器和执行程序相关的非特定于上下文的 OID 查询请求。 接收此类查询请求的适配器会根据 OID 定义对其进行处理。 如果微型端口驱动程序选择,则此查询请求可以与任何其他进程内 OID 集同时处理,或者在与该调制解调器和执行程序关联的任何适配器实例中查询请求。 与同一调制解调器和执行程序关联的微型端口适配器的所有实例都报告该手机网络调制解调器和执行程序 (的相同状态信息,例如无线电电源状态、注册状态、数据包服务状态等 ) 。

对于具有多个调制解调器和/或多个执行程序的设备,与调制解调器和执行程序组合关联的物理微型端口适配器实例可以接收非特定于上下文的 OID 集请求。 微型端口驱动程序应跟踪此类请求的进度。 如果任何适配器中正在进行一个此类集请求,但尚未完成,则 (与同一调制解调器和执行程序) 关联的任何适配器实例的第二个此类集请求尝试应在前面的请求完成后排队并处理。

Windows 10桌面 WMBCLASS 驱动程序遵循上一段中概述的规范来处理此设置请求争用条件,但如果争用条件发生在调制解调器层,调制解调器应遵循相同的指南,在 MBIM 函数上排队冲突的设备范围命令(如果它仍在处理链接到同一基础设备的另一个函数)。

用于设置和查询请求的 OID

为了查询调制解调器中) 和槽 (执行程序的设备数,以及可能同时处于活动状态的执行程序数,主机使用 OID_WWAN_SYS_CAPS

为了查询执行程序的功能,主机使用 OID_WWAN_DEVICE_CAPS_EX

若要定义绑定到每个执行程序的槽或查询当前映射,主机使用 OID_WWAN_DEVICE_SLOT_MAPPINGS

为了查询调制解调器上特定槽的状态,主机使用 OID_WWAN_SLOT_INFO_STATUS

每个设备和每个执行程序命令

在 Windows 10 版本 1703 及更高版本中将执行程序概念添加到非 Windows Mobile 设备后,OID 现在分为两类:每设备 OID 和按执行程序 OID。 下表说明了哪些 OID 属于哪个类别。

按设备或按执行程序 OID 名称
每个设备 OID_WWAN_DRIVER_CAPS
OID_WWAN_ENUMERATE_DEVICE_SERVICE_COMMANDS
OID_WWAN_ENUMERATE_DEVICE_SERVICES
OID_WWAN_PRESHUTDOWN
OID_WWAN_VENDOR_SPECIFIC
OID_WWAN_SYS_CAPS
OID_WWAN_DEVICE_SLOT_MAPPINGS
每个执行程序 OID_WWAN_AUTH_CHALLENGE
OID_WWAN_CONNECT
OID_WWAN_DEVICE_CAPS
OID_WWAN_DEVICE_CAPS_EX
OID_WWAN_DEVICE_SERVICE_COMMAND
OID_WWAN_DEVICE_SERVICE_SESSION
OID_WWAN_DEVICE_SERVICE_SESSION_WRITE
OID_WWAN_DEVICE_SERVICES
OID_WWAN_HOME_PROVIDER
OID_WWAN_NETWORK_IDLE_HINT
OID_WWAN_PACKET_SERVICE
OID_WWAN_PIN
OID_WWAN_PIN_EX
OID_WWAN_PIN_LIST
OID_WWAN_PREFERRED_MULTICARRIER_PROVIDERS
OID_WWAN_PREFERRED_PROVIDERS
OID_WWAN_PROVISIONED_CONTEXTS
OID_WWAN_RADIO_STATE
OID_WWAN_READY_INFO
OID_WWAN_REGISTER_STATE
OID_WWAN_SERVICE_ACTIVATION
OID_WWAN_SIGNAL_STATE
OID_WWAN_SMS_CONFIGURATION
OID_WWAN_SMS_DELETE
OID_WWAN_SMS_READ
OID_WWAN_SMS_SEND
OID_WWAN_SMS_STATUS
OID_WWAN_SUBSCRIBE_DEVICE_SERVICE_EVENTS
OID_WWAN_USSD
OID_WWAN_VISIBLE_PROVIDERS
OID_WWAN_SLOT_INFO_STATUS

注意

OID_WWAN_RADIO_STATE已针对 Windows 10 版本 1703 进行了更新。 有关详细信息,请参阅OID_WWAN_RADIO_STATE。

多 SIM 卡操作的 MBIM 接口更新

对于非 Windows Mobile 操作系统,多执行程序调制解调器显示为具有多个 MBIM 功能的一个 USB 复合设备。 每个 MBIM 函数表示可以维护注册的执行程序。 执行程序特定的命令和通知通过表示该执行程序的 MBIM 函数交换,而特定于调制解调器的命令 (换句话说,那些不是执行程序特定的) 及其相应的通知可能会发送到属于同一基础 USB 复合设备的任何 MBIM 函数或来自这些命令。

向 MBIM 函数发出的所有 CID 集或查询请求都针对与微型端口实例关联的调制解调器和执行程序执行;同样,从 MBIM 函数发送的所有未经请求的通知都适用于与 MBIM 函数关联的调制解调器和执行程序。 同样,从微型端口实例发送的所有未经请求的设备服务事件都适用于与 MBIM 函数关联的调制解调器和执行程序。 例如,来自 MBIM 函数的未经请求的MBIM_CID_REGISTER_STATE或MBIM_CID_PACKET_SERVICE通知仅指示关联的调制解调器/执行程序的注册或数据包服务状态,并且与其他调制解调器 () 或其他执行程序 () 的状态无关。

当设备中有多个调制解调器和/或多个执行程序时,应从与上述调制解调器和执行程序关联的 MBIM 函数发出与特定调制解调器和执行程序组合相关的非上下文特定的未经请求的通知。

在具有多个调制解调器和/或多个执行程序的设备上,可能会向与该调制解调器和执行程序组合关联的 MBIM 函数发出与特定调制解调器和执行程序相关的非特定于上下文的 CID 查询请求。 接收此类查询请求的函数应根据 CID 定义对其进行处理。 如果调制解调器固件选择,则此类查询请求可以与任何其他 CID 集同时处理,或者由与该调制解调器和执行程序关联的任何 MBIM 函数处理查询请求。 与同一调制解调器关联的所有 MBIM 函数应报告该手机调制解调器的相同状态信息,以及它们所代表的执行程序。

当设备中有多个调制解调器和/或多个执行程序时,可能会向与该调制解调器和执行程序关联的 MBIM 函数发出非执行程序特定的 CID 集请求。 调制解调器应跟踪此类请求的整体进度。 如果任何适配器中正在进行一个此类集请求并且尚未完成,则第二个此类集请求尝试 (到与同一调制解调器和执行程序) 关联的任何适配器实例,应在完成以前的请求后排队并进行处理。

下图演示了两个不同调制解调器中 WWANSVC 和 MBIM 函数之间的信息流。

具有 MBIM 函数的调制解调器结构示意图。

本部分包含已定义设备服务的详细调制解调器范围和每个执行程序 CID 说明。 定义引用回现有的公共 MBIM1.0 规范。 在CID_MBIM_DEVICE_SERVICES查询时,符合 MBIM 的设备实现并报告以下设备服务。 现有的已知服务在 USB NCM MBIM 1.0 规范的第 10.1 节中定义。 Microsoft 对此进行扩展以定义以下服务。

服务名称 = 基本连接扩展

UUID = UUID_BASIC_CONNECT_EXTENSIONS

UUID 值 = 3d01dcc5-fef5-4d05-0d3abef7058e9aaf

UUID_MS_BasicConnect定义了以下 CID:

CID 命令代码 最低操作系统版本
MBIM_CID_MS_SYS_CAPS 5 Windows 10 版本 1703
MBIM_CID_MS_DEVICE_CAPS_V2 6 Windows 10 版本 1703
MBIM_CID_MS_DEVICE_SLOT_MAPPINGS 7 Windows 10 版本 1703
MBIM_CID_MS_SLOT_INFO_STATUS 8 Windows 10 版本 1703

以下 CID 节中的所有偏移量都是从 InformationBuffer MBIM_COMMAND_MSG的开头开始计算的。

MBIM_CID_MS_SYS_CAPS

说明

此 CID 检索有关调制解调器的信息。 这可以在作为 USB 函数公开的任何 MB 实例上发送。

查询

MBIM_COMMAND_MSG 上的 InformationBuffer 包含MBIM_MS_SYS_CAPS_INFO响应数据。

设置

不适用。

未经请求的事件

不适用。

参数

Operation 设置 查询 通知
命令 不适用 不适用 不适用
响应 不适用 MBIM_MS_SYS_CAPS_INFO 不适用

数据结构

查询

InformationBuffer 应为 null,InformationBufferLength 应为零。

设置

不适用。

响应

在 InformationBuffer 中应使用以下MBIM_SYS_CAPS_INFO结构。

Offset 大小 字段 类型 说明
0 4 NumberOfExecutors UINT32 此调制解调器报告的 MBB 实例数
4 4 NumberOfSlots UINT32 此调制解调器上可用的物理 UICC 插槽数
8 4 并发 UINT32 可能同时处于活动状态的 MBB 实例数
12 8 ModemId UINT64 每个调制解调器的唯一 64 位标识符

NumberOfExecutors 字段表示调制解调器在其当前配置中支持的执行程序数。 这直接映射到调制解调器支持的“子电话”堆栈数。

NumberofSlots 字段表示调制解调器上实际存在的槽数。 报告的每个槽必须能够接收 UICC,卡 (如果需要,插槽本身可以是异类组合 - 微型 SIM 卡、微型 SIM 卡、纳米 SIM 或 ETSI) 定义的任何标准。 槽数必须等于或大于支持的执行程序数。 “大于”规定允许使用非电话 UICC,例如安全性、NFC 等。

并发 字段 表示可能同时处于活动状态 (MBB 实例) 的执行程序数。 其范围为 1 ≤并发≤ NumberOfExecutors。 例如,双待机调制解调器的并发性为 1,而双主动调制解调器的并发性为 2

ModemId 字段表示给定调制解调器硬件的唯一 64 位标识符。 IHV 可以实现自己的逻辑,为每个调制解调器生成唯一的 64 位值;例如,对其中一个 IMEI 数字进行哈希处理、随机生成 64 位数字等。生成 64 位 ID 后,它应在重新启动和 SIM 卡删除/插入时保留。

状态代码

此 CID 使用通用状态代码 (请参阅 公共 USB MBIM 标准) 第 9.4.5 节中的使用状态代码。

MBIM_CID_MS_DEVICE_CAPS_V2

说明

此 CID 检索与执行程序相关的功能信息。 由于此 CID 是MBIM_CID_DEVICE_CAPS的扩展,因此此处仅介绍公共 USB MBIM 标准第 10.5.1 节中所述的MBIM_CID_DEVICE_CAPS更改。

此 CID 仍为仅限查询,并将返回MBIM_MS_DEVICE_CAPS_INFO_V2结构,以响应 MBIM 服务MSUUID_BASIC_CONNECT和 CID MBIM_CID_MS_DEVICE_CAPS_V2 MBIM_COMMAND_MSG。

参数

Operation 设置 查询 通知
命令 不适用 不适用 不适用
响应 不适用 MBIM_MS_DEVICE_CAPS_INFO_V2 不适用

数据结构

查询

与公共 USB MBIM 标准的第 10.5.1.4 节相同。

设置

不适用。

响应

在 InformationBuffer 中应使用以下MBIM_DEVICE_CAPS_INFO_V2结构。 与公共 USB MBIM 标准第 10.5.1 节中定义的 MBIM_CID_DEVICE_CAPS 结构相比,以下结构具有名为 DeviceIndex 的新字段。 除非此处另有说明,否则此处适用于公共 USB MBIM 标准的表 10-14 中的字段说明。

Offset 大小 字段 类型 说明
0 4 DeviceType MBIM_DEVICE_TYPE
4 4 CellularClass MBIM_CELLULAR_CLASS
8 4 VoiceClass MBIM_VOICE_CLASS
12 4 SimClass MBIM_SIM_CLASS 对于支持此 CID 的 MBIM 调制解调器,SimClass 将始终报告为 MBIMSimClassSimRemovable。
16 4 DataClass MBIM_DATA_CLASS
20 4 SmsCaps MBIM_SMS_CAPS
24 4 ControlCaps MBIM_CTRL_CAPS
28 4 MaxSessions UINT32
32 4 CustomDataClassOffset OFFSET
36 4 CustomDataClassSize SIZE (0..22)
40 4 DeviceIdOffset OFFSET
44 4 DeviceIdSize SIZE (0..26)
48 4 FirmwareInfoOffset OFFSET
52 4 FirmwareInfoSize 大小 (0..60)
56 4 HardwareInfoOffset OFFSET
60 4 HardwareInfoSize 大小 (0..60)
64 4 ExecutorIndex UINT32 执行程序索引。 其范围为 0n-1 ,其中 n 是 MBIM 调制解调器中包含的 MBB 实例数。 其值始终为常量且独立于枚举顺序。
68 DataBuffer DATABUFFER 包含 CustomDataClassDeviceIdFirmwareInfoHardwareInfo 成员的数据缓冲区。

状态代码

此 CID 使用通用状态代码 (请参阅公共 USB MBIM 标准) 第 9.4.5 节中的使用状态代码。

MBIM_CID_MS_DEVICE_SLOT_MAPPINGS

说明

此 CID 设置或返回 (执行程序槽映射) 的设备槽映射。

查询

不使用MBIM_COMMAND_MSG上的 InformationBuffer。 MBIM_COMMAND_DONE的 InformationBuffer 中返回MBIM_MS_DEVICE_SLOT_MAPPING_INFO。

设置

MBIM_COMMAND_MSG的 InformationBuffer 包含MBIM_MS_DEVICE_SLOT_MAPPING_INFO。 MBIM_COMMAND_DONE的 InformationBuffer 中返回MBIM_MS_DEVICE_SLOT_MAPPING_INFO。 无论 Set CID 是成功还是失败,响应中包含的MBIM_MS_DEVICE_SLOT_MAPPING_INFO都表示当前的设备槽映射。

未经请求的事件

不适用。

参数

Operation 设置 查询 通知
命令 MBIM_MS_DEVICE_SLOT_MAPPING_INFO 不适用 不适用
响应 MBIM_MS_DEVICE_SLOT_MAPPING_INFO MBIM_MS_DEVICE_SLOT_MAPPING_INFO 不适用

数据结构

查询

InformationBuffer 应为 null,InformationBufferLength 应为零。

设置

在 InformationBuffer 中应使用以下MBIM_MS_DEVICE_SLOT_MAPPING_INFO结构。

Offset 大小 字段 类型 说明
0 4 MapCount (MC) UINT32 映射数,始终等于设备/执行程序的数量。
4 8 * MC SlotMapList OL_PAIR_LIST 此列表 的第 i 对,其中 (0 <= i <= (MC-1) ) 记录当前映射到 第 i 个 设备/执行器的槽的索引。 对中的第一个元素是一个 4 字节的字段,该字段的 Offset 为 DataBuffer,从此MBIM_MS_DEVICE_SLOT_MAPPINGS_INFO结构的开头 (偏移量 0) 计算,到 UINT32。 该对的第二个元素是记录元素的 4 字节大小。 由于槽索引的类型为 UINT32,因此对中的第二个元素始终为 4。
4 + (8 * MC) 4 * MC DataBuffer DATABUFFER 包含 SlotMapList 的数据缓冲区。 由于槽的大小为 4 个字节,并且 MC 等于槽索引数,因此 DataBuffer 的总大小为 4 * MC。
响应

Set 中使用的MBIM_MS_DEVICE_SLOT_MAPPING_INFO也用在 InformationBuffer for Response 中。

状态代码

状态代码 说明
MBIM_STATUS_BUSY 操作失败,因为设备正忙。 如果函数中没有任何显式信息来清除此条件,主机可以使用函数 (后续操作,例如通知或命令完成) 作为重试失败操作的提示。
MBIM_STATUS_FAILURE 操作在泛型故障) (失败。
MBIM_STATUS_VOICE_CALL_IN_PROGRESS 操作失败,因为语音呼叫正在进行。
MBIM_STATUS_INVALID_PARAMETERS 操作失败,因为参数 (无效,例如槽数范围外或映射) 中的重复值。

MBIM_CID_MS_SLOT_INFO_STATUS

说明

此 CID 检索指定 UICC 槽的高级聚合状态,其中卡 ((如果有) )。 当其中一个槽的状态发生更改时,它还可用于传递未经请求的通知。

查询

MBIM_COMMAND_MSG 的 InformationBuffer 包含MBIM_MS_SLOT_INFO_REQ结构。 MBIM_COMMAND_DONE消息的 InformationBuffer 包含MBIM_MS_SLOT_INFO结构。

设置

不适用。

未经请求的事件

事件信息缓冲区包含MBIM_MS_SLOT_INFO结构。 函数在复合槽/卡状态更改的情况下发送此事件。

参数

Operation 设置 查询 通知
命令 不适用 MBIM_MS_SLOT_INFO_REQ 不适用
响应 不适用 MBIM_MS_SLOT_INFO MBIM_MS_SLOT_INFO

数据结构

查询

在 InformationBuffer 中应使用以下MBIM_MS_SLOT_INFO_REQ结构。

Offset 大小 字段 类型 说明
0 4 SlotIndex UINT32 要查询的槽的索引。
设置

不适用。

响应

在 InformationBuffer 中应使用以下MBIM_MS_SLOT_INFO结构。

Offset 大小 字段 类型 说明
0 4 SlotIndex UINT32 槽的索引。
4 4 状态 MBIM_MS_UICC_SLOT_STATE 槽的状态和卡 ((如果适用)) 。

以下MBIM_MS_UICCSLOT_STATE结构描述了槽的可能状态。

状态 说明
UICCSlotStateUnknown 0 调制解调器仍处于初始化过程中,因此 SIM 槽状态不是确定性的。
UICCSlotStateOffEmpty 1 UICC 槽已关闭电源,并且不存在任何卡。 无法确定关机槽中是否存在卡的实现将其状态报告为 UICCSlotStateOff。
UICCSlotStateOff 2 UICC 槽已关闭电源。
UICCSlotStateEmpty 3 UICC 槽为空 () 中没有卡。
UICCSlotStateNotReady 4 UICC 槽已占用并开机,但其中卡尚未准备就绪。
UICCSlotStateActive 5 UICC 槽已占用,其中卡已准备就绪。
UICCSlotStateError 6 UICC 槽已占用并开机,但卡处于错误状态,在下次重置之前无法使用。
UICCSlotStateActiveEsim 7 槽中的卡是具有活动配置文件的 eSIM,已准备好接受命令。
UICCSlotStateActiveEsimNoProfiles 8 槽中的卡是没有配置文件 (或) 没有活动配置文件的 eSIM,并且已准备好接受命令。
适用于多 sim 卡设备的MBIM_MS_UICCSLOT_STATE转换指南

符合正确的 UICC 槽状态转换可确保 OS 正确处理所有更改,并向用户显示正确的 Toast 通知。

对于 SIM 插入 toast 通知,OS 要求选择 SIM2/槽 1) 的嵌入式插槽 (,并在将 SIM 卡插入物理槽 (SIM1/槽 0) 时发生以下状态转换。

插入 SIM 卡前槽 0 的可能值 插入 SIM 卡后槽 0 的可能值
UICCSlotStateEmpty UICCSlotStateActive
UICCSlotStateOffEmpty
  • UICCSlotStateActiveEsim
  • UICCSlotStateActiveEsimNoProfile

对于 SIM 已删除 Toast 通知,OS 要求在插入 SIM 卡的情况下选择物理插槽 (SIM1/Slot 0) ,并且从物理插槽中删除 SIM 卡时会发生以下状态转换, (SIM1/Slot 0) 。

删除 SIM 卡前槽 0 的可能值 删除 SIM 卡后槽 0 的可能值
UICCSlotStateActive UICCSlotStateEmpty
  • UICCSlotStateActiveEsim
  • UICCSlotStateActiveEsimNoProfile
UICCSlotStateOffEmpty

状态代码

此 CID 使用通用状态代码 (请参阅公共 USB MBIM 标准) 第 9.4.5 节中的使用状态代码。

每个执行器和每调制解调器 MBIM CID 的非 NDIS 映射

大多数 MBIM CID 映射或与 NDIS OID 相关,但 Windows WMB 类驱动程序使用的一些命令没有对应 NDIS。 本部分明确了这些命令是按调制解调器还是按执行程序。

按设备或按执行程序 CID 名称
每个设备 CID_MBIM_MSEMERGENCYMODE
CID_MBIM_MSHOSTSHUTDOWN
每个执行程序 CID_MBIM_MSIPADDRESSINFO
CID_MBIM_MSNETWORKIDLEHINT
CID_MBIM_MULTICARRIER_CURRENT_CID_LIST

双 SIM 卡单一活动

双 SIM 卡单活动 (DSSA) 是 Windows 10 中完全支持的唯一多 SIM 卡操作形式。 DSSA 允许将两个 SIM 卡用于调制解调器,但限制在任何给定时间只能有一个 SIM 卡处于活动状态。

体系结构/流

显示 DSSA 流的示意图。

槽切换行为

如果 DSSA 在设备上受支持,则在某些情况下,槽切换是自动执行的,或者用户通过通知 Toast 提示执行。

开箱即用体验 (OOBE)

  • 在 OOBE 期间,WwanSvc 可能会根据物理槽的状态执行槽重新映射。 如果物理槽为空,则选择嵌入的槽。 如果物理槽具有 SIM 卡,则选择物理槽。

SIM 卡删除

  • 如果 SIM 已从物理槽中删除,并且物理槽是当前选定的槽,则会显示 Toast,询问用户是否要切换到嵌入的插槽。
  • 如果用户选择“是”,则切换槽。

说明 SIM 删除过程的流程图。

SIM 卡插入

  • 如果通过 regkey 启用自动切换:
    • 如果在嵌入所选槽时将 SIM 卡插入到物理槽中,则插槽会自动切换到物理槽,并显示 Toast,告知用户有关开关的信息。
    • Toast 有一个用于打开设置页面的按钮。
  • 如果通过 regkey 禁用了自动切换
    • 如果在嵌入所选槽时将 SIM 卡插入到物理槽中,则会显示 Toast,询问用户是否要切换到物理槽。
    • 如果用户选择“是”,则切换槽。

使用此注册表项配置自动切换。 默认情况下不存在。

位置: HKLM\Software\Microsoft\Cellular\MVSettings\DeviceSpecific\CellUX
关键: EnableAutoSlotSwitch
类型: REG_DWORD
值: 1 |0 (默认值,禁用)

说明 SIM 插入过程的流程图。

硬件实验室工具包 (HLK) 测试

请参阅 安装 HLK 的步骤

在 HLK Studio 中,连接到设备手机网络调制解调器驱动程序并运行测试: Win6_4.MB。Gsm。Data.TestSlot。 此测试包含以下四个测试:

测试名称 说明
QuerySlotMapping 此测试验证测试是否可以成功查询 devcie 槽映射。
SetSlotMapping 此测试验证测试是否可以成功设置设备槽映射。
QuerySlotInfo 此测试验证测试是否可以成功查询设备槽信息。
ValidateSlotInfoState 此测试针对 ReadyInfoState 验证 UICC 槽状态。

或者,可以通过 netsh-mbn 和 netsh-mbn-test-installation 运行 TestSlot HLK 测试列表。

netsh mbn test feature=dssa testpath="C:\data\test\bin" taefpath="C:\data\test\bin" param="AccessString=internet"

此显示 HLK 测试结果的文件应在运行“netsh mbn test”命令的目录中生成: TestSlot.htm

日志分析

  1. 可以使用以下说明收集和解码日志: MB 收集日志
  2. TextAnalysisTool 中打开 .txt 文件
  3. 加载 DSSA 筛选器

下面是用于查询和设置槽映射的示例日志:

  1619 [5]6C6C.0824::01/09/2020-10:57:17.118 [WwanDimCommon]QUERY OID_WWAN_DEVICE_CAPS_EX (e01012e), RequestId 11, Status 340001
  1673 [5]6C6C.0824::01/09/2020-10:57:17.118 [WwanDimCommon]QUERY OID_WWAN_SYS_CAPS (e01012d), RequestId 21, Status 340001
  2488 [5]6C6C.2738::01/09/2020-10:57:17.120 [WwanDimCommon]    StatusCode    : NDIS_STATUS_WWAN_DEVICE_CAPS_EX (0x4004103f)
  2520 [5]6C6C.2738::01/09/2020-10:57:17.120 [WwanDimCommon]    SSERVICE_CAPS_MULTI_SIM     : Supported
  2669 [2]6C6C.2738::01/09/2020-10:57:17.121 [WwanDimCommon]    StatusCode    : NDIS_STATUS_WWAN_SYS_CAPS_INFO (0x4004102c)
  2679 [2]6C6C.2738::01/09/2020-10:57:17.121 [WwanDimCommon]    NumberOfExecutors 0x1
  2680 [2]6C6C.2738::01/09/2020-10:57:17.121 [WwanDimCommon]    NumberOfSlots 0x2
  3497 [5]6C6C.0824::01/09/2020-10:57:17.125 [WwanDimCommon]QUERY OID_WWAN_SLOT_INFO_STATUS (e010130), RequestId 42, Status 340001
  3502 [5]6C6C.0824::01/09/2020-10:57:17.125 [WwanDimCommon]    Slot Index    : 0
  3531 [5]6C6C.0824::01/09/2020-10:57:17.126 [WwanDimCommon]QUERY OID_WWAN_SLOT_INFO_STATUS (e010130), RequestId 32, Status 340001
  3536 [5]6C6C.0824::01/09/2020-10:57:17.126 [WwanDimCommon]    Slot Index    : 1
  6356 [4]6C6C.2738::01/09/2020-10:57:17.133 [WwanDimCommon]    ReadyState     : WwanReadyStateInitialized (0x1)
  6890 [4]6C6C.2738::01/09/2020-10:57:17.134 [WwanDimCommon]    ReadyState     : WwanReadyStateInitialized (0x1)
  6912 [4]6C6C.2738::01/09/2020-10:57:17.134 [WwanDimCommon]    ReadyState     : WwanReadyStateInitialized (0x1)
  6926 [4]6C6C.2738::01/09/2020-10:57:17.134 [WwanDimCommon]    StatusCode    : NDIS_STATUS_WWAN_SLOT_INFO (0x4004102e)
  6934 [4]6C6C.2738::01/09/2020-10:57:17.134 [WwanDimCommon]    SlotIndex     : 0x0
  6935 [4]6C6C.2738::01/09/2020-10:57:17.134 [WwanDimCommon]    SlotState     :  WwanUiccSlotStateActive (0x5)
  6955 [4]6C6C.2738::01/09/2020-10:57:17.134 [WwanDimCommon]    ReadyState     : WwanReadyStateInitialized (0x1)
  7060 [7]6C6C.2738::01/09/2020-10:57:17.135 [WwanDimCommon]    ReadyState     : WwanReadyStateInitialized (0x1)
  7100 [6]6C6C.2738::01/09/2020-10:57:17.135 [WwanDimCommon]    StatusCode    : NDIS_STATUS_WWAN_SLOT_INFO (0x4004102e)
  7108 [6]6C6C.2738::01/09/2020-10:57:17.135 [WwanDimCommon]    SlotIndex     : 0x1
  7109 [6]6C6C.2738::01/09/2020-10:57:17.135 [WwanDimCommon]    SlotState     :  WwanUiccSlotStateActiveEsimNoProfile (0x8)
  7140 [6]6C6C.2738::01/09/2020-10:57:17.135 [WwanDimCommon]    ReadyState     : WwanReadyStateInitialized (0x1)
  7177 [6]6C6C.2738::01/09/2020-10:57:17.135 [WwanDimCommon]    ReadyState     : WwanReadyStateInitialized (0x1)
  8424 [4]6C6C.2738::01/09/2020-10:57:17.137 [WwanDimCommon]    ReadyState     : WwanReadyStateInitialized (0x1)
 10616 [6]6C6C.2738::01/09/2020-10:57:17.145 [WwanDimCommon]    ReadyState     : WwanReadyStateInitialized (0x1)
 12731 [4]6C6C.2738::01/09/2020-10:57:17.149 [WwanDimCommon]QUERY OID_WWAN_SYS_SLOTMAPPINGS (e01012f), RequestId 1e1, Status 340001
 12991 [2]6C6C.2738::01/09/2020-10:57:17.150 [WwanDimCommon]    StatusCode    : NDIS_STATUS_WWAN_DEVICE_SLOT_MAPPING_INFO (0x4004102d)
 13003 [2]6C6C.2738::01/09/2020-10:57:17.150 [WwanDimCommon]        Executor Index 0 is mapped to Uicc Slot Index 0
123489 [4]6C6C.2738::01/09/2020-10:57:24.048 [WwanDimCommon]    ReadyState     : WwanReadyStateInitialized (0x1)
128251 [2]6C6C.2738::01/09/2020-10:57:24.064 [WwanDimCommon]    ReadyState     : WwanReadyStateInitialized (0x1)
128317 [2]6C6C.2738::01/09/2020-10:57:24.064 [WwanDimCommon]    ReadyState     : WwanReadyStateInitialized (0x1)
128407 [7]6C6C.2738::01/09/2020-10:57:24.064 [WwanDimCommon]    ReadyState     : WwanReadyStateInitialized (0x1)
128445 [7]6C6C.2738::01/09/2020-10:57:24.065 [WwanDimCommon]    ReadyState     : WwanReadyStateInitialized (0x1)
129265 [5]6C6C.2738::01/09/2020-10:57:24.067 [WwanDimCommon]    ReadyState     : WwanReadyStateInitialized (0x1)
129292 [5]6C6C.2738::01/09/2020-10:57:24.067 [WwanDimCommon]    ReadyState     : WwanReadyStateInitialized (0x1)
130122 [7]6C6C.2738::01/09/2020-10:57:24.069 [WwanDimCommon]    ReadyState     : WwanReadyStateInitialized (0x1)
155583 [2]6C6C.2738::01/09/2020-10:57:26.637 [WwanDimCommon]    ReadyState     : WwanReadyStateInitialized (0x1)
159010 [7]6C6C.2738::01/09/2020-10:57:26.644 [WwanDimCommon]    ReadyState     : WwanReadyStateInitialized (0x1)
159034 [7]6C6C.2738::01/09/2020-10:57:26.644 [WwanDimCommon]    ReadyState     : WwanReadyStateInitialized (0x1)
161963 [7]6C6C.2738::01/09/2020-10:57:26.655 [WwanDimCommon]    ReadyState     : WwanReadyStateInitialized (0x1)
161986 [7]6C6C.2738::01/09/2020-10:57:26.655 [WwanDimCommon]    ReadyState     : WwanReadyStateInitialized (0x1)
162110 [2]6C6C.2738::01/09/2020-10:57:26.655 [WwanDimCommon]    ReadyState     : WwanReadyStateInitialized (0x1)
162355 [4]6C6C.2738::01/09/2020-10:57:26.656 [WwanDimCommon]    ReadyState     : WwanReadyStateInitialized (0x1)
162381 [6]6C6C.2738::01/09/2020-10:57:26.656 [WwanDimCommon]    ReadyState     : WwanReadyStateInitialized (0x1)
162441 [4]6C6C.2738::01/09/2020-10:57:26.656 [WwanDimCommon]    ReadyState     : WwanReadyStateInitialized (0x1)
194294 [6]6C6C.2738::01/09/2020-10:57:28.722 [WwanDimCommon]    ReadyState     : WwanReadyStateInitialized (0x1)
200029 [0]6C6C.2738::01/09/2020-10:57:28.738 [WwanDimCommon]    ReadyState     : WwanReadyStateInitialized (0x1)
200131 [4]6C6C.2738::01/09/2020-10:57:28.738 [WwanDimCommon]    ReadyState     : WwanReadyStateInitialized (0x1)
200354 [7]6C6C.2738::01/09/2020-10:57:28.739 [WwanDimCommon]    ReadyState     : WwanReadyStateInitialized (0x1)
200671 [6]6C6C.2738::01/09/2020-10:57:28.739 [WwanDimCommon]    ReadyState     : WwanReadyStateInitialized (0x1)
200729 [7]6C6C.2738::01/09/2020-10:57:28.739 [WwanDimCommon]    ReadyState     : WwanReadyStateInitialized (0x1)
200864 [1]6C6C.2738::01/09/2020-10:57:28.740 [WwanDimCommon]    ReadyState     : WwanReadyStateInitialized (0x1)
201464 [0]6C6C.2738::01/09/2020-10:57:28.741 [WwanDimCommon]    ReadyState     : WwanReadyStateInitialized (0x1)
265128 [1]6C6C.2218::01/09/2020-10:57:32.150 [WwanDimCommon]SET OID_WWAN_SYS_SLOTMAPPINGS (e01012f), RequestId a6, Len 10, Status 340001
265133 [1]6C6C.2218::01/09/2020-10:57:32.150 [WwanDimCommon]    SlotMapListHeader.ElementType    : 0xe
265134 [1]6C6C.2218::01/09/2020-10:57:32.150 [WwanDimCommon]    SlotMapListHeader.ElementCount    : 0x1
265135 [1]6C6C.2218::01/09/2020-10:57:32.150 [WwanDimCommon]    Executor Index 0 is mapped to Uicc Slot Index 1
265523 [6]6C6C.2738::01/09/2020-10:57:32.152 [WwanDimCommon]    ReadyState     : WwanReadyStateOff (0x0)
270760 [5]6C6C.2738::01/09/2020-10:57:32.171 [WwanDimCommon]    StatusCode    : NDIS_STATUS_WWAN_DEVICE_SLOT_MAPPING_INFO (0x4004102d)
270770 [5]6C6C.2738::01/09/2020-10:57:32.171 [WwanDimCommon]        Executor Index 0 is mapped to Uicc Slot Index 1
270799 [5]6C6C.2738::01/09/2020-10:57:32.171 [WwanDimCommon]    StatusCode    : NDIS_STATUS_WWAN_SLOT_INFO (0x4004102e)
270807 [5]6C6C.2738::01/09/2020-10:57:32.171 [WwanDimCommon]    SlotIndex     : 0x0
270808 [5]6C6C.2738::01/09/2020-10:57:32.171 [WwanDimCommon]    SlotState     :  WwanUiccSlotStateEmpty (0x3)
270827 [5]6C6C.2738::01/09/2020-10:57:32.171 [WwanDimCommon]    ReadyState     : WwanReadyStateFailure (0x4)
271044 [5]6C6C.2738::01/09/2020-10:57:32.172 [WwanDimCommon]    ReadyState     : WwanReadyStateFailure (0x4)
271089 [5]6C6C.2738::01/09/2020-10:57:32.172 [WwanDimCommon]    ReadyState     : WwanReadyStateFailure (0x4)
271130 [5]6C6C.2738::01/09/2020-10:57:32.172 [WwanDimCommon]    ReadyState     : WwanReadyStateSimNotInserted (0x2)
274729 [7]6C6C.2738::01/09/2020-10:57:32.188 [WwanDimCommon]    ReadyState     : WwanReadyStateInitialized (0x1)
283027 [6]6C6C.2738::01/09/2020-10:57:32.211 [WwanDimCommon]    ReadyState     : WwanReadyStateSimNotInserted (0x2)
323130 [5]6C6C.2738::01/09/2020-10:57:32.352 [WwanDimCommon]    ReadyState     : WwanReadyStateNoEsimProfile (0x7)
403200 [0]6C6C.2738::01/09/2020-10:57:33.748 [WwanDimCommon]    StatusCode    : NDIS_STATUS_WWAN_SLOT_INFO (0x4004102e)
403208 [0]6C6C.2738::01/09/2020-10:57:33.748 [WwanDimCommon]    SlotIndex     : 0x0
403209 [0]6C6C.2738::01/09/2020-10:57:33.748 [WwanDimCommon]    SlotState     :  WwanUiccSlotStateActive (0x5)
407008 [5]6C6C.33A8::01/09/2020-10:57:40.355 [WwanDimCommon]SET OID_WWAN_SYS_SLOTMAPPINGS (e01012f), RequestId 18f, Len 10, Status 340001
407015 [5]6C6C.33A8::01/09/2020-10:57:40.355 [WwanDimCommon]    SlotMapListHeader.ElementType    : 0xe
407017 [5]6C6C.33A8::01/09/2020-10:57:40.355 [WwanDimCommon]    SlotMapListHeader.ElementCount    : 0x1
407018 [5]6C6C.33A8::01/09/2020-10:57:40.355 [WwanDimCommon]    Executor Index 0 is mapped to Uicc Slot Index 0
407079 [4]6C6C.2738::01/09/2020-10:57:40.355 [WwanDimCommon]    ReadyState     : WwanReadyStateOff (0x0)
409570 [2]6C6C.2738::01/09/2020-10:57:40.371 [WwanDimCommon]    StatusCode    : NDIS_STATUS_WWAN_DEVICE_SLOT_MAPPING_INFO (0x4004102d)
409580 [2]6C6C.2738::01/09/2020-10:57:40.371 [WwanDimCommon]        Executor Index 0 is mapped to Uicc Slot Index 0
409591 [5]6C6C.2738::01/09/2020-10:57:40.371 [WwanDimCommon]    StatusCode    : NDIS_STATUS_WWAN_SLOT_INFO (0x4004102e)
409600 [5]6C6C.2738::01/09/2020-10:57:40.371 [WwanDimCommon]    SlotIndex     : 0x1
409601 [5]6C6C.2738::01/09/2020-10:57:40.371 [WwanDimCommon]    SlotState     :  WwanUiccSlotStateEmpty (0x3)
411302 [7]6C6C.2738::01/09/2020-10:57:40.385 [WwanDimCommon]    ReadyState     : WwanReadyStateSimNotInserted (0x2)
416851 [4]6C6C.2738::01/09/2020-10:57:40.510 [WwanDimCommon]    StatusCode    : NDIS_STATUS_WWAN_SLOT_INFO (0x4004102e)
416859 [4]6C6C.2738::01/09/2020-10:57:40.510 [WwanDimCommon]    SlotIndex     : 0x1
416860 [4]6C6C.2738::01/09/2020-10:57:40.510 [WwanDimCommon]    SlotState     :  WwanUiccSlotStateActiveEsimNoProfile (0x8)
418613 [0]6C6C.2738::01/09/2020-10:57:42.632 [WwanDimCommon]    ReadyState     : WwanReadyStateOff (0x0)
434410 [4]6C6C.2738::01/09/2020-10:57:44.558 [WwanDimCommon]    ReadyState     : WwanReadyStateInitialized (0x1)
443914 [7]6C6C.2738::01/09/2020-10:57:44.593 [WwanDimCommon]    ReadyState     : WwanReadyStateInitialized (0x1)
529138 [4]6C6C.2738::01/09/2020-10:57:45.270 [WwanDimCommon]    ReadyState     : WwanReadyStateInitialized (0x1)