【正文】
amp。\039。 s_URCBufferCur = s_URCBuffer。 if (p_eol == NULL) { size_t len。 || *s_URCBufferCur == 39。\039。 if (*s_URCBufferCur == 39。 這 里 需 要 獲 取 Response 信 息 代 碼 , 具 體 代 碼 在ril/referenceril/ 中: static const char *urc_readline() //讀取 Response 信息 { ssize_t count。 Request流程就是接收上層的事件轉(zhuǎn)化為 AT 命令傳輸?shù)接布?。?dāng)驅(qū)動成功加載后,插入 3G 模塊后,在 /dev/目錄下就可以看到 ttyUSB0, ttyUSB1 等字符設(shè)備文件。 Usb serial 驅(qū)動控制插入其中的 usb 3G( ZTE MG3732)設(shè)備,提供虛擬的串口,如 ttyUSB0, ttyUSB1。 l = new LocalSocketAddress(SOCKET_NAME_RIL, )。 Eventloop 將根據(jù)不同的命令類型獲取 javaril 消息,解析出需要的參數(shù),并調(diào)用 onRequest 函數(shù)進(jìn)行分發(fā)處理。 然后通過同樣的途徑: sendResponsesendResponseRawblockingWritewrite to s_fdCommand 完成最終的響應(yīng)傳遞,如圖 44 所示。 p_response 如果返回失?。ㄒ簿褪菢?biāo)準(zhǔn)響應(yīng)的 ERROR 等造成),則通過RIL_onRequestComplete 發(fā)送返回數(shù)據(jù)給上層,結(jié)束命令;如果成功,則進(jìn)一步分析p_responsep_intermediates,同樣是通 過 里的函數(shù)進(jìn)行分析,并同樣將結(jié)果通過 RIL_onRequestComplete 返回。無論有無具體響應(yīng),最終都會以標(biāo)準(zhǔn)響應(yīng) handleFinalResponse來處理,也就是接受到 OK, ERROR 等標(biāo)準(zhǔn) response 來結(jié)束,這是大多數(shù) AT 命令的規(guī)范。比如 AT+CSQ 是 singleline, 返回 at+csq=xx,xx,再加一行 OK,比如一些設(shè)置命令,就是 no_result, 只有一行 OK或 ERROR。通過 internalRequestTimedCallback 將回調(diào)添加到 event 循環(huán),最終完成 callback 上掛的函數(shù)的回調(diào)。通過 Parcel傳遞,將 RESPONSE_UNSOLICITED, unsolResponse( request 號)先寫入 Parcel,然后通過 s_unsolResponses 數(shù)組,查找到對應(yīng)的 responseFunction 完成進(jìn)一步的的解析,存入 Parcel 中。 response 的主要的解析過程由 中的函數(shù)完成,其本質(zhì)就是字符串按塊解析,具體的解析方式由每條命令或上報信息自行決定。39。因為短信的 AT 處理通常比較麻煩,無 論收發(fā)都單獨列出。后繼分析從此處開始。能夠看得出是往硬件中寫入命令。onrequest 中主要是用 switch..case 判斷發(fā)送過來的命令是什么 (如:撥打電話、 SIM 卡狀態(tài)、掛斷電話、等待狀態(tài)等 ),這里當(dāng)然是撥打電話。每個命令以 RequestInfo的形式存在 ( 實例: pRI) ,并且將 pRI 掛在了 s_pendingRequests 中,并執(zhí)行dispatchFunction 方法,即 dispatchDial。然后執(zhí)行at_send_mand_full,前面幾個接口都會最終到這里,再通過一個互斥的at_send_mand_full_nolock 調(diào)用,完成最終的寫出操作,在 writeline 中,寫出到初始化時打開的設(shè)備中。 RIL_REQUEST_DIAL 流程是: onRequestrequestDialat_send_mandat_send_mand_fullat_send_mand_full_nolockwriteline。 Request 號和參數(shù)具備后 ,就可以進(jìn)行具體的 request 函數(shù)調(diào)用了。 這樣將兩個 socket 加到任務(wù)一中建立起來多路復(fù)用 I/O 的檢查句柄集合中,一旦有上層來的(調(diào)試)請求, event 機(jī)制便能 響應(yīng)處理了。 ril_event_set (amp。 21 信息科學(xué)與技術(shù)學(xué)院學(xué)士學(xué)位論文 其中最重要的是 onRequest 域,來自上層的請求都由這個函數(shù)進(jìn)行映射后轉(zhuǎn)換成對應(yīng)的 AT 命令并發(fā)給硬件。 RIL_Supports supports。s_rilEnv, argc, rilArgv)開始,這是一個 RIL_RadioFunctions 結(jié)構(gòu)的指針。關(guān)于 AT 命令發(fā)送的流程,詳見 request 分析。對它的具體分析,包括 at_open中掛接的 ATUnsolHandler, 放到后面的 response 分析里去。attr, readerLoop, amp。 mainLoop 的主要任務(wù)是建立起與硬件的通信,然后通過 read 方法阻塞等待硬件 20 信息科學(xué)與技術(shù)學(xué)院學(xué)士學(xué)位論文 的主動上報或響應(yīng)。 至此第一個任務(wù)分析完畢,這樣便建立起了基于 event 隊列的消息循環(huán),稍后便可以接受上層發(fā)來的的請求了(上層請求的 event 對象建立,在第三個任務(wù)中)。如果任何一個 fd 有數(shù)據(jù)寫入,則進(jìn)入分析流程 processTimeouts(), processReadReadies(amp。 每個 ril_event 結(jié)構(gòu),與一個 fd 句柄綁定(可以是文件、 socket、管道等),并且?guī)б粋€ func 指針去執(zhí)行指定的操作。 //如果是保持的,則不從 watch_list 中刪除 struct timeval timeout。// 下一個消息 struct ril_event *prev。 // 增加消息 void ril_timer_add(struct ril_event * ev, struct timeval * tv)。attr, eventLoop, NULL)建立一個 dispatch 線程,入口點在 eventLoop. 而 eventLoop 中,會調(diào)用 中的 ril_event_loop()函數(shù),建立起消息 (event)隊列機(jī)制。 ③ 任務(wù)三:通過 RIL_Init 獲取一組函數(shù)指針 RIL_RadioFunctions,并通過RIL_register 完成注冊,并打開接受上層命令的 socket 通道。 主入口是 中的 main 函數(shù),主要完成三個任務(wù): ① 任務(wù)一:開啟 中的 event 機(jī)制。 C a l l i n g , S M SA n d r o i d T e l e p h o n e R I L p a r tJ a v a A p p l i c a t i o nJ a v a F r a m e w o r kN a t i v e F r a m e w o r kR i l d d e a m o nL i b r e f e r e n c e r i l . s oL i b r i l . s oR I L D r i v e r ( U A R T . S D I D . U S B )K e r n e l S p a c eR I L R a d i o F u n c t i o nD l o p e n i n t e r f a n c e R I L i n i tS o c k e t “ R I L ”圖 43 Rild、 及 關(guān)系圖 18 信息科學(xué)與技術(shù)學(xué)院學(xué)士學(xué)位論文 ④ radiootions radiooptiongs 通過獲取啟動參數(shù),利用 socket 與 rild 通信,其作用是通過串口將一些與 radio 相關(guān)的參數(shù)直接傳給 rild。它將來自 的請求轉(zhuǎn)換為 AT 命令,同時監(jiān)控 Modem 的反饋信息,并傳遞回 。 Libril 提供的主要功能分布在兩個主要方法中:一個是 RIL_startEventLoop()方法;另一個是 RIL_register()方法。編譯時就已經(jīng)建立了這一關(guān)系(其實也可以編譯成可執(zhí)行程序, 作為守護(hù)進(jìn)程運(yùn)行)。目前 cupcake 分支上帶的是 gsm的支持,另有一個 cdma分支, 3G 通信模塊 MG3732 用到的是 gsm 驅(qū)動。以下是 RIL 交互圖,如圖 42 所示。 } 在 sendSMS()方法中,把上面?zhèn)飨聛淼亩绦畔嚓P(guān)的數(shù)據(jù)寫入到了 Parcel 中 ,協(xié)同一個特殊的 RILRequest 寫入到 Socket 的輸出流中,進(jìn)而將數(shù)據(jù)傳遞到 RIL 層。 (smscPDU)。也可以知道RIL 中有 RILD 這個守護(hù)進(jìn)程(負(fù)責(zé)控制 RIL 串口 )。 l=newLocalSocketAddress(SOCKET_NAME_RIL,.RESERVED)。 RIL 中有個內(nèi)部類叫 RILSender: class RILSender extends Handler implements Runnable,查看其 handleMessage 方法的核心代碼如下: case EVENT_SEND: ().write(dataLength)。 sendSms()方法 調(diào)用了 CommandsInterface 接口, CommandsInterface 是一個特殊的接口 ,與 相關(guān),于是進(jìn)入了 Framework 層。 該方法中有四個參數(shù),分別是 String desinationAddress、 String scAddrsss,String text、 PendingIntent sentIntent、 PendingIntent deliveryIntent,也就是收件人號碼、發(fā)件 13 信息科學(xué)與技術(shù)學(xué)院學(xué)士學(xué)位論文 人號碼、信息內(nèi)容、發(fā)送是否成功回執(zhí)、接收是否成功回執(zhí)。 phone 類是個接口類,其中聲明了 dial 這個方法,具體的結(jié)構(gòu)如箭頭所示: Phone(interface)implementsPhoneBase(abstractclass)extendsCDMAPhone,GSMPhone,SIPPhoneBase。 電 話 、 短 信 應(yīng) 用A n d r o i d t e c h n o l o g yJ a v a . r i lR i l d s e r v e r ( c / c + + )R e f e r e n c e r i l . c ( H A T )U A R T 驅(qū) 動S o c k e tK e r n e lL i n u x C 編 程J a v a a p p l i c a t i o nJ a v a f r a m e w o r kN a t i v e f r a m e w o r k 圖 41 3G 網(wǎng)絡(luò)功能框架圖 12 信息科學(xué)與技術(shù)學(xué)院學(xué)士學(xué)位論文 Application 層 電話部分 ( 1)通話部分 撥打電話時,首先會調(diào)用 onClick()方法,這個方法會通過 ().toS Tring()方法獲取所撥打的電話號碼,并會調(diào)用 isPhoneNumberValid()方法判斷這個電話號碼是否符合格式,如果符合格式,則會觸發(fā) 中的oncreate 方法,如果號碼是緊急號碼則直接以 startactivity 方式處理。 11 信息科學(xué)與技術(shù)學(xué)院學(xué)士學(xué)位論文 4 基于 Android 系統(tǒng)的電話、短信 功能 框架的實現(xiàn) 基于 Android 系統(tǒng)的 3G 網(wǎng)絡(luò)電話、短信框架分為如下四個部分: ( 1) Java application 層; ( 2) Java framework 層; ( 3) Native framework 層 ; ( 4) Kernel 層。 ~$ sudo vim /etc/environment 將路徑添加到 PATH 變量的最后面。 ~$ sudo vim /etc/environment 將路徑添加到 PATH 變量的最后面,命令如下: PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games :/usr/local/arm/保存退出后執(zhí)行 : source /etc/environment 9 信息科學(xué)與技術(shù)學(xué)院學(xué)士學(xué)位論文 這樣修改的環(huán)境變量會立即生效。 圖 31 FS_S5PC100的外觀圖 8 信息科學(xué)與技術(shù)學(xué)院學(xué)士學(xué)位論文 3G 模塊 3G 模塊采用的是中興 MG3732 模塊, 適用于 WCDMA 和 GSM 網(wǎng)絡(luò),支持850/900/1800/1900/2100 頻段 [14]。其視頻解碼能力很強(qiáng) 大并且省電 ,編解碼能力達(dá)到 720p30fps (1280x720),支持電視輸出 ( NTSC/PAL/HDMI )??梢赃m應(yīng) Android 、