觉得写的不错,就转过来收藏了。
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程序。
分享到:
相关推荐
在Android开发过程中,网络相关的议题是开发者经常遇到的挑战之一。这篇博客文章“Android开发过程网络相关问题”可能深入探讨了Android应用如何与服务器进行通信,处理数据交换以及解决可能出现的异常情况。以下是...
4. **ril上网流程** - **建立数据连接**:当需要上网时,DataConnectionService会向RIL发送建立数据连接的请求。 - **PDP激活**:RIL将该请求转化为AT+CGACT命令,激活PDP上下文。 - **IP分配**:激活成功后,RIL...
开发者需要理解并实现HTTP或HTTPS协议,以及可能涉及到的OAuth或WLAN认证流程,这些是Android网络编程的基础。 源码分析方面,我们可以看到以下几个关键部分: 1. **用户界面(UI)**:应用的界面设计是用户体验的...
### 解决Android模拟器上网问题 #### 概述 在进行Android应用开发的过程中,开发者经常需要使用Android模拟器来进行应用程序的测试与调试。然而,在某些情况下,模拟器可能会遇到无法联网的问题,这不仅影响了应用...
这篇文档将深入解析《Android高级应用源码-北京工商大学上网登陆Android版源码》这一项目,旨在提供关于Android开发的...同时,对于Android网络登录认证的实现方式,以及如何优化用户体验等方面,也有很大的学习价值。
### Android使用Adhoc模式共享电脑网络上网 #### 环境需求 为了实现Android设备通过Adhoc模式共享电脑网络上网,需要满足以下条件: - **笔记本电脑**:具备可用的宽带连接(例如局域网宽带或拨号ADSL宽带),...
### Android 数据业务流程分析 #### 一、开启与关闭手机数据开关后的系统处理过程 在Android系统中,数据服务的管理是一项重要的功能,涉及到多个层级的交互与协调。本节将详细描述用户开启或关闭手机数据开关后...
- **网络书签(B04)**:方便用户快速访问常去的网站,提升上网效率。 - **社交网络(B05)**:可能集成多种社交平台,让用户能快速浏览和更新社交信息。 - **微博(B06)**:针对微博用户,提供一键发布和查看...
本篇文章将深入探讨一个具体的实例——“北京工商大学上网登陆Android版源码”,帮助读者了解Android应用开发的基本流程和关键技巧。 首先,我们要明确Android应用的基础架构,它主要由四大组件构成:Activity...
综上所述,本文档是一份全面的华为上网卡模块Linux和Android系统集成指南,为开发者提供了包括驱动安装、拨号上网流程、通用闪灯规格、语音命令交互和安卓系统集成在内的全方位指导。这份文档对于任何从事相关集成...
虽然没有提供具体的标签,但根据标题和描述,我们可以推测一些相关的标签,如“安卓编程”、“Java”(因为Android通常使用Java语言)、"网络认证"、"大学应用"、"源码示例"等。 【文件名称】 "北京工商大学上网...
总结起来,Android 2.3的拨号上网流程从源码角度涵盖了用户界面的设置、系统服务的交互、网络接口的配置、RIL的通信以及网络状态的监控等多个环节。理解这些流程对于系统级的调试、优化或者开发网络相关应用都至关...
"北京工商大学上网登陆Android版源码.zip" 这个标题表明了这是一个包含Android应用程序源代码的压缩文件,具体是用于北京工商大学的网络登录。这意味着源码可能实现了一个特定的校园网认证客户端,适用于Android平台...
在Android系统中,除了常见的通过Wi-Fi热点分享网络之外,还有一个鲜为人知的功能,那就是通过蓝牙(Bluetooth)来实现设备间的网络共享。这种共享方式在某些特定情况下非常实用,例如当一台设备没有Wi-Fi功能,但...
作为一款开源的安卓应用,它允许开发者深入研究其源码,学习并理解网络浏览相关的技术实现,以及如何在Android平台上构建高效的应用。 首先,从【标签】"安卓源码-网络浏览"我们可以推断,这个项目主要涉及Android...
### Android 3G 数据上网卡原理说明 #### 1. 背景介绍 ##### 1.1 3G 数据卡简介 当前国内主流的3G数据卡主要包括中国联通的WCDMA/HSDPA/HSUPA/HSPA技术、中国电信的CDMA2000/EVDO Rev.O/A/B技术以及中国移动的TD-...
通过分析这个源码,开发者可以学习到Android应用开发的基本流程,包括UI设计、网络编程、数据处理、权限管理等,同时也能了解如何实现特定场景下的功能,如校园网登录。对于初学者来说,这是一个很好的实践案例,...