基于android系统的3g网络功能开发 毕业设计_第1页
基于android系统的3g网络功能开发 毕业设计_第2页
基于android系统的3g网络功能开发 毕业设计_第3页
基于android系统的3g网络功能开发 毕业设计_第4页
基于android系统的3g网络功能开发 毕业设计_第5页
已阅读5页,还剩43页未读 继续免费阅读

下载本文档

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

文档简介

JIUJIANGUNIVERSITY毕业论文题目基于ANDROID系统的3G网络功能开发英文题目THE3GNETWORKDEVELOPMENTBASEDONANDROIDSYSTEM院系信息科学与技术学院专业计算机科学与技术姓名黄盛华班级学号A081140指导教师于林峰二一二年五月摘要随着ANDROID系统在消费电子行业的份额不断加重,为满足用户对手持移动产品网络功能的要求,3G无线网络功能的开发是非常有必要的。主要针对中兴MG3732模块的开发。实现在FS_S5PC100开发板上连接MG3732模块后,可以在其搭载的ANDROID22系统中实现3G无线网络的打电话、发短信和上网。首先搭建一个ANDROID系统开发的环境,主要是安装编译工具链,和搭建JAVA平台。其次是实现电话、短信框架,主要是对RIL层的开发和MG3732模块驱动的调试,这是整个开发过程中的重点和难点,需要长时间调试和优化。然后是实现PPPD拨号上网,最后编译内核和ANDROID源码,获得IMG镜像文件,烧录开发板后,插上MG3732模块,验证功能。关键词安卓系统,第三代通信,网络功能ABSTRACTWITHTHEANDROIDSYSTEMCOMPONENTINTHECONSUMERELECTRONICSINDUSTRYHASBEENINCREASINGTOMEETTHEREQUIREMENTSOFTHEUSERSOFTHENETWORKFUNCTIONALITYOFHANDHELDMOBILEPRODUCTS,THEDEVELOPMENTOF3GWIRELESSNETWORKFUNCTIONISVERYNECESSARYTHEDEVELOPMENTWORKISMAINLYFORZTEMG3732MODULEDEVELOPMENTOVERALLTOACHIEVETHEMG3732MODULES5PC100DEVELOPMENTBOARDCONNECTEDANDROID22SYSTEMEQUIPPEDWITH3GWIRELESSNETWORKS,PHONECALLS,TEXTINGANDTHEINTERNETFIRST,THEDEVELOPMENTISTOBUILDANANDROIDSYSTEMDEVELOPMENTENVIRONMENT,ISTOINSTALLTHECOMPILERTOOLCHAIN,ANDBUILDTHEJAVAPLATFORMFOLLOWEDBYMG3732MODULEDRIVENTHEDEBUGGINGANDANDROI22SYSTEMMIDDLELAYERTHEFRAMEWORKLAYERISTHEDEVELOPMENTOFRIL,WHICHISTHEFOCUSTHROUGHOUTTHEDEVELOPMENTPROCESSMOREDIFFICULT,AFTERALONGPERIODOFDEBUGGINGANDOPTIMIZATIONTHENTHEPREPARATIONOFTHEPPPDIALUPSCRIPTANDATCOMMANDSCRIPT,ANDFINALLYCOMPILEDADROIDSOURCELIVEIMGFILES,ANDBURNDEVELOPMENTBOARD,THECERTIFICATIONFUNCTIONKEYWORDSANDROIDSYSTEM,3RDGENERATIONCOMMUNICATION,NETWORKFUNCTIONS目录摘要IABSTRACTII1绪论11系统概述112研究的意义113发展现状114发展趋势215本章小结22需求分析21硬件需求分析322软件需求分析323用户需求分析424可行性525本章小结63硬件与软件环境概述31硬件概述732软件环境概述833本章小结104基于ANDROID系统的电话、短信功能框架的实现41APPLICATION层1242FRAMEWORK层1343NATIVE层1544KERNEL层2645本章小结275基于ANDROID系统的3G模块(MG3732)开发51RIL层的开发2852PPPD拨号上网3253本章小结366功能验证61功能测试3762本章小结39致谢41参考文献421绪论11系统概述此次开发目的为实现基于ANDROID系统的3G网络功能,即利用3G网络实现打接电话、收发短信和无线上网。硬件部分主要采用三星FS_S5PC100开发平台和中兴MG32723G模块,以及一张联通3GSIM卡。系统软件部分采用ANDROID22系统,主要包括LINUX内核、UBOOT、ANDROID文件系统。应用软件部分主要包括ANDROID22系统自带的拨号输入、SMS软件及BROWSER软件,主要作用用于验证。12研究的意义3G是当今社会移动网络的主流,ANDROID系统也在消费电子产品中占有极大的份额(特别是手机和平板电脑),所以研究3G在ANDROID系统中的实现,具有较大的意义的。3G在ANDROID系统上的实现,可以促使ANDROID手机和ANDROID平板电脑实现宽带上网,大大提升上网的速度,并且可以进行手机办公、手机商务等活动。其次手持移动产品(如手机和平板电脑)的视频通话和网络电视、音乐及其他一些只能在PC上实现的功能,都能因此而得到圆满的解决,这样就极大地方便了用户,也使基于ANDROID系统的手持移动产品真正达到“手持电脑”的效果。13发展现状3G已经成为嵌入式领域的一个新热点,国内的移动通信三大巨头在08年相继宣布要重资发展3G业务,3G网络的WAP站点更是随处可见。特别是近几年,越来越多的消费者选择了ANDROID系统的手机、平板电脑和其他设备。基于ANDROID系统的3G网络功能必定会受到极大欢迎。14发展趋势近年来,随着计算机技术及相关技术的发展,嵌入式技术已成为后PC时代的主力,在通讯、网络、工控、医疗、电子、物联网、三网融合、3G等领域发挥着越来越重要的作用,嵌入式IT技术正在变得无处不在。如今,嵌入式IT系统开发无疑成为当今最热门、最有发展前途的领域之一。2010年开始,ANDROID逐渐成为智能手机技术的主导,与IPHONE同领潮流,改变人们的生活和工作。并且ANDROID系统开放性会使其得到更大的发展。因此,基于ANDROID系统的3G系统会得到更大的发展。15本章小结本章首先对包括硬件和软件在内的系统做了一个简单介绍,然后说明了该项目的意义和目的。接下来介绍了当前基于ANDROID系统的3G技术应用这块的发展现状和未来发展趋势,说明当今和未来几年,基于ANDROID系统的3G技术会是一项非常热门的技术。2需求分析需求分析是指开发人员要理解用户的要求,进行详细的市场调查,确定系统的新目标。为了满足用户的需要,回答系统要“做什么”的问题1。21硬件需求分析好的硬件平台会发给软件开发带来许多便利,因此选择一个合适的硬件平台是非常重要的2。根据软件开发需求和硬件平台稳定性、价格等一系列因素,选择了FS_S5PC100开发板。该开发板采用三星SP5C100处理器,处理器采用64/32位内部总线结构,运算速度最大833MHZ,被广泛的应用于智能手机、平板电脑等产品。根据性价比,3G模块选择了中兴MG3732模块。MG3732模块是基于高通QSC6270平台开发的WCDMA3G无线通讯模块,引脚方式为36脚邮票孔,适用于WCDMA和GSM网络,支持850/900/1800/1900/2100频段。22软件需求分析据调查,这几年,系统源码开放的ANDROID系统已经占用了智能手机市场36的份额,并且ANDROID系统还将得到更大的发展3。选择了ANDROID22系统,其优点如下(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网络功能实现的心得体会。这样可以通过查找资料,缩短开发的时间,明确开发方向。23用户需求分析根据调查,全球3G市场正在保持快速稳定的发展,并呈现以下趋势(1)3G技术将成增长主流截至2011年底,全球移动普及率已超过76,市场将逐渐趋于饱和,移动用户增长将趋缓。中国、印度等发展中国家将是未来几年3G用户增长的主要来源,对整个移动通信市场的发展影响重大。3G技术将成为3G市场主流。预计到2015年,HSPA用户占比将由2010年的63迅速上升到256,成为3G用户增长的重要来源8。(2)中低端智能终端市场份额不断提升,开放阵营将占据主流未来,智能终端的能力将呈现PC化,计算、处理和存储能力等方面都逐渐向PC性能水平靠拢。在价格方面,智能终端将整体走低,受众范围不断扩大。依靠产业分工合作、标准化、通用服务获得成本优势的中低端智能终端在市场中的份额将不断上升9。(3)应用商店模式加快发展,浏览器成为其新载体未来,移动应用商店将继续处于快速发展阶段。随着智能终端种类和行业应用的增加,未来应用商店应用范围将持续扩大,成为覆盖手机、平板电脑、电子阅读器、笔记本电脑等移动终端设备的通用应用下载平台10。显而易见,基于ANDROID系统的3G网络功能,会是一个非常热门的技术,并且拥有一个巨大的市场。越来越多的用户将会选择ANDROID系统的移动终端设备,所以方便、快速、便宜,会是用户基本的选择条件。方便,即是携带方便,使用方便。3G模块的成品只有U盘大小,可以随身携带,使用时只需插入一张3G电话卡,连接上手机或是平板电脑就能直接使用。快速,即是上网速度快。MG3732模块的信号接收能力强,而且接收信号稳定。便宜,即是价格便宜。MG3732模块在同类型的3G模块中有明显的价格优势。综上所述,此项目今后必会受到用户的追捧,并且具有巨大的市场优势。24可行性241技术可行性基于ANDROID的源代码的开放,使得在对ANDROID做系统开发的时候可以很好的通过查看源代码来针对专门的问题进行解决11。三星SP5C100的开发板有丰富的资源,在出现问题的时候在互联网中的各大论坛中都能够找到相应的解决方案。所以通过学习,查找相关的资料,开发本系统在技术方面没有任何的问题。242经济可行性经济可行性就是对开发成本进行分析,估计开发成本是否会超过项目的预期利润7。在这个系统的开发过程中,需要的只是开发板的购买,而且开发板是可以多次使用的,对于ANDROID系统是完全自由的,不需要付出任何的代价。当项目结束的时候,可以直接把系统拿过去使用,或者针对相关的硬件进行相应的二次开发,所获得的效益是客观的。基于以上两点的分析,本次系统开发是很有价值的。25本章小结通过对软件和硬件的需求分析,说明所选择的硬件平台是非常合适的。加之ANDROID系统在未来几年也是一个非常热门的方向,3G市场更是稳定快速发展,所以此次开发的项目,不仅紧靠市场的需求,而且在未来的几年内都是一个热门的方向。3硬件与软件环境概述31硬件概述311开发板平台采用了FS_S5PC100开发平台,该开发平台用三星公司先进的基于CORTEXA8内核的S5PC100处理器设计而成。可以适应ANDROID、LINUX、WINCE等智能操作系统的发展及市场需求12。S5PC100处理器采用了64/32位的内部总线结构,运算速度最大833MHZ13。包括强大的硬件加速器,如动态视频处理、显示控制和缩放。支持多种格式的硬件编解码MPEF1/2/4、H263/H264等。其视频解码能力很强大并且省电,编解码能力达到720P30FPS1280X720,支持电视输出(NTSC/PAL/HDMI)。支持2D/3D加速。本处理器广泛应用于智能手机、平板电脑等产品。FS_S5PC100平台的外观,如图31所示。图31FS_S5PC100的外观图3123G模块3G模块采用的是中兴MG3732模块,适用于WCDMA和GSM网络,支持850/900/1800/1900/2100频段14。ZTEMG37323G模块外观,如图32所示。图32MG3732外观图32软件环境概述321交叉开发环境的搭建(1)安装交叉编译工具链解压“LINUXANDROIDTOOLCHAIN”目录下的“ARMNONEEABI422TGZ到根“/USR/LOCAL”目录下,在“/USR/LOCAL”目录下会生成“ARM”目录。执行命令TARZXVFARMNONEEABI422TGZ修改环境变量“PATH”。SUDOVIM/ETC/ENVIRONMENT将路径添加到PATH变量的最后面,命令如下PATH“/USR/LOCAL/SBIN/USR/LOCAL/BIN/USR/SBIN/USR/BIN/SBIN/BIN/USR/GAMES/USR/LOCAL/ARM/422EABI/USR/BIN保存退出后执行SOURCE/ETC/ENVIRONMENT这样修改的环境变量会立即生效。(2)安装JDK安装“LINUXANDROIDTOOLCHAIN”目录下的“JDKBIN”,JDKBIN是JDK15,JDK15是编译ANDROID21必须的工具。把“JDKBIN”拷贝到“/USR”目录下,然后执行,按照提示安装即可。SUDO/JDKBIN安装结束后还要配置一下环境变量。SUDOVIM/ETC/ENVIRONMENT将路径添加到PATH变量的最后面。PATH“/USR/LOCAL/SBIN/USR/LOCAL/BIN/USR/SBIN/USR/BIN/SBIN/BIN/USR/GAMES/USR/LOCAL/ARM/422EABI/USR/BIN/USR/JDK150_21/BIN保存退出后执行SOURCE/ETC/ENVIRONMENT322搭建并配置JAVA环境(1)安装依赖包SUDOAPTGETINSTALLBUILDESSENTIALSUDOAPTGETINSTALLLIBNCURSES5DEVSUDOAPTGETINSTALLX11PROTOCOREDEVSUDOAPTGETINSTALLZLIB1GDEVSUDOAPTGETINSTALLLIBX11DEVSUDOAPTGETINSTALLGPERFSUDOAPTGETINSTALLBISONSUDOAPTGETINSTALLFLEX(2)搭建JAVA编译环境安装JDK下载JDKJDK_1_5BIN并执行如下命令SUDOMKDIR/USR/JAVASUODMVJDK_1_5BIN/USR/JAVASUDOCHMODXJDK_1_5BINSUDO/JDK_1_5BIN在执行以上命令后生成LICENSE文件,按Q然后根据提示输入YES即可开始安装。配置JAVA环境SUDOGEDIT/BASHRC在最后面加上EXPORTJAVA_HOME/USR/JAVA/JDK150_21/系统所用的JDK目录EXPORTPATHJAVA_HOME/BINPATHEXPORTANDROID_JAVA_HOMEJAVA_HOME33本章小结本章主要介绍了开发系统中所需要的硬件及其参数,以及如何搭建好开发平台。良好的开发平台为一个系统开发不仅节约了开发成本,同时也缩短了开发周期15。4基于ANDROID系统的电话、短信功能框架的实现基于ANDROID系统的3G网络电话、短信框架分为如下四个部分(1)JAVAAPPLICATION层;(2)JAVAFRAMEWORK层;(3)NATIVEFRAMEWORK层;(4)KERNEL层。第一层和第二层都属于ANDROID应用层的代码使用的是JAVA语言开发,在此定义为JAVARIL。第三层属于JNI层代码使用的是C/C语言开发,从图41中可知,对于硬件的具体操作代码在第三层,一般情况下,ANDROID框架代码中使用JNI的方式完成JAVA和C/C代码的相互调用,再使用BINDER封装实现进程间通讯。电话框架没有使用这种方式,而是使用SOCKET的方式,完成进程间通讯,RILD进程作为服务器端,JAVA层代码作为客户端把用户的数据发送给RILD进程去处理,3G的网络功能框架图如图41所示。电话、短信应用ANDROIDTECHNOLOGYJAVARILRILDSERVERC/CREFERENCERILCHATUART驱动SOCKETKERNELLINUXC编程JAVAAPPLICATIONJAVAFRAMEWORKNATIVEFRAMEWORK图413G网络功能框架图41APPLICATION层411电话部分(1)通话部分拨打电话时,首先会调用ONCLICK方法,这个方法会通过MYEDITTEXTGETTEXTTOSTRING方法获取所拨打的电话号码,并会调用ISPHONENUMBERVALID方法判断这个电话号码是否符合格式,如果符合格式,则会触发OUTGOINGCALLBROADCASTERJAVA中的ONCREATE方法,如果号码是紧急号码则直接以STARTACTIVITY方式处理。若不是紧急号码,则将该号码以SENDORDEREDBROADCASTOUTGOINGCALLRECEIVER方式处理,由OUTGOINGCALLRECEIVER内部类去接收DORECEIVE此号码,并在DORECEIVE中启动INCALLSCREEN类。INCALLSCREEN类中,若第一次进入则调用ONCREATE函数;若通话中再拨打电话则调用ONNEWINTENT函数。ONCREATE函数中会调用INTERNALRESOLVEINTENT方法调用PLACECALL函数建立一个我们需要拨打电话的CALL接着调用PHONEUTILJAVA的PLACECALL函数传入PHONE对象和NUMBER参数,里面调用CONNECTIONCNPHONEDIALNUMBER。PHONE类是个接口类,其中声明了DIAL这个方法,具体的结构如箭头所示PHONEINTERFACE“REQUESTTOSTRINGRRMREQUESTSENDRR在SENDSMS方法中,把上面传下来的短信相关的数据写入到了PARCEL中,协同一个特殊的RILREQUEST写入到SOCKET的输出流中,进而将数据传递到RIL层。43NATIVE层RILRADIOINTERFACELAYER层,主要是基于AT命令的操作,也就是把上层的传递下来的数据包(电话数据或是短信数据)分解,并转化为可以让3G模块识别的AT命令,最后把3G模块处理完数据返回的RESPONSE解析,再传递回上层。431ANDROIDRIL概念ANDROIDRIL是基于TELEPHONY服务和RAIDO硬件层的抽象层,ANDROID的RILD库介于硬件抽象层HAL接口与基于MODEM之间,它同样提供了语音、数据、短信、SIM卡管理以及STK应用的功能,实现思路跟微软的RIL有异曲同工之妙,也是把标准的GSM27007中常用的如DIAL这些做主动请求的操作称之为REQUEST,一共75个;另外一类信息是GSM模块主动上报的例如信号强度、基站信息等,称之为UNSOLICITEDRESPONSE,一共17个。其开发模式是跟微软RIL开发差不多,需要针对不同的GSM模块进行不同的GSM驱动开发,公用的部分GOOGLE已经做好了,特定的部分需要用户自己去定制,这样做可以大大地提高开发效率。以下是RIL交互图,如图42所示。CALLTRACKERSMSDISPATHERSERVICERTRACKERDATATRACKERPHONEAPPLICATIONRILRADIODACMONVENDORRILLINUXIPSTACKPACKETDRVERBASEBANDAPPLICATIONFRAMEWORKLIBRARIESUSERSPACELINUXKERNELBASEBAND图42RIL交互图432本地代码RIL支持的本地代码包括RIL库和守护进程。HARDWARE/RIL/INCLUDEHARDWARE/RIL/LIBRILHARDWARE/RIL/RILDHARDWARE/RIL/REFERENCERIL编译结果是/SYSTEM/BIN/RILD守护进程/SYSTEM/LIB/LIBRILSORIL的库/SYSTEM/LIB/LIBREFERENCERILSORIL参考库ANDROID的RIL驱动模块,在HARDWARE/RIL目录下,一共分RILD,LIBRILSO以及LIBREFRENCE_RILSO三个部分,另外RADIOOPTIONS可供自动或手动调试使用。它们都依赖于INCLUDE目录中RILH头文件。目前CUPCAKE分支上带的是GSM的支持,另有一个CDMA分支,3G通信模块MG3732用到的是GSM驱动。(1)RILD与LIBRILSO以及LIBREFRENCE_RILSO的关系RILD仅以MAIN函数作为整个RIL层的入口点,负责完成初始化。在RILDC文件中,将完成RIL的加载过程,它会执行如下操作首先动态加载VENDORRIL的SO文件;其次执行RIL_STARTEVENTLOOP开启消息队列以进行事件监听;最后通过执行VENDORRIL的RILINIT方法来进行VENDORRIL与LIBRIL的关系建立。LIBRILSO与RILD结合紧密,是其共享库。编译时就已经建立了这一关系(其实也可以编译成可执行程序,作为守护进程运行)。组成部分为RILCPP和RIL_EVENTCPP。LIBRILSO驻留在RILD这一守护进程中,主要完成同上层通信的工作,接受RIL请求并传递给LIBREFRENCE_RILSO,同时把来自LIBREFRENCE_RILSO的反馈回传给调用进程。编译时,LIBRIL被链入RILD,它为RILD提供了EVENT处理功能,还提供了在RILD与VENDORRIL之间传递请求和响应消息的能力。LIBRIL提供的主要功能分布在两个主要方法中一个是RIL_STARTEVENTLOOP方法;另一个是RIL_REGISTER方法。RIL_STARTEVENTLOOP方法所提供的功能就是启用EVENTLOOP线程,执行RIL消息队列;RIL_REGISTER方法的功能是启动名为RILD的监听端口。LIBREFRENCE_RILSORILD通过手动的DLOPEN方式加载,结合稍微松散,这主要是因为LIBREFRENCESO负责跟MODEM硬件通信。这样做更方便替换或修改加载的方式,以适配更多种类的MODEM。它将来自LIBRILSO的请求转换为AT命令,同时监控MODEM的反馈信息,并传递回LIBRILSO。在初始化时,RILD通过符号RIL_INIT获取一组函数指针并以此与之建立联系。REFERENCERIL会接收调用者传来的参数,参数内容为与RADIO的通信方式。如通过串口连接RADIO,那么参数形式为D/DEV/TTYSX,如图43所示。CALLING,SMSANDROIDTELEPHONERILPARTJAVAAPPLICATIONJAVAFRAMEWORKNATIVEFRAMEWORKRILDDEAMONLIBREFERENCERILSOLIBRILSORILDRIVERUARTSDIDUSBKERNELSPACERILRADIOFUNCTIONDLOPENINTERFANCERILINITSOCKET“RIL”图43RILD、LIBRILSO及LIBREFRENCESO关系图RADIOOTIONSRADIOOPTIONGS通过获取启动参数,利用SOCKET与RILD通信,其作用是通过串口将一些与RADIO相关的参数直接传给RILD。可用于调试时配置MODEM参数的配置。(2)初始化流程RILD是一个守护进程,在这里定义宏RIL_SHLIB。执行的过程为获取参数打开功能库建立事件循环执行RIL_INITRIL_REGISTER。主入口是RILDC中的MAIN函数,主要完成三个任务任务一开启LIBRILSO中的EVENT机制。在RIL_STARTEVENTLOOP中,最核心的是由多路I/O驱动的消息循环。任务二初始化LIBREFRENCE_RILSO。也就是跟硬件或模拟硬件MODEM通信的部分(后面统一称硬件),通过RIL_INIT函数完成。任务三通过RIL_INIT获取一组函数指针RIL_RADIOFUNCTIONS,并通过RIL_REGISTER完成注册,并打开接受上层命令的SOCKET通道。初始化流程分析如下任务一也就是RIL_STARTEVENTLOOP函数。RIL_STARTEVENTLOOP在RILCPP中实现,它的主要目的是通过PTHREAD_CREATE/初始化消息队列VOIDRIL_EVENT_SETSTRUCTRIL_EVENTEV,INTFD,BOOLPERSIST,RIL_EVENT_CBFUNC,VOIDPARAM/设置消息队列相关的属性VOIDRIL_EVENT_ADDSTRUCTRIL_EVENTEV/增加消息VOIDRIL_TIMER_ADDSTRUCTRIL_EVENTEV,STRUCTTIMEVALTV/增加时间计时器VOIDRIL_EVENT_DELSTRUCTRIL_EVENTEV/删除消息VOIDRIL_EVENT_LOOP/通过多路复用I/O机制循环调用消息队列STRUCTRIL_EVENTSTRUCTRIL_EVENTNEXT/下一个消息STRUCTRIL_EVENTPREV/前一个消息INTFD/事件相关设备句柄。例如对于串口数据事件,FD就是相关串口的设备句柄BOOLPERSIST/如果是保持的,则不从WATCH_LIST中删除STRUCTTIMEVALTIMEOUTRIL_EVENT_CBFUNC/回调事件处理函数VOIDPARAM/回调时参数每个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/SETTORIL_VERSION/RIL_REQUESTFUNCONREQUESTRIL_RADIOSTATEREQUESTONSTATEREQUESTRIL_SUPPORTSSUPPORTSRIL_CANCELONCANCELRIL_GETVERSIONGETVERSIONRIL_RADIOFUNCTIONS其中最重要的是ONREQUEST域,来自上层的请求都由这个函数进行映射后转换成对应的AT命令并发给硬件。RILD通过RIL_REGISTER注册这一指针。RIL_REGISTER中要完成的另外一个任务,就是打开跟上层通信的SOCKET接口(S_FDLISTEN是主接口,S_FDDEBUG供调试时使用)。然后将这两个SOCKET接口使用任务一中实现的机制进行注册(仅列出S_FDLISTEN)。RIL_EVENT_SETRILEVENTADDWAKEUP这样将两个SOCKET加到任务一中建立起来多路复用I/O的检查句柄集合中,一旦有上层来的(调试)请求,EVENT机制便能响应处理了。(3)REQUEST流程对DIAL而言,COMMANDINFO包含了所有的AT命令。所以COMMANDINFO结构应该这样进行初始化RIL_REQUEST_DIAL,DISPATCHDIAL,RESPONSEVOID这里执行DISPATCHFUNCTION,也就是DISPATCHDIAL这一函数。其实有很多种类的DISPATCHFUNCTION,比如DISPATCHVOID,DISPATCHSTRINGS,DISPATCHSIM_IO等等,这些函数的区别在于解析传入的参数形式,VOID就是不带参数的,STRINGS是以STRING做参数,又如DIAL等,有自己的参数解析方式,以此类推。REQUEST号和参数具备后,就可以进行具体的REQUEST函数调用了。利用S_CALLBACKSONREQUESTPRIPCIREQUESTNUMBER,XXX,LEN,PRI完成这一操作。S_CALLBACKS的作用是获取前文中提到的来自LIBREFERENCERIL的RIL_RADIOFUNCTIONS结构指针。REQUEST请求在这里转入底层的LIBREFERENCERIL处理,HANDLER是REFERENCERILC中的ONREQUESTONREQUEST进行一个简单的SWITCH分发。RIL_REQUEST_DIAL流程是ONREQUESTREQUESTDIALAT_SEND_COMMANDAT_SEND_COMMAND_FULLAT_SEND_COMMAND_FULL_NOLOCKWRITELINE。REQUESTDIAL中将命令和参数转换成对应的AT命令,调用公共SENDCOMMAND接口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,并执行EVFUNCEVFD,0,EVPARAM,即调用STATICVOIDLISTENCALLBACKINTFD,SHORTFLAGS,VOIDPARAM方法。在该方法中,首先通过ACCEPT()接收上层的SOCKET,然后通过RECORD_STREAM_NEW建立一个RECORD_STREAM,并联系上S_FDCOMMAND,到目前为止S_FDCOMMAND已经有了上层数据,于是调用PROCESSCOMMANDSCALLBACKINTFD,SHORTFLAGS,VOIDPARAM方法,PROCESSCOMMANDSCALLBACK会保证收到一个完整的REQUEST(由RECORDSTREAM决定),并调用PROCESSCOMMANDBUFFER方法,这是命令的下发流程。每个命令以REQUESTINFO的形式存在实例PRI,并且将PRI挂在了S_PENDINGREQUESTS中,并执行DISPATCHFUNCTION方法,即DISPATCHDIAL。DISPATCHDIAL方法中,里面核心代码如下S_CALLBACKSONREQUESTPRIPCIREQUESTNUMBER,而S_CALLBACKS是前文提到说的RIL_RADIOFUNCTIONS结构的指针,RIL_RADIOFUNCTION中有个重要的域是ONREQUEST,详情可参照REFERENCERILC文件中ONREQUEST方法的实现。ONREQUEST中主要是用SWITCHCASE判断发送过来的命令是什么如拨打电话、SIM卡状态、挂断电话、等待状态等,这里当然是拨打电话。大致的流程为ONREQUESTREQUESTDIALAT_SEND_COMMANDAT_SEND_COMMAND_FULLAT_SEND_COMMAND_FULL_NOLOCK。NOLOCK方法中关键性的一句为WRITELINE。查看WRITELINE方法,WRITTENWRITES_FD,SCUR,LENCUR。能够看得出是往硬件中写入命令。其实质都是AT_SEND_COMMAND_FULL方法,执行WRITE之后便等待硬件那边给过来的响应,于是进入RESPONSE阶段。(4)RESPONSE流程前文对REQUEST的分析,中止在AT_SEND_COMMAND_FULL_NOLOCK里的WRITELINE操作。因为这里完成命令写出到硬件设备的操作,接下来就是等待硬件响应,也就是RESPONSE过程。后继分析从此处开始。RESPONSE信息的获取,是初始化分析中提到的READERLOOP中,由READLINE函数以“行”为单位接收上来。AT的RESPONSE有两种,一是主动上报的,比如网络状态、短信、来电等都不需要经过请求,有一个UNSOLICITED词语专门描述;另一种才是真正意义上的RESPONSE,也就是命令的响应。所有的行,首先经过SMS的自动上报筛选。因为短信的AT处理通常比较麻烦,无论收发都单独列出。这里是因为要即时处理这条短信消息(两行、标志PDU),而不能拆开处理。处理函数为ONUNSOLICITED(由S_UNSOLHANDLER指向)。除SMS特例外,所有的LINE都要经过PROCESSLINE,该处理流程如下NOCMDHANDLEUNSOLICITED/主动上报ISFINALRESPONSESUCCESSHANDLEFINALRESPONSE/成功,标准响应ISFINALRESPONSEERRORHANDLEFINALRESPONSE/失败,标准响应GETSENDSMSPDU/收到符号,发送SMS数据再继续等待响应SWITCHS_TYPE具体响应/命令有具体的响应信息需要对应分析需要关注的是HANDLEUNSOLICITED自动上报功能以及SWITCHS_TYPE具体响应信息。具体响应需要HANDLEFINALRESPONSE这样的标准响应来最终完成。ONUNSOLICITE(主动上报响应)STATICVOIDONUNSOLICITEDCONSTCHARS,CONSTCHARSMS_PDU;短信的AT设计难度较高。RESPONSE的主要的解析过程由AT_TOKC中的函数完成,其本质就是字符串按块解析,具体的解析方式由每条命令或上报信息自行决定。此处不再详述。ONUNSOLICITED只解析出头部一般是XXXX的形式,然后按类型决定下一步操作,操作为RIL_ONUNSOLICITEDRESPONSE和RIL_REQUESTTIMEDCALLBACK两种。第一,RIL_ONUNSOLICITEDRESPONSESOLICITE的信息直接返回给上层。通过PARCEL传递,将RESPONSE_UNSOLICITED,UNSOLRESPONSE(REQUEST号)先写入PARCEL,然后通过S_UNSOLRESPONSES数组,查找到对应的RESPONSEFUNCTION完成进一步的的解析,存入PARCEL中。最终通过SENDRESPONSE将其传递回原进程。流程如下SENDRESPONSESENDRESPONSERAWBLOCKINGWRITEWRITETOS_FDCOMMAND前面建立起来的和上层框架的SOCKET连接。第二,RIL_REQUESTTIMEDCALLBACK通过EVENT机制实现的TIMER机制,回调对应的内部处理函数。通过INTERNALREQUESTTIMEDCALLBACK将回调添加到EVENT循环,最终完成CALLBACK上挂的函数的回调。比如POLLSIMSTATE,ONPDPCONTEXTLISTCHANGED等回调,不用返回上层,内部处理就可以。SWITCHS_TYPE(命令的具体响应)及HANDLEFINALRESPONSE(标准响应)命令的类型(S_TYPE)在SENDCOMMAND时设置。有NO_RESULT、NUMERIC、SINGLELINE、MULTILINE几种,供不同的AT使用。比如ATCSQ是SINGLELINE,返回ATCSQXX,XX,再加一行OK,比如一些设置命令,就是NO_RESULT,只有一行OK或ERROR。这几个类型的解析都很相似,通过一定的判断(如比较AT头标记等),如果是对应的响应,就通过ADDINTERMEDIATE挂到一个临时结果。SP_RESPONSEP_INTERMEDIATES队列中,如果不是对应响应,则其应该是穿插其中的自动上报,用ONUNSOLICITE来处理。具体响应只起一个获取响应信息到临时结果、等待具体分析的作用。无论有无具体响应,最终都会以标准响应HANDLEFINALRESPONSE来处理,也就是接受到OK,ERROR等标准RESPONSE来结束,这是大多数AT命令的规范。HANDLEFINALRESPONSE会设置S_COMMANDCOND这一OBJECT,也就是AT_SEND_COMMAND_FULL_NOLOCK等待的对象。至此,响应的完整信息已经完全获得,SENDCOMMAND可以进一步处理返回的信息(临时结果、以及标准返回的成功或失败都在SP_RESPONSE中)。PP_OUTRESPONSE参数将SP_RESPONSE返回给调用AT_SEND_COMMAND_FULL_NOLOCK的函数。P_RESPONSE如果返回失败(也就是标准响应的ERROR等造成),则通过RIL_ONREQUESTCOMPLETE发送返回数据给上层,结束命令;如果成功,则进一步分析P_RESPONSEP_INTERMEDIATES,同样是通过AT_TOKC里的函数进行分析,并同样将结果通过RIL_ONREQUESTCOMPLETE返回。RIL_ONREQUESTCOMPLETE和RIL_ONUNSOLICITEDRESPONSE很相似,功能也一致。通过PARCEL来传递回上层,同样是先写入RESPONSE_SOLICITED(区别于RESPONSE_UNSOLICITED),PRITOKEN上层传下的REQUEST号),错误码(SENDCOMMAND的错误,不是AT响应)。如果有AT响应,通过访问PRIPCIRESPONSEFUNCTION来完成具体RESPONSE的解析,并写入PARCEL。然后通过同样的途径SENDRESPONSESENDRESPONSERAWBLOCKINGWRITEWRITETOS_FDCOMMAND完成最终的响应传递,如图44所示。RESPONSE流程VENDORRILANDROIDRILIMPLRILDPHONEBASEBANDINCOMINGCALLPICKUPLISTENTHREADONUNSOLICITEDRESPONSECONNECTIONESTABLISHED图44RESPONSE流程图READLOOP要解决的问题是解析从MODEM发过来的回应。如果遇到主动上报消息则通过HANDLEUNSOLICITED上报的JAVARIL;如果是命令的应答,则通过HANDLEFINALRESPONSE通知SEND_AT_COMMAND有应答结果。RILD层初始化时获取REFERENCERILC提供的函数列表结构体。EVENTLOOP将根据不同的命令类型获取JAVARIL消息,解析出需要的参数,并调用ONREQUEST函数进行分发处理。SEND_AT_COMMAND是同步的,命令发送后,SEND_AT_COMMAND将等待在命令处理完成。RIL跟上层通讯主要采用两种方式一种是通过SOCKET发送与接收消息的方式来实现,C方面,这个SOCKET在RILCPP里面可以找到它的创建代码S_FDLISTENANDROID_GET_CONTROL_SOCKETSOCKET_NAME_RILJAVA方面,在RILJAVA中SNEWLOCALSOCKETLNEWLOCALSOCKETADDRESSSOCKET_NAME_RIL,LOCALSOCKETADDRESSNAMESPACERESERVEDSCONNECTL另外一种方式就是直接通过TCP/IP直接访问内核中的SHAREDMEMORY,进行RPC调用,这种方式主要应用在数据模式上,一是因为ANDROID的每个ACTIVITY随时都会有可能需要网络连接接收发送数据,因此必须提供一种实时性较高的访问方式,二是因为可以提高通讯效率。44KERNEL层此处主要是对USBSERIALDRIVER的加载,这里使用的USBSERIALDRIVER是来自LINUX内核下的通用USBSERIAL驱动。USBSERIAL驱动控制插入其中的USB3G(ZTEMG3732)设备,提供虚拟的串口,如TTYUSB0,TTYUSB1。为了让USBSERIAL驱动为3G模块所使用,需要修改驱动源码,使内核能够识别设备。主要是在内核/DRIVER/USB/SERIAL/OPTIONC中,增加设备的VID和PID,也就是产品号和出厂号。代码如下所示USB_DEVICE0X19D2,0XFFFF,USB_DEVICE0X19D2,0XFFEC,并且还需要配置内核DEVICEDRIVERSUSBSUPPORTSUPPORTFORHOSSIDEUSB/OHCIHCDSUPPORTUSBSERIALCONVERTERSUPPORTUSBDRIVERFORGSMANDCDMAMODEMS这样内核就支持ZTEMG37323G模块了。当驱动成功加载后,插入3G模块后,在/DEV/目录下就可以看到TTYUSB0,TTYUSB1等字符设备文件。45本章小结本章对APP层、FRAMEWORK层进行了简单的分析,重点介绍了RIL层和KERNEL层的实现。对APP层、FRAMEWORK层的分析是为了实现RIL层,知道RIL层从上层接收到什么。RIL层主要实现了两个流程,即REQUEST流程和RESPON

温馨提示

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

评论

0/150

提交评论