ImageVerifierCode 换一换
格式:DOCX , 页数:9 ,大小:19.34KB ,
资源ID:28390157      下载积分:3 金币
快捷下载
登录下载
邮箱/手机:
温馨提示:
快捷下载时,用户名和密码都是您填写的邮箱或者手机号,方便查询和重复下载(系统自动生成)。 如填写123,账号就是123,密码也是123。
特别说明:
请自助下载,系统不会自动发送文件的哦; 如果您已付费,想二次下载,请登录后访问:我的下载记录
支付方式: 支付宝    微信支付   
验证码:   换一换

加入VIP,免费下载
 

温馨提示:由于个人手机设置不同,如果发现不能下载,请复制以下地址【https://www.bdocx.com/down/28390157.html】到电脑端继续下载(重复下载不扣费)。

已注册用户请登录:
账号:
密码:
验证码:   换一换
  忘记密码?
三方登录: 微信登录   QQ登录  

下载须知

1: 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。
2: 试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓。
3: 文件的所有权益归上传用户所有。
4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
5. 本站仅提供交流平台,并不能对任何下载内容负责。
6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

版权提示 | 免责声明

本文(数据业务建立流程之发起网络连接过程原.docx)为本站会员(b****5)主动上传,冰豆网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知冰豆网(发送邮件至service@bdocx.com或直接QQ联系客服),我们立即给予删除!

数据业务建立流程之发起网络连接过程原.docx

1、数据业务建立流程之发起网络连接过程原数据业务建立流程之发起网络连接过程(原) 经过前面这些过程,网络连接所需要的条件就全部准备就绪,接下来就是等待网络接入。 我们把网络接入过程简单分为三个阶段: 触发阶段 -该阶段是由各种不同事件触发的,比如SIM载入完毕、PS域Attach成功、通话结束、APN改变等,该阶段的最终都是要调用setupDataOnConnectableApns()方法; 准备连接阶段 -该阶段是指,在DcTracker收到建立连接的请求之后,需要进行一系列有效性检测,比如APN是否已经激活、PS是否已经就绪、用户是否打开网络开关等,然后创建DataConnection()对象

2、,准备发起连接请求; 发送连接命令阶段 -该阶段是指,在DataConnection收到DcTracker的请求之后,将请求转交给RILJ的过程,经过该阶段后,请求就发送到了RIL以及Modem层,由底层完成信令的发送和接收;一、触发阶段 有多种事件可以触发网络接入过程,具体来说分为以下几个原因:java view plain copy /漫游相关 static final String REASON_ROAMING_ON = roamingOn; static final String REASON_ROAMING_OFF = roamingOff; /PS attach static fi

3、nal String REASON_DATA_ATTACHED = dataAttached; /APN改变 static final String REASON_APN_CHANGED = apnChanged; /通话结束 static final String REASON_VOICE_CALL_ENDED = 2GVoiceCallEnded; /SIM载入完毕 static final String REASON_SIM_LOADED = simLoaded; /网络模式改变 static final String REASON_NW_TYPE_CHANGED = nwTypeCha

4、nged; 我们挑选最常见的REASON_DATA_ATTACHED原因来分析网络连接的发起过程。 什么是Data Attach事件呢?其实就是手机的PS域Attach成功,而PS域是和CS域相对应,简单来说,手机(2G/3G)打电话是在CS域上进行,而数据流量是在PS域上进行,PS域附着(Attach)成功之后才可以发起数据激活的信令,然后才可以上网,默认状态下,手机开机后就会发起PS附着的信令给网络,附着成功之后将会接到成功的消息,由于DcTracker当初初始化时在registerForAllEvents()中注册了Attach的监听器:java view plain copy prot

5、ected void registerForAllEvents() /监听是否PS域Attach状态 mPhone.getServiceStateTracker().registerForDataConnectionAttached(this, DctConstants.EVENT_DATA_CONNECTION_ATTACHED, null); 因此当PS域Attach成功之后,将会收到EVENT_DATA_CONNECTION_ATTACHED消息:java view plain copy public void handleMessage (Message msg) switch (ms

6、g.what) case DctConstants.EVENT_DATA_CONNECTION_ATTACHED: onDataConnectionAttached(); break; 继续:java view plain copy private void onDataConnectionAttached() mAttached.set(true); if (getOverallState() = DctConstants.State.CONNECTED) /已经处于连接状态 startNetStatPoll(); startDataStallAlarm(DATA_STALL_NOT_SUS

7、PECTED); notifyDataConnection(Phone.REASON_DATA_ATTACHED); else /初始化后应该处于IDLE状态 notifyOffApnsOfAvailability(Phone.REASON_DATA_ATTACHED); if (mAutoAttachOnCreationConfig) mAutoAttachOnCreation = true; setupDataOnConnectableApns(Phone.REASON_DATA_ATTACHED); 当前的连接状态是IDLE,因此会将REASON_DATA_ATTACHED的参数传递给n

8、otifyOffApnsOfAvailability(),里面也没什么内容,我们直接来看setupDataOnConnectableApns()的操作。 setupDataOnConnectableApns()就是发起数据连接时使用的方法,调用该方法时需要传递一个原因的参数,该参数标明当前建立数据连接的原因(其实目前也没有发现该参数的具体作用)。 其他诸如SIM载入完毕、通话结束等触发事件也都是通过该方法发起数据连接请求的。二、准备连接阶段 当由于种种原因触发网络连接请求时,就会调用到setupDataOnConnectableApns()方法,并传递各种原因的参数,接下来就需要准备APN并进

9、行各种有效性检测,并最终将请求转交给DataConnection来处理。java view plain copy private void setupDataOnConnectableApns(String reason) /对于当前环境来说,reason为REASON_DATA_ATTACHED for (ApnContext apnContext : mPrioritySortedApnContexts) if (apnContext.getState() = DctConstants.State.FAILED) apnContext.setState(DctConstants.State

10、.IDLE); if (apnContext.isConnectable() apnContext.setReason(reason); trySetupData(apnContext); 在这个方法里面,遍历当前所有的APN参数(mPrioritySortedApnContexts其实等同于mApnContexts,只不过是按照优先级顺序排列了一下而已,项都是一样的),找到可用的APN参数,然后通过trySetupData()发起连接请求,我们来看一下这里如何判断一个APN是否可用,也就是看一下isConnectable()的判断条件:java view plain copy ApnCont

11、ext.java public boolean isConnectable() return isReady() && (mState = DctConstants.State.IDLE) | (mState = DctConstants.State.SCANNING) | (mState = DctConstants.State.RETRYING) | (mState = DctConstants.State.FAILED); 前面我们说过,激活APN的时候,其实就是让isReady()的判断通过,而mState初始值也是IDLE,因此刚才我们激活的APN参数此时就被挑选出来

12、,并进行trySetupData()的操作:java view plain copy DcTracker.java private boolean trySetupData(ApnContext apnContext) boolean isEmergencyApn = apnContext.getApnType().equals(PhoneConstants.APN_TYPE_EMERGENCY); boolean desiredPowerState = mPhone.getServiceStateTracker().getDesiredPowerState(); boolean checkU

13、serDataEnabled = !(apnContext.getApnType().equals(PhoneConstants.APN_TYPE_IMS); if (apnContext.isConnectable() && (isEmergencyApn | (isDataAllowed(apnContext) && getAnyDataEnabled(checkUserDataEnabled) && !isEmergency() int radioTech = mPhone.getServiceState().getRilDataRadio

14、Technology(); if (apnContext.getState() = DctConstants.State.IDLE) ArrayList<ApnSetting> waitingApns = buildWaitingApns(apnContext.getApnType(), radioTech); if (waitingApns.isEmpty() notifyNoData(DcFailCause.MISSING_UNKNOWN_APN, apnContext); notifyOffApnsOfAvailability(apnContext.getReason();

15、return false; else apnContext.setWaitingApns(waitingApns); /建立连接 boolean retValue = setupData(apnContext, radioTech); notifyOffApnsOfAvailability(apnContext.getReason(); return retValue; else 这里主要经历了有效性的检查,其中判断了四个情况: apnContext.isConnectable() -判断当前APN是否已经被激活; isEmergencyApn() -当前APN是否为紧急APN; isData

16、Allowed() -判断是否已经ATTACH成功,SIM是否初始化完毕,当前手机服务是否支持,漫游下是否允许上网等; getAnyDataEnabled() -该条件主要判断用户是否打开了数据开关; 这四个条件我们主要来看最后一个,他里面包含用户数据开关的判断,我们来看一下详情,其中传递的参数checkUserDataEnabled受4G IMS的影响,由于国内暂时都没有部署IMS,因此这里的参数肯定都为true:java view plain copy mUserDataEnabled = Settings.Global.getInt( mPhone.getContext().getCon

17、tentResolver(), Settings.Global.MOBILE_DATA, 1) = 1; 这说明他来自于Settings.Global.MOBILE_DATA这个属性值,而这个属性值恰恰就是当用户打开或关闭移动网络时所改变的属性值,当用户打开数据网络时,该值为1,关闭网络时,该值就是0。 回到trySetupData()中来,当前所选取的APN是可用的,而且不是紧急APN,同时假设用户打开了数据流量开关,那么在该方法中就会通过setupData的方法来发送数据连接的请求:java view plain copy private boolean setupData(ApnCont

18、ext apnContext, int radioTech) ApnSetting apnSetting; DcAsyncChannel dcac = null; apnSetting = apnContext.getNextWaitingApn(); int profileId = apnSetting.profileId; if (profileId = 0) profileId = getApnProfileID(apnContext.getApnType(); if (dcac = null) /创建DcAsyncChannel dcac = findFreeDataConnectio

19、n(); if (dcac = null) dcac = createDataConnection(); if (dcac = null) return false; apnContext.setDataConnectionAc(dcac); apnContext.setApnSetting(apnSetting); apnContext.setState(DctConstants.State.CONNECTING); mPhone.notifyDataConnection(apnContext.getReason(), apnContext.getApnType(); /通过DcAsyncC

20、hannel发起连接请求 Message msg = obtainMessage(); msg.what = DctConstants.EVENT_DATA_SETUP_COMPLETE; msg.obj = apnContext; dcac.bringUp(apnContext, getInitialMaxRetry(), profileId, radioTech, mAutoAttachOnCreation, msg); return true; 这个方法内部主要完成了两个任务: 1、更新当前APN参数的状态并把状态发送到系统中(还是通过notifyDataConnection()来完成)

21、; 2、通过DcAsyncChannel的bringUp()方法发起连接请求; 我们主要分析第二个任务。 这里显示通过findFreeDataConnection()方法搜索可用的DcAsyncChannel,找不到的话就通过createDataConnection()创建,我们由于第一次上网,因此就需要创建的过程:java view plain copy private DcAsyncChannel createDataConnection() int id = mUniqueIdGenerator.getAndIncrement(); DataConnection conn = DataC

22、onnection.makeDataConnection(mPhone, id, this, mDcTesterFailBringUpAll, mDcc); mDataConnections.put(id, conn); /创建DcAsyncChannel通道 DcAsyncChannel dcac = new DcAsyncChannel(conn, LOG_TAG); /申请双向连接 int status = dcac.fullyConnectSync(mPhone.getContext(), this, conn.getHandler(); if (status = AsyncChann

23、el.STATUS_SUCCESSFUL) mDataConnectionAcHashMap.put(dcac.getDataConnectionIdSync(), dcac); else return dcac; 这里我们主要完成四个步骤: 1、拿到了一个DataConnection对象; 2、创建了DcAsyncChannel对象; 3、通过fullyConnectSync对DataConnection发起双向连接请求; 4、将DcAsyncChannel返回出来; DcAsyncChannel的属性其实是AsyncChannel:java view plain copy public c

24、lass DcAsyncChannel extends AsyncChannel 根据AsyncChannel的使用和原理中的介绍,通过fullyConnectSync()可以一次性申请到双向的AsyncChannel,对于当前环境来说,就是在DcTracker与DataConnection之间建立了双向的连接通道,而且把通道的地址传递出来,而在setupData()中我们看到,DcTracker拿到该通道后,就进行了bringUp()的调用;java view plain copy private boolean setupData(ApnContext apnContext, int ra

25、dioTech) DcAsyncChannel dcac = null; /通过DcAsyncChannel发起连接请求 Message msg = obtainMessage(); msg.what = DctConstants.EVENT_DATA_SETUP_COMPLETE; msg.obj = apnContext; dcac.bringUp(apnContext, getInitialMaxRetry(), profileId, radioTech, mAutoAttachOnCreation, msg); return true; 而且在调用bringUp时传递了一个Messag

26、e的参数,该参数中携带了两个参数,EVENT_DATA_SETUP_COMPLETE的消息和APN的内容。 然后我们来看bringUp:java view plain copy DcAsyncChannel.java public void bringUp(ApnContext apnContext, int initialMaxRetry, int profileId, int rilRadioTechnology, boolean retryWhenSSChange, Message onCompletedMsg) sendMessage(DataConnection.EVENT_CONN

27、ECT, new ConnectionParams(apnContext, initialMaxRetry, profileId, rilRadioTechnology, retryWhenSSChange, onCompletedMsg); 这里就是将刚才的两个参数封装后通过sendMessage()发送出去,那么这个消息是发送给谁了呢? 其实就是发送给DcAsyncChannel通道的另一端DataConnection了,那么DataConnection是如何处理该消息的呢?三、发送连接命令阶段 当消息流进入DataConnection时,网络请求的过程在上层也就进入了最后的发送阶段,接下

28、来我们就来看这最后的阶段如何完成。 DataConnection是在刚才的createDataConnection()方法中通过makeDataConnection()方法创建的:java view plain copy DataConnection.java static DataConnection makeDataConnection(PhoneBase phone, int id, DcTrackerBase dct, DcTesterFailBringUpAll failBringUpAll, DcController dcc) /创建DataConnection方法 DataCon

29、nection dc = new DataConnection(phone, DC- + mInstanceNumber.incrementAndGet(), id, dct, failBringUpAll, dcc); dc.start(); return dc; 先来看该类的属性:java view plain copy public final class DataConnection extends StateMachine 然后来看该对象的构造方法:java view plain copy private DataConnection(PhoneBase phone, String

30、name, int id, DcTrackerBase dct, DcTesterFailBringUpAll failBringUpAll, DcController dcc) super(name, dcc.getHandler(); mPhone = phone; mDct = dct; mDcTesterFailBringUpAll = failBringUpAll; mDcController = dcc; mId = id; mCid = -1; mDcRetryAlarmController = new DcRetryAlarmController(mPhone, this);

31、ServiceState ss = mPhone.getServiceState(); mRilRat = ss.getRilDataRadioTechnology(); mDataRegState = mPhone.getServiceState().getDataRegState(); int networkType = ss.getDataNetworkType(); mNetworkInfo = new NetworkInfo(ConnectivityManager.TYPE_MOBILE, networkType, NETWORK_TYPE, TelephonyManager.get

32、NetworkTypeName(networkType); mNetworkInfo.setRoaming(ss.getRoaming(); mNetworkInfo.setIsAvailable(true); /各种状态机初始化 addState(mDefaultState); addState(mInactiveState, mDefaultState); addState(mActivatingState, mDefaultState); addState(mRetryingState, mDefaultState); addState(mActiveState, mDefaultState); addState(mDisconnectingState, mDefaultSta

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1