Android:一篇就够!全面&详细解析APN(涉及内容:GGSN,authtype,MVNO,pdp,Apns |
您所在的位置:网站首页 › 手机更改apn › Android:一篇就够!全面&详细解析APN(涉及内容:GGSN,authtype,MVNO,pdp,Apns |
每篇一格言: 人生就像滚雪球,关键是要找到足够湿的雪,和足够长的坡。 ——沃伦巴菲特 目录 1. APN:从概念说起 1.1 从3GPP看APN的定义和角色 1.2 APN包含哪些参数 APN的类型: 1.3 APN的存储位置与加载位置 1.3.1 APN的存储位置 1.3.2 APN的加载位置 1.4虚拟运营商的APN 2. APN的实现机制 2.1 APN的创建: 从XML到database 2.2 APN匹配SIM卡与菜单显示 2.3 PDP时APN的选择 2.4 modem中的APN 附录1 从xml加载到database 附录2。APN的读取与菜单显示 附录3 PDP中的APN 1. APN:从概念说起 1.1 从3GPP看APN的定义和角色Definition of Access Point Name In the GPRS backbone, an Access Point Name (APN) is a reference to a GGSN. To support inter-PLMN roaming, the internal GPRS DNS functionality is used to translate the APN into the IP address of the GGSN. ——3gpp 23.003 从定义可看出,APN是GGSN的引用,被internal GPRS DNS转换为GGSN的IP地址。 GGSN主要起网关作用,所扮演的角色: 对内:网络传输; (网络接入控制,分组数据的过滤) 对外:路由器(路由选择和分组的转发,IP地址分配) 1.2 APN包含哪些参数一个典型的APN包含的参数有名称、MCCMNC、接入点、类型。 下面以CMCC APN为例,它包含下面一些参数: APN还可以包含其他更多的参数,主要有下面这些: Note :每个有数据业务的运营商都会设定自己的APN,同一个运营商的APN可能有多条,包括分别用于3G或4G,NET和WAP,不同APN的使用范围和收费会有差别。 APN的类型:常见的APN类型有下面几种,用途和优先级各有不同。 APN以XML的格式存储。 文件名: Apns-conf.xml 源码文件路径: MTK平台(通常):alps\mediatek\frameworks\base\telephony\etc 高通平台(通常):android\vendor\qcom\proprietary\telephony-apps\etc UE文件路径: system/etc/ Apns-conf.xml 当UE开机后,读取XML中的APN并写入到database中。 database中APN 的table名称: content://telephony/carriers 注:有些平台为了适配dual SIM,可能会加上sub1/sub2等。 1.3.2 APN的加载位置加载到database: TelephonyProvider读取XML并在database中插入apn的table。 加载到UI菜单: 根据SIM卡的MCCMNC,去匹配database中同样MCCMNC的APN项,并将匹配到的APN填写到菜单列表。 加载到PDP请求: 由DCtracker负责创建/更新waiting APN list,供PDP选用。 1.4虚拟运营商的APN虚拟运营商(MVNO)没有自营网段,使用了主运营商的网段,因而和主运营商有相同的MCCMNC。为了能够与主运营商区分,虚拟运营商的APN还包含了MVNO参数。MVNO参数分为SPN/PNN/IMSI/GID1,是从SIM卡对应栏位读取的值,目的是从该值中判断该SIM卡是否属于MVNO。 在加载MVNO SIM卡的APN时,会同时去匹配MCCMNC和MVNO参数。 APN的概念部分到此告一段落,下面做个总结: 在上一章中我们讲到,APN的原始参数存放在XML中; 而UE是通过query database的方式使用APN; 因而必然需要将APN从XML录入到database,这一步在telephonyprovider中实现。 为了更清晰的理解实现思路,避免过多的源码干扰阅读节奏,接下来的分析中涉及到的源码部分,都以伪代码的形式给出,详细的代码以附录形式给出。 telephonyprovider中的initDatabase方法的逻辑(伪代码): private void initDatabase(SQLiteDatabase db) { 1.打开APN xml文件etc/apns-conf.xml 2. 获得文件句柄后,使用FileReader得到文件字符流 3. 检查APN version一致性 4.加载XMl中的数据到database,具体见loadApns方法 }源码点这里 对第3点:“检查APN version一致性” 的说明: 随着OS升级,APN字段也在更新,因此检查APN version的目的是为了避免XML与OS不兼容。若version不一致,抛出异常: // Sanity check. Force internal version and confidential versions to agree int confversion = Integer.parseInt(confparser.getAttributeValue(null, "version")); if (publicversion != confversion) { throw new IllegalStateException("Internal APNS file version doesn't match " + confFile.getAbsolutePath()); }loadApns的逻辑(伪代码) private void loadApns(SQLiteDatabase db, XmlPullParser parser) { 1。每次读取parser中的一个element,也就是一条APN数据 2.通过getrow方法将APN转换为Contentvalues; 3.最后通过insertAddingDefaults将键值写入database: }写入的table名是CARRIERS_TABLE,该table由createCarriersTable方法创建。 该table url是:content://telephony/carriers/ table 创建时机: telephonyprovider的内部类DatabaseHelper在oncrea |
今日新闻 |
推荐新闻 |
CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3 |