emulator 修改MCCMNC后的联网问题

经慈
2023-12-01

        在<<Emulator默认电话号码和MCC,MNC的修改>>中已经知道了模拟器的MCC,MNC是如何修改的. 但是修改后是有一个问题的.即模拟器无法联网了. 主要问题是在哪里呢?

        首先我们要知道手机SIM卡中是存储了国际移动用户识别码的就是我们常说的IMSI, 这串数字用于区别移动用户的有效信息. 其总长度一般为15位, 前面的三位就是MCC即国家代码. 如:中国的460 美国的310等. 那么MNC就是 第4位到第6位 . 中国的MNC是两位的所以IMSI  的前5位就是MCCMNC. 美国的MNC是三位,所以IMSI 的前6位就是MCCMNC. 模拟器默认的就是美国的MCCMNC. 即310260. 

        那么当手机插入SIM后是如何确定MNC的位数的呢? 毕竟手机需要根据MCC和MNC来确定apn好接入到对应的网络上网的.首先获取IMSI 是这样的.  在emulator 模拟器的源码中有 qemu/android/android-emu/android/telephony/modem.c  这个文件. 其中有下面这么一段

//原本的代码中 第二项是有数据的 就是相应的IMSI 和IMEI
// 我修改成通过后面的方法来获取相应的数据

{ "+CIMI", NULL, handleGetImsi },

{ "+CGSN", NULL, handleGetImei },

这一段是通过AT指令来获取相应的IMSI 和IMEI的.

         同样在/telephony文件夹下有一个文件 sim_card.c 文件 有这么一段. 

 { "+CRSM=176,28589,0,0,4",  "+CRSM: 144,0,00000002" },   //Change MNC Length to 2

这一段命令是通过AT指令 来确定MNC的长度的 原本最后的一个数字是3.即MNC的长度截取3位. 因为emulator默认MCC是美国的310 所以MNC截取为3位. 现在我们改成2位,这样 framework中就会截取MNC的长度就是两位了.

        确定了MCCMNC的长度后,我们就可以把apns-conf.xml 修改后打包进rom中了.  注意: 原有的aosp中apns-conf.xml  是不包含 其它国家的MCCMNC的. 我们可以将真机的 /system/etc/apns-conf.xml  pull出来 打包进rom中 这样apn的接入点就是 国内的移动网络代码了. 同样我们将真机的 /system/etc/spn-conf.xml  pull出来打包进rom中. 这样 运营商的名字就会根据这个配置文件来确定了. 

       另外 记得将 emulator 中 Cellular 设置项中的NetworkType 选为LTE 然后 重置 apn 就可以上网了.

       通过 adb shell getprop 查看gsm.sim 的相关属性 发现都变了!!.

       

       

 类似资料: