Android网络相关

来源:互联网 发布:电脑端口怎么关闭 编辑:程序博客网 时间:2024/05/16 07:41
网络应用,对于用户来说,主要是搜索,浏览网页,发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地址。然后网络连接 就成功了。之后就就是发送上层应用程序数据。 网络安全 2009FLY文摘,正正博客 WWW.2009FLY.COM在我们的应用程序中,触发了上网需求,系统会去检测网络是否连接,当然对于有多种接口,会轮询,看哪一个连接可用(这里应该是否有优先级,先有线,然后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) { 数据技术 Oracle、DBMaker、DB2 2009FLY文摘,正正博客 WWW.2009FLY.COM 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)); 2009FLY文摘,正正博客 WWW.2009FLY.COM 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() { 移动开发,Android、iPhone 2009FLY文摘,正正博客 WWW.2009FLY.COM 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) 移动开发,Android、iPhone 2009FLY文摘,正正博客 WWW.2009FLY.COM 在应用程序触发网络发送数据,如触发了onApnChanged,onRoamingOff, onRoamingOn等函数,或者处理消息时,会调用trySetupData函数 对于trySetupData函数,刚会调用setupData(reason);进行数据连接。 private boolean setupData(String reason) { ApnSetting apn; PdpConnection pdp; apn = getNextApn(); if (apn == null) return false; 数据技术 Oracle、DBMaker、DB2 2009FLY文摘,正正博客 WWW.2009FLY.COM pdp = findFreePdp(); if (pdp == null) { if (DBG) log("setupData: No free PdpConnection found!"); return false; } mActiveApn = apn; mActivePdp = pdp; Message msg = obtainMessage(); 网络安全 2009FLY文摘,正正博客 WWW.2009FLY.COM 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层发送拨号请求了。 2009FLY文摘,正正博客 WWW.2009FLY.COM 接下来,看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 数据技术 Oracle、DBMaker、DB2 2009FLY文摘,正正博客 WWW.2009FLY.COM 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); 2009FLY文摘,正正博客 WWW.2009FLY.COM 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); 游戏编程 2009FLY文摘,正正博客 WWW.2009FLY.COM 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目录下。 2009FLY文摘,正正博客 WWW.2009FLY.COM 在Android1.6版本之前,系统封装了调用pppd的代码,在frameworks/base/telephony/java/com/android/internal/telephony/PppLink.java中。 但之后就没有了,网上的介绍说是用了高通的方案,把pppd与系统的进程的通信通过了内存共享的方式来实现,因此在代码中就去掉了调用pppd的java代码。 如何共享?这是个问题。不过应该是系统的事了。 那么自己要手动进行pppd拨号了。 什么时候拨号?这个是关键。gprs毕竟是有流量。大家都比较喜欢按需拨号,相当于智能拨号了。ppp已经提供了这个功能,加相应的参数即可。 WEB技术 Ajax、RIA 2009FLY文摘,正正博客 WWW.2009FLY.COM 不过在新的android版本中,已经ppp代码进行了简化,没有chat.c文件,那自然没得有chat命令,也就无法用pppd call xxx这个命令。如果想用chat那么就要自己移植ppp程序
原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 陌生网友生日叫我发红包怎么办 微信群的群主不小心推出群该怎么办 支付宝验证码被别人知道了怎么办 微信解除银行卡绑定零钱清零怎么办 qq号被盗了理财通的钱怎么办 工行转错账号的钱被冻结怎么办 微信20w限额满了怎么办 通过qq号申请微信被盗了怎么办 微信号被盗手机绑定被改怎么办 腾讯视频激活码兑换达到限制怎么办 虚拟服务购买自动每月扣q币怎么办 微信被骗充值Q币怎么办 微信给别人充q币怎么办 k歌别人送的k币怎么办 忘记了qq号码但记得密码怎么办 q自己的活干完了该怎么办 在应用宝下载的游戏搜不到了怎么办 衣服有图片在淘宝找不到同款怎么办 淘宝卖家小儿说质量不合格怎么办 订单显示显示已签收没收到货怎么办 网上买过的东西查不到订单号怎么办 亚航的组合机票飞机延误怎么办 在微信上面对面红包被骗了钱怎么办 人欠我钱不给我怎么办 微信号被骗走然后骗了朋友钱怎么办 微信手机充值不到帐怎么办 中银香港密码器坏了怎么办 香港恒生银行的编码器丢了怎么办 淘宝拍下订单发货物流不显示怎么办 wish查到仿品审核变慢怎么办 淘宝卖家订单号错误无法修改怎么办 顺丰快递运单号微信扫描取消怎么办 买的王者荣耀号有守护平台怎么办 融e联登录密码错三次怎么办 金融e家u盾密码忘了怎么办 用工行网银转账后想取消交易怎么办 工行融e借没有密码器怎么办 工行融e借密码器丢了怎么办 工行融e联手机登录密码忘记怎么办 领导给员工抱怨工作太烦怎么办 员工抱怨忙的忙死闲的闲死怎么办