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

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章