基于Android系統(tǒng)的G網(wǎng)(完整資料)_第1頁(yè)
基于Android系統(tǒng)的G網(wǎng)(完整資料)_第2頁(yè)
基于Android系統(tǒng)的G網(wǎng)(完整資料)_第3頁(yè)
基于Android系統(tǒng)的G網(wǎng)(完整資料)_第4頁(yè)
基于Android系統(tǒng)的G網(wǎng)(完整資料)_第5頁(yè)
已閱讀5頁(yè),還剩109頁(yè)未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡(jiǎn)介

基于Android系統(tǒng)的G網(wǎng)(完整資料)(可以直接使用,可編輯優(yōu)秀版資料,歡迎下載)

基于Android系統(tǒng)的G網(wǎng)(完整資料)(可以直接使用,可編輯優(yōu)秀版資料,歡迎下載)JIUJIANGUNIVERSITY畢業(yè)論題目基于Android系統(tǒng)的3G網(wǎng)絡(luò)功能開發(fā)英文題目The3GNetworkDevelopmentBasedonAndroidSystem院系信息科學(xué)與技術(shù)學(xué)院專業(yè)計(jì)算機(jī)科學(xué)與技術(shù)姓名黃盛華班級(jí)學(xué)號(hào)A081140指導(dǎo)教師于林峰二○一二年五月摘要隨著Android系統(tǒng)在消費(fèi)電子行業(yè)的份額不斷加重,為滿足用戶對(duì)手持移動(dòng)產(chǎn)品網(wǎng)絡(luò)功能的要求,3G無(wú)線網(wǎng)絡(luò)功能的開發(fā)是非常有必要的。主要針對(duì)中興MG3732模塊的開發(fā)。實(shí)現(xiàn)在FS_S5PC100開發(fā)板上連接MG3732模塊后,可以在其搭載的Android2。2系統(tǒng)中實(shí)現(xiàn)3G無(wú)線網(wǎng)絡(luò)的打電話、發(fā)短信和上網(wǎng)。首先搭建一個(gè)Android系統(tǒng)開發(fā)的環(huán)境,主要是安裝編譯工具鏈,和搭建Java平臺(tái)。其次是實(shí)現(xiàn)電話、短信框架,主要是對(duì)RIL層的開發(fā)和MG3732模塊驅(qū)動(dòng)的調(diào)試,這是整個(gè)開發(fā)過(guò)程中的重點(diǎn)和難點(diǎn),需要長(zhǎng)時(shí)間調(diào)試和優(yōu)化。然后是實(shí)現(xiàn)PPPD撥號(hào)上網(wǎng),最后編譯內(nèi)核和Android源碼,獲得img鏡像文件,燒錄開發(fā)板后,插上MG3732模塊,驗(yàn)證功能。關(guān)鍵詞:安卓系統(tǒng),第三代通信,網(wǎng)絡(luò)功能AbstractWiththeAndroidsystemcomponentintheconsumerelectronicsindustryhasbeenincreasingtomeettherequirementsoftheusersofthenetworkfunctionalityofhandheldmobileproducts,thedevelopmentof3Gwirelessnetworkfunctionisverynecessary.ThedevelopmentworkismainlyforZTEMG3732moduledevelopment。OveralltoachievetheMG3732modules5pc100developmentboardconnectedAndroid2.2systemequippedwith3Gwirelessnetworks,phonecalls,textingandtheInternet。First,thedevelopmentistobuildanAndroidsystemdevelopmentenvironment,istoinstallthecompilertoolchain,andbuildtheJavaplatform.FollowedbyMG3732module-driventhedebuggingandAndroi2.2systemmiddlelayer(theFRAMEWORKlayer)isthedevelopmentofRIL,whichisthefocusthroughoutthedevelopmentprocessmoredifficult,afteralongperiodofdebuggingandoptimization。ThenthepreparationofthePPPdial-upscriptandATcommandscript,andfinallycompiledAdroidsourceliveimgfiles,andburndevelopmentboard,thecertificationfunction。Keywords:AndroidSystem,3rdGenerationCommunication,NetworkFunctions目錄TOC\o"1—2”\h\z\u摘要 PAGEREF_Toc20736IHYPERLINK\l_Toc6265A(chǔ)bstractPAGEREF_Toc6265IIHYPERLINK\l_Toc229231緒論HYPERLINK\l_Toc83371.1系統(tǒng)概述(1)HYPERLINK\l_Toc314221.2研究的意義(1)HYPERLINK\l_Toc134801。3發(fā)展現(xiàn)狀(1)HYPERLINK\l_Toc274001。4發(fā)展趨勢(shì)(2)HYPERLINK\l_Toc90231。5本章小結(jié)(2)HYPERLINK\l_Toc44892需求分析2.1硬件需求分析(3)2。2軟件需求分析(3)HYPERLINK\l_Toc190172.3用戶需求分析(4)HYPERLINK\l_Toc159822。4可行性(5)HYPERLINK\l_Toc44942.5本章小結(jié)(6)3硬件與軟件環(huán)境概述HYPERLINK\l_Toc292133。1硬件概述(7)152263。2軟件環(huán)境概述(8)3。3本章小結(jié)(10)HYPERLINK\l_Toc242024基于Android系統(tǒng)的電話、短信功能框架的實(shí)現(xiàn)HYPERLINK\l_Toc253464。1Applicat(yī)ion層(12)HYPERLINK\l_Toc184644.2Framework層(13)4。3Nat(yī)ive層(15)HYPERLINK\l_Toc28704.4Kernel層(26)149994。5本章小結(jié)(27)HYPERLINK\l_Toc155785基于Android系統(tǒng)的3G模塊(MG3732)開發(fā)5。1RIL層的開發(fā)(28)5。2PPPD撥號(hào)上網(wǎng)(32)5.3本章小結(jié)(36)6功能驗(yàn)證HYPERLINK\l_Toc184066.1功能測(cè)試(37)6.2本章小結(jié)(39)HYPERLINK\l_Toc31055致謝(41)參考文獻(xiàn) (42)1緒論1.1系統(tǒng)概述此次開發(fā)目的為實(shí)現(xiàn)基于Android系統(tǒng)的3G網(wǎng)絡(luò)功能,即利用3G網(wǎng)絡(luò)實(shí)現(xiàn)打接電話、收發(fā)短信和無(wú)線上網(wǎng).硬件部分主要采用三星FS_S5PC100開發(fā)平臺(tái)和中興MG32723G模塊,以及一張聯(lián)通3GSIM卡.系統(tǒng)軟件部分采用Android2.2系統(tǒng),主要包括Linux內(nèi)核、UBOOT、Android文件系統(tǒng).應(yīng)用軟件部分主要包括Android2.2系統(tǒng)自帶的撥號(hào)輸入、SMS軟件及Browser軟件,主要作用用于驗(yàn)證.1。2研究的意義3G是當(dāng)今社會(huì)移動(dòng)網(wǎng)絡(luò)的主流,Android系統(tǒng)也在消費(fèi)電子產(chǎn)品中占有極大的份額(特別是手機(jī)和平板電腦),所以研究3G在Android系統(tǒng)中的實(shí)現(xiàn),具有較大的意義的。3G在Android系統(tǒng)上的實(shí)現(xiàn),可以促使Android手機(jī)和Android平板電腦實(shí)現(xiàn)寬帶上網(wǎng),大大提升上網(wǎng)的速度,并且可以進(jìn)行手機(jī)辦公、手機(jī)商務(wù)等活動(dòng)。其次手持移動(dòng)產(chǎn)品(如手機(jī)和平板電腦)的視頻通話和網(wǎng)絡(luò)電視、音樂及其他一些只能在PC上實(shí)現(xiàn)的功能,都能因此而得到圓滿的解決,這樣就極大地方便了用戶,也使基于Android系統(tǒng)的手持移動(dòng)產(chǎn)品真正達(dá)到“手持電腦"的效果.1。3發(fā)展現(xiàn)狀3G已經(jīng)成為嵌入式領(lǐng)域的一個(gè)新熱點(diǎn),國(guó)內(nèi)的移動(dòng)通信三大巨頭在08年相繼宣布要重資發(fā)展3G業(yè)務(wù),3G網(wǎng)絡(luò)的WAP站點(diǎn)更是隨處可見。特別是近幾年,越來(lái)越多的消費(fèi)者選擇了Android系統(tǒng)的手機(jī)、平板電腦和其他設(shè)備?;贏ndroid系統(tǒng)的3G網(wǎng)絡(luò)功能必定會(huì)受到極大歡迎.1。4發(fā)展趨勢(shì)近年來(lái),隨著計(jì)算機(jī)技術(shù)及相關(guān)技術(shù)的發(fā)展,嵌入式技術(shù)已成為后PC時(shí)代的主力,在通訊、網(wǎng)絡(luò)、工控、醫(yī)療、電子、物聯(lián)網(wǎng)、三網(wǎng)融合、3G等領(lǐng)域發(fā)揮著越來(lái)越重要的作用,嵌入式IT技術(shù)正在變得無(wú)處不在。如今,嵌入式IT系統(tǒng)開發(fā)無(wú)疑成為當(dāng)今最熱門、最有發(fā)展前途的領(lǐng)域之一。2010年開始,Android逐漸成為智能手機(jī)技術(shù)的主導(dǎo),與iPhone同領(lǐng)潮流,改變?nèi)藗兊纳詈凸ぷ?。并且Android系統(tǒng)開放性會(huì)使其得到更大的發(fā)展。因此,基于Android系統(tǒng)的3G系統(tǒng)會(huì)得到更大的發(fā)展。1.5本章小結(jié)本章首先對(duì)包括硬件和軟件在內(nèi)的系統(tǒng)做了一個(gè)簡(jiǎn)單介紹,然后說(shuō)明了該項(xiàng)目的意義和目的.接下來(lái)介紹了當(dāng)前基于Android系統(tǒng)的3G技術(shù)應(yīng)用這塊的發(fā)展現(xiàn)狀和未來(lái)發(fā)展趨勢(shì),說(shuō)明當(dāng)今和未來(lái)幾年,基于Android系統(tǒng)的3G技術(shù)會(huì)是一項(xiàng)非常熱門的技術(shù)。2需求分析需求分析是指開發(fā)人員要理解用戶的要求,進(jìn)行詳細(xì)的市場(chǎng)調(diào)查,確定系統(tǒng)的新目標(biāo)。為了滿足用戶的需要,回答系統(tǒng)要“做什么”的問(wèn)題[1].2.1硬件需求分析好的硬件平臺(tái)會(huì)發(fā)給軟件開發(fā)帶來(lái)許多便利,因此選擇一個(gè)合適的硬件平臺(tái)是非常重要的[2]。根據(jù)軟件開發(fā)需求和硬件平臺(tái)穩(wěn)定性、價(jià)格等一系列因素,選擇了FS_S5PC100開發(fā)板。該開發(fā)板采用三星SP5C100處理器,處理器采用64/32位內(nèi)部總線結(jié)構(gòu),運(yùn)算速度最大833MHZ,被廣泛的應(yīng)用于智能手機(jī)、平板電腦等產(chǎn)品.根據(jù)性價(jià)比,3G模塊選擇了中興MG3732模塊。MG3732模塊是基于高通QSC6270平臺(tái)開發(fā)的WCDMA3G無(wú)線通訊模塊,引腳方式為36腳郵票孔,適用于WCDMA和GSM網(wǎng)絡(luò),支持850/900/1800/1900/2100頻段。2.2軟件需求分析據(jù)調(diào)查,這幾年,系統(tǒng)源碼開放的Android系統(tǒng)已經(jīng)占用了智能手機(jī)市場(chǎng)36%的份額,并且Android系統(tǒng)還將得到更大的發(fā)展[3]。選擇了Android2。2系統(tǒng),其優(yōu)點(diǎn)如下:(1)開放性Android平臺(tái)首要優(yōu)勢(shì)就是其開放性[4]。開放的平臺(tái)允許任何移動(dòng)終端廠商加入到Android聯(lián)盟中來(lái).顯著的開放性可以使其擁有更多的開發(fā)者,隨著用戶和應(yīng)用的日益豐富,一個(gè)嶄新的平臺(tái)也將很快走向成熟[5]。(2)掙脫束縛在過(guò)去很長(zhǎng)的一段時(shí)間,特別是在歐美地區(qū),手機(jī)應(yīng)用往往受到運(yùn)營(yíng)商制約,使用什么功能接入什么網(wǎng)絡(luò),幾乎都受到運(yùn)營(yíng)商的控制。自從iPhone上市,用戶可以更加方便地連接網(wǎng)絡(luò),運(yùn)營(yíng)商的制約減少。隨著EDGE、HSDPA這些2G至3G移動(dòng)網(wǎng)絡(luò)的逐步過(guò)渡和提升,手機(jī)隨意接入網(wǎng)絡(luò)已不是運(yùn)營(yíng)商口中的笑談[6].(3)豐富的硬件由于Android的開放性,同時(shí)Android的熱火,致使眾多的硬件生產(chǎn)廠商在第一時(shí)間專門針對(duì)Android生產(chǎn)出各具特色的產(chǎn)品。(4)開發(fā)商Android平臺(tái)提供給第三方開發(fā)商一個(gè)十分寬泛、自由的環(huán)境.因此不會(huì)受到各種條條框框的阻撓,可想而知,會(huì)有無(wú)數(shù)新穎別致的軟件誕生。(5)Google應(yīng)用從搜索巨人到全面的互聯(lián)網(wǎng)滲透,Google服務(wù)如地圖、郵件、搜索等已經(jīng)成為連接用戶和互聯(lián)網(wǎng)的重要紐帶,而Android平臺(tái)手機(jī)將無(wú)縫結(jié)合這些優(yōu)秀的Google服務(wù)[7]。Android系統(tǒng)是開源的。這會(huì)為開發(fā)帶來(lái)極大的方便。在互聯(lián)網(wǎng)上,可以找到很多研究Android系統(tǒng)、研究3G網(wǎng)絡(luò)功能實(shí)現(xiàn)的心得體會(huì).這樣可以通過(guò)查找資料,縮短開發(fā)的時(shí)間,明確開發(fā)方向。2。3用戶需求分析根據(jù)調(diào)查,全球3G市場(chǎng)正在保持快速穩(wěn)定的發(fā)展,并呈現(xiàn)以下趨勢(shì):(1)3G+技術(shù)將成增長(zhǎng)主流截至2011年底,全球移動(dòng)普及率已超過(guò)76%,市場(chǎng)將逐漸趨于飽和,移動(dòng)用戶增長(zhǎng)將趨緩。中國(guó)、印度等發(fā)展中國(guó)家將是未來(lái)幾年3G用戶增長(zhǎng)的主要來(lái)源,對(duì)整個(gè)移動(dòng)通信市場(chǎng)的發(fā)展影響重大。3G+技術(shù)將成為3G市場(chǎng)主流。預(yù)計(jì)到2015年,HSPA用戶占比將由2010年的6.3%迅速上升到25。6%,成為3G用戶增長(zhǎng)的重要來(lái)源[8]。(2)中低端智能終端市場(chǎng)份額不斷提升,開放陣營(yíng)將占據(jù)主流未來(lái),智能終端的能力將呈現(xiàn)PC化,計(jì)算、處理和存儲(chǔ)能力等方面都逐漸向PC性能水平靠攏。在價(jià)格方面,智能終端將整體走低,受眾范圍不斷擴(kuò)大。依靠產(chǎn)業(yè)分工合作、標(biāo)準(zhǔn)化、通用服務(wù)獲得成本優(yōu)勢(shì)的中低端智能終端在市場(chǎng)中的份額將不斷上升[9].(3)應(yīng)用商店模式加快發(fā)展,瀏覽器成為其新載體未來(lái),移動(dòng)應(yīng)用商店將繼續(xù)處于快速發(fā)展階段.隨著智能終端種類和行業(yè)應(yīng)用的增加,未來(lái)應(yīng)用商店應(yīng)用范圍將持續(xù)擴(kuò)大,成為覆蓋手機(jī)、平板電腦、電子閱讀器、筆記本電腦等移動(dòng)終端設(shè)備的通用應(yīng)用下載平臺(tái)[10]。顯而易見,基于Android系統(tǒng)的3G網(wǎng)絡(luò)功能,會(huì)是一個(gè)非常熱門的技術(shù),并且擁有一個(gè)巨大的市場(chǎng).越來(lái)越多的用戶將會(huì)選擇Android系統(tǒng)的移動(dòng)終端設(shè)備,所以方便、快速、便宜,會(huì)是用戶基本的選擇條件。方便,即是攜帶方便,使用方便。3G模塊的成品只有U盤大小,可以隨身攜帶,使用時(shí)只需插入一張3G電話卡,連接上手機(jī)或是平板電腦就能直接使用??焖?,即是上網(wǎng)速度快。MG3732模塊的信號(hào)接收能力強(qiáng),而且接收信號(hào)穩(wěn)定。便宜,即是價(jià)格便宜.MG3732模塊在同類型的3G模塊中有明顯的價(jià)格優(yōu)勢(shì)。綜上所述,此項(xiàng)目今后必會(huì)受到用戶的追捧,并且具有巨大的市場(chǎng)優(yōu)勢(shì)。2。4可行性2.4.1技術(shù)可行性基于Android的源代碼的開放,使得在對(duì)Android做系統(tǒng)開發(fā)的時(shí)候可以很好的通過(guò)查看源代碼來(lái)針對(duì)專門的問(wèn)題進(jìn)行解決[11].三星SP5C100的開發(fā)板有豐富的資源,在出現(xiàn)問(wèn)題的時(shí)候在互聯(lián)網(wǎng)中的各大論壇中都能夠找到相應(yīng)的解決方案。所以通過(guò)學(xué)習(xí),查找相關(guān)的資料,開發(fā)本系統(tǒng)在技術(shù)方面沒有任何的問(wèn)題。2。4.2經(jīng)濟(jì)可行性經(jīng)濟(jì)可行性就是對(duì)開發(fā)成本進(jìn)行分析,估計(jì)開發(fā)成本是否會(huì)超過(guò)項(xiàng)目的預(yù)期利潤(rùn)[7]。在這個(gè)系統(tǒng)的開發(fā)過(guò)程中,需要的只是開發(fā)板的購(gòu)買,而且開發(fā)板是可以多次使用的,對(duì)于Android系統(tǒng)是完全自由的,不需要付出任何的代價(jià)。當(dāng)項(xiàng)目結(jié)束的時(shí)候,可以直接把系統(tǒng)拿過(guò)去使用,或者針對(duì)相關(guān)的硬件進(jìn)行相應(yīng)的二次開發(fā),所獲得的效益是客觀的.基于以上兩點(diǎn)的分析,本次系統(tǒng)開發(fā)是很有價(jià)值的.2.5本章小結(jié)通過(guò)對(duì)軟件和硬件的需求分析,說(shuō)明所選擇的硬件平臺(tái)是非常合適的。加之Android系統(tǒng)在未來(lái)幾年也是一個(gè)非常熱門的方向,3G市場(chǎng)更是穩(wěn)定快速發(fā)展,所以此次開發(fā)的項(xiàng)目,不僅緊靠市場(chǎng)的需求,而且在未來(lái)的幾年內(nèi)都是一個(gè)熱門的方向。3硬件與軟件環(huán)境概述3。1硬件概述開發(fā)板平臺(tái)采用了FS_S5PC100開發(fā)平臺(tái),該開發(fā)平臺(tái)用三星公司先進(jìn)的基于Cortex—A8內(nèi)核的S5PC100處理器設(shè)計(jì)而成??梢赃m應(yīng)Android、Linux、Wince等智能操作系統(tǒng)的發(fā)展及市場(chǎng)需求[12].S5PC100處理器采用了64/32位的內(nèi)部總線結(jié)構(gòu),運(yùn)算速度最大833MHZ[13]。包括強(qiáng)大的硬件加速器,如:動(dòng)態(tài)視頻處理、顯示控制和縮放。支持多種格式的硬件編解碼:MPEF-1/2/4、H263/H264等。其視頻解碼能力很強(qiáng)大并且省電,編解碼能力達(dá)到720p@30fps(1280x720),支持電視輸出(NTSC/PAL/HDMI)。支持2D/3D加速.本處理器廣泛應(yīng)用于智能手機(jī)、平板電腦等產(chǎn)品。FS_S5PC100平臺(tái)的外觀,如圖3-1所示。圖3—1FS_S5PC100的外觀圖3.1.23G模塊3G模塊采用的是中興MG3732模塊,適用于WCDMA和GSM網(wǎng)絡(luò),支持850/900/1800/1900/2100頻段[14]。ZTEMG37323G模塊外觀,如圖3—2所示。圖3-2MG3732外觀圖3.2軟件環(huán)境概述3。2.1交叉開發(fā)環(huán)境的搭建(1)安裝交叉編譯工具鏈=1\*GB3①解壓“Linux—Android\toolchain”目錄下的“arm—none—eabi-4.2。2.tgz到根“/usr/local"目錄下,在“/usr/local”目錄下會(huì)生成“arm”目錄。執(zhí)行命令:#tarzxvfarm-none-eabi-4。2.2.tgz=2\*GB3②修改環(huán)境變量“PATH”?!鐂udovim/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保存退出后執(zhí)行:source/etc/environment這樣修改的環(huán)境變量會(huì)立即生效。(2)安裝JDK=1\*GB3①安裝“Linux-Android\toolchain”目錄下的“jdk.bin”,jdk.bin是Jdk1.5,Jdk1。5是編譯Android2。1必須的工具。把“jdk.bin”拷貝到“/usr"目錄下,然后執(zhí)行,按照提示安裝即可.#sudo./jdk。bin=2\*GB3②安裝結(jié)束后還要配置一下環(huán)境變量?!?sudovim/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:/usr/jdk1.5.0_21/bin保存退出后執(zhí)行:source/etc/environment3.2。2搭建并配置Java環(huán)境(1)安裝依賴包$sudoapt-getinstallbuild-essential$sudoapt-getinstalllibncurses5-dev$sudoapt-getinstallx11proto-core-dev$sudoapt-getinstallzlib1g-dev$sudoapt—getinstalllibx11-dev$sudoapt-getinstallgperf$sudoapt—getinstallbison$sudoapt—getinstallflex(2)搭建Java編譯環(huán)境=1\*GB3①安裝JDK下載jdk(JDK_1_5.BIN)并執(zhí)行如下命令:$sudomkdir/usr/java$suodmvJDK_1_5。BIN/usr/java$sudochmod+xJDK_1_5.BIN$sudo。/JDK_1_5.BIN在執(zhí)行以上命令后生成license文件,按q然后根據(jù)提示輸入yes即可開始安裝。=2\*GB3②配置java環(huán)境$sudogedit~/.bashrc在最后面加上:exportJAVA_HOME=/usr/java/jdk1.5.0_21//系統(tǒng)所用的jdk目錄exportPATH=$JAVA_HOME/bin:$PATHexportANDROID_JAVA_HOME=$JAVA_HOME3。3本章小結(jié)本章主要介紹了開發(fā)系統(tǒng)中所需要的硬件及其參數(shù),以及如何搭建好開發(fā)平臺(tái).良好的開發(fā)平臺(tái)為一個(gè)系統(tǒng)開發(fā)不僅節(jié)約了開發(fā)成本,同時(shí)也縮短了開發(fā)周期[15]。4基于Android系統(tǒng)的電話、短信功能框架的實(shí)現(xiàn)基于Android系統(tǒng)的3G網(wǎng)絡(luò)電話、短信框架分為如下四個(gè)部分:(1)Javaapplication層;(2)Javaframework層;(3)Nativeframework層;(4)Kernel層。第一層和第二層都屬于Android應(yīng)用層的代碼使用的是JAVA語(yǔ)言開發(fā),在此定義為Java-ril。第三層屬于JNI層代碼使用的是C/C++語(yǔ)言開發(fā),從圖4-1中可知,對(duì)于硬件的具體操作代碼在第三層,一般情況下,Android框架代碼中使用JNI的方式完成Java和C/C++代碼的相互調(diào)用,再使用binder封裝實(shí)現(xiàn)進(jìn)程間通訊.電話框架沒有使用這種方式,而是使用socket的方式,完成進(jìn)程間通訊,rild進(jìn)程作為服務(wù)器端,Java層代碼作為客戶端把用戶的數(shù)據(jù)發(fā)送給rild進(jìn)程去處理,3G的網(wǎng)絡(luò)功能框架圖如圖4-1所示。圖4—13G網(wǎng)絡(luò)功能框架圖4。1Application層4.1.1電話部分(1)通話部分撥打電話時(shí),首先會(huì)調(diào)用onClick()方法,這個(gè)方法會(huì)通過(guò)myEditText.getText().toSTring()方法獲取所撥打的電話號(hào)碼,并會(huì)調(diào)用isPhoneNumberValid()方法判斷這個(gè)電話號(hào)碼是否符合格式,如果符合格式,則會(huì)觸發(fā)Outgoingcallbroadcaster.java中的oncreat(yī)e方法,如果號(hào)碼是緊急號(hào)碼則直接以startactivity方式處理。若不是緊急號(hào)碼,則將該號(hào)碼以sendorderedbroadcast(outgoingcallreceiver)方式處理,由OutgoingcallReceiver內(nèi)部類去接收(doReceive)此號(hào)碼,并在doreceive中啟動(dòng)InCallScreen類。IncallScreen類中,若第一次進(jìn)入則調(diào)用oncreat(yī)e函數(shù);若通話中再撥打電話則調(diào)用onnewintent函數(shù).oncreat(yī)e函數(shù)中會(huì)調(diào)用internalResolveIntent方法--—〉調(diào)用placecall函數(shù)(建立一個(gè)我們需要撥打電話的Call)-—〉接著調(diào)用Phoneutil.java的placecall函數(shù)(傳入phone對(duì)象和number參數(shù)),里面調(diào)用Connect=phone。dial(number)。phone類是個(gè)接口類,其中聲明了dial這個(gè)方法,具體的結(jié)構(gòu)如箭頭所示:Phone(interface)〈-—-implements-—PhoneBase(abstractclass)<extends--——CDMAPhone,GSMPhone,SIPPhoneBase.其中GSMPhone與CDMAPhone都是由PhoneFactory來(lái)獲取實(shí)例的.很明顯這里是GSMPhone類在進(jìn)行dial操作。(2)短信部分發(fā)送短信時(shí),首先會(huì)通過(guò)mNumber。getText().toString()和mMessage。getText().toString()這兩個(gè)方法獲取短信號(hào)碼和內(nèi)容,然后會(huì)觸發(fā)SmsManager.java中的sendTextMessage方法。該方法中有四個(gè)參數(shù),分別是StringdesinationAddress、StringscAddrsss,Stringtext、PendingIntentsentIntent、PendingIntentdeliveryIntent,也就是收件人號(hào)碼、發(fā)件人號(hào)碼、信息內(nèi)容、發(fā)送是否成功回執(zhí)、接收是否成功回執(zhí)。sendTextMessage方法是通過(guò)AIDL的方式,獲得服務(wù),再調(diào)用這個(gè)服務(wù)對(duì)象的sendText()方法.這個(gè)服務(wù)對(duì)象繼承了ISms。Stub,所以SmsManager。sendTextMessage()方法調(diào)用了IccSmsInterfaceManager對(duì)象的sendText()方法。IccSmsInterfaceManager是一個(gè)繼承了ISms.Stub的抽象類,IccSmsInterfaceManager對(duì)象的sendText()方法調(diào)用了SMSDispatcher類的sendText()方法,這個(gè)方法又調(diào)用了GsmSMSDispat(yī)cher。java中的sendSms()方法。sendSms()方法調(diào)用了CommandsInterface接口,CommandsInterface是一個(gè)特殊的接口,與RIL.java相關(guān),于是進(jìn)入了Framework層。4。2Framework層(1)通話部分進(jìn)入GSMPhone的dial方法:其中有個(gè)mCT(GsmCallTracker類)。dial方法,深入其中有:cm.dial(pendingMO。address,clirMode,obtainCompleteMessage());cm為CommandsInterface(interface接口)的對(duì)象.因?yàn)椋襂L。java(在android/internal/telephony目錄中)extendsBaseCommandsimplementsCommandsInterface接口,所以cm.dial就等同于RIL.dial。RIL.dial()方法中,創(chuàng)建RILRequest對(duì)象,并將此RILRequest對(duì)象放入messagequeue中。RIL中有個(gè)內(nèi)部類叫RILSender:classRILSenderextendsHandlerimplementsRunnable,查看其handleMessage方法的核心代碼如下:caseEVENT_SEND:s。getOutputStream()。write(dat(yī)aLength);s.getOutputStream().write(data);s為mSocket,而文件中mSocket為LocalSocket對(duì)象,而在實(shí)例化中。s=newLocalSocket();l=newLocalSocketAddress(SOCKET_NAME_RIL,LocalSocketAddress.Namespace.RESERVED);s.connect(l);可以看到LocalSocket與SOCKET_NAME_RIL打上了交道,查看其SOCKET_NAME_RIL=”rild",可以得知s.getOutputStream()。write(data)是往rild的socket寫數(shù)據(jù)。其實(shí)RILSender和RILReceiver都是共用的一個(gè)socket。也可以知道RIL中有RILD這個(gè)守護(hù)進(jìn)程(負(fù)責(zé)控制RIL串口).這里總結(jié)下發(fā)送步驟:=1\*GB3①創(chuàng)建RILRequest,將請(qǐng)求數(shù)據(jù)及Msg放入到RILRequest中;=2\*GB3②利用Send方法(參數(shù):EVENT_SEND)將RILRequest放入到消息隊(duì)列中;=3\*GB3③RILSender類獲取此消息,把RILRequest通過(guò)SOCKET方式發(fā)送到Rild并保存在mRequest中,以便消息的返回。(2)短信部分進(jìn)入Framework層后,主要靠CommandsInterface對(duì)象的sendSMS()方法來(lái)做事情,sendSMS()方法源碼如下:public

void

sendSMS

(String

smscPDU,

String

pdu,

Message

result)

RILRequest

rr=RILRequest。obtain(RIL_REQUEST_SEND_SMS,

result);rr。mp。writeInt(2);rr.mp。writeString(smscPDU);rr.mp。writeString(pdu);if

(RILJ_LOGD)riljLog(rr.serialString()

+

">

+

requestToString(rr.mRequest));send(rr);}

在sendSMS()方法中,把上面?zhèn)飨聛?lái)的短信相關(guān)的數(shù)據(jù)寫入到了Parcel中,協(xié)同一個(gè)特殊的RILRequest寫入到Socket的輸出流中,進(jìn)而將數(shù)據(jù)傳遞到RIL層.4.3Native層RIL(RadioInterfaceLayer)層,主要是基于AT命令的操作,也就是把上層的傳遞下來(lái)的數(shù)據(jù)包(電話數(shù)據(jù)或是短信數(shù)據(jù))分解,并轉(zhuǎn)化為可以讓3G模塊識(shí)別的AT命令,最后把3G模塊處理完數(shù)據(jù)返回的response解析,再傳遞回上層。4。3.1AndroidRIL概念A(yù)ndroidRIL是基于telephony服務(wù)和raido硬件層的抽象層,Android的Rild庫(kù)介于硬件抽象層HAL接口與基于Modem之間,它同樣提供了語(yǔ)音、數(shù)據(jù)、短信、SIM卡管理以及STK應(yīng)用的功能,實(shí)現(xiàn)思路跟微軟的RIL有異曲同工之妙,也是把標(biāo)準(zhǔn)的GSM27.007中常用的如Dial這些做主動(dòng)請(qǐng)求的操作稱之為request,一共75個(gè);另外一類信息是GSM模塊主動(dòng)上報(bào)的例如信號(hào)強(qiáng)度、基站信息等,稱之為unsolicitedresponse,一共17個(gè)。其開發(fā)模式是跟微軟RIL開發(fā)差不多,需要針對(duì)不同的GSM模塊進(jìn)行不同的GSM驅(qū)動(dòng)開發(fā),公用的部分google已經(jīng)做好了,特定的部分需要用戶自己去定制,這樣做可以大大地提高開發(fā)效率.以下是RIL交互圖,如圖4-2所示.圖4-2RIL交互圖4.3.2本地代碼RIL支持的本地代碼包括RIL庫(kù)和守護(hù)進(jìn)程.hardware/ril/includehardware/ril/librilhardware/ril/rildhardware/ril/reference—ril編譯結(jié)果是:/system/bin/rild:守護(hù)進(jìn)程/system/lib/libril。so:RIL的庫(kù)/system/lib/libreference-ril。so:RIL參考庫(kù)Android的RIL驅(qū)動(dòng)模塊,在hardware/ril目錄下,一共分rild,libril。so以及l(fā)ibrefrence_ril。so三個(gè)部分,另外radiooptions可供自動(dòng)或手動(dòng)調(diào)試使用.它們都依賴于include目錄中ril。h頭文件.目前cupcake分支上帶的是gsm的支持,另有一個(gè)cdma分支,3G通信模塊MG3732用到的是gsm驅(qū)動(dòng)。rild與libril.so以及l(fā)ibrefrence_ril。so的關(guān)系=1\*GB3①rild僅以main函數(shù)作為整個(gè)RIL層的入口點(diǎn),負(fù)責(zé)完成初始化。在rild.c文件中,將完成RIL的加載過(guò)程,它會(huì)執(zhí)行如下操作:首先動(dòng)態(tài)加載VendorRIL的。so文件;其次執(zhí)行RIL_startEventLoop()開啟消息隊(duì)列以進(jìn)行事件監(jiān)聽;最后通過(guò)執(zhí)行VendorRIL的rilInit()方法來(lái)進(jìn)行VendorRIL與libril的關(guān)系建立。=2\*GB3②libril.so與rild結(jié)合緊密,是其共享庫(kù)。編譯時(shí)就已經(jīng)建立了這一關(guān)系(其實(shí)也可以編譯成可執(zhí)行程序,作為守護(hù)進(jìn)程運(yùn)行)。組成部分為ril.cpp和ril_event。cpp。libril.so駐留在rild這一守護(hù)進(jìn)程中,主要完成同上層通信的工作,接受RIL請(qǐng)求并傳遞給librefrence_ril.so,同時(shí)把來(lái)自librefrence_ril.so的反饋回傳給調(diào)用進(jìn)程。編譯時(shí),libril被鏈入rild,它為rild提供了event處理功能,還提供了在rild與VendorRIL之間傳遞請(qǐng)求和響應(yīng)消息的能力。Libril提供的主要功能分布在兩個(gè)主要方法中:一個(gè)是RIL_startEventLoop()方法;另一個(gè)是RIL_register()方法。RIL_startEventLoop()方法所提供的功能就是啟用eventLoop線程,執(zhí)行RIL消息隊(duì)列;RIL_register()方法的功能是啟動(dòng)名為rild的監(jiān)聽端口。=3\*GB3③librefrence_ril.sorild通過(guò)手動(dòng)的dlopen方式加載,結(jié)合稍微松散,這主要是因?yàn)閘ibrefrence.so負(fù)責(zé)跟Modem硬件通信。這樣做更方便替換或修改加載的方式,以適配更多種類的Modem。它將來(lái)自libril。so的請(qǐng)求轉(zhuǎn)換為AT命令,同時(shí)監(jiān)控Modem的反饋信息,并傳遞回libril.so。在初始化時(shí),rild通過(guò)符號(hào)RIL_Init獲取一組函數(shù)指針并以此與之建立聯(lián)系。reference—ril會(huì)接收調(diào)用者傳來(lái)的參數(shù),參數(shù)內(nèi)容為與radio的通信方式。如通過(guò)串口連接radio,那么參數(shù)形式為:-d/dev/ttySx,如圖4—3所示.圖4-3Rild、Libril。so及Librefrence。so關(guān)系圖=4\*GB3④radiootionsradiooptiongs通過(guò)獲取啟動(dòng)參數(shù),利用socket與rild通信,其作用是通過(guò)串口將一些與radio相關(guān)的參數(shù)直接傳給rild??捎糜谡{(diào)試時(shí)配置Modem參數(shù)的配置.(2)初始化流程rild是一個(gè)守護(hù)進(jìn)程,在這里定義宏RIL_SHLIB.執(zhí)行的過(guò)程為:獲取參數(shù)—〉打開功能庫(kù)->建立事件循環(huán)—〉執(zhí)行RIL_Init—>RIL_register。主入口是rild.c中的main函數(shù),主要完成三個(gè)任務(wù):=1\*GB3①任務(wù)一:開啟libril。so中的event機(jī)制.在RIL_startEventLoop中,最核心的是由多路I/O驅(qū)動(dòng)的消息循環(huán)。=2\*GB3②任務(wù)二:初始化librefrence_ril。so。也就是跟硬件或模擬硬件modem通信的部分(后面統(tǒng)一稱硬件),通過(guò)RIL_Init函數(shù)完成。=3\*GB3③任務(wù)三:通過(guò)RIL_Init獲取一組函數(shù)指針RIL_RadioFunctions,并通過(guò)RIL_register完成注冊(cè),并打開接受上層命令的socket通道。初始化流程分析如下:=1\*GB3①任務(wù)一:也就是RIL_startEventLoop函數(shù)。RIL_startEventLoop在ril.cpp中實(shí)現(xiàn),它的主要目的是通過(guò)pthread_create(&s_tid_dispatch,&attr,eventLoop,NULL)建立一個(gè)dispatch線程,入口點(diǎn)在eventLoop。而eventLoop中,會(huì)調(diào)用ril_event。cpp中的ril_event_loop()函數(shù),建立起消息(event)隊(duì)列機(jī)制.這一消息隊(duì)列的機(jī)制討論如下:voidril_event_init();//初始化消息隊(duì)列voidril_event_set(structril_event*ev,intfd,boolpersist,ril_event_cbfunc,void*param);//設(shè)置消息隊(duì)列相關(guān)的屬性voidril_event_add(structril_event*ev);//增加消息voidril_timer_add(structril_event*ev,structtimeval*tv);//增加時(shí)間計(jì)時(shí)器voidril_event_del(structril_event*ev);//刪除消息voidril_event_loop();//通過(guò)多路復(fù)用I/O機(jī)制循環(huán)調(diào)用消息隊(duì)列structril_event{structril_event*next;//下一個(gè)消息structril_event*prev;//前一個(gè)消息intfd;//事件相關(guān)設(shè)備句柄。例如對(duì)于串口數(shù)據(jù)事件,fd就是相關(guān)串口的設(shè)備句柄boolpersist;//如果是保持的,則不從wat(yī)ch_list中刪除structtimevaltimeout;ril_event_cbfunc;//回調(diào)事件處理函數(shù)void*param;//回調(diào)時(shí)參數(shù)};每個(gè)ril_event結(jié)構(gòu),與一個(gè)fd句柄綁定(可以是文件、socket、管道等),并且?guī)б粋€(gè)func指針去執(zhí)行指定的操作。具體流程是:ril_event_init完成后,通過(guò)ril_event_set來(lái)配置一個(gè)新ril_event,并通過(guò)ril_event_add加入到隊(duì)列之中(實(shí)際通常用rilEventAddWakeup來(lái)添加)。add會(huì)把隊(duì)列里所有ril_event的fd,放入一個(gè)fd集合readFds中。這樣ril_event_loop能通過(guò)一個(gè)多路復(fù)用I/O的機(jī)制(select)來(lái)等待這些fd.如果任何一個(gè)fd有數(shù)據(jù)寫入,則進(jìn)入分析流程processTimeouts(),processReadReadies(&rfds,n)和firePending()(后面會(huì)詳細(xì)分析這些流程)。另外可以看到,在進(jìn)入ril_event_loop之前,已經(jīng)通過(guò)pipe機(jī)制掛入了s_wakeupfd_event.目的是為了可以在一些情況下能夠內(nèi)部喚醒ril_event_loop的多路復(fù)用阻塞,比如一些帶timeout的命令到期的時(shí)候。至此第一個(gè)任務(wù)分析完畢,這樣便建立起了基于event隊(duì)列的消息循環(huán),稍后便可以接受上層發(fā)來(lái)的的請(qǐng)求了(上層請(qǐng)求的event對(duì)象建立,在第三個(gè)任務(wù)中)。=2\*GB3②任務(wù)二:這個(gè)任務(wù)的入口是RIL_Init,RIL_Initreference—ril。c首先通過(guò)參數(shù)獲取(p/d/s)硬件接口的設(shè)備文件或模擬硬件接口的socket。接下來(lái)便新創(chuàng)建一個(gè)線程pthread_create(&s_tid_mainloop,&attr,mainLoop,NULL)繼續(xù)初始化,即mainLoop。mainLoop的主要任務(wù)是建立起與硬件的通信,然后通過(guò)read方法阻塞等待硬件的主動(dòng)上報(bào)或響應(yīng)。在注冊(cè)一些基礎(chǔ)回調(diào)(timeout、readerclose)后,mainLoop首先打開硬件設(shè)備文件,建立起與硬件的通信,s_device_path和s_port是前面獲取的設(shè)備路徑參數(shù),將其打開(兩者可以同時(shí)打開并擁有各自的reader,這里也很容易添加雙卡雙待等支持)。接下來(lái)通過(guò)at_open(fd,onUnsolicited)函數(shù)建立起這一設(shè)備文件上的reader等待循環(huán),這也是通過(guò)新建一個(gè)線程完成,ret=pthread_create(&s_tid_reader,&at(yī)tr,readerLoop,&attr),入口點(diǎn)為readerLoop。AT命令都是以/r/n或/n/r的換行符來(lái)作為分隔符的,所以readerLoop是line驅(qū)動(dòng)的,除非出錯(cuò)、超時(shí)等,否則會(huì)讀到一行完整的響應(yīng)或主動(dòng)上報(bào),才會(huì)返回.這個(gè)循環(huán)啟動(dòng)以后,基本的AT響應(yīng)機(jī)制就已經(jīng)建立了起來(lái)。對(duì)它的具體分析,包括at(yī)_open中掛接的ATUnsolHandler,放到后面的response分析里去。SMS(短信)的收發(fā)if(isSMSUnsolicited(line))判斷也在readerLoop中。有了響應(yīng)的機(jī)制(當(dāng)然,能與硬件通信也已經(jīng)可以發(fā)請(qǐng)求了),通過(guò)RIL_requestTimedCallback(initializeCallback,NULL,&TIMEVAL_0),跑到initializeCallback中,執(zhí)行一些以AT命令為主的Modem初始化命令。關(guān)于AT命令發(fā)送的流程,詳見request分析.這里可以看到,主要完成一些參數(shù)配置,以及網(wǎng)絡(luò)狀態(tài)的檢查等.硬件已經(jīng)可以訪問(wèn)了.=3\*GB3③任務(wù)三:由RIL_Init的返回值funcs=rilInit(&s_rilEnv,argc,rilArgv)開始,這是一個(gè)RIL_RadioFunctions結(jié)構(gòu)的指針.typedefstruct{intversion;/*settoRIL_VERSION*/RIL_RequestFunconRequest;RIL_RadioStat(yī)eRequestonStateRequest;RIL_Supportssupports;RIL_CancelonCancel;RIL_GetVersiongetVersion;}RIL_RadioFunctions;其中最重要的是onRequest域,來(lái)自上層的請(qǐng)求都由這個(gè)函數(shù)進(jìn)行映射后轉(zhuǎn)換成對(duì)應(yīng)的AT命令并發(fā)給硬件。Rild通過(guò)RIL_register注冊(cè)這一指針.RIL_register中要完成的另外一個(gè)任務(wù),就是打開跟上層通信的socket接口(s_fdListen是主接口,s_fdDebug供調(diào)試時(shí)使用)。然后將這兩個(gè)socket接口使用任務(wù)一中實(shí)現(xiàn)的機(jī)制進(jìn)行注冊(cè)(僅列出s_fdListen)。ril_event_set(&s_listen_event,s_fdListen,false,listenCallback,NULL);rilEventAddWakeup(&s_listen_event);這樣將兩個(gè)socket加到任務(wù)一中建立起來(lái)多路復(fù)用I/O的檢查句柄集合中,一旦有上層來(lái)的(調(diào)試)請(qǐng)求,event機(jī)制便能響應(yīng)處理了.(3)Request流程對(duì)Dial而言,CommandInfo包含了所有的AT命令。所以CommandInfo結(jié)構(gòu)應(yīng)該這樣進(jìn)行初始化:{RIL_REQUEST_DIAL,dispatchDial,responseVoid}這里執(zhí)行dispat(yī)chFunction,也就是dispatchDial這一函數(shù)。其實(shí)有很多種類的dispatchfunction,比如dispatchVoid,dispat(yī)chStrings,dispat(yī)chSIM_IO等等,這些函數(shù)的區(qū)別在于解析傳入的參數(shù)形式,void就是不帶參數(shù)的,Strings是以string[]做參數(shù),又如Dial等,有自己的參數(shù)解析方式,以此類推.Request號(hào)和參數(shù)具備后,就可以進(jìn)行具體的request函數(shù)調(diào)用了。利用s_callbacks。onRequest(pRI—〉pCI—〉requestNumber,xxx,len,pRI)完成這一操作。s_callbacks的作用是獲取前文中提到的來(lái)自libreference-ril的RIL_RadioFunctions結(jié)構(gòu)指針.request請(qǐng)求在這里轉(zhuǎn)入底層的libreference-ril處理,handler是reference-ril.c中的onRequest。onRequest進(jìn)行一個(gè)簡(jiǎn)單的switch分發(fā)。RIL_REQUEST_DIAL流程是:onRequest-->requestDial--〉at_send_command——>at_send_command_full——>at(yī)_send_command_full_nolock--〉writeline。requestDial中將命令和參數(shù)轉(zhuǎn)換成對(duì)應(yīng)的AT命令,調(diào)用公共sendcommand接口at_send_command。除了這個(gè)接口之外,還有如下命令:at_send_command_singleline、at_send_command_sms、at(yī)_send_command_multiline等,這是根據(jù)at返回值,以及發(fā)命令流程的類型來(lái)區(qū)別的。比如at_csq類型,需要at_send_command_singleline,而發(fā)送短信,因?yàn)橛校穑颍飉pt提示符“>”,傳送數(shù)據(jù)、結(jié)束符等一系列操作,需要專門用at_send_command_sms來(lái)實(shí)現(xiàn).然后執(zhí)行at(yī)_send_command_full,前面幾個(gè)接口都會(huì)最終到這里,再通過(guò)一個(gè)互斥的at(yī)_send_command_full_nolock調(diào)用,完成最終的寫出操作,在writeline中,寫出到初始化時(shí)打開的設(shè)備中。前面提到RILSender將請(qǐng)求呼叫的字節(jié)流傳給了rild的socket.這時(shí),ril_event_loop方法的select檢測(cè)到了有請(qǐng)求的信號(hào),導(dǎo)致被掛入pending_list,并執(zhí)行ev->func(ev—>fd,0,ev->param),即調(diào)用stat(yī)icvoidlistenCallback(intfd,shortflags,void*param)方法。在該方法中,首先通過(guò)accept()接收上層的socket,然后通過(guò)record_stream_new()建立一個(gè)record_stream,并聯(lián)系上s_fdCommand,到目前為止s_fdCommand已經(jīng)有了上層數(shù)據(jù),于是調(diào)用processCommandsCallback(intfd,shortflags,void*param)方法,processCommandsCallback會(huì)保證收到一個(gè)完整的request(由recordStream決定),并調(diào)用processCommandBuffer方法,這是命令的下發(fā)流程。每個(gè)命令以RequestInfo的形式存在(實(shí)例:pRI),并且將pRI掛在了s_pendingRequests中,并執(zhí)行dispatchFunction方法,即dispatchDial.dispatchDial方法中,里面核心代碼如下:s_callbacks。onRequest(pRI->pCI-〉requestNumber,&dial,sizeOfDial,pRI);而s_callbacks是前文提到說(shuō)的RIL_RadioFunctions結(jié)構(gòu)的指針,RIL_RadioFunction中有個(gè)重要的域是onRequest,詳情可參照reference-ril.c文件中onrequest方法的實(shí)現(xiàn)。onrequest中主要是用switch..case判斷發(fā)送過(guò)來(lái)的命令是什么(如:撥打電話、SIM卡狀態(tài)、掛斷電話、等待狀態(tài)等),這里當(dāng)然是撥打電話。大致的流程為:onrequest--〉requestDial——>at_send_command—->at_send_command_full-—〉at_send_command_full_nolock.nolock方法中關(guān)鍵性的一句為writeLine(。..).查看writeline方法,written=write(s_fd,s+cur,len—cur)。能夠看得出是往硬件中寫入命令。其實(shí)質(zhì)都是at_send_command_full方法,執(zhí)行write之后便等待硬件那邊給過(guò)來(lái)的響應(yīng),于是進(jìn)入response階段。(4)Response流程前文對(duì)Request的分析,中止在at_send_command_full_nolock里的writeline操作.因?yàn)檫@里完成命令寫出到硬件設(shè)備的操作,接下來(lái)就是等待硬件響應(yīng),也就是response過(guò)程。后繼分析從此處開始。response信息的獲取,是初始化分析中提到的readerLoop中,由readline函數(shù)以“行”為單位接收上來(lái).AT的response有兩種,一是主動(dòng)上報(bào)的,比如網(wǎng)絡(luò)狀態(tài)、短信、來(lái)電等都不需要經(jīng)過(guò)請(qǐng)求,有一個(gè)unsolicited詞語(yǔ)專門描述;另一種才是真正意義上的response,也就是命令的響應(yīng)。所有的行,首先經(jīng)過(guò)sms的自動(dòng)上報(bào)篩選。因?yàn)槎绦诺腁T處理通常比較麻煩,無(wú)論收發(fā)都單獨(dú)列出。這里是因?yàn)橐磿r(shí)處理這條短信消息(兩行、標(biāo)志+pdu),而不能拆開處理。處理函數(shù)為onUnsolicited(由s_unsolHandler指向)。除sms特例外,所有的line都要經(jīng)過(guò)processLine,該處理流程如下:nocmd—-->handleUnsolicited//主動(dòng)上報(bào)isFinalResponseSuccess-—-〉handleFinalResponse//成功,標(biāo)準(zhǔn)響應(yīng)isFinalResponseError--—>handleFinalResponse//失敗,標(biāo)準(zhǔn)響應(yīng)get'>'——->sendsmspdu//收到>符號(hào),發(fā)送sms數(shù)據(jù)再繼續(xù)等待響應(yīng)switchs_type-——>具體響應(yīng)//命令有具體的響應(yīng)信息需要對(duì)應(yīng)分析需要關(guān)注的是handleUnsolicited自動(dòng)上報(bào)功能以及switchs_type具體響應(yīng)信息。具體響應(yīng)需要handleFinalResponse這樣的標(biāo)準(zhǔn)響應(yīng)來(lái)最終完成。=1\*GB3①onUnsolicite(主動(dòng)上報(bào)響應(yīng))stat(yī)icvoidonUnsolicited(constchar*s,constchar*sms_pdu);短信的AT設(shè)計(jì)難度較高。response的主要的解析過(guò)程由at_tok。c中的函數(shù)完成,其本質(zhì)就是字符串按塊解析,具體的解析方式由每條命令或上報(bào)信息自行決定.此處不再詳述。onUnsolicited只解析出頭部(一般是+XXXX的形式),然后按類型決定下一步操作,操作為RIL_onUnsolicitedResponse和RIL_requestTimedCallback兩種。第一,RIL_onUnsolicitedResponse:solicite的信息直接返回給上層。通過(guò)Parcel傳遞,將RESPONSE_(tái)UNSOLICITED,unsolResponse(request號(hào))先寫入Parcel,然后通過(guò)s_unsolResponses數(shù)組,查找到對(duì)應(yīng)的responseFunction完成進(jìn)一步的的解析,存入Parcel中。最終通過(guò)sendResponse將其傳遞回原進(jìn)程.流程如下:sendResponse—->sendResponseRaw-->blockingWrite-->writetos_fdCommand(前面建立起來(lái)的和上層框架的socket連接)。第二,RIL_requestTimedCallback:通過(guò)event機(jī)制實(shí)現(xiàn)的timer機(jī)制,回調(diào)對(duì)應(yīng)的內(nèi)部處理函數(shù).通過(guò)internalRequestTimedCallback將回調(diào)添加到event循環(huán),最終完成callback上掛的函數(shù)的回調(diào)。比如pollSIMStat(yī)e,onPDPContextListChanged等回調(diào),不用返回上層,內(nèi)部處理就可以。=2\*GB3②switchs_type(命令的具體響應(yīng))及handleFinalResponse(標(biāo)準(zhǔn)響應(yīng))命令的類型(s_type)在sendcommand時(shí)設(shè)置。有NO_RESULT、NUMERIC、SINGLELINE、MULTILINE幾種,供不同的AT使用.比如AT+CSQ是singleline,返回at(yī)+csq=xx,xx,再加一行OK,比如一些設(shè)置命令,就是no_result,只有一行OK或ERROR.這幾個(gè)類型的解析都很相似,通過(guò)一定的判斷(如比較AT頭標(biāo)記等),如果是對(duì)應(yīng)的響應(yīng),就通過(guò)addIntermediate掛到一個(gè)臨時(shí)結(jié)果。sp_response—>p_intermediates隊(duì)列中,如果不是對(duì)應(yīng)響應(yīng),則其應(yīng)該是穿插其中的自動(dòng)上報(bào),用onUnsolicite來(lái)處理。具體響應(yīng)只起一個(gè)獲取響應(yīng)信息到臨時(shí)結(jié)果、等待具體分析的作用。無(wú)論有無(wú)具體響應(yīng),最終都會(huì)以標(biāo)準(zhǔn)響應(yīng)handleFinalResponse來(lái)處理,也就是接受到OK,ERROR等標(biāo)準(zhǔn)response來(lái)結(jié)束,這是大多數(shù)AT命令的規(guī)范。handleFinalResponse會(huì)設(shè)置s_commandcond這一object,也就是at_send_command_full_nolock等待的對(duì)象。至此,響應(yīng)的完整信息已經(jīng)完全獲得,sendcommand可以進(jìn)一步處理返回的信息(臨時(shí)結(jié)果、以及標(biāo)準(zhǔn)返回的成功或失敗都在sp_response中)。pp_outResponse參數(shù)將sp_response返回給調(diào)用at(yī)_send_command_full_nolock的函數(shù)。p_response如果返回失?。ㄒ簿褪菢?biāo)準(zhǔn)響應(yīng)的ERROR等造成),則通過(guò)RIL_onRequestComplete發(fā)送返回?cái)?shù)據(jù)給上層,結(jié)束命令;如果成功,則進(jìn)一步分析p_response—>p_intermediates,同樣是通過(guò)at_tok.c里的函數(shù)進(jìn)行分析,并同樣將結(jié)果通過(guò)RIL_onRequestComplete返回。RIL_onRequestComplete和RIL_onUnsolicitedResponse很相似,功能也一致.通過(guò)Parcel來(lái)傳遞回上層,同樣是先寫入RESPONSE_(tái)SOLICITED(區(qū)別于RESPONSE_UNSOLICITED),pRI->token(上層傳下的request號(hào)),錯(cuò)誤碼(sendcommand的錯(cuò)誤,不是AT響應(yīng)).如果有AT響應(yīng),通過(guò)訪問(wèn)pRI-〉pCI->responseFunction來(lái)完成具體response的解析,并寫入Parcel。然后通過(guò)同樣的途徑:sendResponse--〉sendResponseRaw—->blockingWrite-->writetos_fdCommand?完成最終的響應(yīng)傳遞,如圖4—4所示。圖4—4Response流程圖Readloop要解決的問(wèn)題是:解析從Modem發(fā)過(guò)來(lái)的回應(yīng)。如果遇到主動(dòng)上報(bào)消息則通過(guò)handleUnsolicited上報(bào)的java-ril;如果是命令的應(yīng)答,則通過(guò)handleFinalResponse通知send_at_command有應(yīng)答結(jié)果。Rild層初始化時(shí)獲取reference-ril.c提供的函數(shù)列表結(jié)構(gòu)體.Eventloop將根據(jù)不同的命令類型獲取java-ril消息,解析出需要的參數(shù),并調(diào)用onRequest函數(shù)進(jìn)行分發(fā)處理。send_at_command是同步的,命令發(fā)送后,send_at_command將等待在命令處理完成。=3\*GB3③RIL跟上層通訊主要采用兩種方式:一種是通過(guò)Socket發(fā)送與接收消息的方式來(lái)實(shí)現(xiàn),C方面,這個(gè)Socket在ril.cpp里面可以找到它的創(chuàng)建代碼:s_fdListen=android_get_control_socket(SOCKET_NAME_RIL);JAVA方面,在RIL。java中:s=newLocalSocket();l=newLocalSocketAddress(SOCKET_NAME_RIL,LocalSocketAddress.Namespace。RESERVED);s.connect(l);另外一種方式就是直接通過(guò)TCP/IP直接訪問(wèn)內(nèi)核中的sharedmemory,進(jìn)行RPC調(diào)用,這種方式主要應(yīng)用在數(shù)據(jù)模式上,一是因?yàn)锳ndroid的每個(gè)Activity隨時(shí)都會(huì)有可能需要網(wǎng)絡(luò)連接接收發(fā)送數(shù)據(jù),因此必須提供一種實(shí)時(shí)性較高的訪問(wèn)方式,二是因?yàn)榭梢蕴岣咄ㄓ嵭省?.4Kernel層此處主要是對(duì)usbserialdriver的加載,這里使用的usbserialdriver是來(lái)自linux內(nèi)核下的通用usbserial驅(qū)動(dòng)。Usbserial驅(qū)動(dòng)控制插入其中的usb3G(ZTEMG3732)設(shè)備,提供虛擬的串口,如ttyUSB0,ttyUSB1。為了讓usbserial驅(qū)動(dòng)為3G模塊所使用,需要修改驅(qū)動(dòng)源碼,使內(nèi)核能夠識(shí)別設(shè)備。主要是在內(nèi)核/driver/usb/serial/option.c中,增加設(shè)備的vid和pid,也就是產(chǎn)品號(hào)和出廠號(hào)。代碼如下所示:{USB_DEVICE(0x19d2,0xffff)},{USB_DEVICE(0x19d2,0xffec)},并且還需要配置內(nèi)核:DeviceDrivers--->[*]USBsupport—-—>〈*>SupportforHos-sideUSB//<*〉OHCIHCDsupport〈*〉USBSerialConvertersupport——-><*>USBdriverforGSMandCDMAmodems這樣內(nèi)核就支持ZTEMG37323G模塊了。當(dāng)驅(qū)動(dòng)成功加載后,插入3G模塊后,在/dev/目錄下就可以看到ttyUSB0,ttyUSB1等字符設(shè)備文件。4.5本章小結(jié)本章對(duì)APP層、Framework層進(jìn)行了簡(jiǎn)單的分析,重點(diǎn)介紹了RIL層和Kernel層的實(shí)現(xiàn)。對(duì)App層、Framework層的分析是為了實(shí)現(xiàn)RIL層,知道RIL層從上層接收到什么.RIL層主要實(shí)現(xiàn)了兩個(gè)流程,即Request流程和Response流程。Request流程就是接收上層的事件轉(zhuǎn)化為AT命令傳輸?shù)接布?。Response流程就是把硬件響應(yīng)的命令再解析,然后返回給上層。5基于Android系統(tǒng)的3G模塊(MG3732)開發(fā)5.1RIL層的開發(fā)為了使RIL層支持該3G模塊,首先要在RIL層添加對(duì)該模塊的支持。代碼如ril/reference—ril/Android.mk中:LOCAL_CFLAGS+=-DZTE_M(jìn)G3732MG3732模塊Response的數(shù)據(jù)與普通的模塊有所區(qū)別,所以獲取Response信息的代碼有所不同.這里需要獲取Response信息代碼,具體代碼在ril/reference-ril/atchannel.c中:staticconstchar*urc_readline()//讀取Response信息{ssize_tcount;char*p_read=NULL;char*p_eol=NULL;char*ret;if(*s_URCBufferCur==’\0’){s_URCBufferCur=s_URCBuffer;*s_URCBufferCur=’\0';p_read=s_URCBuffer;}else{while(*s_URCBufferCur=='\r'||*s_URCBufferCur=='\n')s_URCBufferCur++;p_eol=findNextEOL(s_URCBufferCur);if(p_eol==NULL){size_tlen;len=strlen(s_URCBufferCur);memmove(s_URCBuffer,s_URCBufferCur,len+1);p_read=s_URCBuffer+len;s_URCBufferCur=s_URCBuffer;}}while(p_eol==NULL){if(0==MAX_AT_RESPONSE—(p_read—s_URCBuffer)){LOGE("ERROR:Inputlineexceededbuffer\n");s_URCBufferCur=s_URCBuffer;*s_URCBufferCur='\0';p_read=s_URCBuffer;}do{count=read(urc_fd,p_read,MAX_AT_RESPONSE-(p_read-s_URCBuffer));}while(count<0&&errno==EINTR);if(count>0){AT_DUMP(”<〈",p_read,count)s_readCount+=count;p_read[count]='\0';while(*s_URCBufferCur=='\r'||*s_URCBufferCur=='\n')s_URCBufferCur++;p_eol=findNextEOL(s_URCBufferCur);p_read+=count;}elseif(count<=0){if(count==0){LOGD("atchannel:EOFreached”);}else{LOGD(”atchannel:readerror%s",strerror(errno));}returnNULL;}}ret=s_URCBufferCur;*p_eol='\0';s_URCBufferCur=p_eol+1;LOGD("AT<%s\n”,ret);returnret;}staticvoid*urc_readerLoop(void*arg)//循環(huán)讀取Response信息{for(;;){constchar*line;line=urc_readline();if(line==NULL){break;}if(isSMSUnsolicited(line)){//如果是短信,則用readline讀取,否則用processLine(line)讀?。鉮ar*line1;constchar*line2;line1=strdup(line);line2=readline();if(line2==NULL){break;}if(s_unsolHandler?。絅ULL){s_unsolHandler(line1,line2);}free(cuò)(line1);}else{processLine(line);}}onReaderClosed();returnNULL;};MG3732模塊讀?。襡sponse信息,所以在AT命令解析函數(shù)at(yī)_open中需要有對(duì)MG3732模塊的宏控制,具體代碼在ril/reference-ril/atchannel.cat_open函數(shù)中:#ifdefZTE_MG3732//發(fā)現(xiàn)ZTE_MG3732模塊intfd2=-1;while(fd2<0){fd2=open("/dev/ttyUSB2",O_RDWR);//打開硬件設(shè)備if(fd2〈0){perror("openingURCinterface.retrying。..”);sleep(10);}}if(fd2>0){urc_fd=fd2;structtermiosios;tcgetattr(fd2,&ios);ios.c_lflag=0;tcsetattr(fd2,TCSANOW,&ios);}ret=pthread_cr

溫馨提示

  • 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。

最新文檔

評(píng)論

0/150

提交評(píng)論