Androidネットワーク関連---インターネットの流れ
7051 ワード
ネットワークアプリケーションは、ユーザーにとって、主に検索、Webページの閲覧、emailの送信、mmsの送信です.androidにとってこれらのアプリケーションに関連するいくつかの中間プロセスは、主にwebkit、wap、smtpなどのプロトコル、それからsocket通信、それからlinuxカーネルのtcpipプロトコルスタック、pppプロトコル、最後にttyS 0などのデバイスインタフェースに関連し、最後にmodemによってデータを送信する.また、携帯電話のネットワークインタフェースはmodemではなく、ネットワークカードやwifiである可能性があります.androidにも対応するインタフェースが追加できます.
しかし、有線ネットワークカードは、現在は少ないが、携帯電話やタブレットでは体積の大きいネットワークポートを使うことは少ない.
まず全体的にネットワークの流れを見てみましょう
ここでは主にmodemの形式について議論する.
アプリケーション->ネットワーク接続のトリガ(または接続済み)->androidローカルjni socket関数->カーネル内のBSD socket?->tcp/ip->ppp->/dev/ttySx(modemのデータポート).
トリガされたネットワーク接続では、接続されていない場合、ダイヤルアップが実行され、ダイヤルアップにはいくつかの初期化atコマンドと、RIL.javaに対応するril.cppファイルで完了するダイヤルアップコマンドがあります.ダイヤルアップに成功すると、ppp交渉プロセスが行われ、ppp交渉に成功すると、モバイルネットワークは端末にipアドレス、ゲートウェイ、dnsアドレスを割り当てます.そしてネットワーク接続は成功しました.その後、上位アプリケーションのデータを送信します.
私たちのアプリケーションでは、インターネットのニーズがトリガーされ、システムはネットワークが接続されているかどうかを検出します.もちろん、複数のインタフェースがある場合は、ポーリングして、どの接続が利用可能かを見ます(ここに優先度があるかどうかは、まず有線で、それからwifiで、最後にmodemで、結局modemの費用は最高です).
pppダイヤルアップの前に、すべてのインプリメンテーションがPhoneServiceに含まれています.すなわち、frameworks/base/telephony/java/com/android/internal/telephony/ディレクトリの下にあります.
結局、ダイヤルという動作は電話の範疇に属している.
まずPhoneApp.javaで:onCreate
PhoneFactory.java:public static void makeDefaultPhone(Context context)
GSMPhone.javaのコンストラクション関数では、
GsmDataConnectionTracker.javaでは、GsmDataConnectionTrackerクラスはDataConnectionTrackerに継承されます.GsmDataConnectionTrackerコンストラクション関数でcreateAllPdpList()が呼び出されました.関数は GsmDataConnectionTracker.javaにあります.次のようになります.
アプリケーションがonApnChanged、onRoamingOff、onRoamingOnなどの関数をトリガしたり、メッセージを処理したりするときにtrySetupData関数が呼び出されます.
trySetupデータ関数の場合、setupData(reason)が呼び出されます.データ接続を行います.
次に、PdpConnection.javaファイルを見て、DataConnectionに継承します.
このファイルはconnect,disconnectなどの方法を実現しています.
接続、setupDataCallインタフェースメソッド
mCMのタイプはCommandsInterface、すなわちいくつかの電話サービスがぶつかる汎用インタフェースです.このインタフェースの実装は、RILクラスです.次にRIL.javaを見ます.
RIL.javaはandroid電話サービスとmodem操作の変換機能を完了した.すなわち,いくつかの電話サービスを実装atコマンドに変換しmodemに送信する.
RILクラスでのsetupDataCallメソッドは、次のように実現されます.
これはsocket方式でril.cppに関連要求を送信し、リードでRIL_を送信する.REQUEST_SETUP_DATA_CALLリクエストは、ril.cppで完了するとmodemにATD*99**1#コマンドをシリアルポートで送信します.最後にatコマンドを返して結果を返し、成功するとCONNECT OKに戻り、ril.cppはRIL.javaにこのコマンドの成功した応答を送信します.RIL.javaのrun関数のループでprocessResponseメソッドを呼び出し、関連する応答を解析します.
さらにrr.mResult.sendToTarget()を介して,戻り結果を上位モジュールに送る.
このとき、pppダイヤルアッププログラムpppのダイヤルアップソースコードがexternal/pppディレクトリの下に呼び出されます.
Android 1.6バージョンの前に、frameworks/base/telephony/java/com/android/internal/telephony/ppLink.javaにpppdを呼び出すコードがカプセル化されています.
しかしその後はなく、ネット上の紹介ではハイパス方式でpppdとシステムのプロセスの通信をメモリ共有方式で実現したため、コードからpppdを呼び出すjavaコードが削除されたという.
どのように共有しますか?これは問題です.しかし、システムのことだと思います.
では、自分でpppdダイヤルを手動で行います.
いつダイヤルしますか.これがポイントです.gprsは結局流量がある.みんなはオンデマンドダイヤルが好きで、スマートダイヤルに相当します.pppはすでにこの機能を提供しており、対応するパラメータを加えればよい.
しかし、新しいandroidバージョンでは、pppコードが簡略化されており、chat.cファイルがなければ、chatコマンドがなければ、pppd call xxxというコマンドは使用できません.chatを使いたいならpppプログラムを自分で移植しなければなりません.
しかし、有線ネットワークカードは、現在は少ないが、携帯電話やタブレットでは体積の大きいネットワークポートを使うことは少ない.
まず全体的にネットワークの流れを見てみましょう
ここでは主にmodemの形式について議論する.
アプリケーション->ネットワーク接続のトリガ(または接続済み)->androidローカルjni socket関数->カーネル内のBSD socket?->tcp/ip->ppp->/dev/ttySx(modemのデータポート).
トリガされたネットワーク接続では、接続されていない場合、ダイヤルアップが実行され、ダイヤルアップにはいくつかの初期化atコマンドと、RIL.javaに対応するril.cppファイルで完了するダイヤルアップコマンドがあります.ダイヤルアップに成功すると、ppp交渉プロセスが行われ、ppp交渉に成功すると、モバイルネットワークは端末にipアドレス、ゲートウェイ、dnsアドレスを割り当てます.そしてネットワーク接続は成功しました.その後、上位アプリケーションのデータを送信します.
私たちのアプリケーションでは、インターネットのニーズがトリガーされ、システムはネットワークが接続されているかどうかを検出します.もちろん、複数のインタフェースがある場合は、ポーリングして、どの接続が利用可能かを見ます(ここに優先度があるかどうかは、まず有線で、それからwifiで、最後にmodemで、結局modemの費用は最高です).
pppダイヤルアップの前に、すべてのインプリメンテーションがPhoneServiceに含まれています.すなわち、frameworks/base/telephony/java/com/android/internal/telephony/ディレクトリの下にあります.
結局、ダイヤルという動作は電話の範疇に属している.
まずPhoneApp.javaで:onCreate
PhoneFactory.makeDefaultPhones(this); //
PhoneFactory.java:public static void makeDefaultPhone(Context context)
int phoneType = getPhoneType(networkMode);
if (phoneType == Phone.PHONE_TYPE_GSM) {
sProxyPhone = new PhoneProxy(new GSMPhone(context,
sCommandsInterface, sPhoneNotifier));
Log.i(LOG_TAG, "Creating GSMPhone");
} else if (phoneType == Phone.PHONE_TYPE_CDMA) {
sProxyPhone = new PhoneProxy(new CDMAPhone(context,
sCommandsInterface, sPhoneNotifier));
Log.i(LOG_TAG, "Creating CDMAPhone");
}
// PhoneProxy, PhoneProxy , GSMPhone, cdma, CDMAPhone。 cdma .
GSMPhone.javaのコンストラクション関数では、
mDataConnection = new GsmDataConnectionTracker (this);
GsmDataConnectionTracker.javaでは、GsmDataConnectionTrackerクラスはDataConnectionTrackerに継承されます.GsmDataConnectionTrackerコンストラクション関数でcreateAllPdpList()が呼び出されました.関数は GsmDataConnectionTracker.javaにあります.次のようになります.
private void createAllPdpList() {
pdpList = new ArrayList();
DataConnection pdp;
for (int i = 0; i < PDP_CONNECTION_POOL_SIZE; i++) {
pdp = new PdpConnection(mGsmPhone);
pdpList.add(pdp);
}
}
// PDP_CONNECTION_POOL_SIZE PdpConnection(PDP_CONNECTION_POOL_SIZE 1)
アプリケーションがonApnChanged、onRoamingOff、onRoamingOnなどの関数をトリガしたり、メッセージを処理したりするときにtrySetupData関数が呼び出されます.
trySetupデータ関数の場合、setupData(reason)が呼び出されます.データ接続を行います.
private boolean setupData(String reason) {
ApnSetting apn;
PdpConnection pdp;
apn = getNextApn();
if (apn == null) return false;
pdp = findFreePdp();
if (pdp == null) {
if (DBG) log("setupData: No free PdpConnection found!");
return false;
}
mActiveApn = apn;
mActivePdp = pdp;
Message msg = obtainMessage();
msg.what = EVENT_DATA_SETUP_COMPLETE;
msg.obj = reason;
pdp.connect(apn, msg);
setState(State.INITING);
phone.notifyDataConnection(reason);
return true;
}
// pdp.connect(apn, msg)。 , RIL.java 。
次に、PdpConnection.javaファイルを見て、DataConnectionに継承します.
このファイルはconnect,disconnectなどの方法を実現しています.
接続、setupDataCallインタフェースメソッド
phone.mCM.setupDataCall(Integer.toString(RILConstants.SETUP_DATA_TECH_GSM),
Integer.toString(RILConstants.DATA_PROFILE_DEFAULT), apn.apn, apn.user,
apn.password, Integer.toString(authType),
obtainMessage(EVENT_SETUP_DATA_CONNECTION_DONE));
mCMのタイプはCommandsInterface、すなわちいくつかの電話サービスがぶつかる汎用インタフェースです.このインタフェースの実装は、RILクラスです.次にRIL.javaを見ます.
RIL.javaはandroid電話サービスとmodem操作の変換機能を完了した.すなわち,いくつかの電話サービスを実装atコマンドに変換しmodemに送信する.
RILクラスでのsetupDataCallメソッドは、次のように実現されます.
public void
setupDataCall(String radioTechnology, String profile, String apn,
String user, String password, String authType, Message result) {
RILRequest rr
= RILRequest.obtain(RIL_REQUEST_SETUP_DATA_CALL, result);
rr.mp.writeInt(6);
rr.mp.writeString(radioTechnology);
rr.mp.writeString(profile);
rr.mp.writeString(apn);
rr.mp.writeString(user);
rr.mp.writeString(password);
rr.mp.writeString(authType);
if (RILJ_LOGD) riljLog(rr.serialString() + "> "
+ requestToString(rr.mRequest) + " " + radioTechnology + " "
+ profile + " " + apn + " " + user + " "
+ password + " " + authType);
send(rr);
}
これはsocket方式でril.cppに関連要求を送信し、リードでRIL_を送信する.REQUEST_SETUP_DATA_CALLリクエストは、ril.cppで完了するとmodemにATD*99**1#コマンドをシリアルポートで送信します.最後にatコマンドを返して結果を返し、成功するとCONNECT OKに戻り、ril.cppはRIL.javaにこのコマンドの成功した応答を送信します.RIL.javaのrun関数のループでprocessResponseメソッドを呼び出し、関連する応答を解析します.
processResponse()->processSolicited ()
->case RIL_REQUEST_SETUP_DATA_CALL: ret = responseStrings(p); break;
さらにrr.mResult.sendToTarget()を介して,戻り結果を上位モジュールに送る.
このとき、pppダイヤルアッププログラムpppのダイヤルアップソースコードがexternal/pppディレクトリの下に呼び出されます.
Android 1.6バージョンの前に、frameworks/base/telephony/java/com/android/internal/telephony/ppLink.javaにpppdを呼び出すコードがカプセル化されています.
しかしその後はなく、ネット上の紹介ではハイパス方式でpppdとシステムのプロセスの通信をメモリ共有方式で実現したため、コードからpppdを呼び出すjavaコードが削除されたという.
どのように共有しますか?これは問題です.しかし、システムのことだと思います.
では、自分でpppdダイヤルを手動で行います.
いつダイヤルしますか.これがポイントです.gprsは結局流量がある.みんなはオンデマンドダイヤルが好きで、スマートダイヤルに相当します.pppはすでにこの機能を提供しており、対応するパラメータを加えればよい.
しかし、新しいandroidバージョンでは、pppコードが簡略化されており、chat.cファイルがなければ、chatコマンドがなければ、pppd call xxxというコマンドは使用できません.chatを使いたいならpppプログラムを自分で移植しなければなりません.