77范文网 - 专业文章范例文档资料分享平台

Android APN开发流程分析

来源:网络收集 时间:2019-04-23 下载这篇文档 手机版
说明:文章内容仅供预览,部分内容可能不全,需要完整文档或者需要复制内容,请下载word后使用。下载word有问题请添加微信号:或QQ: 处理(尽可能给您提供完整文档),感谢您的支持与谅解。点击这里给我发消息

Android APN开发流程分析

2 Data Connect流程分析

Android的数据连接是基于PPP方式的,主要步骤为:首先通过AT命令激活PDP连接,然后pppd通过数据端口完成拨号连接;

数据连接的核心控制类是DataConnectionTracker,存在于GSMPhone里,数据连接不需要用干预,在APN设置好之后,在适当的情况下就会自动激活,激活的入口点是:DataConnectionTracker.trySetupData→setupData→

PdpConnection.connetc→CommandsInterface.setupDefaultPDP,通过PdpConnection访问GSMPhone

RIL层的setupDefaultPDP实现,setupDefaultPDP的结果由EVENT_SETUP_PDP_DONE返回,如果成则开始调用pppd完成实际连接,这是通过DataLink.connect实现的;

DataLink只是抽象基类,此处它的实现类是PppLink,实现DataLinkInterface接口,所以

DataLink.connect实际上调用PppLink.connect,它通过SystemService.start(SERVICE_PPPD_

开始pppd服务,并通过checkPPP函数访问Linux的sys文件系统来查询pppd的连接状态,如果便可以将LINKUP的消息通知出去以完成连接流程。

2 Data Connect流程分析

Android的数据连接是基于PPP方式的,主要步骤为:首先通过AT命令激活PDP连接,然后利用pppd通过数据端口完成拨号连接;

数据连接的核心控制类是DataConnectionTracker,存在于GSMPhone里,数据连接不需要用户的干预,在APN设置好之后,在适当的情况下就会自动激活,激活的入口点是:DataConnectionTracker.trySetupData→setupData→ PdpConnection.connetc→CommandsInterface.setupDefaultPDP,通过PdpConnection访问GSMPhone中的RIL层的setupDefaultPDP实现,setupDefaultPDP的结果由EVENT_SETUP_PDP_DONE返回,如果成功,则开始调用pppd完成实际连接,这是通过DataLink.connect实现的;

DataLink只是抽象基类,此处它的实现类是PppLink,实现

DataLinkInterface接口,所以DataLink.connect实际上调用PppLink.connect,它通过SystemService.start(SERVICE_PPPD_GPRS)开始pppd服务,并通过checkPPP函数访问Linux的sys文件系统来查询pppd的连接状态,如果成功,便可以将LINKUP的消息通知出去以完成连接流程。

3.3 RILD源码分析

RIL对对消息的处理是将消息通过LocalSocket发送到以rild为名称的有名端口。这个有

Socket

ril.cpp

s_fdListen

=

android_get_control_socket(SOCKET_NAME_RIL)

RILD是守护进程,执行的过程为:获取参数→打开功能库→建立事件循环→执行RIL_Init→RIL_register;事件循环式核心,通过Select多路复用机制,读取来自上层的Socket

接口的具体操作命令,同时一些命令Timeout唤醒机制,也通过Select实现;

1. Request流程

命令下发流程:首先从JAVA层通过Socket将命令发送到RIL层的RILD守护进程,RILD中负责监听的ril_event_loop消息循环中的Select发现RILD Socket有了请求连接信号,建立一个record_stream,打通与上层的数据通道并开始接收请求数据,数据通道的回调函数processCommandsCallback()会保证收到一个完整的Request后,将其送达processCommandBuffer()函数;

解析过程:processCommandBuffer()从Socket中序列化的数据流里还原信息,将其组织到RequestInfo中;RequestInfo数据结构如下(存在于ril.cpp中):

typedef struct RequestInfo {

int32_t token; //this is not RIL_Token CommandInfo *pCI; struct RequestInfo *p_next; char cancelled;

char local; // responses to local commands do not go back to command process } RequestInfo;

RIL层以Request号为基础采用表驱动方式分发请求,CommandInfo结构表示命令的信息,关联了Request号和实际的请求函数,以及响应函数之间的关系;

分发流程:s_callback.onRequest()完成分发操作,s_callback获取自libreference-ril的RIL_RadioFunction结构指针,Request请求在这里转入底层的libreference-ril处理,handler是reference-ril.cpp中的Request。

onRequest根据Request号进行简单的switch分发,然后将命令和参数转换成对应的AT命令,由writeline()完成驱动层的发送,writeline通过驱动程序节点的文件描述符进行写操作实现控制。 2. Response流程

Response有两类:unsolicited表示主动上报的消息,如来电,来短信等,而solicited是AT命令的响应,判断是否是solicited的依据有两点:一是当前用AT命令正在等待响应;二是读取的响应符合该AT命令的响应格式。

对于Response流程来讲,流程是从Modem设备发回响应数据开始的。

RIL通过readerLoop函数,利用readline逐行读取响应数据,随后通过processLine进

行分析,主动上报的一般以+XXXX的形式出现,而AT命令的响应格式则有一行或多行之分,但最终一定以OK或者ERROR结尾,于是PrcessLine有以下几种情况: 1)、没有AT命令等待响应或不符合AT响应格式,一般是主动上报行,由handleUnsolicited处理,handleUnsolicited→onUnsolicetd→RIL_onUnsolicitedResponse; 2)、isFinalResponseSucess/isFinalResponseError是最终响应行,转到handleFinalResponse处理,handleFInalResponse会发送线程同步信号,激活等到的发送线程;

3)、符合当前AT命令响应格式的行,解析并获取数据,这是响应处理的中间过程,然后继续收到最终响应行,然后进入2)流程

最后的发送动作由sendResponse→sendResponseRaw→blockingWrite通过Socket回传给上层来完成,响应解析由上层完成。

Android MMS 源码流程(一) 2010-06-25 08:21

概述

MMS的收发操作借助于手机的短信机制,实际收发过程需要网络的APN支持,使用特定的APN接入点实现MMS数据的真实发送和接收;

源码流程

1) Telephpony.java getOrCreateThreadId()函数: 目录:\\frameworks\\base\\core\\java\\android\\provider\\

说明:这个函数根据接收者列表和未保存的消息返回一个线程ID,如果这个消息开始一个新的线程,那么函数分配一个线程ID,否则返回一个适当的已经存在的线程ID;

2) MmsMessageSender.java sendMessage()函数:

目录:\\packages\\apps\\mms\\src\\com\\android\\mms\\transaction\\ 说明:对Mms进行封包 3) 再一次调用第一步函数

4) ConnectivityService.java startUsingNetworkFeature()函数: 目录:\\framework\\base\\services\\java\\com\\android\\server\\

说明:该函数为实现Mms 网络连接的关键函数,下面我们详细分析: A、enforceChangePermission():判断调用的进程是否具有操作权限,如果不具有,抛出一个SecurityException异常,并强制准许权限 B、 ConnectivityManager.isNetworkTypeValid(networkType)来判断

networkType是否合法,如果不合法返回一个APN_REQUEST_FAILED,

在这里用到了最重要的ConnectivityManager类: public class ConnectivityManager定义在

\\frameworks\\base\\core\\java\\android\\net的ConnectivityManager.java里,其主要作用为:

1、监视网络连接,如WIFI、GPRS、UMTS等 2、当网路连接出现变化的时候,发送广播intents 3、当一个网络连接丢失之后,尝试连接另一个网络 4、为App提供粗粒度、细粒度的有效网络状态查询

C、 FeatureUser f = new FeatureUser(networkType, feature, binder);

新建一个FeatureUser类变量,该类实现:当调用进程died时发送一个Notice,这样就可以自我老化

D、int usedNetworkType = networkType;

if(networkType == ConnectivityManager.TYPE_MOBILE) {

if (TextUtils.equals(feature, Phone.FEATURE_ENABLE_MMS)) { usedNetworkType =

ConnectivityManager.TYPE_MOBILE_MMS; } else if (TextUtils.equals(feature, Phone.FEATURE_ENABLE_SUPL)) { usedNetworkType =

ConnectivityManager.TYPE_MOBILE_SUPL; } else if (TextUtils.equals(feature, Phone.FEATURE_ENABLE_DUN)) { usedNetworkType =

ConnectivityManager.TYPE_MOBILE_DUN; } else if (TextUtils.equals(feature, Phone.FEATURE_ENABLE_HIPRI)) { usedNetworkType =

ConnectivityManager.TYPE_MOBILE_HIPRI; } }

这段代码获取使用的网络类型;

E、NetworkStateTracker network = mNetTrackers[usedNetworkType];

NetworkStateTracker类在NetworkStateTracker.java里:每个子类保持跟踪一个网络接口的连接状态,一个网络的状态信息由一个Tracker类保持,基类管理network-type-independent 网络状态 F、mFeatureUsers.add(f);

列表操作,将f添加到列表的end

G、if (!mNetRequestersPids[usedNetworkType].contains(currentPid)) { // this gets used for per-pid dns when connected

mNetRequestersPids[usedNetworkType].add(currentPid); }

判断网络操作需要的Pid是否包含当前Pid,如果不包含就添加进去 H、mHandler.sendMessageDelayed(mHandler.obtainMessage(

百度搜索“77cn”或“免费范文网”即可找到本站免费阅读全部范文。收藏本站方便下次阅读,免费范文网,提供经典小说综合文库Android APN开发流程分析在线全文阅读。

Android APN开发流程分析.doc 将本文的Word文档下载到电脑,方便复制、编辑、收藏和打印 下载失败或者文档不完整,请联系客服人员解决!
本文链接:https://www.77cn.com.cn/wenku/zonghe/622189.html(转载请注明文章来源)
Copyright © 2008-2022 免费范文网 版权所有
声明 :本网站尊重并保护知识产权,根据《信息网络传播权保护条例》,如果我们转载的作品侵犯了您的权利,请在一个月内通知我们,我们会及时删除。
客服QQ: 邮箱:tiandhx2@hotmail.com
苏ICP备16052595号-18
× 注册会员免费下载(下载后可以自由复制和排版)
注册会员下载
全站内容免费自由复制
注册会员下载
全站内容免费自由复制
注:下载文档有可能“只有目录或者内容不全”等情况,请下载之前注意辨别,如果您已付费且无法下载或内容有问题,请联系我们协助你处理。
微信: QQ: