Android 手机上网实现机制

Android 网络整体架构


Android 网络中,在底层实现两个虚拟串口:

1、Command 命令通道:建立或断开网络建立

2、Data 数据通道:基于TCP/IP 网络通信协议的数据传输


DataConnection 在Telephony Frameworks 层中用来管理手机上网连接

Android 最大支持9个数据连接类型,但同一时刻仅有一个是有效的;

DataConnection 继承 StateMachine 类(State设计模式)的抽象类,其子类 GsmDataConnection 和 CdmaDataConnection;


定义了6个内部类:

DcDefaultState  默认状态定义,作为其他5个状态对象的父对象

DcInactiveState  不活动的状态定义,作为初始化状态,在不使用、断开数据连接、数据连接异常时回到此状态

DcActivatingState  正在激活的状态定义

DcActiveState  活动中的状态定义,连接网络成功

DcDisconnectingState  正在断开的状态定义

DcDisconnectionErrorCreatingConnection  断开失败并且正在创建的状态定义,连接网络失败


这些内部类都有enter、exit 和 processMessage 三个重要方法

enter :在状态转换时,进入此状态的操作

exit :在状态转换时,退出此状态的操作

processMessage :根据Handler 消息类型进入不同的分支进行处理


DataConnection 类关键属性

ApnSetting  mApnSetting  APN 配置信息

PhoneBase  phone  Phone对象

LinkProperties  mLinkProperties  网络连接的基本信息

HashMap<Integer, FailCause>  sErrorCodeToFailCauseMap  记录所以数据连接失败原因

FailCause  lastFailCause  记录最后一次数据连接失败原因

DcXXXState  mXXXState  数据连接的6中状态  


DataConnection 抽象类关键方法



StateMachine 状态机,实现了State 设计模式的应用

State 设计模式将对象的状态封装成一个对象,在不同状态下,同样的调用执行不同的操作;


Context 上下文维护对个State 子类的实例,每个实例实现该状态的操作;Context只需固定调用State.Handle方法,交由ConcreteState对象的Handle处理;


StateMachine 类共有6个内部类:

ProcessedMessageInfo  已处理的消息实体类

ProcessedMessages  已处理的消息类

SmHandler  消息处理核心类,负责Handler 消息的发生和接收用来管理和更新State对象

HaltingState  关闭的状态类

QuittingState  正在退出的状态类

StateInfo  状态实体类型


StateMachine 运行过程:

addState  增加管理的状态对象

setInitialState  设置状态的初始化对象

start  开始运行状态机

addState 增加管理的状态对象,这些状态对象之间存在着树状关系,一个State对象不会处理的消息交由父节点处理,这是职责链设计模式

StateInfo  addState(State  state,  State  parent)

SmHandler 内部类作为自定义的Handler 消息处理对象


  private DataConnection(PhoneBase phone, String name, int id,
419                DcTrackerBase dct, DcTesterFailBringUpAll failBringUpAll,
420                DcController dcc) {
441
442        addState(mDefaultState);
443            addState(mInactiveState, mDefaultState);
444            addState(mActivatingState, mDefaultState);
445            addState(mRetryingState, mDefaultState);
446            addState(mActiveState, mDefaultState);
447            addState(mDisconnectingState, mDefaultState);
448            addState(mDisconnectingErrorCreatingConnection, mDefaultState);
449        setInitialState(mInactiveState);  //设置初始化的State对象
450
451        mApnContexts = new ArrayList<ApnContext>();
452        if (DBG) log("DataConnection constructor X");
453    }

start() 启动方法的调用则是在子类GSMDataconnection和CDMADataconnection 类完成


APN (Access Point Name) 是通过手机上网必现配置的一个参数,决定手机通过哪种接入方式访问网络;

启动手机后,所以的APN 配置信息都会保存在telephony.db 的SQLite 的数据库表名未carriers 的表中;

adb  pull  /data/data/com.android.providers.telephony/databases/telephony.db 

telephony.db 数据库文件carriers 表:

name  APN 配置名称

numeric  运营商编号

apn  APN 接入点,比如中国移动有两个接入点:cmwap 和 cmnet

proxy  代理服务器地址

port  端口号

mmsproxy  彩信代理服务器地址

mmsport  彩信代理服务器端口号

mmsc  彩信接入服务地址

type  APN 接入类型


Android 支持的 APN 类型,最多支持5种 APN 类型:

default  默认数据类型,即浏览器、Email等手机普通上网数据连接

mms  发送和接收彩信使用的数据连接

supl  支持AGPS 的数据连接

dun(dial-up-network)  拨号连接

hipri  扩张

以上数据连接优先级是由低到高


Android 中新增 APN 配置

1、修改配置文件

2、进入Call Setting 模块设置 APN 配置信息

配置 APN 信息,是修改 $workdir/development/data/etc/apns-conf.xml 配置文件


开机自动建立 default 默认数据连接

查看手机上网的基本参数配置

adb  shell  netcfg   查看网络基本信息,如网卡名称、状态、IP地址、Mac地址

adb  shell  ip  route   查看IP路由表

完成DataConnection 数据连接的创建和设置:

1、初始化ApnContext,APN 上下午信息

2、SIM 卡加载完成后,设置创建DataConnection 数据连接

3、激活创建的DataConnection 数据连接


初始化ApnContext :

initApnContextAndDataConnection 获取 defaultEnable 和 networkConfigStrings 参数

networkConfigStrings 方法在 frameworks/base/core/res/res/values/configs.xml 配置文件中定义

onSetDependencyMet ,applyNewState 更新数据连接的状态;


创建DataConnection 连接

SIM 卡中联系人加载完成发出 EVENT_RECORDS_LOADED , GSMDataConnectionTracker 接收消息,调用onRecordsLoaded 完成default 默认数据连接的创建和激活:

1、createAllApnList  创建 ApnSetting (APN 配置信息的实体对象)对象列表

2、notifyOffApnsOfAvailability  发出数据连接变化的消息通知

3、setupDataOnReadyApns  创建和激活DataConnection 数据连接

onRecordsLoaded --> setupDataOnReadyApns --> trySetupData --> setupDate 完成数据连接的创建 --> createDataConnection 负责dc 对象的创建


激活DataConnection 数据连接

EVENT_DATA_SETUP_COMPLETE 消息创建,调用bringUp 激活当前数据连接;

创建EVENT_CONNECT,调用父类StateMachine的sendMessage方法,继而调用mSmHandler.sendMessage;

sMsHander 负责完成StateMachine 状态机的消息处理,handleMessage --> processMsg --> curStateInfo.state.processMessage

设置初始状态InactiveState,调用内部processMessage,继而调用onConnect 和 transitionTo

  • 1
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值