基于Android系统的3G网

上传人:沈*** 文档编号:99730213 上传时间:2022-06-01 格式:DOC 页数:61 大小:4.58MB
收藏 版权申诉 举报 下载
基于Android系统的3G网_第1页
第1页 / 共61页
基于Android系统的3G网_第2页
第2页 / 共61页
基于Android系统的3G网_第3页
第3页 / 共61页
资源描述:

《基于Android系统的3G网》由会员分享,可在线阅读,更多相关《基于Android系统的3G网(61页珍藏版)》请在装配图网上搜索。

1、. -JIU JIANG UNIVERSITY毕 业 论 文 题 目基于Android系统的3G网 络功能开发英文题目 The 3G Network Development Based on Android System院 系 信息科学与技术学院 专 业 计算机科学与技术 姓 名 黄盛华 班级学号 A081140 指导教师 于林峰 二一二年五月. . word.zl-. -摘要随着Android系统在消费电子行业的份额不断加重,为满足用户对手持移动产品网络功能的要求,3G无线网络功能的开发是非常有必要的。主要针对中兴MG3732模块的开发。实现在FS_S5PC100开发板上连接MG3732模块

2、后,可以在其搭载的Android2.2系统中实现3G无线网络的打、发短信和上网。首先搭建一个Android系统开发的环境,主要是安装编译工具链,和搭建Java平台。其次是实现、短信框架,主要是对RIL层的开发和MG3732模块驱动的调试,这是整个开发过程中的重点和难点,需要长时间调试和优化。然后是实现PPPD拨号上网,最后编译核和Android源码,获得img镜像文件,烧录开发板后,插上MG3732模块,验证功能。关键词:安卓系统,第三代通信,网络功能AbstractWith the Android system ponent in the consumer electronics indus

3、try 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 dev

4、elopment 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 piler tool chain,and build the Java platform. Followed by MG3732 module-driven the debu

5、gging 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 mand script, and finally piled Adroi

6、d source live img files, and burn development board, the certification function.Keywords:Android System, 3rd Generation munication, 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、件概述(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). . word.zl-. -1 绪论1.1系统概述此次开发目的为实现基于Android系统的3G网络功能,即利用

8、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手机和And

9、roid平板电脑实现宽带上网,大大提升上网的速度,并且可以进展手机办公、手机商务等活动。其次手持移动产品如手机和平板电脑的视频通话和网络电视、音乐及其他一些只能在PC上实现的功能,都能因此而得到圆满的解决,这样就极方便了用户,也使基于Android系统的手持移动产品真正到达“手持电脑的效果。1.3 开展现状3G已经成为嵌入式领域的一个新热点,国的移动通信三大巨头在08年相继宣布要重资开展3G业务,3G网络的WAP站点更是随处可见。特别是近几年,越来越多的消费者选择了Android系统的手机、平板电脑和其他设备。基于Android系统的3G网络功能必定会受到极大欢送。1.4 开展趋势近年来,随着

10、计算机技术及相关技术的开展,嵌入式技术已成为后PC时代的主力,在通讯、网络、工控、医疗、电子、物联网、三网融合、3G等领域发挥着越来越重要的作用,嵌入式IT技术正在变得无处不在。如今,嵌入式IT系统开发无疑成为当今最热门、最有开展前途的领域之一。2010年开场,Android逐渐成为智能手机技术的主导,与iPhone同领潮流,改变人们的生活和工作。并且Android系统开放性会使其得到更大的开展。因此,基于Android系统的3G系统会得到更大的开展。1.5 本章小结本章首先对包括硬件和软件在的系统做了一个简单介绍,然后说明了该工程的意义和目的。接下来介绍了当前基于Android系统的3G技术

11、应用这块的开展现状和未来开展趋势,说明当今和未来几年,基于Android系统的3G技术会是一项非常热门的技术。2需求分析需求分析是指开发人员要理解用户的要求,进展详细的市场调查,确定系统的新目标。为了满足用户的需要,答复系统要“做什么的问题1。2.1硬件需求分析好的硬件平台会发给软件开发带来许多便利,因此选择一个适宜的硬件平台是非常重要的2。根据软件开发需求和硬件平台稳定性、价格等一系列因素,选择了FS_S5PC100开发板。该开发板采用三星SP5C100处理器,处理器采用64/32位部总线构造,运算速度最大833MHZ,被广泛的应用于智能手机、平板电脑等产品。根据性价比,3G模块选择了中兴M

12、G3732模块。MG3732 模块是基于高通QSC6270平台开发的WCDMA 3G无线通讯模块,引脚方式为36脚邮票孔,适用于 WCDMA和GSM网络,支持850/900/1800/1900/2100 频段。2.2软件需求分析据调查,这几年,系统源码开放的Android系统已经占用了智能手机市场36%的份额,并且Android系统还将得到更大的开展3。选择了Android2.2系统,其优点如下:1开放性Android平台首要优势就是其开放性4。开放的平台允许任何移动终端厂商参加到Android联盟中来。显著的开放性可以使其拥有更多的开发者,随着用户和应用的日益丰富,一个崭新的平台也将很快走向

13、成熟5。2挣脱束缚在过去很长的一段时间,特别是在欧美地区,手机应用往往受到运营商制约,使用什么功能接入什么网络,几乎都受到运营商的控制。自从iPhone上市,用户可以更加方便地连接网络,运营商的制约减少。随着EDGE、HSDPA这些2G至3G移动网络的逐步过渡和提升,手机随意接入网络已不是运营商口中的笑谈6。3丰富的硬件由于Android的开放性,同时Android的热火,致使众多的硬件生产厂商在第一时间专门针对Android生产出各具特色的产品。4开发商Android平台提供应第三方开发商一个十分广泛、自由的环境。因此不会受到各种条条框框的阻挠,可想而知,会有无数新颖别致的软件诞生。5Goo

14、gle应用从搜索巨人到全面的互联网渗透,Google效劳如地图、搜索等已经成为连接用户和互联网的重要纽带,而Android平台手机将无缝结合这些优秀的Google效劳7。Android系统是开源的。这会为开发带来极大的方便。在互联网上,可以找到很多研究Android系统、研究3G网络功能实现的心得体会。这样可以通过查找资料,缩短开发的时间,明确开发方向。2.3用户需求分析根据调查,全球3G市场正在保持快速稳定的开展,并呈现以下趋势:13G+技术将成增长主流截至2011年底,全球移动普及率已超过76%,市场将逐渐趋于饱和,移动用户增长将趋缓。中国、印度等开展中国家将是未来几年3G用户增长的主要来

15、源,对整个移动通信市场的开展影响重大。3G+技术将成为3G市场主流。预计到2015年,HSPA用户占比将由2010年的6.3%迅速上升到25.6%,成为3G用户增长的重要来源8。2中低端智能终端市场份额不断提升,开放阵营将占据主流未来,智能终端的能力将呈现PC化,计算、处理和存储能力等方面都逐渐向PC性能水平靠拢。在价格方面,智能终端将整体走低,受众围不断扩大。依靠产业分工合作、标准化、通用效劳获得本钱优势的中低端智能终端在市场中的份额将不断上升9。3应用商店模式加快开展,浏览器成为其新载体未来,移动应用商店将继续处于快速开展阶段。随着智能终端种类和行业应用的增加,未来应用商店应用围将持续扩大

16、,成为覆盖手机、平板电脑、电子阅读器、笔记本电脑等移动终端设备的通用应用下载平台10。显而易见,基于Android系统的3G网络功能,会是一个非常热门的技术,并且拥有一个巨大的市场。越来越多的用户将会选择Android系统的移动终端设备,所以方便、快速、廉价,会是用户根本的选择条件。方便,即是携带方便,使用方便。3G模块的成品只有U盘大小,可以随身携带,使用时只需插入一3G卡,连接上手机或是平板电脑就能直接使用。快速,即是上网速度快。MG3732模块的信号接收能力强,而且接收信号稳定。廉价,即是价格廉价。MG3732模块在同类型的3G模块中有明显的价格优势。综上所述,此工程今后必会受到用户的追

17、捧,并且具有巨大的市场优势。2.4可行性2.4.1技术可行性基于Android的源代码的开放,使得在对Android做系统开发的时候可以很好的通过查看源代码来针对专门的问题进展解决11。三星SP5C100的开发板有丰富的资源,在出现问题的时候在互联网中的各大论坛中都能够找到相应的解决方案。所以通过学习,查找相关的资料,开发本系统在技术方面没有任何的问题。2.4.2经济可行性经济可行性就是对开发本钱进展分析,估计开发本钱是否会超过工程的预期利润7。在这个系统的开发过程中,需要的只是开发板的购置,而且开发板是可以屡次使用的,对于Android系统是完全自由的,不需要付出任何的代价。当工程完毕的时候

18、,可以直接把系统拿过去使用,或者针对相关的硬件进展相应的二次开发,所获得的效益是客观的。基于以上两点的分析,本次系统开发是很有价值的。2.5本章小结通过对软件和硬件的需求分析,说明所选择的硬件平台是非常适宜的。加之Android系统在未来几年也是一个非常热门的方向,3G市场更是稳定快速开展,所以此次开发的工程,不仅紧靠市场的需求,而且在未来的几年都是一个热门的方向。3 硬件与软件环境概述3.1硬件概述3.1.1开发板平台采用了FS_S5PC100开发平台,该开发平台用三星公司先进的基于 Cortex-A8核的S5PC100 处理器设计而成。可以适应Android 、Linux 、Wince 等

19、智能操作系统的开展及市场需求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模块,适用于

20、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 将路径

21、添加到 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目录下,然后执行,按照提示安装即

22、可。#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-essent

23、ial $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$suo

24、d 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本章小结本章主要介绍了开发系统中所需要的硬件及其参数,以及

25、如何搭建好开发平台。良好的开发平台为一个系统开发不仅节约了开发本钱,同时也缩短了开发周期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

26、和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()方法判断这个是否符合格式,如果符合格式,那么会触发Outgoingcallb

27、roadcaster.java中的oncreate方法,如果是紧急那么直接以startactivity方式处理。假设不是紧急,那么将该以sendorderedbroadcast(outgoingcallreceiver)方式处理,由OutgoingcallReceiver部类去接收(doReceive)此,并在doreceive中启动InCallScreen类。IncallScreen类中,假设第一次进入那么调用oncreate函数;假设通话中再拨打那么调用onnewintent函数。oncreate函数中会调用internalResolveIntent方法-调用placecall函数(建立一

28、个我们需要拨打的Call)-接着调用Phoneutil.java的placecall函数(传入phone对象和number参数),里面调用Connection = phone.dial(number)。phone类是个接口类,其中声明了dial这个方法,具体的构造如箭头所示:Phone(interface)-implements-PhoneBase(abstractclass)+requestToString(rr.mRequest);send(rr);在sendSMS()方法中,把上面传下来的短信相关的数据写入到了Parcel中,协同一个特殊的RILRequest写入到Socket的输出流中

29、,进而将数据传递到RIL层。4.3 Native层RIL(Radio Interface Layer)层,主要是基于AT命令的操作,也就是把上层的传递下来的数据包数据或是短信数据分解,并转化为可以让3G模块识别的AT命令,最后把3G模块处理完数据返回的response解析,再传递回上层。4.3.1Android RIL概念Android RIL是基于telephony效劳和raido硬件层的抽象层,Android的Rild库介于硬件抽象层HAL接口与基于Modem之间,它同样提供了语音、数据、短信、SIM卡管理以及STK应用的功能,实现思路跟微软的RIL有异曲同工之妙,也是把标准的 GSM27

30、.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

31、/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用

32、到的是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结合严密,是其共享库。编译时就已经建立了这一关系其实也可以编译成可执行程序,作为守护进程运行。组成局部为ri

33、l.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()方法所提供的功能就是启用eve

34、ntLoop线程,执行RIL消息队列;RIL_register()方法的功能是启动名为rild的监听端口。librefrence_ril.sorild通过手动的dlopen方式加载,结合稍微松散,这主要是因为librefrence.so负责跟Modem硬件通信。这样做更方便替换或修改加载的方式,以适配更多种类的Modem。它将来自libril.so的请求转换为AT命令,同时监控Modem的反响信息,并传递回libril.so。在初始化时,rild通过符号RIL_Init获取一组函数指针并以此与之建立联系。reference-ril会接收调用者传来的参数,参数容为与radio的通信方式。如通过串

35、口连接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中的e

36、vent机制。在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_disp

37、atch, &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(st

38、ruct 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; /事件相关设备句柄。例如对于串口数据事件,f

39、d就是相关串口的设备句柄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

40、_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的命令到期的时候。至此第一个任务分析完毕,这样便

41、建立起了基于event队列的消息循环,稍后便可以承受上层发来的的请求了上层请求的event对象建立,在第三个任务中。任务二:这个任务的入口是RIL_Init, RIL_Initreference-ril.c首先通过参数获取(p/d/s)硬件接口的设备文件或模拟硬件接口的socket. 接下来便新创立一个线程pthread_create(&s_tid_mainloop, &attr, mainLoop, NULL)继续初始化,即mainLoop。mainLoop的主要任务是建立起与硬件的通信,然后通过read方法阻塞等待硬件的主动上报或响应。在注册一些根底回调timeout、readerclos

42、e后,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驱动的,

43、除非出错、超时等,否那么会读到一行完整的响应或主动上报,才会返回。这个循环启动以后,根本的AT响应机制就已经建立了起来。对它的具体分析,包括at_open中挂接的ATUnsolHandler, 放到后面的response分析里去。SMS短信的收发if(isSMSUnsolicited(line)判断也在readerLoop中。有了响应的机制当然,能与硬件通信也已经可以发请求了,通过RIL_requestTimedCallback(initializeCallback,NULL, &TIMEVAL_0),跑到initializeCallback中,执行一些以AT命令为主的Modem初始化命令。关

44、于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 o

45、nCancel;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,lis

46、tenCallback, NULL);rilEventAddWakeup (&s_listen_event);这样将两个socket加到任务一中建立起来多路复用I/O的检查句柄集合中,一旦有上层来的调试请求,event机制便能响应处理了。3Request流程对Dial而言,mandInfo包含了所有的AT命令。所以mandInfo构造应该这样进展初始化:RIL_REQUEST_DIAL, dispatchDial, responseVoid这里执行dispatchFunction, 也就是dispatchDial这一函数。其实有很多种类的dispatch function, 比方dispatc

47、hVoid, 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请求在这里转入底

48、层的 libreference-ril处理,handler是reference-ril.c中的onRequest.onRequest进展一个简单的switch分发。RIL_REQUEST_DIAL流程是:onRequest-requestDial-at_send_mand-at_send_mand_full-at_send_mand_full_nolock-writeline。requestDial中将命令和参数转换成对应的AT命令,调用公共send mand接口at_send_mand。除了这个接口之外,还有如下命令:at_send_mand_singleline、at_send_mand_

49、sms、at_send_mand_multiline等,这是根据at返回值,以及发命令流程的类型来区别的。比方at_csq类型,需要at_send_mand_singleline,而发送短信,因为有prompt提示符“,传送数据、完毕符等一系列操作,需要专门用at_send_mand_sms来实现。然后执行at_send_mand_full,前面几个接口都会最终到这里,再通过一个互斥的at_send_mand_full_nolock调用,完成最终的写出操作,在writeline中,写出到初始化时翻开的设备中。前面提到RILSender将请求呼叫的字节流传给了rild的socket。这时,ril

50、_event_loop方法的select检测到了有请求的信号,导致被挂入pending_list,并执行ev-func(ev-fd, 0, ev-param),即调用static void listenCallback (int fd, short flags, void *param)方法。在该方法中,首先通过accept接收上层的socket,然后通过record_stream_new()建立一个record_stream,并联系上s_fdmand,到目前为止s_fdmand已经有了上层数据,于是调用processmandsCallback(int fd, short flags, voi

51、d *param) 方法,processmandsCallback会保证收到一个完整的request由recordStream决定,并调用processmandBuffer方法,这是命令的下发流程。每个命令以RequestInfo的形式存在(实例:pRI),并且将pRI挂在了s_pendingRequests中,并执行dispatchFunction方法,即dispatchDial。dispatchDial方法中,里面核心代码如下:s_callbacks.onRequest(pRI-pCI-requestNumber, &dial, sizeOfDial, pRI);而s_callbacks是

52、前文提到说的RIL_RadioFunctions构造的指针,RIL_RadioFunction中有个重要的域是onRequest,详情可参照reference-ril.c文件中onrequest方法的实现。onrequest中主要是用switch.case判断发送过来的命令是什么(如:拨打、SIM卡状态、挂断、等待状态等),这里当然是拨打。大致的流程为:onrequest-requestDial-at_send_mand-at_send_mand_full-at_send_mand_full_nolock。nolock方法中关键性的一句为writeLine(.)。查看writeline方法,w

53、ritten = write (s_fd, s + cur, len - cur)。能够看得出是往硬件中写入命令。其实质都是at_send_mand_full方法,执行write之后便等待硬件那边给过来的响应,于是进入response阶段。4Response流程前文对Request的分析,中止在at_send_mand_full_nolock里的writeline操作。因为这里完成命令写出到硬件设备的操作,接下来就是等待硬件响应,也就是response过程。后继分析从此处开场。response信息的获取,是初始化分析中提到的readerLoop中,由readline函数以“行为单位接收上来。A

54、T的response有两种,一是主动上报的,比方网络状态、短信、来电等都不需要经过请求,有一个unsolicited词语专门描述;另一种才是真正意义上的response,也就是命令的响应。所有的行,首先经过sms的自动上报筛选。因为短信的AT处理通常比拟麻烦,无论收发都单独列出。这里是因为要即时处理这条短信消息两行、标志pdu,而不能拆开处理。处理函数为onUnsolicited由s_unsolHandler指向。除sms特例外,所有的line都要经过processLine,该处理流程如下:no cmd-handleUnsolicited /主动上报isFinalResponseSuccess-handleFinalResponse /成功,标准响应

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

copyright@ 2023-2025  zhuangpeitu.com 装配图网版权所有   联系电话:18123376007

备案号:ICP2024067431-1 川公网安备51140202000466号


本站为文档C2C交易模式,即用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。装配图网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知装配图网,我们立即给予删除!