Android網路相關

來源:互聯網
上載者:User

網路應用,對於使用者來說,主要是搜尋,瀏覽網頁,發email,發mms。對於android來說這些應用涉及到的一些中間過程,主要涉及到webkit,wap,smtp等協議,然後是socket通訊,然後就是
linux核心的tcpip協議棧,及ppp協議,最後再是ttyS0之類的裝置介面,最後由modem發送資料。另外手機的網路介面可能不是modem,有可能是網卡或者wifi,那麼android中也有相應的介面可以添加。
不過有線網卡,目前用的比較少,畢竟手機或平板電腦上很少會用到體積大的網口。

先在總體上看一下網路流程
這裡主要討論modem的形式。

 應用程式->觸發網路連接(或已串連)->android本地的jni socket函數->核心中的BSD socket?->tcp/ip->ppp->/dev/ttySx(modem的資料口)。
 在觸發的網路連接,如果沒有串連,則會時行撥號,撥號有一些初始化at命令,及一個撥號命令,atd*99***1#,這些實現是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>();
                    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函數
                對於trySetupData函數,剛會調用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等方法。
        在connect,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目錄下。
        在Android1.6版本之前,系統封裝了調用pppd的代碼,在frameworks/base/telephony/java/com/android/internal/telephony/PppLink.java中。
        但之後就沒有了,網上的介紹說是用了高通的方案,把pppd與系統的進程的通訊通過了記憶體共用的方式來實現,因此在代碼中就去掉了調用pppd的java代碼。
       
        如何共用?這是個問題。不過應該是系統的事了。
        那麼自己要手動進行pppd撥號了。
        什麼時候撥號?這個是關鍵。gprs畢竟是有流量。大家都比較喜歡按需撥號,相當於智能撥號了。ppp已經提供了這個功能,加相應的參數即可。
       
        不過在新的android版本中,已經ppp代碼進行了簡化,沒有chat.c檔案,那自然沒得有chat命令,也就無法用pppd call xxx這個命令。如果想用chat那麼就要自己移植ppp程式。

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.