APN概念
APN(Access Point Name),即“接入点名称”,用来标识GPRS的业务种类,目前分为两大类:CMWAP(通过GPRS访问WAP业务)、CMNET(除了WAP以外的服务目前都用CMNET,比如连接因特网等)。是通过手机上网时必须配置的一个参数,它决定了您的手机通过哪种接入方式来访问网络。业务流程GPRS专网系统终端上网登录服务器平台的流程为:
1)用户发出GPRS登录请求,请求中包括由移动公司为GPRS专网系统专门分配的专网APN;
2)根据请求中的APN,SGSN向DNS服务器发出查询请求,找到与企业服务器平台连接的GGSN,并将用户请求通过GTP隧道封装送给GGSN;
3)GGSN将用户认证信息(包括手机号码、用户账号、密码等)通过专线送至Radius进行认证;
4)Radius认证服务器看到手机号等认证信息,确认是合法用户发来的请求,向DHCP服务器请求分配用户地址;
5)Radius认证通过后,由Radius向GGSN发送携带用户地址的确认信息;
6)用户得到了IP地址,就可以携带数据包,对GPRS专网系统信息查询和业务处理平台进行访问。
Android自带的内部APN配置文件
frameworks/base/core/res/res/xml/apns.xml文件内容:
<!-- If you edit this version, also edit the version in the partner-supplied
apns-conf.xml configuration file -->
<apns version="7">
</apns>
该文件被编译到res.apk中,通过android的资源管理器进行访问。
第三方提供的APN配置文件
在Android源码build目录下,通过搜索apns-conf.xml可以找到在各个board中分别有配置:
在编译该product时会将device/generic/goldfish/data/etc/apns-conf.xml文件拷贝到system/etc/目录下,最后打包到system.img中。
APN配置加载
android通过telephony.db数据库中的carriers表来保存所有的APN配置信息
packages/providers/TelephonyProvider/src/com/android/providers/telephony/TelephonyProvider.java文件中的内部类DatabaseHelper用于创建telephony.db数据库
public void onCreate(SQLiteDatabase db) {
// Set up the database schema
db.execSQL("CREATE TABLE " + CARRIERS_TABLE +
"(_id INTEGER PRIMARY KEY," +
"name TEXT," +
"numeric TEXT," +
"mcc TEXT," +
"mnc TEXT," +
"apn TEXT," +
"user TEXT," +
"server TEXT," +
"password TEXT," +
"proxy TEXT," +
"port TEXT," +
"mmsproxy TEXT," +
"mmsport TEXT," +
"mmsc TEXT," +
"authtype INTEGER," +
"type TEXT," +
"current INTEGER," +
"protocol TEXT," +
"roaming_protocol TEXT," +
"carrier_enabled BOOLEAN," +
"preset BOOLEAN default false," +
"bearer INTEGER);");
//从APN配置xml文件中读取APN配置,并存储到数据表carriers中
initDatabase(db);
}
APN配置信息加载分为两部分,首先从Android自带的内部APN配置文件中读取配置信息,然后在读取第三方提供的APN配置文件信息。
private void initDatabase(SQLiteDatabase db) {
// Read internal APNS data
Resources r = mContext.getResources();
//读取frameworks/base/core/res/res/xml/apns.xml文件
XmlResourceParser parser = r.getXml(com.android.internal.R.xml.apns);
int publicversion = -1;
try {
XmlUtils.beginDocument(parser, "apns");
//读取APN配置版本信息
publicversion = Integer.parseInt(parser.getAttributeValue(null, "version"));
//加载APN配置信息,并保存到数据表中
loadApns(db, parser);
} catch (Exception e) {
Log.e(TAG, "Got exception while loading APN database.", e);
} finally {
parser.close();
}
// Read external APNS data (partner-provided)
XmlPullParser confparser = null;
// Environment.getRootDirectory() is a fancy way of saying ANDROID_ROOT or "/system".
//读取system/etc/apns-conf.xml文件
File confFile = new File(Environment.getRootDirectory(), PARTNER_APNS_PATH);
FileReader confreader = null;
try {
confreader = new FileReader(confFile);
confparser = Xml.newPullParser();
confparser.setInput(confreader);
XmlUtils.beginDocument(confparser, "apns");
// 读取第三方提供的APN配置版本号
int confversion = Integer.parseInt(confparser.getAttributeValue(null, "version"));
//判断第三方提供的APN配置版本号是否与Android自带的APN配置版本号相同
if (publicversion != confversion) {
throw new IllegalStateException("Internal APNS file version doesn't match "
+ confFile.getAbsolutePath());
}
//如果版本号相同,读取APN配置信息
loadApns(db, confparser);
} catch (FileNotFoundException e) {
// It's ok if the file isn't found. It means there isn't a confidential file
// Log.e(TAG, "File not found: '" + confFile.getAbsolutePath() + "'");
} catch (Exception e) {
Log.e(TAG, "Exception while parsing '" + confFile.getAbsolutePath() + "'", e);
} finally {
try { if (confreader != null) confreader.close(); } catch (IOException e) { }
}
}
从APN信息加载源码中可以知道,第三方提供的APN配置信息版本必须与内部APN配置信息的版本相同。自此APN配置信息就存储在carriers表中了,并且通过TelephonyProvider向外提供访问接口。
分享到:
相关推荐
设置android的APN配置,移动2G和联通的2G和3G网络配置,以及MMS的APN配置
android端通过代码实现apn配置,这里做一下记录,方便以后查看这部分实现内容
在android代码中切换网络,如cmnet,cmwap
附件为apndemo,apn.xml需放到U盘或者sd卡根目录,在有信号的时候插卡或U盘3秒后配置成功
APN配置指北1
APN的英文全称是Access Point Name,中文全称叫接入点,是您在通过手机上网时必须配置的一个参数,它决定了您的手机通过哪种接入方式来访问网络。 有时候需要修改APN的时候会发现无法更改,连常用的海卓HIAPN都无法...
文档收集全球大部分运营商APN配置,条目丰富,持续更新中。
该类为 APN MMSC 信息提供了一个应用程序内源,以在系统 APN DB 不可用且用户未提供自己的本地 MMSC 配置详细信息的情况下用作后备。 它目前覆盖了全球数百家运营商。 它使用得越多,我们实现全面覆盖的速度就越快...
Push Server当前支持iOS(APN)和android(GCM)平台。 它使用mongoDB来存储推送令牌。 请注意,由于未实现任何特定的安全性,因此该服务器不应用作前端服务器。入门1-数据库node-pushserver使用mongodb来存储用户/...
修復 Android上的APN崩潰問題 4.0 ICS, 請使用“移動網絡”,而不是. 微調部件佈局, 特別是對於 QVGA的設備. 重新排列的配置文件設置的順序. 降低功耗,同時使“保持清醒”. 提高為文件名有特殊的鈴聲的支持.
|--android 设置apn |--android 调节屏幕亮度 |--android 资源uri |--android 还原短信 |--android 重启 |--android中anim文件特效 |--app信息menifest获取(如版本号) |--AsyncQueryHandler之异步查询Cursor处理 |--...
配置之上的约定:推送将约定之上的配置带到您的应用中,以组织您的推送通知实现。 极其容易学习:如果您知道如何使用ActionMailer,那么您已经知道如何使用Pushing。 与ActiveJob异步发送通知,无需任何学习费用。...
◊配置Android防火墙,TCP拥塞,DNS * 1►任务管理器 ◊检查CPU,网络和内存使用情况 ◊杀死(默认)或强制停止* 1任何应用程序或内核进程 ◊自动任务杀手,内存增强器,内存清理器 ►系统控制* 1◊CPU调速器,频率...
Tart Push Service 能够以透明的方式向 Android 和 IOS 设备发送推送通知。 安装 克隆存储库。 运行npm install 并运行./bin/www --config "/path/to/config.json" --port 3000 配置 配置文件 配置文件必须是严格...
可用的推送服务提供商: GCM 流式细胞仪APN安装Laravel 5.8以下版本在控制台中输入: composer require "edujugon/push-notification:^v3.0.0"Laravel 5.8 / 6及更高版本在控制台中输入: composer require edujugon...
使用raix:push软件包为Android推送通知配置GCM。 。 将凭据粘贴到config.push.json中 使用raix:push软件包为iOS推送通知配置APN。 。 将凭据粘贴到config.push.json中 笔记 和软件包进行了稍微修改,并将其放置在...
AndroidPN实现了从服务器到android移动平台的文本消息推送。这里先简单说一下androidPN的安装过程。 下载androidpn-client-0.5.0.zip和androidpn-server-0.5.0-bin.zip 网址:...
方便的回送组件,可使用kue为iOS和Android发送推送通知。 安装 npm i loopback-component-kue-push --save 配置 将loopback-component-kue-push对象添加到项目的component-config.json : " loopback-component-...
Push Server当前支持iOS(APN)和android(GCM)平台。 它使用mongoDB来存储推送令牌。 请注意,由于未实现任何特定的安全性,因此该服务器不应用作前端服务器。入门1-数据库node-pushserver使用mongodb来存储用户/...