`
zzbupt
  • 浏览: 84480 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

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

阅读更多

觉得写的不错,就转过来收藏了。

http://blog.csdn.net/Askeyes/article/details/6000431

 

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

分享到:
评论
1 楼 chenmaostyle 2012-09-05  
再通过rr.mResult.sendToTarget(),把返回结果送到上一层模块中 是什么意思呀???

相关推荐

    Android 开发过程网络相关问题

    NULL 博文链接:https://billyyuan.iteye.com/blog/1058522

    Android-RIL详细总结及流程图_ril上网流程_RILandroid_RIL_androidril_Android流程图

    安卓ril开发流程及原理详细说明,包含各函数说明

    深入理解 Android Telephony原理剖析与最佳实践

    第三部分(7~9章),对Android的通信功能进行了深入的分析,包括对网络服务状态的运行机制的分析、对Android手机上网的实现机制的分析,以及对短息发送和接收流程的分析;第四部分(10~12章),对Android RIL的工作...

    《Android Telephony原理解析与开发指南》_杨青平

    全书共10章,主要内容包括初识Android、搭建Android源代码编译调试环境、深入解析通话流程、详解Telecom、详解TeleService、Voice Call语音通话模型、ServiceState网络服务、Data Call移动数据业务、SMS & MMS业务...

    android电话系统数据流程分析

    3)上网的网络通路建立(例如GSM GPRS),如何PPP连接并连接到LinuxSocket通道上的?系统如何管理数据连接? 4)AP跟Modem通讯时通过AT指令的,如何将AT指令变成一个个具体的操作函数,如何管理Modem发给我们的回应...

    Android 2.3 拨号上网流程从源码角度进行分析

    通常,如果我们想使用SIM卡拨号上网功能,我们要在设置中进行简单的配置,步骤如下: 设置 -》无线和网络 -》移动网络 -》(已启用数据/数据漫游/接入点名称/仅使用2G网络/网络运营商) 我们必须选中其中的“已启用...

    Android设备间实现蓝牙(Bluetooth)共享上网

    主要为大家详细介绍了Android设备间实现蓝牙(Bluetooth)共享上网的方法,主要以图片的方式向大家展示蓝牙共享上网

    安卓课程设计-手机通讯录系统全解.doc

    1) 优点:具备触摸屏、高级图形显示和上网功能,界面强大,可以说是一种 融入全部Web应用的单一平台 2) 缺点:由于时时刻刻都需要和网络进行连接,因此在手机的能耗方面控制就较差, 导致待机能力不足;又由于其...

    中国移动微求职 For Android v3.0.zip

     针对广大普通求职人群电脑上网不方便的难题,jobtone(微求职)手机招聘服务可大大便捷了其找工作的途径,求职者可以通过手机进行简历维护,投递和搜索职位。服务平台在收到求职者投递简历后的第一时间,会自动...

    软件专业调研报告(2).doc

    利用自己的人际关系,与已经就业的学生进行聊天交流,借此向其了解有关本专 业的专业计划的问题,了解企业中的工作流程。 三、调研的主要内容 1.软件行业的发展现状 近年来,我国软件和信息技术服务业发展迅速,但...

    软件专业调研报告.doc

    利用自己的人际关系,与已经就业的学生进行聊天交流,借此向其了解有关本专 业的专业计划的问题,了解企业中的工作流程。 三、调研的主要内容 1.软件行业的发展现状 近年来,我国软件和信息技术服务业发展迅速,但...

    软件专业调研报告(1).doc

    利用自己的人际关系,与已经就业的学生进行聊天交流,借此向其了解有关本专 业的专业计划的问题,了解企业中的工作流程。 三、调研的主要内容 1.软件行业的发展现状 近年来,我国软件和信息技术服务业发展迅速,但...

    软件专业调研报告.docx

    利用自己的人际关系,与已经就业的学生进行聊天交流,借此向其了解有关本专业的专业计划的问题,了解企业中的工作流程。 三、调研的主要内容 1.软件行业的发展现状 软件专业调研报告全文共5页,当前为第1页。近年来...

    软件专业调研报告(2).docx

    利用自己的人际关系,与已经就业的学生进行聊天交流,借此向其了解有关本专业的专业计划的问题,了解企业中的工作流程。 三、调研的主要内容 1.软件行业的发展现状 近年来,我国软件和信息技术服务业发展迅速,但...

Global site tag (gtag.js) - Google Analytics