解决方案

APN基础常识

seo靠我 2023-09-24 13:07:04

一.APN的简介

APN的完整说明在3GPP规范TS23.003 Clause 9中进行了详细定义。

MCCMNC的定义在3GPP规范TS23.003 Clause 2的IMSI定义中。

APN在GPRS骨SEO靠我干网中用来标识要使用的外部PDN(Packet data network,分组数据网,即常说的Internet),在GPRS网络中代表外部数据网络的总称。

APN由以下两部分组成:

APN网络标识:

是用户SEO靠我通过GGSN/PGW(Gateway GPRS Support Node,GPRS网关支持节点/PDN Gateway ,分组数据网网关)可连接到外部网络的标识,该标识由网络运营者分配给ISP(IntSEO靠我ernet Service Provider,因特网业务提供者)或公司,与其固定Internet域名一致,是APN的必选组成部分。例如 , 定义移动用户通过该接入某公司的企业网,则APN的网络标识可以SEO靠我规划为“www.ABC123.com”。

APN运营者标识:用于标识GGSN/PGW所归属的网络,是APN的可选组成部分。其形式为“MNCxxxx.MCCyyyy.gprs”(3G网络中),或者“MNCSEO靠我xxxx.MCCyyyy.3gppnetwork.org(4G网络中)。APN实际上就是对一个外部PDN的标识,这些PDN包括企业内部网、Internet、WAP网站、行业内部网等专用网络。

二.ApnSEO靠我参数的组成

例:移动apn,把所有的属性都放在一起如下

apn carrier=”中国移动彩信 (China Mobile)”

mcc=”460”

mnc=”00”

apn=”cmwap”

proxy=”10.0SEO靠我.0.172”

port=”80”

mmsc=”http://mmsc.monternet.com”

mmsproxy=”10.0.0.172”

mmsport=”80”

user=”mms”

password=SEO靠我”mms”

type=”mms”

authtype=”1”

protocol=”IPV4V6”

/>

其对应的属性定义如下:

Carrier:apn的名字,可为空,只用来显示apn列表中此apn的显示名字。

MccSEO靠我:由三位数组成。 用于识别移动用户的所在国家;

Mnc:由两位或三位组成。 用于识别移动用户的归属PLMN。 MNC的长度(两位或三位数)取决于MCC的值。

Apn:APN网络标识(接入点名称),是APNSEO靠我参数中的必选组成部分。此标识由运营商分配。

Proxy:代理服务器的地址

Port:代理服务器的端口号

Mmsc:MMS中继服务器/多媒体消息业务中心,是彩信的交换服务器。

Mmsproxy:彩信代理服务器的SEO靠我地址

Mmsport:彩信代理服务器的端口号

Protocol:支持的协议,不配置默认为IPV4。

User:用户

Password:密码

Authtype:apn的认证协议,PAP为口令认证协议,是二次握手机SEO靠我制。CHAP是质询握手认证协议,是三次握手机制。 None0PAP1CHAP2PAP or CHAP3

Type: apn的接入点类型

Default默认网络连接Mms彩信专用连接,此连接与default类SEO靠我似,用于与载体的多媒体信息服务器对话的应用程序Supl是Secure User Plane Location“安全用户面定位”的简写,此连接与default类似,用于帮助定位设备与载体的安全用户面定位SEO靠我服务器对话的应用程序Dun Dial Up Networking拨号网络的简称,此连接与default连接类似,用于执行一个拨号网络网桥,使载体能知道拨号网络流量的应用程序Hipri 高优先级网络,与SEO靠我default类似,但路由设置不同。只有当进程访问移动DNS服务器,并明确要求使用requestRouteToHost(int, int)才会使用此连接

注意:此表中的数据连接优先级是由低到高,即defSEO靠我ault数据连接的优先级最低,而hipri数据连接的优先级最高。比如:手机上网聊天,建立的是default数据连接。如果此时接到一条彩信,由于彩信的数据连接是mms,优先级比default高,所以会先SEO靠我断开default数据连接,建立mms数据连接,让手机先收到彩信。所以收发彩信的同时不能上网。(单条pdp连接的情况)

注:mnc的位数由mcc决定。比如,墨西哥334020,此国家的mnc为020,mSEO靠我ccmnc的值都固定在了SIM卡保存的IMSI中,配置apn参数时mnc不可简洁为20,否则apn列表中将读取不到此国家的334020运营商的参数。

三.Apn的存储以及初始化

apn在手机中的存储:

apSEO靠我n文件:System/etc/apn-conf.xml

apn数据存储的数据库:/data/data/com.android.providers.telephony/databases/ telephoSEO靠我ny.db

Carriers表

apn的初始化:

在启动手机时,需要初始化telephony.db数据库,这时候会读取手机目录System/etc/apn-conf.xml并把其中的内容加入到CarrierSEO靠我s表中。以后查询有关apn的配置参数都是从Carriers表中取出。

创建并初始化Carriers表:

packages/providers/TelephonyProvider/src/com/androSEO靠我id/providers/telephony/TelephonyProvider.java

内部类:DatabaseHelper.java

//创建数据库

由于添加了UNIQUE 约束条件,如果两个差不多的SEO靠我apn参数满足约束条件内的属性都相等,那么认为是同一组apn参数,将不会重复插入到数据库。private void createCarriersTable(SQLiteDatabase db, StrSEO靠我ing tableName) {// Set up the database schemaif (DBG) log("dbh.createCarriersTable start");String coSEO靠我lumns = "(_id INTEGER PRIMARY KEY," +NAME + " TEXT DEFAULT ," +NUMERIC + " TEXT DEFAULT ," +MCC + " SEO靠我TEXT DEFAULT ," +MNC + " TEXT DEFAULT ," +APN + " TEXT DEFAULT ," +USER + " TEXT DEFAULT ," +SERVER SEO靠我+ " TEXT DEFAULT ," +PASSWORD + " TEXT DEFAULT ," +PROXY + " TEXT DEFAULT ," +PORT + " TEXT DEFAULT SEO靠我," +MMSPROXY + " TEXT DEFAULT ," +MMSPORT + " TEXT DEFAULT ," +MMSC + " TEXT DEFAULT ," +AUTH_TYPE +SEO靠我 " INTEGER DEFAULT -1," +TYPE + " TEXT DEFAULT ," +CURRENT + " INTEGER," +SOURCE_TYPE + " INTEGER DESEO靠我FAULT 0," +CSD_NUM + " TEXT DEFAULT ," +PROTOCOL + " TEXT DEFAULT IP," +ROAMING_PROTOCOL + " TEXT DESEO靠我FAULT IP,";/// M: add for OMACP serviceif (OMACP_SUPPORT) {columns += OMACP_ID + " TEXT DEFAULT ," +SEO靠我NAP_ID + " TEXT DEFAULT ," +PROXY_ID + " TEXT DEFAULT ,";}columns += CARRIER_ENABLED + " BOOLEAN DEFSEO靠我AULT 1," +BEARER + " INTEGER DEFAULT 0," +BEARER_BITMASK + " INTEGER DEFAULT 0," +SPN + " TEXT DEFAUSEO靠我LT ," +IMSI + " TEXT DEFAULT ," +PNN + " TEXT DEFAULT ," +PPP + " TEXT DEFAULT ," +MVNO_TYPE + " TEXSEO靠我T DEFAULT ," +MVNO_MATCH_DATA + " TEXT DEFAULT ,";columns += SUBSCRIPTION_ID + " INTEGER DEFAULT " +SEO靠我SubscriptionManager.INVALID_SUBSCRIPTION_ID + "," +PROFILE_ID + " INTEGER DEFAULT 0," +MODEM_COGNITISEO靠我VE + " BOOLEAN DEFAULT 0," +MAX_CONNS + " INTEGER DEFAULT 0," +WAIT_TIME + " INTEGER DEFAULT 0," +MASEO靠我X_CONNS_TIME + " INTEGER DEFAULT 0," +MTU + " INTEGER DEFAULT 0," +EDITED + " INTEGER DEFAULT " + UNSEO靠我EDITED + "," +USER_VISIBLE + " BOOLEAN DEFAULT 1, " +USER_EDITABLE + " BOOLEAN DEFAULT 1," +// UniquSEO靠我eness collisions are used to trigger merge code so if a field is listed// here it means we will acceSEO靠我pt both (user edited + new apn_conf definition)// Columns not included in UNIQUE constraint: name, cSEO靠我urrent, edited,// user, server, password, authtype, type, protocol, roaming_protocol, sub_id,// modeSEO靠我m_cognitive, max_conns, wait_time, max_conns_time, mtu, bearer_bitmask,// user_visible"UNIQUE (" + TSEO靠我extUtils.join(", ", CARRIERS_UNIQUE_FIELDS) + "));";db.execSQL("CREATE TABLE " + tableName + columnsSEO靠我);db.execSQL("DROP TABLE IF EXISTS " + CARRIERS_DM_TABLE);db.execSQL("CREATE TABLE " + CARRIERS_DM_TSEO靠我ABLE + columns);if (DBG) log("dbh.createCarriersTable:-");}

//读取apns-conf.xml文件,并初始化Carriers表。

privateSEO靠我 void initDatabase(SQLiteDatabase db) {if (VDBG) log("dbh.initDatabase:+ db=" + db);// Read internalSEO靠我 APNS dataResources r = mContext.getResources();XmlResourceParser parser = r.getXml(com.android.inteSEO靠我rnal.R.xml.apns);int publicversion = -1;try {XmlUtils.beginDocument(parser, "apns");publicversion = SEO靠我Integer.parseInt(parser.getAttributeValue(null, "version"));loadApns(db, parser);} catch (Exception SEO靠我e) {loge("Got exception while loading APN database." + e);} finally {parser.close();}// Read externaSEO靠我l APNS data (partner-provided)XmlPullParser confparser = null;File confFile = getApnConfFile();FileRSEO靠我eader confreader = null;if (DBG) log("confFile = " + confFile);try {confreader = new FileReader(confSEO靠我File);confparser = Xml.newPullParser();confparser.setInput(confreader);XmlUtils.beginDocument(confpaSEO靠我rser, "apns");// Sanity check. Force internal version and confidential versions to agreeint confversSEO靠我ion = Integer.parseInt(confparser.getAttributeValue(null, "version"));if (publicversion != confversiSEO靠我on) {log("initDatabase: throwing exception due to version mismatch");throw new IllegalStateExceptionSEO靠我("Internal APNS file version doesnt match "+ confFile.getAbsolutePath());}db.beginTransaction();try SEO靠我{loadApns(db, confparser);db.setTransactionSuccessful();} finally {db.endTransaction();}} catch (FilSEO靠我eNotFoundException e) {// Its ok if the file isnt found. It means there isnt a confidential file// LSEO靠我og.e(TAG, "File not found: " + confFile.getAbsolutePath() + "");} catch (Exception e) {loge("initDatSEO靠我abase: Exception while parsing " + confFile.getAbsolutePath() + "" +e);} finally {// Get rid of userSEO靠我/carrier deleted entries that are not present in apn xml file.// Those entries have edited value USESEO靠我R_DELETED/CARRIER_DELETED.if (VDBG) {log("initDatabase: deleting USER_DELETED and replacing "+ "DELESEO靠我TED_BUT_PRESENT_IN_XML with DELETED");}// Delete USER_DELETEDdb.delete(CARRIERS_TABLE, IS_USER_DELETSEO靠我ED + " or " + IS_CARRIER_DELETED, null);// Change USER_DELETED_BUT_PRESENT_IN_XML to USER_DELETEDConSEO靠我tentValues cv = new ContentValues();cv.put(EDITED, USER_DELETED);db.update(CARRIERS_TABLE, cv, IS_USSEO靠我ER_DELETED_BUT_PRESENT_IN_XML, null);// Change CARRIER_DELETED_BUT_PRESENT_IN_XML to CARRIER_DELETEDSEO靠我cv = new ContentValues();cv.put(EDITED, CARRIER_DELETED);db.update(CARRIERS_TABLE, cv, IS_CARRIER_DESEO靠我LETED_BUT_PRESENT_IN_XML, null);if (confreader != null) {try {confreader.close();} catch (IOExceptioSEO靠我n e) {// do nothing}}// Update the stored checksumsetApnConfChecksum(getChecksum(confFile));}if (VDBSEO靠我G) log("dbh.initDatabase:- db=" + db);}

设置APN:

packages/apps/Settings/src/com/android/settings/ApnSettSEO靠我ings.java

查询数据库Carriers表中的数据:private void fillList() {final TelephonyManager tm = (TelephonyManager) SEO靠我getSystemService(Context.TELEPHONY_SERVICE);String mccmnc = mSubscriptionInfo == null ? "" : tm.getSSEO靠我imOperator(mSubscriptionInfo != null ? mSubscriptionInfo.getSubscriptionId(): SubscriptionManager.INSEO靠我VALID_SUBSCRIPTION_ID);/// M: for plug-in @{// use mcc&mnc in IMPI to query apn.Log.d(TAG, "before pSEO靠我lugin, mccmnc = " + mccmnc);mccmnc = mApnExt.getOperatorNumericFromImpi(mccmnc,SubscriptionManager.gSEO靠我etPhoneId(mSubscriptionInfo.getSubscriptionId()));/// @}Log.d(TAG, "mccmnc = " + mccmnc);/*StringBuiSEO靠我lder where = new StringBuilder("numeric=\"" + mccmnc +"\" AND NOT (type=ia AND (apn=\"\" OR apn IS NSEO靠我ULL)) AND user_visible!=0");*/String where = "numeric=\"" + mccmnc + "\"";/// M: for [C2K APN CustomSEO靠我ization] @{if (mSubscriptionInfo != null) {int subId = mSubscriptionInfo.getSubscriptionId();if (CdmSEO靠我aUtils.isSupportCdma(subId)) {where = CdmaApnSetting.customizeQuerySelectionforCdma(where, mccmnc, sSEO靠我ubId);}}/// @}where += " AND NOT (type=ia AND (apn=\"\" OR apn IS NULL)) AND user_visible!=0";/// M:SEO靠我 for VoLTE, do not show ims apn for non-VoLTE project @{/*if (mHideImsApn) {where.append(" AND NOT (SEO靠我type=ims)");}*///if (!FeatureOption.MTK_VOLTE_SUPPORT || mHideImsApn) {where += " AND NOT (type=ims SEO靠我OR type=ia,ims)";//}/// @}/// M: for plug-inwhere = mApnExt.getFillListQuery(where, mccmnc);Log.d(TASEO靠我G, "fillList where: " + where);String order = mApnExt.getApnSortOrder(Telephony.Carriers.DEFAULT_SORSEO靠我T_ORDER);order = "_id asc";Log.d(TAG, "fillList sort: " + order);Cursor cursor = getContentResolver(SEO靠我).query(Telephony.Carriers.CONTENT_URI,new String[] { "_id", "name", "apn", "type", "mvno_type", "mvSEO靠我no_match_data","sourcetype" }, where.toString(), null, order);if (cursor != null) {Log.d(TAG, "fillLSEO靠我ist, cursor count: " + cursor.getCount());IccRecords r = null;if (mUiccController != null && mSubscrSEO靠我iptionInfo != null) {r = mUiccController.getIccRecords(SubscriptionManager.getPhoneId(mSubscriptionISEO靠我nfo.getSubscriptionId()), UiccController.APP_FAM_3GPP);}PreferenceGroup apnList = (PreferenceGroup) SEO靠我findPreference("apn_list");apnList.removeAll();/// M: for plug-in, use Preference instead ApnPrefereSEO靠我nce for the// convenience of plug-in sideArrayList<Preference> mnoApnList = new ArrayList<PreferenceSEO靠我>();ArrayList<Preference> mvnoApnList = new ArrayList<Preference>();ArrayList<Preference> mnoMmsApnLSEO靠我ist = new ArrayList<Preference>();ArrayList<Preference> mvnoMmsApnList = new ArrayList<Preference>()SEO靠我;mSelectedKey = getSelectedApnKey();cursor.moveToFirst();while (!cursor.isAfterLast()) {String name SEO靠我= cursor.getString(NAME_INDEX);String apn = cursor.getString(APN_INDEX);String key = cursor.getStrinSEO靠我g(ID_INDEX);String type = cursor.getString(TYPES_INDEX);String mvnoType = cursor.getString(MVNO_TYPESEO靠我_INDEX);String mvnoMatchData = cursor.getString(MVNO_MATCH_DATA_INDEX);/// M: check source type, somSEO靠我e types are not editableint sourcetype = cursor.getInt(SOURCE_TYPE_INDEX);/// M: skip specific APN tSEO靠我ypeif(shouldSkipApn(type)) {cursor.moveToNext();continue;}/// M: for plug-inname = mApnExt.updateApnSEO靠我Name(name, sourcetype);ApnPreference pref = new ApnPreference(getPrefContext());pref.setKey(key);preSEO靠我f.setTitle(name);pref.setSummary(apn);pref.setPersistent(false);pref.setOnPreferenceChangeListener(tSEO靠我his);pref.setSubId(mSubscriptionInfo.getSubscriptionId());/// M: for [Read Only APN]pref.setApnEditaSEO靠我ble(mApnExt.isAllowEditPresetApn(type, apn, mccmnc, sourcetype));pref.setSubId(mSubscriptionInfo == SEO靠我null ? null : mSubscriptionInfo.getSubscriptionId());/// M: for ALPS02500557, do not select emergencSEO靠我y APNboolean selectable = ((type == null) || (!type.equals("mms")&& !type.equals("ia") && !type.equaSEO靠我ls("ims") && !type.equals("emergency")))/// M: for plug-in&& mApnExt.isSelectable(type);pref.setSeleSEO靠我ctable(selectable);Log.d(TAG, "mSelectedKey = " + mSelectedKey + " key = " + key + " name = " + nameSEO靠我 +" selectable=" + selectable);if (selectable) {/// M: select prefer APN later, as the apn list are SEO靠我not solid now @{/*if ((mSelectedKey != null) && mSelectedKey.equals(key)) {pref.setChecked();}*//// SEO靠我@}addApnToList(pref, mnoApnList, mvnoApnList, r, mvnoType, mvnoMatchData);/// M: For CT feature,whenSEO靠我 apns-conf.xml add type extra value "supl",// selectable maybe ture when 46011 mms, so need this metSEO靠我hod.mApnExt.customizeUnselectableApn(type, mvnoType, mvnoMatchData, mnoApnList, mvnoApnList,mSubscriSEO靠我ptionInfo == null ? null : mSubscriptionInfo.getSubscriptionId());} else {addApnToList(pref, mnoMmsASEO靠我pnList, mvnoMmsApnList, r, mvnoType, mvnoMatchData);/// M: for plug-inmApnExt.customizeUnselectableASEO靠我pn(type, mvnoType, mvnoMatchData, mnoMmsApnList, mvnoMmsApnList,mSubscriptionInfo == null ? null : mSEO靠我SubscriptionInfo.getSubscriptionId());}cursor.moveToNext();}cursor.close();if (!mvnoApnList.isEmpty(SEO靠我)) {mnoApnList = mvnoApnList;mnoMmsApnList = mvnoMmsApnList;// Also save the mvno info}for (PreferenSEO靠我ce preference : mnoApnList) {apnList.addPreference(preference);}for (Preference preference : mnoMmsASEO靠我pnList) {apnList.addPreference(preference);}/// M: always set a prefer APNsetPreferApnChecked(mnoApnSEO靠我List);/// M: update screen enable state according to airplane mode, SIM radio status, etc.updateScreSEO靠我enEnableState(getActivity());}}

packages/apps/Settings/src/com/android/settings/ApnEditor.java

各个国家mccSEO靠我mnc的查询:

http://www.gpsspg.com/bs/mnc.htm
“SEO靠我”的新闻页面文章、图片、音频、视频等稿件均为自媒体人、第三方机构发布或转载。如稿件涉及版权等问题,请与 我们联系删除或处理,客服邮箱:html5sh@163.com,稿件内容仅为传递更多信息之目的,不代表本网观点,亦不代表本网站赞同 其观点或证实其内容的真实性。

网站备案号:浙ICP备17034767号-2