当前位置:操作系统 > 安卓/Android >>

Android网络相关---上网流程

网络应用,对于用户来说,主要是搜索,浏览网页,发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;

  &

补充:移动开发 , Android ,
CopyRight © 2012 站长网 编程知识问答 www.zzzyk.com All Rights Reserved
部份技术文章来自网络,