本文实质上是记录我在尝试为我的手机启用电信 VoWiFi 支持的步骤,意在为读者提供探索的思路而并非解决方案,本文确实会提供适用于本台设备的配置文件,可能可以直接使用但并无保证。
本人并非基带相关行业从事人员,高通的资料在网络上也严重缺失,因此本文提到的概念和所谓的推论都可能是有误的,欢迎指正。
另外请注意,本文要求设备有 root 权限,仅适用于高通设备且必须带有 EFS 分区,对于 MTK 设备请探寻另一套方案。
序言
我居住的地区附近电信基站信号较弱,自从 VoLTE 强制普及后(电信不允许 5G 设备保留 CDMA 支持,因此后疫情时代没有 VoLTE 几乎无法使用)严重情况下在室内经常错过电话。皮基站确实是一套解决方案,但需要先和电信预约,安装的时候需要强实名认证,还额外占用一个插座,属实不方便。自从电信 VoWiFi 在 2023 年开始公测时我就一直关注着进展,但即便到了 2025 年电信仍未大面积铺开 VoWiFi 支持,也只有最新的设备支持电信 VoWiFi,我便琢磨着如何给旧的设备启用 VoWiFi。
直到真正折腾的时候才发现网上针对相关的资料虽然很多,但都很零散,而且提供的方法往往只适用于部分机型 / 运营商,此外就算涉及到修改文件的方法,博主往往只是粗暴地上传了一份替换文件,并未提及思路,这给我添了很多麻烦,因此本文并非一篇单纯的教程,更多的是一种探索的思路,一方面记录我的踩坑经历,也能给其他想要研究的人一些思路上的帮助。
已有研究
在互联网上,在这方面的相关研究都还停留在启用 VoLTE 层面,但本质上启用 VoLTE 和 VoWiFi 是非常相近的,因此我们可以举一反三,学习这些教程上启用 VoLTE 的方法,大致流程总结如下:
1. 系统层面启用 VoLTE/VoWiFi
Android 设备上,基带是个独立的子系统,为了能让设备支持 VoLTE/VoWiFi,需要同时在基带和系统层面启用对应功能,因此最简单也是最先需要完成的步骤是启用 Android 系统层面的 VoLTE/VoWiFi 支持。
对于不同 Android ROM,启用方式各不相同,大致可以分为:使用 Magisk/KernelSU 或者索性在编译期间在 build.prop 里添加相关条目,在 MIUI 上使用暗码关闭 VoLTE/VoWiFi carrier check,使用 Pixel IMS 配合 Shizuku 启用 VoLTE/VoWiFi,由于这些教程在网上已经泛滥成灾,这里不再赘述,读者可以直接 Google 获得结果。
2. 基带层面支持 VoLTE/VoWiFi
对于高通设备来说,每个运营商的 VoLTE/VoWiFi 的配置相关文件是保存于一个个 MBN 文件内并烧写到 modem 分区,这些 MBN 配置文件包括信号调制解调、网络注册、运营商特定的频段配置、网络搜索策略、射频校准数据以及 VoLTE/VoWiFi。根据笔者在互联网上的搜索,强制开启 VoLTE/VoWiFi 的操作无非分为如下两种:
强制使用其他运营商 MBN
高通设备的 modem 分区包含大部分运营商的配置文件,如果当前运营商的配置文件未开启 VoLTE/VoWiFi,那是否可以强制在当前卡上应用别的运营商的 MBN 配置?答案是可能的。
根据系统不同,流程不一。对于 MIUI 系统,可以强行开启系统自带的鲁班 MTB 工具,在 MBN 配置页面选择别的运营商的 MBN 并应用到当前卡上;而一个更通用的方法,则是先开启高通调试端口并连接到电脑上,再在电脑上启动 PDC,并选择其他运营商的配置文件 activate 即可。[1]
需要注意此方案是有缺陷的,由于每个运营商各个频段等配置不一,使用此方案很有可能导致部分功能缺失(如频段),并不建议采用此方案。
寻找同 SoC 的新版 MBN
除了上述寻找别的运营商 MBN 强行启用,另外一个办法就是提取其他同 SoC 设备的 modem 分区里的 MBN 文件并装载到当前设备上。
需要注意的是,由于 MBN 文件带有厂商签名,基带在加载时会校验签名,如果不符会直接拒绝加载,因此并不能直接修改 MBN 文件后再替换。
此方法也有两种技术路线,如下:
1. 直接替换 modem 分区下 MBN 文件
这种方案最简单粗暴,但是由于涉及到基带分区变动,在不同设备上可能有不同的修改流程也不一定能生效。
2. 修改 EFS 分区
高通设备的 EFS 分区存储基带相关关键数据,如 WiFi / 蓝牙 MAC 地址、传感器校准数据,IMEI、MEID 以及其他关键数据,刷机圈中所说的备份基带部分指的就是该分区。
每次基带检测到有新的 SIM 卡时,会先从 modem 分区中选取对应运营商的 MBN 配置文件,并把 MBN 中的内容释放到 EFS 分区中。
因此除了直接替换 modem 分区下的 MBN 配置,也可以模拟基带的操作,手动把 MBN 内的配置文件释放到此 EFS 分区中。典型的工具如 EfsTools [2]。
本文做了什么
针对上述方案,如果出现了以下情况(而且出现的概率相当大)
1. 同 SoC 中并没有支持 VoWiFi/VoLTE 的 MBN
2. 一一尝试其他运营商的配置文件后发现并不能达到目的
那还有什么办法呢?笔者后来采用了上文两种方案的结合,在不破坏其他功能的情况下启用电信 VoWiFi,而对于其他运营商或 VoLTE 这种思路都是通用的。
本文测试的设备是美版 Moto G Stylus 2023 5G,原生仅支持电信 VoLTE,参考的配置来源于小米 12S Pro。
具体步骤
最初是某群友求助于笔者,希望能够让他的小米 12S Pro 支持电信 VoWiFi,查阅资料 [3] 得知 12S Pro 在官方支持设备名单内,且要求系统版本在 V14.0.8.2.TLECNXM 及以下版本,那是不是说明,V14.0.8.2 之后的版本的 MBN 文件发生了改变,因此笔者就想着对比 V14.0.8.2 和后一版本内电信 MBN 的差异来分析哪些文件可能用于开启 VoWiFi。
1. 下载 ROM 并提取 MBN
先通过 xmfirmwareupdater.com 等下载站下载到了小米 12S Pro 的 V14.0.8.2 和 V14.0.9.0 版本的线刷包,这里以 V14.0.8.2 为例,解压,随后找到 images/NON-HLOS.bin 文件,这个分区存储了高通 BSP、固件和基带等程序,这其中便包括 MBN 文件,使用 mount 命令将其挂载。
mkdir -p /mnt/mi12spro/v14.0.8.2/modem mount NON-HLOS.bin /mnt/mi12spro/v14.0.8.2/modem cd /mnt/mi12spro/v14.0.8.2/modem
随后找到 image/modem_pr/mcfg/configs/mcfg_sw/generic/
文件夹,这里包含了所有运营商的 MBN 配置,再进入 China/CT/Commercial/VoLTE_OpenMkt/
文件夹,当前文件夹下的 mcfg_sw.mbn
便是中国电信的 MBN 配置;V14.0.9.0 同理按上述操作提取。
2. 解压 MBN 文件
Github 上有很多相关工具,这里笔者使用的是 mbn-mcfg-tools。
注意:这个工具似乎有 bug,解压出来的二进制文件头都多了一个 07 的字节,分析的时候务必剔除
执行 mbn-tool -e mi12SPro14082.mbn mi12SPro14082
解压 MBN,V14.0.9.0 同理。
3. 对比差异
使用 diff
工具对比两个 MBN 解压出来的文件夹内容的差异
diff -bur mi12SPro14082 mi12SPro1409
差异结果如下,文本文件的详细差异在此处略过,在下一节具体分析
Only in mi12SPro14082/files/data: iwlan_s2b_config.xml_(1) diff -bur mi12SPro14082/files/efsprofiles/overideconfig mi12SPro1409/files/efsprofiles/overideconfig --- mi12SPro14082/files/efsprofiles/overideconfig 2025-02-15 11:39:34.909075940 -0500 +++ mi12SPro1409/files/efsprofiles/overideconfig 2025-02-15 12:23:14.919781347 -0500 // ... 略过 Only in mi12SPro14082/files/nv/item_files/data/wlan_config: wlan_offload_config_(1) Binary files mi12SPro14082/files/nv/item_files/ims/IMSWifiDynamicConfig and mi12SPro1409/files/nv/item_files/ims/IMSWifiDynamicConfig differ Only in mi12SPro14082/files/nv/item_files/ims: IMSWifiDynamicConfig_(1) Binary files mi12SPro14082/files/nv/item_files/ims/qp_ims_common_config and mi12SPro1409/files/nv/item_files/ims/qp_ims_common_config differ Binary files mi12SPro14082/files/nv/item_files/ims/qp_ims_reg_config_db and mi12SPro1409/files/nv/item_files/ims/qp_ims_reg_config_db differ Binary files mi12SPro14082/files/nv/item_files/ims/qp_ims_service_enablement_config and mi12SPro1409/files/nv/item_files/ims/qp_ims_service_enablement_config differ Only in mi12SPro14082/files/nv/item_files/modem/mmode: custom_emerg_info Only in mi12SPro14082/files/nv/item_files/modem/mmode: lpm_emerg_wifi_preferred Only in mi12SPro14082/files/nv/item_files/modem/mmode: wifi_config_(1)
4. 分析
经过上文的 diff 我们会发现一个神奇的问题,为什么有些配置文件还有个加了_(1) 后缀的文件?经过后面的分析笔者推测,小米 12S Pro 实际上对公发布的 V14.0.8.2 还是不支持 VoWiFi 的(询问了一些朋友,似乎是需要小米定向推送),但是小米工程师把实际要修改的文件留在了 MBN 配置内并以_(1) 为结尾,这直接给了我们一个很好的机会来判断到底需要修改哪些文件。
1. data/iwlan_s2b_config.xml
根据 deepseek,这个文件包含 VoWiFi 注册配置以及网络切换、优先级设置、密钥策略。
根据 diff 的结果,V14.0.8.2 和 V14.0.9.0 的该文件没有差异,但只在 V14.0.8.2 里出现了 iwlan_s2b_config.xml_(1),让我们来看下这两个文件的差异。
比较显著的变更在于添加了中国电信的 eDPG 服务器地址,其他配置变更基本都无关痛痒(其实是因为根本不知道代表什么意思)。
2. efsprofiles/overideconfig
diff 输出的差异如下:
-[Registration:RegistrationSettings] - -*enableRegistrationInLPM = 2 - -[ISH:ConnectivityParams] - -*IsVoWifiEnabled = 1 - -[QIPCALL:ImsVoWifiConfig] - -#NR and wifi directional values : -#0 -> Disable NR to Wifi in both direcitons -#1 -> Enable NR to Wifi in both directions -#2 -> Enable NR to Wifi Only -#3 -> Enable Wifi to NR Only - -*NRWifiHOConfig_Home_Idle = 0 - -#NR and wifi directional values : -#0 -> Disable NR to Wifi in both direcitons -#1 -> Enable NR to Wifi in both directions -#2 -> Enable NR to Wifi Only -#3 -> Enable Wifi to NR Only - -*NRWifiHOConfig_Home_Active = 0 - -#NR and wifi directional values : -#0 -> Disable NR to Wifi in both direcitons -#1 -> Enable NR to Wifi in both directions -#2 -> Enable NR to Wifi Only -#3 -> Enable Wifi to NR Only - -*NRWifiHOConfig_Home_Active_Connecting = 0 - -*MidCallConnectivityTimer = 5 - -#This config is required to enable performing on-demand DPD mid call check on WiFi call timeout to check backhaul connectivity -#0 -> Disable on demand DPD check (default) -#1 -> Enable on demand DPD check - -*EnableOnDemandDPDCheckOnWiFiMidCallInactivityTimeOut = 1
上文的内容在 V14.0.9.0 的 MBN 中被移除,在这里我们看到了很关键的 IsVoWifiEnabled
,因此我们可以确认在 V14.0.9.0 版本中 VoWiFi 特性已被彻底移除,V14.0.8.2 虽然也未能开启 VoWiFi 但是保留了相关配置。
3. nv/item_files/data/wlan_config/wlan_offload_config
这个文件非常简单只有一个字节,且在两个版本的 ROM 中的值都为 00
,但在 V14.0.8.2 中有一份 wlan_offload_config_(1) 文件,值为 02
,在小米 14 ROM 的 MBN 文件中该值也为 02
,根据 Deepseek 提供的信息,wlan_offload_config
通常用于配置 WLAN 与蜂窝网络之间的 Offload 行为,特别是在 iWLAN(基于 IP 的 WLAN 接入) 或 LTE/WiFi 互操作场景中,而 VoWiFi 本质上也是一种 WLAN offload,所以这其实也是一个开关,00
的时候为关闭,非 00
时的值定义尚不明确,但可以肯定应该是用来开启的。
在实测环境里,如果该值为 00
,那么在拨号盘输入 *#*#4634#*#* 后,在手机信息里,可以观测到 WLAN 数据原始注册状态一栏为 NOT_REG_OR_SEARCHING,改为 02
后 WLAN 数据原始注册状态变为 HOME,因此推测这一项是关键开关,那我们后续只要把这个文件的值改为 02
即可。
4. nv/item_files/ims/IMSWifiDynamicConfig
这个文件是二进制文件,由于高通把自家的技术文档跟藏原子弹发射密码一样藏得严严实实的,在搜寻半天后才找到了一个网页 [4] 记录了高通基带 MBN 内的二进制文件每个 field 的定义。
根据该文档,这个文件记录了 IMS Wifi 的参数,看到了许多包含 Timer 的条目,怀疑应该是超时选项,根据定义应该没有和启用 VoWiFi 有强相关的配置选项,因此此处略过。
5. nv/item_files/ims/qp_ims_common_config
上图左侧为 V14.0.8.2,右侧为 V14.0.9.0
根据定义,可得
field | hex | value | size | desc |
---|---|---|---|---|
version | 01 | 1 | 1 | 配置版本号,值为 1 |
AllowedRATMask | 40 04 00 12 | 301990976 | 4 | 允许的 IMS 级别无线接入技术(RAT)掩码 |
PhoneContextUri | 00… (256 bytes) | “” | 256 | 上下文 URI |
ReservedBytes | 00… (763 bytes) | (大部分为零) | 763 | 保留字节 |
根据 [5] 提供的信息 AllowedRATMask 应该设置为 33555520,由于没有给出具体的值定义,因此这里只能囫囵吞枣。
同时对比小米 12S Pro 和小米 14 的 MBN 发现文件内容一致,因此该文件应该和设备无关,可以跨设备使用。
6. nv/item_files/ims/qp_ims_reg_config_db
以上为小米 12S Pro V14.0.8.2 和 V14.0.9.0 版本的对比,而小米 12S Pro V14.0.8.2 与小米 14 的该文件也存在些许差异。
由于公开的资料里对该文件的描述非常粗略,也没有值的定义,目前根据 [5] 已知的情况是文件里的 iRAT 的值确实会影响到 VoWiFi 功能,但不知道应该具体怎么修改,因此现阶段只能粗暴地直接替换这个文件。
7. nv/item_files/ims/qp_ims_service_enablement_config
顾名思义,这个文件掌控了 IMS 启用的服务种类,在 V14.0.8.2 的版本中该二进制解析后的值如下:
Field | Hex | Value | Size | Desc |
---|---|---|---|---|
version |
00 |
0 | 1 | 版本号 |
VoLTEEnabled |
01 |
1 | 1 | 启用 LTE 语音通话 |
VideoTelephonyEnabled |
01 |
1 | 1 | 启用视频电话 |
MobileDataEnabled |
01 |
1 | 1 | 启用移动数据 |
ServicesMaskEnabledbyNetwork |
00 00 00 00 |
0 | 4 | 网络未启用任何服务掩码 |
WifiCallingEnabled |
02 |
2 | 1 | 启用 Wi-Fi 通话 |
CallModePref |
03 00 00 00 |
3 | 4 | 可能为 Wi-Fi 优先 |
WifiCallingEnabledinRoaming |
00 |
0 | 1 | 漫游时禁用 Wi-Fi 通话 |
WifiProvisioningID |
00 ... 00 (20 bytes) |
“” | 20 | 空字符串 |
ImsServiceEnabled |
01 |
1 | 1 | 启用 IMS 服务 |
UtEnabled |
01 |
1 | 1 | 启用 UT 功能 |
SmsEnabled |
01 |
1 | 1 | 启用 IP 网络短信 |
DanEnabled |
00 |
0 | 1 | 禁用 DAN 功能 |
UssdEnabled |
00 |
0 | 1 | 禁用 USSD 功能 |
MwiEnabled |
00 |
0 | 1 | 禁用 MWI 功能 |
PresenceEnabled |
00 |
0 | 1 | 禁用在场服务 |
AutoConfigEnabled |
00 |
0 | 1 | 禁用自动配置服务 |
XdmClientEnabled |
00 |
0 | 1 | 禁用 XDM 客户端 |
RcsMessagingEnabled |
00 |
0 | 1 | 禁用 RCS 消息 |
CallModePrefRoam |
00 00 00 00 |
0 | 4 | 漫游时蜂窝优先 |
RttEnabled |
00 |
0 | 1 | 禁用 RTT(实时文本) |
iCarrierConfigEnabled |
00 |
0 | 1 | 禁用运营商配置 |
ReservedBytes |
00 ... 00 (975 bytes) |
全 0 | 975 | 保留字段,未使用 |
而在 V14.0.9.0 版本中,差异部分如下:
Field | Hex | Value | Size | Desc |
---|---|---|---|---|
WifiCallingEnabled |
00 |
0 | 1 | 禁用 Wi-Fi 通话 |
CallModePref |
00 00 00 00 |
0 | 4 | 蜂窝网络优先 |
这个文件的定义比较明了,可以发现在 V14.0.8.2 里修改了两处数据,这两处也是关键开关。
8. nv/item_files/modem/mmode/custom_emerg_info
这个文件仅存在于 V14.0.8.2,根据定义解析后的结果如下表:
Field | Hex | Value | Size | Desc |
---|---|---|---|---|
version | 01 | 1 | 1 byte | 表示版本号为 1 |
is_ecbm_required | 00 | false | 1 byte | 不需要 ECBM(Emergency Callback Mode) |
hold_concurrent_voicecall_during_emergency | 01 | true | 1 byte | 在紧急呼叫期间保持并发语音呼叫 |
is_alternate_redial_algorithm | 00 | false | 1 byte | 不使用备用重拨算法 |
is_store_ral_in_efs | 00 | false | 1 byte | 不将 RAL 存储在 EFS 中 |
ReservedBytes | 0128 0000 0000 00 | 296 | 7 bytes | 保留字段 |
在小米 14 的 MBN 文件中并未发现该文件,推测该文件不是很重要。
9. nv/item_files/modem/mmode/lpm_emerg_wifi_preferred
这个文件仅存在于 V14.0.8.2,值为 01
,推测含义为在低功耗模式下紧急电话倾向于使用 VoWiFi,推测该文件不是很重要。
10. nv/item_files/modem/mmode/lpm_emerg_wifi_preferred/wifi_config
该文件实际上在几个版本中没有差异,这里略过分析。
5. 整理文件
根据上述分析,我们采取的策略为:
- 替换 / 添加
iwlan_s2b_config.xml
,wlan_offload_config
,IMSWifiDynamicConfig
,qp_ims_common_config
,qp_ims_reg_config_db
,qp_ims_service_enablement_config
,custom_emerg_info
,lpm_emerg_wifi_preferred
。 - 向现有的
overideconfig
文件追加在上述分析中提到的缺失的部分,尤其是开启 VoWifi。
[ISH:ConnectivityParams] *IsVoWifiEnabled = 1
这里我把整理好的文件上传于此,可以直接使用
Mi12SProCTVoWifi.zip
6. 在 EFS 分区修改文件
- 先从 Google 上搜索 QPST 下载并安装(请务必确定 exe 中包含高通的数字签名后再安装),并同时安装好驱动。
- 让手机进入 diag 模式
不同型号,不同 ROM 的手机打开调试端口的方法不一,较为通用的方法有两种- 将手机连接到电脑或在手机终端内执行
su
获取 root 权限后执行setprop sys.usb.config diag,serial_cdev,rmnet,adb - 对于外挂基带的设备,上述命令可能并不能打开外挂基带的调试端口,可以尝试以下命令
resetprop ro.bootmode usbradio resetprop ro.build.type userdebug setprop sys.usb.config diag,diag_mdm,adb - 如果上述两个方案都不生效,请查阅 Google 对应厂商 / 型号的开启方法。
- 将手机连接到电脑或在手机终端内执行
- 启动 EFS Explorer,并选择对应的 Phone 后读取 EFS 分区
- 按照上述提到的各个文件的路径,找到对应文件夹后右键
Copy data file from PC
,选取上述压缩包内的文件,注意要勾选 overwrite
需要注意,在复制wlan_offload_config
这个文件时,请选择Copy item file from PC
,简而言之,该文件之前是 data file 的话复制时也要选 data file,item file 同理。 - 关闭 EFS Explorer,重启手机,并确保 Android 系统层面的所有 WLAN 通话开关已开启,可开关飞行模式观察是否出现中国电信 WLAN 通话。
测试结果
目前该套配置在如下机型测试结果如下
设备 | SoC | 系统 | 状态 |
---|---|---|---|
Moto G Stylus 5G 2023 美版 | 6 Gen 1 | 34.42-86-3-8 | 成功 |
Mi 10 | 865 | LineageOS 22.1 | 成功,VoWiFi 下视频通话不可用 |
Mi 10S | 865 | PixelOS | 成功,VoWiFi 下视频通话不可用 |
Mi 10S | 865 | MIUI | 成功 |
红米 K30s Ultra | 865 | LineageOS 22.1 | 失败 |
小米 12S Pro | 8+ Gen 1 | HyperOS 2.0.1.0 | 失败 |
欢迎在评论区反馈你的机型的结果。
结语
有人说我对电信的 VoWiFi 有种莫名其妙的执着,在折腾这个事情上有些过于魔怔。这点上我并不否认,因为自身有需求,同时我也对这种来自厂商和运营商的双重限制感到不爽,也因此投入了很多心思在这方面。
在基带领域从事的工作人员可能会对本篇的内容嗤之以鼻,因为当我回过头再去网上检索相关文章时发现其实很多文章都已经提到过类似思路,那这里就权当一份更为详细或者说,啰嗦的一篇文章来总结这些内容吧。此外,由于高通的封闭,大量资料在公网上难以寻觅,给我的工作造成了巨大的障碍,也算是一种信息差吧。
参考文献
[1] https://www.discuss.com.hk/viewthread.php?tid=30643382
[2] https://xdaforums.com/t/guide-enabling-volte-vowifi-v2.4028073/
[3]https://www.txrjy.com/thread-1320055-1-1.html
[4] https://adresearch.tistory.com/12
[5] https://blog.csdn.net/tom1988614/article/details/136685780