本文实质上是记录我在尝试为我的手机启用电信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