Androidネットワーク関連---インターネットの流れ


ネットワークアプリケーションは、ユーザーにとって、主に検索、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.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プログラムを自分で移植しなければなりません.