1,百度apn概念:
APN(Access Point Name),即“接入点名称”,是您在通过手机上网时必须配置的一个参数,它决定了您的手机通过哪种接入方式来访问网络,用来标识GPRS的业务种类,目前分为两大类:CMWAP/UNIWAP/3GWAP(通过GPRS访问WAP业务)、CMNET/UNINET/3GNET(除了WAP以外的服务目前都用CMNET,比如连接因特网等)。 APN的完整说明在3GPP规范TS23.003 Clause 9中进行详细定义及说明。
基本信息
中文名称
接入点
外文名称
Access Point Name
分类
CMWAP/UNIWAP/3GWAP
目录
展开
1 基本概念
2 APN的构成
3 APN类型
4 业务流程
1 基本概念
APN(Access Point Name),即“接入点名称”,是您在通过手机上网时必须配置的一个参数,
APN
它决定了您的手机通过哪种接入方式来访问网络,用来标识GPRS的业务种类,目前分为两大类:CMWAP/UNIWAP/3GWAP(通过GPRS访问WAP业务)、CMNET/UNINET/3GNET(除了WAP以外的服务目前都用CMNET,比如连接因特网等)。
APN的完整说明在3GPP规范TS23.003 Clause 9中进行详细定义及说明。
2 APN的构成
接入点名字(APN Access Point Name)在GPRS骨干网中用来标识要使用的外部PDN网络(即我们常说的Internet),在GPRS网络中代表外部数据网络的总称。APN由以下两部分组成:
- APN网络标识:这部分是必有的,它是由网络运营者分配给ISP或公司的、与其固定Internet域名一样的一个标识。
- APN运营者标识:这部分是可选的,其形式为“xxx.yyy.gprs”(如MNC.MCC.gprs),用于标识归属网络。cmnet.000.460.gprs
APN网络标识通常作为用户签约数据存储在HLR中,用户手机在发起分组数据业务时也可向网络侧提供APN,用于网络侧选择应接入相应的GGSN以及用于GGSN判断接入相应的外部网络。此外,HLR中也可存储一个通配符,这样用户或SGSN就可以选择接入一个没有在HLR中存储的APN。
用户可以通过不同的APN选择GGSN,即用户可以激活多个PDP上下文,每个PDP上下文与一个APN相联系。用户选择不同的APN的目的就是通过不同的GGSN选择外部网络。
APN需要通过DNS进行域名解析才能获取GGSN或外部网络节点的真实的IP地址。
简单来说,APN实际上就是对一个外部PDN(Packet data network)的标识,这些PDN包括企业内部网,Internet,WAP网站,黑莓,行业内部网如公交电力系统等等专用网络。网络侧如果知道MS到底做了激活以后要访问哪个网络,给你分配哪个网段的IP呢(因为每个网络分配的IP可能都是不一样的,有的是私网,有的是公网IP)?这就要靠APN来区分了?现网中,APN=cmnet就代表internet, APN=cmwap就代表专用WAP数据网络,当然各个运营商可能名字不一样,如联通是uniwap,uninet等。
3 APN类型
现在我们涉及到的APN具体有两种,一种是通过手机浏览器上网使用的,另一种是通过客户端软件来登陆服务器。中国联通的2G业务WAP浏览器中使用的APN为“UNIWAP”,3G业务WAP浏览器使用的APN为“3GWAP”;中国联通的2G上公网使用的APN为“UNINET”,3G业务上网卡及上公网使用的APN为“3GNET”。 中国移动上内网的APN为“CMWAP”,上网卡及上公网使用的APN为“CMNET”。 中国电信上内网的APN为“CTWAP”,上网卡及上公网使用的APN为“CTNET”。
好在现在国内销售的手机都已经将APN配置预先做好了,因此您不用为了APN的配置而太担心。
专线APN
根据企业对网络安全的特殊要求,采用了多种安全措施,主要包括:
1.通过一条2M 专线接入运营商GPRS网络,双方互联路由器之间采用私有IP地址进行广域连接,在GGSN与移动公司互联路由器之间采用GRE隧道。
2.为客户分配专用的APN,普通用户不得申请该APN。用于GPRS专网的SIM卡仅开通该专用APN,限制使用其他APN。
3.客户可自建一套RADIUS服务器和DHCP服务器,GGSN向RADIUS服务器提供用户主叫号码,采用主叫号码和用户账号相结合的认证方式;用户通过认证后由DHCP服务器分配企业内部的静态IP地址。
4.端到端加密:移动终端和服务器平台之间采用端到端加密,避免信息在整个传输过程中可能的泄漏。
5.双方采用防火墙进行隔离,并在防火墙上进行IP地址和端口过滤。
4 业务流程
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专网系统信息查询和业务处理平台进行访问。
APN的技术
从运营商角度看,APN就是一个逻辑名字,接入点,APN一般都部署在GGSN设备上或者逻辑连接到GGSN上,用户使用GPRS上网时,都通过GGSN代理出去到外部网络,
因此,APN设置,过滤,统计等等,就成为一个对GPRS计费,GPRS资费有重要参考价值的参数之一(因为APN可以区分一个业务或者外部网络)。
此外,3gpp最新版本TS说明,gprs上网还可以基于APN实现内容计费。
Application Serial Number (APN)
常见于美国专利,是美国专利局在收到所申请专利后给的一个顺序排号。在专利工作中常会用到。
2:代码相关位置:
配置文件 apns-conf.xml alps\mediatek\frameworks\base\telephony\etc
解析配置文件代码 TelephonyProvider.java alps\packages\providers\TelephonyProvider\src\com\android\providers\telephony
此文件里面的loadApns函数getRow函数是关键的解析过程 insertAddingDefaults
生成的文档db /data/data/com.android.providers.telephony/databases/telephony.db 打开查看tables下面的carriers,可以看到所有的数据
cmd使用(eng版本)
adb remount
adb pull /data/data/com.android.providers.telephony/databases/telephony.db d:\telephony.db
导出db文档
Telephony.java alps\frameworks\opt\telephony\src\java\android\provider 类 Carriers里面包含所有的列名称。
3:相关url Telephony.Carriers.CONTENT_URI
插入修改数据的方法:
Uri uri = Uri.withAppendedPath(Telephony.Carriers.CONTENT_URI, "current");
ContentValues map = new ContentValues();
String operatorNumeric = mSimRecords.getOperatorNumeric();
map.put(Telephony.Carriers.NUMERIC, operatorNumeric);
4:apn type 值:
/**
* APN types for data connections. These are usage categories for an APN
* entry. One APN entry may support multiple APN types, eg, a single APN
* may service regular internet traffic ("default") as well as MMS-specific
* connections.<br/>
* APN_TYPE_ALL is a special type to indicate that this APN entry can
* service all data connections.
*/
public static final String APN_TYPE_ALL = "*";
/** APN type for default data traffic */
public static final String APN_TYPE_DEFAULT = "default";
/** APN type for MMS traffic */
public static final String APN_TYPE_MMS = "mms";
/** APN type for SUPL assisted GPS */
public static final String APN_TYPE_SUPL = "supl";
/** APN type for DUN traffic */
public static final String APN_TYPE_DUN = "dun";
/** APN type for HiPri traffic */
public static final String APN_TYPE_HIPRI = "hipri";
/** APN type for FOTA */
public static final String APN_TYPE_FOTA = "fota";
/** APN type for IMS */
public static final String APN_TYPE_IMS = "ims";
/** APN type for CBS */
public static final String APN_TYPE_CBS = "cbs";
/** APN type for IA Initial Attach APN */
public static final String APN_TYPE_IA = "ia";
//MTK-START [mtk04070][111117][ALPS00093395]MTK added
public static final String APN_TYPE_DM = "dm";
public static final String APN_TYPE_WAP = "wap";
public static final String APN_TYPE_NET = "net";
public static final String APN_TYPE_CMMAIL = "cmmail";
public static final String APN_TYPE_TETHERING = "tethering";
public static final String APN_TYPE_RCSE = "rcse";
//MTK-END [mtk04070][111117][ALPS00093395]MTK added
5:一个完整版的apn配置参数
彩信的: 必填写项为:
carrier="Vodafone GR-MMS"
mcc="202"
mnc="05"
apn="mms.vodafone.net"
type="mms"
mmsc为主页内容,有填写,没有不填
----------------------
<apn carrier="MoviStar Internet"
mcc="334"
mnc="030"
apn="internet.movistar.mx"
proxy="10.2.20.1"
port="80"
user="movistar"
password="movistar"
type="default,supl"
/>
这里注意一个配置:
配置authenticationtype时需要写的为authtype=**,比如authtype="1"
代码注释说明为 TelephonyProvider.java,在这里
// The auth type column can have 4 values: 0 (None), 1 (PAP), 2 (CHAP)
// 3 (PAP or CHAP). To avoid breaking compatibility, with already working
// APNs, the unset value (-1) will be used. If the value is -1.
// the authentication will default to 0 (if no user / password) is specified
// or to 3. Currently, there have been no reported problems with
// pre-configured APNs and hence it is set to -1 for them. Similarly,
// if the user, has added a new APN, we set the authentication type
// to -1.
spn
1:百度spn概念
SPN(Service Provider name)编辑
本词条缺少信息栏、名片图,补充相关内容使词条更完整,还能快速升级,赶紧来编辑吧!
运营商名称
SPN--Service Provider Name 运营商名称,其内容是写在USIM/SIM卡中EFspn字段中的,与当前注册的网络无关。如中国移动卡,漫游到任何网络,其SPN都是「CMCC」或「中国移动」;[1]
2:代码相关位置
spn-conf.xml virtual-spn-conf-by-efspn.xml (这个后面再说)alps\mediatek\frameworks\base\telephony\etc
SpnOverride.java alps\frameworks\opt\telephony\src\java\com\android\internal\telephony\uicc PARTNER_SPN_OVERRIDE_PATH PARTNER_VIRTUAL_SPN_BY_EF_SPN_OVERRIDE_PATH
关注加载点 private SpnOverride() ---loadSpnOverrides(); loadVirtualSpnOverridesByEfSpn();
RIL.java 里面,使用点 alps\frameworks\opt\telephony\src\java\com\android\internal\telephony lookupOperatorName函数
这里面你可以克制化,可以让spn依据语言变化,比如 if ((numeric.equals("46000")) || (numeric.equals("46002")) || (numeric.equals("46007")) || (numeric.equals("46008"))) {
operName = context.getText(com.mediatek.R.string.oper_long_46000).toString(); 这样子即可。
分析lookupOperatorName函数,我们可以看出spn得到运营商名字的逻辑顺序
if (mSpnOverride != null) {
mvnoOperName = mSpnOverride.getSpnByEfSpn(numeric,
mPhone.getMvnoPattern(PhoneConstants.MVNO_TYPE_SPN)); --先从这里获取,后面追加这个描述介绍
riljLog("the result of searching mvnoOperName by EF_SPN: " + mvnoOperName);
if(mvnoOperName == null) // determine by IMSI
mvnoOperName = mSpnOverride.getSpnByImsi(numeric, mPhone.getSubscriberId());
riljLog("the result of searching mvnoOperName by IMSI: " + mvnoOperName);
if(mvnoOperName == null)
mvnoOperName = mSpnOverride.getSpnByEfPnn(numeric,
mPhone.getMvnoPattern(PhoneConstants.MVNO_TYPE_PNN));
riljLog("the result of searching mvnoOperName by EF_PNN: " + mvnoOperName);
if(mvnoOperName == null)
mvnoOperName = mSpnOverride.getSpnByEfGid1(numeric,
mPhone.getMvnoPattern(PhoneConstants.MVNO_TYPE_GID));
riljLog("the result of searching mvnoOperName by EF_GID1: " + mvnoOperName);
/** the default implementation is not null ,so when operator part
* extends this class to over write it , must need to think that
* whether call super class‘s implementaion or not
* */
public String getFillListQuery(String numeric,int slotId) {
// get mvno type and mvno match data
String sqlStr = "";
try {
ITelephony telephony = ITelephony.Stub.asInterface(ServiceManager.getService(Context.TELEPHONY_SERVICE));
String mvnoType = telephony.getMvnoMatchType(slotId);
String mvnoPattern = telephony.getMvnoPattern(mvnoType,slotId);
// set sql string
sqlStr = " mvno_type=\‘" + mvnoType + "\‘" + " and mvno_match_data=\‘" + mvnoPattern + "\‘";
} catch (android.os.RemoteException e) {
Xlog.d(TAG, "RemoteException " + e);
}