桌面多调制解调器多执行程序支持
传统上,非手机的 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 的可能组合。
在执行器内部,蜂窝协议栈通常被视为自包含的系统,只是在双待机调制解调器实现的情况下除外,此时处理通信流量(语音和/或数据)的执行器可能会阻止另一个执行器保持注册。
下图演示了双备用调制解调器的逻辑视图。 执行程序 0 上的流量(电话呼叫)导致执行程序 1 丢失注册。
NDIS 6.7 中的 Windows 桌面调制解调器接口模型不适用于此类体系结构,因为它基于几个隐式假设:
- 该模型假定调制解调器中存在单个执行程序。
- 该模型假定有一个与调制解调器硬件直接关联的单个 UICC 卡。
- UICC 被视为单应用程序 SIM 卡。
相比之下,Windows Mobile上的Microsoft Radio Interface Layer(RIL)接口明确揭示了这些假设的多重性。 Windows Mobile 中的移动宽带接口公开了通过单独的微型端口独立注册的功能,并假定设备的某些基本配置已通过 RIL 接口完成。 为了提供等效的功能,Windows 桌面必须提供机制来发现执行器和槽数、独立访问执行程序、定义执行程序与槽之间的映射,以及定义每个执行程序将使用的映射 UICC 卡中的应用程序。
有关手机网络体系结构的详细信息以及 Windows 10 移动版和桌面版之间的差异,请参阅 手机网络体系结构和实现。
主要对象和操作
下图显示了调制解调器的抽象模型。
每个调制解调器由全局唯一标识符(GUID)标识,并包含一组或多项执行程序,每个执行程序都可以在移动电话网络上独立注册。 每个执行程序都有一个关联的执行程序索引,一个整数,从第一个执行器 0 开始。 此外,调制解调器还会公开一个或多个可能包含 UICC 卡的槽。 假设槽数大于或等于执行程序的数量。 每个槽都有一个从 0 开始的关联索引,以及与该槽的电源状态和(如果有)插在槽中的卡的可用性状态相关的当前状态。
为了确保与现有调制解调器的兼容性,每个执行程序都使用单个槽中的 UICC 卡提供的信息进行操作。 执行程序与槽之间的关联由槽映射定义,该映射将每个执行程序映射到一个槽。
槽可能包含 UICC 卡;每个卡都包含一个或多个 UICC 应用程序,例如 USIM、CSIM、ISIM 或其他电话和非电话应用程序,例如 PKCS#15 或用于 NFC 安全元素的全局平台应用程序。 这些单独的 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 |
注释
Windows 10 版本 1703 对 OID_WWAN_RADIO_STATE 也进行了更新。 有关详细信息,请参阅OID_WWAN_RADIO_STATE。
多卡操作的MBIM接口更新
对于非 Windows Mobile 操作系统,多执行器调制解调器显示为一个具有多个 MBIM 功能的 USB 复合设备。 每个 MBIM 函数表示可以维护注册的执行程序。 执行程序特定的命令和通知通过表示执行程序的 MBIM 函数交换,而特定于调制解调器的命令(换句话说,不是执行程序特定的命令)及其相应的通知可以发送到或来自属于同一基础 USB 复合设备的任何 MBIM 函数。
所有向 MBIM 函数发出的 CID 集或查询请求都针对与之关联的微型端口实例的调制解调器和执行程序执行;同样,从 MBIM 函数发送的所有未经请求的通知都适用于与 MBIM 函数关联的调制解调器和执行程序。 同样,从微型端口实例发送的所有未经请求的设备服务事件都适用于与 MBIM 函数关联的调制解调器和执行程序。 例如,来自 MBIM 函数的未经请求的MBIM_CID_REGISTER_STATE或MBIM_CID_PACKET_SERVICE通知仅指示关联的调制解调器/执行程序的注册或数据包服务状态,并且与其他调制解调器或其他执行程序的状态无关。
如果设备中有多个调制解调器和/或多个执行程序,则与特定调制解调器和执行程序组合相关的非特定于上下文的未请求通知应从与上述调制解调器和执行程序关联的 MBIM 函数发出。
在具有多个调制解调器和/或多个执行程序的设备上,与特定调制解调器和执行程序相关的非特定于上下文的 CID 查询请求可能会颁发给与该调制解调器和执行程序组合关联的 MBIM 函数。 接收此类查询请求的函数应根据 CID 定义对其进行处理。 如果是由调制解调器固件选择的,则此类查询请求可与任何其他 CID 集一起处理,或者由与该调制解调器和执行程序关联的任何 MBIM 函数处理查询请求。 与同一调制解调器关联的所有 MBIM 函数除了报告它们所代表的执行程序外,还应报告该手机调制解调器的相同状态信息。
当设备中有多个调制解调器和/或多个执行程序时,可能会向与该调制解调器和执行程序关联的 MBIM 函数发出非执行程序特定的 CID 集请求。 调制解调器应跟踪整个此类请求的进度。 如果一个此类设置请求在任何适配器中正在进行且尚未完成,则与同一调制解调器和执行程序关联的任何适配器实例进行的第二个此类设置请求应在前一个请求完成后排队并处理。
下图演示了两个不同的调制解调器中的 WWANSVC 和 MBIM 函数之间的信息流。
本部分包含定义的设备服务的整个调制解调器和每个执行器的 CID 详细描述。 定义引用回现有公共 MBIM1.0 规范。 符合 MBIM 标准的设备在通过 CID_MBIM_DEVICE_SERVICES 查询时,实现并报告以下设备服务。 现有已知服务在 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
DESCRIPTION
此 CID 检索有关调制解调器的信息。 这可以在公开为 USB 函数的任何 MB 实例上发送。
查询
MBIM_COMMAND_MSG中的 InformationBuffer 以MBIM_MS_SYS_CAPS_INFO形式包含响应数据。
设置
不適用。
未经请求的事件
不適用。
参数
| 操作 | 设置 | 查询 | 通知 |
|---|---|---|---|
| 指令 | 不適用 | 不適用 | 不適用 |
| 响应 | 不適用 | MBIM_MS_SYS_CAPS_INFO | 不適用 |
数据结构
查询
InformationBuffer 应为 null,InformationBufferLength 应为零。
设置
不適用。
响应
在 InformationBuffer 中应使用以下MBIM_SYS_CAPS_INFO结构。
| Offset | 尺寸 | 领域 | 类型 | DESCRIPTION |
|---|---|---|---|---|
| 0 | 4 | 执行器数量 | UINT32 | 此调制解调器报告的 MBB 实例数 |
| 4 | 4 | 槽位数量 | 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
DESCRIPTION
此 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。
参数
| 操作 | 设置 | 查询 | 通知 |
|---|---|---|---|
| 指令 | 不適用 | 不適用 | 不適用 |
| 响应 | 不適用 | 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 | 尺寸 | 领域 | 类型 | DESCRIPTION |
|---|---|---|---|---|
| 0 | 4 | 设备类型 | 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 | |
| 二十四 | 4 | ControlCaps | MBIM_CTRL_CAPS | |
| 28 | 4 | MaxSessions | UINT32 | |
| 32 | 4 | CustomDataClassOffset | OFFSET | |
| 36 | 4 | CustomDataClassSize | SIZE(0..22) | |
| 40 | 4 | 设备ID偏移量 | OFFSET | |
| 44 | 4 | DeviceIdSize | SIZE(0..26) | |
| 48 | 4 | FirmwareInfoOffset | OFFSET | |
| 52 | 4 | 固件信息大小 | SIZE(0..60) | |
| 56 | 4 | HardwareInfoOffset | OFFSET | |
| 六十 | 4 | 硬件信息大小 | SIZE(0..60) | |
| 64 | 4 | ExecutorIndex | UINT32 | 执行者索引。 它的范围从 0 到 n-1 ,其中 n 是 MBIM 调制解调器中包含的 MBB 实例数。 其值始终是常量且独立于枚举顺序。 |
| 68 | 数据缓冲区 (DataBuffer) | DATABUFFER | 包含 CustomDataClass、DeviceId、FirmwareInfo 和 HardwareInfo 成员的数据缓冲区。 |
状态代码
此 CID 使用通用状态代码(请参阅公共 USB MBIM 标准第 9.4.5 节中的状态代码的使用)。
MBIM_CID_MS_DEVICE_SLOT_MAPPINGS
DESCRIPTION
此 CID 设置或返回设备槽映射(换句话说,执行程序槽映射)。
查询
在MBIM_COMMAND_MSG上没有使用InformationBuffer。 MBIM_MS_DEVICE_SLOT_MAPPING_INFO 在 MBIM_COMMAND_DONE 的 InformationBuffer 中返回。
设置
MBIM_COMMAND_MSG 的信息 Buffer 包含 MBIM_MS_DEVICE_SLOT_MAPPING_INFO。 MBIM_COMMAND_DONE InformationBuffer 中返回MBIM_MS_DEVICE_SLOT_MAPPING_INFO。 无论 Set CID 是成功还是失败,响应中包含的MBIM_MS_DEVICE_SLOT_MAPPING_INFO都表示当前的设备槽映射。
未经请求的事件
不適用。
参数
| 操作 | 设置 | 查询 | 通知 |
|---|---|---|---|
| 指令 | 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 | 尺寸 | 领域 | 类型 | DESCRIPTION |
|---|---|---|---|---|
| 0 | 4 | MapCount (MC) | UINT32 | 映射数,这始终等于设备/执行程序的数量。 |
| 4 | 8 * MC | SlotMapList | OL_PAIR_LIST | 此列表的第 i 对,其中(0 <= i <= (MC-1))记录了当前映射到第 i 个设备/执行器的槽的索引。 对中的第一个元素是一个4字节字段,表示在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。
状态代码
| 状态代码 | DESCRIPTION |
|---|---|
| MBIM_STATUS_BUSY | 操作失败,因为设备正忙。 如果函数没有任何显式的方法来清除此条件,主机可以使用函数的后续操作(例如通知或命令完成)作为提示来重试失败的操作。 |
| MBIM_STATUS_FAILURE | 操作失败(一般失败)。 |
| 语音通话进行中 | 操作失败,因为语音呼叫正在进行中。 |
| MBIM_STATUS_INVALID_PARAMETERS | 由于参数无效(例如映射中的槽号超出范围或重复值),作失败。 |
MBIM_CID_MS_SLOT_INFO_STATUS
DESCRIPTION
此 CID 检索指定的 UICC 插槽及其中的卡(如果有)的高级汇总状态。 当其中一个槽的状态发生更改时,它还可用于传递未经请求的通知。
查询
MBIM_COMMAND_MSG 的 InformationBuffer 中包含一个 MBIM_MS_SLOT_INFO_REQ 结构。 MBIM_COMMAND_DONE 消息的 InformationBuffer 包含一个 MBIM_MS_SLOT_INFO 结构。
设置
不適用。
未经请求的事件
事件信息Buffer 包含MBIM_MS_SLOT_INFO结构。 该函数在复合槽/卡状态发生更改时发送此事件。
参数
| 操作 | 设置 | 查询 | 通知 |
|---|---|---|---|
| 指令 | 不適用 | MBIM_MS_SLOT_INFO_REQ | 不適用 |
| 响应 | 不適用 | MBIM_MS_SLOT_INFO | MBIM_MS_SLOT_INFO |
数据结构
查询
在 InformationBuffer 中应使用以下MBIM_MS_SLOT_INFO_REQ结构。
| Offset | 尺寸 | 领域 | 类型 | DESCRIPTION |
|---|---|---|---|---|
| 0 | 4 | SlotIndex | UINT32 | 要查询的槽的索引。 |
设置
不適用。
响应
在 InformationBuffer 中应使用以下MBIM_MS_SLOT_INFO结构。
| Offset | 尺寸 | 领域 | 类型 | DESCRIPTION |
|---|---|---|---|---|
| 0 | 4 | SlotIndex | UINT32 | 槽的索引。 |
| 4 | 4 | 国家 | MBIM_MS_UICC_SLOT_STATE | 插槽和卡的状态(如果适用)。 |
以下MBIM_MS_UICCSLOT_STATE结构描述了槽的可能状态。
| 国家 | 价值 | DESCRIPTION |
|---|---|---|
| UICCSlotStateUnknown | 0 | 调制解调器仍在初始化过程中,因此 SIM 槽状态不是确定性的。 |
| UICCSlotStateOffEmpty | 1 | UICC 槽已断电,没有卡片插入。 无法确定某一已关闭槽位中卡片存在与否的实现,其会将状态报告为 UICCSlotStateOff。 |
| UICCSlotStateOff | 2 | UICC 槽已断电。 |
| UICC插槽状态为空 | 3 | UICC 槽为空(其中没有卡片)。 |
| UICC卡槽状态未准备好 | 4 | UICC 槽已占用并打开电源,但其中的卡尚未准备好。 |
| UICCSlotStateActive | 5 | UICC 槽已被占用,其内的卡片已准备就绪。 |
| UICCSlotStateError | 6 | UICC 槽已占用并处于打开状态,但卡处于错误状态,在下次重置之前无法使用。 |
| UICCSlotStateActiveEsim | 7 | 槽中的卡是一张具有活动配置文件的 eSIM,已准备好接受指令。 |
| UICC 插槽状态 – 活动,eSIM,无配置文件 | 8 | 槽中的卡是一个 eSIM,没有配置文件(或没有活动配置文件),并且已准备好接受命令。 |
多 sim 卡设备的MBIM_MS_UICCSLOT_STATE过渡指南
符合正确的 UICC 槽状态转换可确保 OS 正确处理所有更改并向用户显示正确的 Toast 通知。
对于 SIM 插入 的 Toast 通知,OS 需要选择嵌入式槽(SIM2/Slot 1),并在物理槽(SIM1/Slot 0)中插入 SIM 卡时进行以下状态转换。
| SIM 插入前槽 0 的可能值 | SIM 插入后槽 0 的可能值 |
|---|---|
| UICC槽状态为空 | UICCSlotStateActive |
| UICCSlotStateOffEmpty |
|
对于删除 SIM的弹出通知,操作系统要求选择一个已经插入了 SIM 卡的物理槽(SIM1/槽0),并在从该物理槽(SIM1/槽0)中移除 SIM 卡时,进行以下状态转换。
| 移除 SIM 卡之前槽位 0 的可能值 | 删除 SIM 卡后槽 0 的可能值 |
|---|---|
| UICCSlotStateActive | UICC槽状态为空 |
|
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_多运营商_当前_CID_列表 |
双 SIM 卡单卡激活
双 SIM 卡单卡激活(DSSA)是 Windows 10 中唯一完全支持的多 SIM 操作形式。 DSSA 允许将两张 SIM 卡与调制解调器一起使用,但限制在任何给定时间只能有一个 SIM 卡处于活动状态。
体系结构/流
槽切换行为
如果设备支持 DSSA,在某些情况下,卡槽切换可能会自动进行,或者用户会通过消息提示被提醒进行切换。
开箱即用体验 (OOBE)
- 在 OOBE 期间,WwanSvc 服务可以根据物理插槽的状态执行插槽重新映射。 如果物理槽为空,则选择嵌入的槽。 如果物理槽具有 SIM 卡,则选择物理槽。
SIM 移除
- 如果 SIM 从物理槽中移除,并且物理槽是当前选定的槽,则会显示一条消息,询问用户是否要切换到内嵌槽。
- 如果用户选择“是”,则切换槽位。
SIM 插入
- 如果通过 regkey 启用自动切换:
- 如果在选定的槽位为嵌入式槽位时将 SIM 卡插入到物理槽,则系统会自动切换到物理槽,并显示一条 Toast 通知用户有关切换的信息。
- Toast 有一个用于打开设置页的按钮。
- 如果通过 regkey 禁用自动切换
- 如果在当前所选的插槽为嵌入式时将 SIM 卡插入物理槽,将显示提示信息,询问用户是否切换至物理槽。
- 如果用户选择“是”,则会切换槽。
使用此注册表项配置自动切换。 默认情况下不存在它。
位置: HKLM\Software\Microsoft\Cellular\MVSettings\DeviceSpecific\CellUX
键: EnableAutoSlotSwitch
类型:REG_DWORD
值: 1 |0 (默认值,已禁用)
硬件实验室工具包 (HLK) 测试
请参阅 安装 HLK 的步骤。
在 HLK Studio 中连接到设备的蜂窝调制解调器驱动程序并运行测试:Win6_4.MB.GSM.Data.TestSlot。 此测试包含以下四个测试:
| 测试名称 | DESCRIPTION |
|---|---|
| QuerySlotMapping | 此测试验证能否成功查询设备槽映射。 |
| SetSlotMapping | 此测试验证测试可以成功设置设备槽映射。 |
| QuerySlotInfo | 此测试验证可以成功查询设备槽位信息。 |
| ValidateSlotInfoState | 此测试将 UICC 插槽状态与 ReadyInfoState 对比验证。 |
或者,可以通过 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
日志分析
- 可以使用以下说明收集和解码 日志:MB 收集日志
- 在 TextAnalysisTool 中打开 .txt 文件
- 加载 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)