毕业设计(论文)-基于Android系统的3G网络功能开发.doc_第1页
毕业设计(论文)-基于Android系统的3G网络功能开发.doc_第2页
毕业设计(论文)-基于Android系统的3G网络功能开发.doc_第3页
毕业设计(论文)-基于Android系统的3G网络功能开发.doc_第4页
毕业设计(论文)-基于Android系统的3G网络功能开发.doc_第5页
已阅读5页,还剩44页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

JIU JIANG UNIVERSITY毕 业 论 文 题 目 基于Android系统的3G网 络功能开发 英文题目 The 3G Network Development Based on Android System 院 系 信息科学与技术学院 专 业 计算机科学与技术 姓 名 班级学号 A081140 指导教师 二一二年五月信息科学与技术学院学士学位论文摘 要随着Android系统在消费电子行业的份额不断加重,为满足用户对手持移动产品网络功能的要求,3G无线网络功能的开发是非常有必要的。主要针对中兴MG3732模块的开发。实现在FS_S5PC100开发板上连接MG3732模块后,可以在其搭载的Android2.2系统中实现3G无线网络的打电话、发短信和上网。首先搭建一个Android系统开发的环境,主要是安装编译工具链,和搭建Java平台。其次是实现电话、短信框架,主要是对RIL层的开发和MG3732模块驱动的调试,这是整个开发过程中的重点和难点,需要长时间调试和优化。然后是实现PPPD拨号上网,最后编译内核和Android源码,获得img镜像文件,烧录开发板后,插上MG3732模块,验证功能。关键词:安卓系统,第三代通信,网络功能AbstractWith the Android system component in the consumer electronics industry has been increasing to meet the requirements of the users of the network functionality of handheld mobile products, the development of 3G wireless network function is very necessary.The development work is mainly for ZTE MG3732 module development. Overall to achieve the MG3732 module s5pc100 development board connected Android2.2 system equipped with 3G wireless networks, phone calls, texting and the Internet.First, the development is to build an Android system development environment, is to install the compiler tool chain,and build the Java platform. Followed by MG3732 module-driven the debugging and Androi2.2 system middle layer (the FRAMEWORK layer) is the development of RIL, which is the focus throughout the development process more difficult, after a long period of debugging and optimization. Then the preparation of the PPP dial-up script and AT command script, and finally compiled Adroid source live img files, and burn development board, the certification function.Keywords:Android System, 3rd Generation Communication, Network Functions目 录摘 要IAbstractII1 绪论1.1系统概述(1)1.2 研究的意义(1)1.3 发展现状(1)1.4 发展趋势(2)1.5 本章小结(2)2 需求分析2.1硬件需求分析(3)2.2软件需求分析(3)2.3用户需求分析(4)2.4可行性(5)2.5本章小结(6)3 硬件与软件环境概述3.1硬件概述(7)3.2软件环境概述(8)3.3本章小结(10)4 基于Android系统的电话、短信功能框架的实现4.1 Application层(12)4.2 Framework层(13)4.3 Native层(15)4.4 Kernel层(26)4.5本章小结(27)5 基于Android系统的3G模块(MG3732)开发5.1 RIL层的开发(28)5.2 PPPD拨号上网(32)5.3 本章小结(36)6 功能验证6.1功能测试(37)6.2本章小结(39)致 谢(41)参考文献(42)431 绪论1.1系统概述此次开发目的为实现基于Android系统的3G网络功能,即利用3G网络实现打接电话、收发短信和无线上网。硬件部分主要采用三星FS_S5PC100开发平台和中兴MG3272 3G模块,以及一张联通3G SIM卡。系统软件部分采用Android2.2系统,主要包括Linux内核、UBOOT、Android文件系统。应用软件部分主要包括Android2.2系统自带的拨号输入、SMS软件及Browser软件,主要作用用于验证。1.2 研究的意义3G是当今社会移动网络的主流,Android系统也在消费电子产品中占有极大的份额(特别是手机和平板电脑),所以研究3G在Android系统中的实现,具有较大的意义的。3G在Android系统上的实现,可以促使Android手机和Android平板电脑实现宽带上网,大大提升上网的速度,并且可以进行手机办公、手机商务等活动。其次手持移动产品(如手机和平板电脑)的视频通话和网络电视、音乐及其他一些只能在PC上实现的功能,都能因此而得到圆满的解决,这样就极大地方便了用户,也使基于Android系统的手持移动产品真正达到“手持电脑”的效果。1.3 发展现状3G已经成为嵌入式领域的一个新热点,国内的移动通信三大巨头在08年相继宣布要重资发展3G业务,3G网络的WAP站点更是随处可见。特别是近几年,越来越多的消费者选择了Android系统的手机、平板电脑和其他设备。基于Android系统的3G网络功能必定会受到极大欢迎。1.4 发展趋势近年来,随着计算机技术及相关技术的发展,嵌入式技术已成为后PC时代的主力,在通讯、网络、工控、医疗、电子、物联网、三网融合、3G等领域发挥着越来越重要的作用,嵌入式IT技术正在变得无处不在。如今,嵌入式IT系统开发无疑成为当今最热门、最有发展前途的领域之一。2010年开始,Android逐渐成为智能手机技术的主导,与iPhone同领潮流,改变人们的生活和工作。并且Android系统开放性会使其得到更大的发展。因此,基于Android系统的3G系统会得到更大的发展。1.5 本章小结本章首先对包括硬件和软件在内的系统做了一个简单介绍,然后说明了该项目的意义和目的。接下来介绍了当前基于Android系统的3G技术应用这块的发展现状和未来发展趋势,说明当今和未来几年,基于Android系统的3G技术会是一项非常热门的技术。2 需求分析需求分析是指开发人员要理解用户的要求,进行详细的市场调查,确定系统的新目标。为了满足用户的需要,回答系统要“做什么”的问题1。2.1硬件需求分析好的硬件平台会发给软件开发带来许多便利,因此选择一个合适的硬件平台是非常重要的2。根据软件开发需求和硬件平台稳定性、价格等一系列因素,选择了FS_S5PC100开发板。该开发板采用三星SP5C100处理器,处理器采用64/32位内部总线结构,运算速度最大833MHZ,被广泛的应用于智能手机、平板电脑等产品。根据性价比,3G模块选择了中兴MG3732模块。MG3732 模块是基于高通QSC6270平台开发的WCDMA 3G无线通讯模块,引脚方式为36脚邮票孔,适用于 WCDMA和GSM网络,支持850/900/1800/1900/2100 频段。2.2软件需求分析据调查,这几年,系统源码开放的Android系统已经占用了智能手机市场36%的份额,并且Android系统还将得到更大的发展3。选择了Android2.2系统,其优点如下:(1)开放性 Android平台首要优势就是其开放性4。开放的平台允许任何移动终端厂商加入到Android联盟中来。显著的开放性可以使其拥有更多的开发者,随着用户和应用的日益丰富,一个崭新的平台也将很快走向成熟5。(2)挣脱束缚在过去很长的一段时间,特别是在欧美地区,手机应用往往受到运营商制约,使用什么功能接入什么网络,几乎都受到运营商的控制。自从iPhone上市,用户可以更加方便地连接网络,运营商的制约减少。随着EDGE、HSDPA这些2G至3G移动网络的逐步过渡和提升,手机随意接入网络已不是运营商口中的笑谈6。(3)丰富的硬件由于Android的开放性,同时Android的热火,致使众多的硬件生产厂商在第一时间专门针对Android生产出各具特色的产品。(4)开发商Android平台提供给第三方开发商一个十分宽泛、自由的环境。因此不会受到各种条条框框的阻挠,可想而知,会有无数新颖别致的软件诞生。(5)Google应用从搜索巨人到全面的互联网渗透,Google服务如地图、邮件、搜索等已经成为连接用户和互联网的重要纽带,而Android平台手机将无缝结合这些优秀的Google服务7。Android系统是开源的。这会为开发带来极大的方便。在互联网上,可以找到很多研究Android系统、研究3G网络功能实现的心得体会。这样可以通过查找资料,缩短开发的时间,明确开发方向。2.3用户需求分析根据调查,全球3G市场正在保持快速稳定的发展,并呈现以下趋势:(1)3G+技术将成增长主流截至2011年底,全球移动普及率已超过76%,市场将逐渐趋于饱和,移动用户增长将趋缓。中国、印度等发展中国家将是未来几年3G用户增长的主要来源,对整个移动通信市场的发展影响重大。3G+技术将成为3G市场主流。预计到2015年,HSPA用户占比将由2010年的6.3%迅速上升到25.6%,成为3G用户增长的重要来源8。(2)中低端智能终端市场份额不断提升,开放阵营将占据主流未来,智能终端的能力将呈现PC化,计算、处理和存储能力等方面都逐渐向PC性能水平靠拢。在价格方面,智能终端将整体走低,受众范围不断扩大。依靠产业分工合作、标准化、通用服务获得成本优势的中低端智能终端在市场中的份额将不断上升9。(3)应用商店模式加快发展,浏览器成为其新载体未来,移动应用商店将继续处于快速发展阶段。随着智能终端种类和行业应用的增加,未来应用商店应用范围将持续扩大,成为覆盖手机、平板电脑、电子阅读器、笔记本电脑等移动终端设备的通用应用下载平台10。显而易见,基于Android系统的3G网络功能,会是一个非常热门的技术,并且拥有一个巨大的市场。越来越多的用户将会选择Android系统的移动终端设备,所以方便、快速、便宜,会是用户基本的选择条件。方便,即是携带方便,使用方便。3G模块的成品只有U盘大小,可以随身携带,使用时只需插入一张3G电话卡,连接上手机或是平板电脑就能直接使用。快速,即是上网速度快。MG3732模块的信号接收能力强,而且接收信号稳定。便宜,即是价格便宜。MG3732模块在同类型的3G模块中有明显的价格优势。综上所述,此项目今后必会受到用户的追捧,并且具有巨大的市场优势。2.4可行性2.4.1技术可行性基于Android的源代码的开放,使得在对Android做系统开发的时候可以很好的通过查看源代码来针对专门的问题进行解决11。三星SP5C100的开发板有丰富的资源,在出现问题的时候在互联网中的各大论坛中都能够找到相应的解决方案。所以通过学习,查找相关的资料,开发本系统在技术方面没有任何的问题。2.4.2经济可行性经济可行性就是对开发成本进行分析,估计开发成本是否会超过项目的预期利润7。在这个系统的开发过程中,需要的只是开发板的购买,而且开发板是可以多次使用的,对于Android系统是完全自由的,不需要付出任何的代价。当项目结束的时候,可以直接把系统拿过去使用,或者针对相关的硬件进行相应的二次开发,所获得的效益是客观的。基于以上两点的分析,本次系统开发是很有价值的。2.5本章小结通过对软件和硬件的需求分析,说明所选择的硬件平台是非常合适的。加之Android系统在未来几年也是一个非常热门的方向,3G市场更是稳定快速发展,所以此次开发的项目,不仅紧靠市场的需求,而且在未来的几年内都是一个热门的方向。3 硬件与软件环境概述3.1硬件概述3.1.1开发板平台采用了FS_S5PC100开发平台,该开发平台用三星公司先进的基于 Cortex-A8内核的S5PC100 处理器设计而成。可以适应Android 、Linux 、Wince 等智能操作系统的发展及市场需求12。S5PC100处理器采用了64/32 位的内部总线结构,运算速度最大833MHZ13。包括强大的硬件加速器,如:动态视频处理、显示控制和缩放。支持多种格式的硬件编解码:MPEF-1/2/4 、H263/H264 等。其视频解码能力很强大并且省电 ,编解码能力达到720p30fps (1280x720),支持电视输出 (NTSC/PAL/HDMI )。支持 2D/3D 加速。本处理器广泛应用于智能手机、平板电脑等产品。FS_S5PC100平台的外观,如图3-1所示。图3-1 FS_S5PC100的外观图3.1.2 3G模块3G模块采用的是中兴MG3732模块,适用于 WCDMA和GSM网络,支持850/900/1800/1900/2100 频段14。ZTE MG3732 3G模块外观,如图3-2所示。图3-2 MG3732外观图3.2软件环境概述3.2.1 交叉开发环境的搭建(1)安装交叉编译工具链 解压 “Linux-Androidtoolchain ”目录下的 “arm-none-eabi-4.2.2.tgz 到根 “/usr/local”目录下,在“/usr/local”目录下会生成“arm”目录。执行命令:#tar zxvf arm-none-eabi-4.2.2.tgz修改环境变量 “PATH ”。$ sudo vim /etc/environment 将路径添加到 PATH 变量的最后面,命令如下: PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games :/usr/local/arm/4.2.2-eabi/usr/bin 保存退出后执行:source /etc/environment 这样修改的环境变量会立即生效。(2)安装 JDK安装“Linux-Androidtoolchain”目录下的“jdk.bin”,jdk.bin是Jdk1.5,Jdk1.5 是编译Android2.1必须的工具。 把“jdk.bin”拷贝到“/usr”目录下,然后执行,按照提示安装即可。#sudo ./jdk.bin 安装结束后还要配置一下环境变量。 $ sudo vim /etc/environment将路径添加到PATH变量的最后面。PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/arm/4.2.2-eabi/usr/bi n:/usr/jdk1.5.0_21/bin 保存退出后执行:source /etc/environment3.2.2 搭建并配置Java环境(1)安装依赖包$sudo apt-get install build-essential $sudo apt-get install libncurses5-dev $sudo apt-get install x11proto-core-dev $sudo apt-get install zlib1g-dev $sudo apt-get install libx11-dev $sudo apt-get install gperf $sudo apt-get install bison $sudo apt-get install flex (2)搭建 Java 编译环境安装JDK下载jdk(JDK_1_5.BIN)并执行如下命令:$sudo mkdir /usr/java$suod mv JDK_1_5.BIN /usr/java$sudo chmod +x JDK_1_5.BIN $sudo ./JDK_1_5.BIN 在执行以上命令后生成license文件,按q然后根据提示输入yes即可开始安装。配置java环境$sudo gedit /.bashrc 在最后面加上:export JAVA_HOME=/usr/java/jdk1.5.0_21 /系统所用的jdk目录 export PATH=$JAVA_HOME/bin:$PATH export ANDROID_JAVA_HOME=$JAVA_HOME 3.3本章小结本章主要介绍了开发系统中所需要的硬件及其参数,以及如何搭建好开发平台。良好的开发平台为一个系统开发不仅节约了开发成本,同时也缩短了开发周期15。4 基于Android系统的电话、短信功能框架的实现基于Android系统的3G网络电话、短信框架分为如下四个部分:(1) Java application层;(2) Java framework层;(3) Native framework层;(4) Kernel 层。第一层和第二层都属于Android应用层的代码使用的是JAVA语言开发,在此定义为Javaril。第三层属于JNI层代码使用的是C/C+语言开发,从图4-1中可知,对于硬件的具体操作代码在第三层,一般情况下,Android框架代码中使用JNI的方式完成Java和C/C+代码的相互调用,再使用binder封装实现进程间通讯。电话框架没有使用这种方式,而是使用socket的方式,完成进程间通讯,rild进程作为服务器端,Java层代码作为客户端把用户的数据发送给rild进程去处理,3G的网络功能框架图如图4-1所示。图4-1 3G网络功能框架图4.1 Application层4.1.1 电话部分(1)通话部分拨打电话时,首先会调用onClick()方法,这个方法会通过myEditText.getText().toSTring()方法获取所拨打的电话号码,并会调用isPhoneNumberValid()方法判断这个电话号码是否符合格式,如果符合格式,则会触发Outgoingcallbroadcaster.java中的oncreate方法,如果号码是紧急号码则直接以startactivity方式处理。若不是紧急号码,则将该号码以sendorderedbroadcast(outgoingcallreceiver)方式处理,由OutgoingcallReceiver内部类去接收(doReceive)此号码,并在doreceive中启动InCallScreen类。IncallScreen类中,若第一次进入则调用oncreate函数;若通话中再拨打电话则调用onnewintent函数。oncreate函数中会调用internalResolveIntent方法-调用placecall函数(建立一个我们需要拨打电话的Call)-接着调用Phoneutil.java的placecall函数(传入phone对象和number参数),里面调用Connection cn = phone.dial(number)。phone类是个接口类,其中声明了dial这个方法,具体的结构如箭头所示:Phone(interface)-implements-PhoneBase(abstractclass)+requestToString(rr.mRequest);send(rr);在sendSMS()方法中,把上面传下来的短信相关的数据写入到了Parcel中,协同一个特殊的RILRequest写入到Socket的输出流中,进而将数据传递到RIL层。4.3 Native层RIL(Radio Interface Layer)层,主要是基于AT命令的操作,也就是把上层的传递下来的数据包(电话数据或是短信数据)分解,并转化为可以让3G模块识别的AT命令,最后把3G模块处理完数据返回的response解析,再传递回上层。4.3.1 Android RIL概念Android RIL是基于telephony服务和raido硬件层的抽象层,Android的Rild库介于硬件抽象层HAL接口与基于Modem之间,它同样提供了语音、数据、短信、SIM卡管理以及STK应用的功能,实现思路跟微软的RIL有异曲同工之妙,也是把标准的 GSM27.007中常用的如Dial这些做主动请求的操作称之为request,一共75个;另外一类信息是GSM模块主动上报的例如信号强度、基站信息等,称之为unsolicited response,一共17个。其开发模式是跟微软RIL开发差不多,需要针对不同的GSM模块进行不同的GSM驱动开发,公用的部分google已经做好了,特定的部分需要用户自己去定制,这样做可以大大地提高开发效率。以下是RIL交互图,如图4-2所示。图4-2 RIL交互图4.3.2 本地代码 RIL支持的本地代码包括RIL库和守护进程。hardware/ril/includehardware/ril/librilhardware/ril/rildhardware/ril/reference-ril编译结果是:/system/bin/rild :守护进程/system/lib/libril.so :RIL 的库/system/lib/libreference-ril.so :RIL 参考库Android的RIL驱动模块,在hardware/ril目录下,一共分rild,libril.so以及librefrence_ril.so三个部分,另外radiooptions可供自动或手动调试使用。它们都依赖于include目录中ril.h头文件。目前cupcake分支上带的是gsm的支持,另有一个cdma分支,3G通信模块MG3732用到的是gsm驱动。(1) rild与libril.so以及librefrence_ril.so的关系 rild仅以main函数作为整个RIL层的入口点,负责完成初始化。在rild.c文件中,将完成RIL的加载过程,它会执行如下操作:首先动态加载Vendor RIL的.so文件;其次执行RIL_startEventLoop()开启消息队列以进行事件监听;最后通过执行Vendor RIL的rilInit()方法来进行Vendor RIL与libril的关系建立。libril.so与 rild结合紧密,是其共享库。编译时就已经建立了这一关系(其实也可以编译成可执行程序,作为守护进程运行)。组成部分为ril.cpp和ril_event.cpp。libril.so驻留在 rild这一守护进程中,主要完成同上层通信的工作,接受RIL请求并传递给librefrence_ril.so,同时把来自librefrence_ril.so的反馈回传给调用进程。编译时,libril被链入rild,它为rild提供了event处理功能,还提供了在rild与Vendor RIL之间传递请求和响应消息的能力。Libril提供的主要功能分布在两个主要方法中:一个是RIL_startEventLoop()方法;另一个是RIL_register()方法。RIL_startEventLoop()方法所提供的功能就是启用eventLoop线程,执行RIL消息队列;RIL_register()方法的功能是启动名为rild的监听端口。librefrence_ril.sorild通过手动的dlopen方式加载,结合稍微松散,这主要是因为librefrence.so负责跟Modem硬件通信。这样做更方便替换或修改加载的方式,以适配更多种类的Modem。它将来自libril.so的请求转换为AT命令,同时监控Modem的反馈信息,并传递回libril.so。在初始化时,rild通过符号RIL_Init获取一组函数指针并以此与之建立联系。reference-ril会接收调用者传来的参数,参数内容为与radio的通信方式。如通过串口连接radio,那么参数形式为:-d /dev/ttySx,如图4-3所示。图4-3 Rild、Libril.so及Librefrence.so关系图radiootionsradiooptiongs通过获取启动参数,利用socket与rild通信,其作用是通过串口将一些与radio相关的参数直接传给rild。可用于调试时配置Modem参数的配置。(2)初始化流程rild 是一个守护进程,在这里定义宏RIL_SHLIB。执行的过程为:获取参数打开功能库建立事件循环执行RIL_InitRIL_register。主入口是rild.c中的main函数,主要完成三个任务:任务一:开启libril.so中的event机制。在RIL_startEventLoop中,最核心的是由多路I/O驱动的消息循环。任务二:初始化librefrence_ril.so。也就是跟硬件或模拟硬件modem通信的部分(后面统一称硬件),通过RIL_Init函数完成。任务三:通过RIL_Init获取一组函数指针RIL_RadioFunctions,并通过RIL_register完成注册,并打开接受上层命令的socket通道。初始化流程分析如下:任务一:也就是RIL_startEventLoop函数。RIL_startEventLoop在ril.cpp中实现,它的主要目的是通过pthread_create(&s_tid_dispatch, &attr, eventLoop, NULL)建立一个dispatch线程,入口点在eventLoop. 而eventLoop中,会调用ril_event.cpp中的ril_event_loop()函数,建立起消息(event)队列机制。这一消息队列的机制讨论如下:void ril_event_init(); / 初始化消息队列void ril_event_set(struct ril_event * ev, int fd, bool persist, ril_event_cb func, void * param);/ 设置消息队列相关的属性void ril_event_add(struct ril_event * ev); / 增加消息void ril_timer_add(struct ril_event * ev, struct timeval * tv); / 增加时间计时器void ril_event_del(struct ril_event * ev);/ 删除消息void ril_event_loop(); / 通过多路复用I/O机制循环调用消息队列struct ril_event struct ril_event *next;/ 下一个消息struct ril_event *prev;/ 前一个消息int fd; /事件相关设备句柄。例如对于串口数据事件,fd就是相关串口的设备句柄bool persist; /如果是保持的,则不从watch_list中删除struct timeval timeout; ril_event_cb func; /回调事件处理函数void *param; /回调时参数;每个ril_event结构,与一个fd句柄绑定(可以是文件、socket、管道等),并且带一个func指针去执行指定的操作。具体流程是:ril_event_init完成后,通过ril_event_set来配置一个新ril_event,并通过ril_event_add加入到队列之中(实际通常用rilEventAddWakeup来添加)。add会把队列里所有ril_event的fd,放入一个fd集合readFds中。这样 ril_event_loop能通过一个多路复用I/O的机制(select)来等待这些fd。如果任何一个fd有数据写入,则进入分析流程processTimeouts(),processReadReadies(&rfds, n)和firePending()(后面会详细分析这些流程)。另外可以看到,在进入ril_event_loop之前,已经通过pipe机制挂入了s_wakeupfd_event。目的是为了可以在一些情况下能够内部唤醒ril_event_loop的多路复用阻塞,比如一些带timeout的命令到期的时候。至此第一个任务分析完毕,这样便建立起了基于event队列的消息循环,稍后便可以接受上层发来的的请求了(上层请求的event对象建立,在第三个任务中)。任务二:这个任务的入口是RIL_Init, RIL_Initreference-ril.c首先通过参数获取(p/d/s)硬件接口的设备文件或模拟硬件接口的socket. 接下来便新创建一个线程pthread_create(&s_tid_mainloop, &attr, mainLoop, NULL)继续初始化,即mainLoop。mainLoop的主要任务是建立起与硬件的通信,然后通过read方法阻塞等待硬件的主动上报或响应。在注册一些基础回调(timeout、readerclose)后,mainLoop首先打开硬件设备文件,建立起与硬件的通信,s_device_path和s_port是前面获取的设备路径参数,将其打开(两者可以同时打开并拥有各自的reader,这里也很容易添加双卡双待等支持)。接下来通过at_open(fd, onUnsolicited)函数建立起这一设备文件上的reader等待循环,这也是通过新建一个线程完成,ret= pthread_create(&s_tid_reader, &attr, readerLoop, &attr),入口点为readerLoop。AT命令都是以/r/n或/n/r的换行符来作为分隔符的,所以readerLoop是line驱动的,除非出错、超时等,否则会读到一行完整的响应或主动上报,才会返回。这个循环启动以后,基本的AT响应机制就已经建立了起来。对它的具体分析,包括at_open中挂接的ATUnsolHandler, 放到后面的response分析里去。SMS(短信)的收发if(isSMSUnsolicited(line)判断也在readerLoop中。有了响应的机制(当然,能与硬件通信也已经可以发请求了),通过RIL_requestTimedCallback(initializeCallback, NULL, &TIMEVAL_0),跑到initializeCallback中,执行一些以AT命令为主的Modem初始化命令。关于AT命令发送的流程,详见request分析。这里可以看到,主要完成一些参数配置,以及网络状态的检查等。硬件已经可以访问了。任务三:由RIL_Init的返回值funcs = rilInit(&s_rilEnv, argc, rilArgv)开始,这是一个RIL_RadioFunctions结构的指针。typedef struct int version; /* set to RIL_VERSION */RIL_RequestFunc onRequest;RIL_RadioStateRequest onStateRequest;RIL_Supports supports;RIL_Cancel onCancel;RIL_GetVersion getVersion; RIL_RadioFunctions;其中最重要的是onRequest域,来自上层的请求都由这个函数进行映射后转换成对应的AT命令并发给硬件。Rild通过RIL_register注册这一指针。RIL_register中要完成的另外一个任务,就是打开跟上层通信的socket接口(s_fdListen是主接口,s_fdDebug供调试时使用)。然后将这两个socket接口使用任务一中实现的机制进行注册(仅列出s_fdListen)。ril_event_set (&s_listen_event, s_fdListen, false,listenCallback, NULL);rilEventAddWakeup (&s_listen_event);这样将两个socket加到任务一中建立起来多路复用I/O的检查句柄集合中,一旦有上层来的(调试)请求,event机制便能响应处理了。(3)Request流程对Dial而言,CommandInfo包含了所有的AT命令。所以CommandInfo结构应该这样进行初始化:RIL_REQUEST_DIAL, dispatchDial, responseVoid这里执行dispatchFunction, 也就是dispatchDial这一函数。其实有很多种类的dispatch function, 比如dispatchVoid, dispatchStrings, dispatchSIM_IO等等, 这些函数的区别在于解析传入的参数形式,void就是不带参数的,Strings是以string做参数,又如Dial等,有自己的参数解析方式,以此类推。Request号和参数具备后,就可以进行具体的request函数调用了。利用s_callbacks.onRequest(pRI-pCI-requestNumber, xxx, len, pRI)完成这一操作。s_callbacks的作用是获取前文中提到的来自libreference-ril的RIL_RadioFunctions结构指针。request请求在这里转入底层的 libreference-ril处理,handler是reference-ril.c中的onRequest.onRequest进行一个简单的switch分发。RIL_REQUEST_DIAL流程是:onRequest-requestDial-at_send_command-at_send_command_full-at_send_command_full_nolock-writeline。requestDial中将命令和参数转换成对应的AT命令,调用公共send command接口at_send_command。除了这个接口之外,还有如下命令:at_send_command_singleline、at_send_command_sms、at_send_command_multiline等,这是根据at返回值,以及发命令流程的类型来区别的。比如at_csq类型,需要at_send_command_singleline,而发送短信,因为有prompt提示符“”,传送数据、结束符等一系列操作,需要专门用at_send_command_sms来实现。然后执行at_send_command_full,前面几个接口都会最终到这里,再通过一个互斥的at_send_command_full_nolock调用,完成最终的写出操作,在writeline中,写出到初始化时打开的设备中。前面提到RILSender将请求呼叫的字节流传给了rild的socket。这时,ril_event_loop方法的select检测到了有请求的信号,导致被挂入pending_list,并执行ev-func(ev-fd, 0, ev-param),即调用static void listenCallback (int

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论