1. 程式人生 > >andorid Telephony 整體介紹

andorid Telephony 整體介紹

6572_Telephony

1 術語和前言:

2 TelePhony:

2.1 Telephony框架

Android手機作業系統是一個基於Linux Kernel的分層智慧手機作業系統,其共分為4,從上到下分別是:

Ø  應用層(Java Application,包括了Android各種應用程式

Ø  應用框架層(Java Frameworks),是Google釋出的核心應用所使用的API框架

Ø  系統執行庫層(User Libraries),包含了手機系統平臺必須的C/C++核心庫、Dalvik

虛擬機器執行環境和HAL子層

Ø  核心層(Linux Kernel)Android 4.0 基於Linux Kernel 3.0.8 提供核心系統服務,例如檔案管理、記憶體管理、程序管理、網路堆疊、驅動模型等作業系統的基本服務能力

Telephony為手機提供通訊功能,其通訊邏輯關係如下,

Android Telephony採用了分層結構,共跨越了4層:

Ø  Telephony應用,包括了PhoneMMSSTK等應用程式

Ø  Telephony框架,提供TelephonyManager,包含資料連線、通話、資訊和SIM相關的API

Ø  無線通訊介面層(RIL

),主要位於User Libraries層中的HAL層,提供APApplication Processor)和BP( Baseband Processor)之間的通訊功能

Ø  Modem,位於BP,主要負責實際的無線通訊能力處理

其中,Telephony框架層是以Phone例項為核心的,Phone介面及其子類管理整個整個手機的Telephony功能。Phone相關資訊在後面介紹。

Telephony框架層為應用層和框架層的其它服務提供Telephony服務,如下:

PhoneInterfaceManager服務,是ITelephony介面的實現,PhoneInterfaceManage

通過PhoneApp、CallManager、Phone物件實現相應功能。

IccSmsInterfaceManager短訊息服務,是Isms介面的實現;IccPhoneBookInterfaceManager電話本服務,是IIccPhoneBook介面的實現;PhoneSubInfo提供使用者資訊讀取服務,是IPhoneSubInfo介面的實現;

TelephonyRegistry提供應用層的訊息登記服務,是ITelephonyRegistry介面的實現。

應用程式通過以下幾個客戶端物件使用Telephony框架提供的服務。

  通過在SmsManager物件例項(通過SmsManager類的getDefault函式返回SmsManager物件)中訪問IccSmsInterfaceManager服務,用來收發簡訊。

  通過IccProvider一個內容提供物件提供對IccPhoneBookInterfaceManager服務的訪問,讀取和管理電話本。 

  通過TelephonyManager物件提供對PhoneSubInfo、PhoneInterfaceManager、TelephonyRegistry服務的訪問,TelephonyManager物件通過getSubscriberInfo函式獲得PhoneSubInfo服務的遠端訪問代理物件。

通過getITelephony函式獲得PhoneInterfaceManager的遠端訪問代理物件。提供一個物件全域性sRegistry(指向TelephonyRegistry服務的遠端訪問代理物件)訪問TelephonyRegistry服務。

Android中關於telephony相關的java程式碼主要在下列目錄中:
1. frameworks/base/telephony/java/android/telephony 
   提供Android telephony的公開介面,任何具有許可權的第三方應用都可使用,如介面類TelephonyManager。
2. frameworks/base/telephony/java/com/android/internal/telephony
3. frameworks/base/services/java/com/android/server/TelephonyRegistry.java
   提供一系列內部介面,目前第三方應用還不能使用。當前似乎只有packages/apps/Phone能夠使用

4. frameworks/opt/telephony  
5. packages/apps/Phone
   一個特殊應用,或者理解為一個平臺內部程序。其他應用通過intent方式呼叫這個程序的服務。

1.1 Phone介紹

Phone相關類的關係圖:

Phone

介面,定義了一些telephony相關的常量和方法

PhoneBase

類,繼承了handler,實現了phone介面,

類裡定義了一些常用類的引用,如mCM,SMSDispatcher

PhoneNotifier

介面,定義了一些telephony相關的通知方法

PhoneFactory

類,建立phone例項,主要完成socket建立、RIL例項建立、

phoneproxy例項建立。

MTKPhoneFactory

MTK對PhoneFactory的封裝,當前看不到程式碼

PhoneProxy

類,繼承了handler,實現了phone介面,使用phone例項,完成和ril互動的介面。

Phone描述了對電話的所有操作介面。PhoneBase直接從Phone 派生而來, GSMPhone又從PhoneBase派生而來,代表GSM手機的通訊功能。PhoneProxy也從Phone直接派生而來,完成和ril互動的介面,手機的Phone例項就是一個PhoneProxy例項。

介面類Phone定義了一套API,這套API用於使用RIL傳送AT命令請求,也還有一套register和unregister函式;當呼叫者對一些內部狀態感興趣時,可以呼叫對應的register函式,當狀態變化時可以得到及時通知。

PhoneBase實現了Phone介面中定義的部分函式,還有一部分由其子類GSMPhone和CDMAPhone實現。PhoneBase通過CommandsInterface介面與RIL daemon層互動,實現短訊息提交、資料連線控制、ICC 資訊讀取等Telephony基類功能。PhoneBase包含SMSDispatcher、DataConnectionTracker、IccFileHandler、IccRecords、IccCard等幾個抽象類成員,並通過這些抽象類成員提供某一方面功能的基類實現。

PhoneProxy是GSMPhone和CDMAPhone的代理,讓使用者不用關注手機到底是GSM還是CDMA,它遵守Phone定義的API介面,因此繼承Phone。PhoneFactory在建立Phone物件時,擁有的是PhoneProxy物件,PhoneProxy根據實際的網路型別建立對應的GSMPhone或CDMAPhone。PhoneProxy代理物件實現了Phone介面,使應用能夠使用統一的PhoneProxy物件控制操作具體型別的Phone物件,而不用關心它們之間的差異(代理模式的採用),應用程式通過PhoneFactory的getDefaultPhone函式返回統一的PhoneProxy代理物件來訪問不同的Phone物件。 因為Telephony框架層支援不同的網路型別的Telephony實現(CDMA、GSM),因此Telephony框架層普遍使用代理模式來對應用提供統一的服務介面。如PhoneProxy代理物件內部還封裝了IccSmsInterfaceManager、IccPhoneBookInterfaceManager、PhoneSubInfo三個服務的代理物件,通過代理物件提供對這三個服務的操作控制。

Phone物件是整個Telephony服務的核心,主要的Telephony服務(IccSmsInterfaceManager、IccPhoneBookInterfaceManager、PhoneSubInfo)及資料連線功能都通過具體的Phone物件提供,具體的Phone物件包括CDMAPhone、CDMALTEPhone、GSMPhone及SipPhone。PhoneBase抽象類是這些具體Phone物件的共同的基類,本身一個Handler類,用來提供Phone介面的基實現。

SMSDispatcher 、DataConnectionTracker 、IccFileHandler、IccRecords、IccCard等抽象類對應GSMPhone物件中的派生類分別為GsmSMSDispatcher(提供GSM模式的短訊息傳送和接收提交功能)、GsmDataConnectionTracker(提供GSM模式的資料連線管理功能)、SIMFileHandler(提供SIM File處理)、SIMRecords(提供SIM資訊記錄功能)、SimCard(提供SIM CARD功能); IccSmsInterfaceManager、IccPhoneBookInterfaceManager、PhoneSubInfo服務在GSMPhone物件中實現的具體的服務類為SimSmsInterfaceManager、    SimPhoneBookInterfaceManager及PhoneSubInfo。

另外GSMPhone物件在例項化時還例項化GsmCallTracker(提供GSM模式的CALL管理)、GsmServiceStateTracker(提供GSM模式的服務狀態管理)、CatService物件(提供STK服務)。

1.1 Message

Message在telephony主要通過GsmSMSDispatcher提供GSM模式的短訊息傳送和接收提交功能,通過smsMessage實現短訊息的編解碼。

1.2 Call

GSMCallTracker是Android的通話管理層,GsmCallTracker派生自Handler的虛擬類CallTracker;

GsmCallTracke物件提供Call狀態(共有IDLE, ACTIVE, HOLDING, DIALING, ALERTING, INCOMING, WAITING, DISCONNECTED, DISCONNECTING九種狀態)的跟蹤和管理,能夠提供向RIL層傳送請求,接收和處理RIL層發來的命令響應事件及其它主動通知事件,如振鈴等CALL相關事件及Service狀態事件。

 GsmCallTracker物件中還提供有三個GsmCall物件(派生自抽象類Call):ringingCall(用來管理處於INCOMING和WAITING狀態的通話)、foregroundCall(用來管理處於DAILING、ALERTING、ACTIVE狀態的通話)、backgroundCall(用來管理HOLD的通話)。

1.3 Network States

GsmServiceStateTracker派生自Handler的虛擬類ServiceStateTracker。

GsmServiceStateTracker物件提供ServiceState(共有STATE_IN_SERVICE、STATE_OUT_OF_SERVICE、STATE_EMERGENCY_ONLY、STATE_POWER_OFF四種狀態)的跟蹤和管理

GsmServiceStateTracker物件中除了包括ServiceState狀態資訊外,還包括SignalStrength訊號強度等資訊。

GsmServiceStateTracker物件還維護GSM CELL位置資訊,因此包含兩個GsmCellLocation物件成員cellLoc(當前位置) , newCellLoc( 新位置 )。

1.4 Data Connection

Telephony框架的資料連線模組負責資料連線通道的建立,使電話能夠提供資料服務,如上網等。

DataConnectionTracker是資料連線功能的核心,GsmDataConnectionTracker、CdmaDataConnectionTracker是DataConnectionTracker的兩個派生類,實現具體網路的資料連線的建立和管理。

每一個數據連線用一個DataConnection物件表示,DataConnection對應的具體網路的派生類為GsmDataConnection和CdmaDataConnection。DataConnectionTracker中用一個HashMap型別的變數mDataConnections維護每一個數據連線。CDMA同時只能建立一路資料連線,GSM網路則沒有限制。

DataConnection物件是一個是一個狀態機物件,維護連線的狀態,並提供資料連線的LinkProperties和LinkCapabilities等屬性。DataConnection物件的狀態包括DcDefaultState、DcInactiveState、DcActivatingState、DcActiveState、DcDisconnectingState、DcDisconnectionErrorCreatingConnection六種狀態。

對於GsmDataConnectionTracker物件,ApnContext物件提供資料連線的APN上下文,每一個APN型別都對應一個ApnContext物件,ApnContext物件維護對應的APN設定、DataConnectionTracker的狀態、對應的DataConnection和DataConnectionAc等。

資料連線通道的建立過程:

    1、 資料連線的建立最終都通過GsmDataConnectionTracker和CdmaDataConnectionTracker的trySetupData函式啟動資料連線;

    2、 trySetupData函式呼叫setupData函式,設定資料連線引數(如採用的Apn設定引數,連線建立成功響應訊息);

    3、 然後呼叫對應的DataConnection物件的bringUp函式傳送資料連線訊息(EVENT_CONNECT)。

    4、 EVENT_CONNECT訊息由DataConnection物件的狀態機的相應狀態物件接收處理,對於開始尚未建立資料連線時,DataConnection物件處於DcInactiveState狀態,因此DcInactiveState狀態物件接收處理EVENT_CONNECT事件,呼叫onConnect函式,並轉變為DcActivatingState狀態。

    5、 在具體DataConnection物件的onConnect函式中呼叫RIL介面setupDataCall函式啟動資料連線;

    6、 連線建立後RIL層迴應EVENT_SETUP_DATA_CONNECTION_DONE請求應答事件,由DataConnection物件的DcActivatingState狀態物件接收處理EVENT_SETUP_DATA_CONNECTION_DONE事件,呼叫onSetupConnectionCompleted函式,並過渡到DcActiveState狀態,連線建立成功。

 DataConnectionTracker物件採用DataConnectionAc物件(派生自AsyncChannel)與DataConnection物件通訊。

 GsmDataConnectionTracker物件在setupData函式呼叫createDataConnection函式建立時GsmDataConnection物件和DataConnectionAc物件,並通過DataConnectionAc物件與GsmDataConnection物件建立非同步通訊連線。GsmDataConnectionTracker物件對於每類ApnContext都可以建立一個GsmDataConnection物件和一個DataConnectionAc物件。

  CdmaDataConnectionTracker物件在例項化時呼叫createAllDataConnectionList函式建立需要的資料連線物件CdmaDataConnection和DataConnectionAc物件。CdmaDataConnectionTracker物件只支援建立一個CdmaDataConnection物件和DataConnectionAc物件。

        boolean trySetupData(String reason) 

嘗試建立資料連線。它只是檢查當前手機狀態是具備建立資料連線的條件,當符合條件時,就去建立連線。這些條件包括當前是否處在正常的非連線狀態、phone是否處在空閒狀態、SIM卡是否就緒、是否允許資料連線、資料連線是否受限、以及電源狀態也允許的情況下。接著呼叫buildWaitingApns去構建一個可供使用的APN列表(使用者設定的preferred 

APN,若沒設定則APN的型別匹配亦可,詳見buildWaitingApns說明),若列表不為空,若就呼叫setupData建立資料連線。

        boolean setupData(String 

reason)使用PdpConnection的connect函式(最終呼叫到RIL的setupDataCall函式),從備選APN列表waitingApns中,選擇第一個APN作為配置去建立資料連線,詳見buildWaitingApns函式

APN相關API

 createAllApnList:用當前SIM卡對應的運營商查詢系統的所有APN,並呼叫createApnList建立APN列表,並找到使用者設定的preferred APN
     createApnList:用查詢得到的資料集,建立APN列表
     onApnChanged:當APN被使用者更改時,將呼叫到此函式,重新建立資料連線
     buildWaitingApns:使用使用者設定的preferred APN構建一個可用於資料連線的備選APN列表,即waitingApns列表(當有preferred APN,該列表就只有一個)。若使用者沒有設定preferred APN,則將所有型別匹配的APN新增到waitingApns列表(如default型別)。當trySetupData函式檢查有waitingApns列表中有可用的APN時,就會去嘗試建立連線。
     getNextApn():當PdpConnection需要用到APN建立資料連線時,將呼叫該函式從waitingApns備選列表中獲取第一個APN,直至成功建立資料連線為止。
     setPreferredApn:當用戶沒有設定preferred APN時,將當前資料連線成功的那個APN設定為preferred APN。詳見onDataSetupComplete。
     getPreferredApn:使用者獲取使用者設定的preferred APN

1.5 Simcard

CatService物件實現STK服務,也是一個Handler物件,並實現AppInterface介面。CatService物件能夠與RIL和STK應用互動:可以實現向RIL傳送Envelop命令,以及從RIL接收STK事件,解析事件流(包括Proactive Command),從STK應用接收命令執行結果編碼後發給RIL。CatService物件採用一個RilMessageDecoder狀態機解析RIL發來的STK事件流。

1.6 PhoneNotifier

整個Telephony事件通知框架包括三層: RIL訊息層、框架事件處理層、應用層。

整個框架層以PhoneBase為中心,向上通過PhoneNotifier介面嚮應用層傳送框架層產生的的事件,應用層通過TelephonyRegistry介面提供對特定事件的監聽,由PhoneNotifier介面的預設實現DefaultPhoneNotifier通過TelephonyRegistry物件嚮應用層傳送事件通知。

1.7 TelephonyManager

TelephonyManager主要提供Phone模組各種資訊的查詢和監聽服務。這些資訊既包括裝置的狀態,也包括SIM卡的狀態,還包括網路的狀態。

TelephonyManager主要使用兩個服務來訪問telephony功能:
1. ITelephony,提供與telephony進行操作,互動的介面

在packages/apps/Phone中由PhoneInterfaceManager.java實現。
2. ITelephonyRegistry, 提供登記telephony事件的介面    

在frameworks/base/services/java/com/android/server/TelephonyRegistry.java實現。

TelephonyManager並不是一個標準的服務(Service),因為他沒有繼承自任何其他的Service,,他只是一個普通的類,沒有繼承任何父類或介面。那麼他是如何實現telephony功能的呢,它通過三個介面類ITelephonyRegistry,IPhoneSubInfo,ITelephony,獲取系統服務,從而實現通訊功能。

1.7.1.1 ITelephonyRegistry服務

        這個服務是在TelephonyManager建構函式中得到的,他的主要作用就是對訊號、來電轉駁、位置改變、資料連線狀態等資訊的監聽。

是一個系統服務,主要完成兩方面的通知任務:
        1監聽Phone狀態,當有新的狀態時,對註冊該服務的客戶端進行通知。比如:
                notifyCallState:通知通話狀態的改變。
                notifySignalStrength:通知訊號的改變。
                notifyCallForwardingChanged:通知來電轉駁狀態的改變。
                notifyDataConnection:通知資料連線的改變。
        2監聽Phone狀態,當有新的狀態時,傳送相應的廣播到系統中。比如:
                broadcastServiceStateChanged:廣播服務狀態的改變。
                broadcastSignalStrengthChanged:廣播訊號的改變。
                broadcastDataConnectionStateChanged:廣播資料連線狀態的改變。

        客戶端在得到這個服務後,可以通過統一的listen方法將自己註冊為狀態的監聽器,如果Phone狀態發生了改變,系統就會遍歷所有的監聽器,主動向他們發訊息,呼叫相應的回撥函式。

1.7.1.2 IPhoneSubInfo服務

        這個服務是在getSubscriberInfo介面中得到的,通過這個服務可以得到軟體版本、裝置IDSIM卡串號、語音信箱等資訊

1.7.1.3 ITelephony服務

        這個服務很特殊,是在Phone模組中註冊給系統的(其他服務都是在framework中註冊的),主要功能是Phone模組相關狀態的查詢和處理,包括位置服務、小區註冊資訊、當前網路狀態、是否有SIM卡插入、以及SIM卡狀態等資訊。在TelephonyManager中是通過getITelephony介面得到的這個服務

相關推薦

andorid Telephony 整體介紹

6572_Telephony 1 術語和前言: 2 TelePhony: 2.1 Telephony框架 Android手機作業系統是一個基於Linux Kernel的分層智慧手機作業系統,

springboot整體介紹

聲明 部署 版本信息 註入 名稱 關心 ejb rod wire 1.springboot:快速開發,強大的運維能力。(監控,服務發現,並打) 2.微服務,將一個大系統分解成很多獨立的小服務,這些服務能隨時發布。 3.2004年第一版spring 1.0,rod joh

Spring Data Redis整體介紹 (一)

目前 擴展 刪除 依據 實例化 -m doc 不同的 SDR 為什麽使用Spring Data Redis 首先Spring Data Redis 是Spring 框架提供的用於操作Redis的客戶端。 Spring框架是一個全棧Java程序框架,通過DI、AOP和便攜的服

ActiveMQ SSL應用之一 整體介紹

一、簡單介紹 1、環境 作業系統:win7 64bit/Linux 64bit JDK版本:jdk1.7.0_79及以上 ActiveMQ版本:apache-activemq-5.11.1 2、使用SSL的原因 ActiveMQ普通的TCP連線方式,報文在網路中是以明文方式

Hadoop 整體介紹

1 分散式檔案系統 HDFS HDFS 是 GFS 的克隆版; HDFS特點 : 擴充套件性,容錯性,海量資料儲存; 將檔案切分為指定大小的資料塊並以多副本的儲存在多個機器; 資料切分、多副本、容錯等操作對使用者是透明的; 2 分散式資源排程系統

1、智慧門禁系統教程--工程的整體介紹

一、門禁系統的效果圖二、具體實現的功能1、監控2、人臉識別3、出勤率等資料查詢4、遠端監控三、開發的環境與硬體平臺1、Qt 5.82、opencv3.23、mysql4、海康的網路攝像頭5、pc運算6、

Tomcat整體介紹

來源 本文整理自 <Tomcat核心設計剖析>、<Tomcat結構解析> Tomcat 整體架構 ​ 如上圖所示:包含了Tomcat內部的主要元件,每個元件之間的層次包含關係很清楚。Tomcat大體上可以看成由 Connector 和 Container 元件組成。Conne

PE檔案解析-檔案頭與整體介紹

一、PE的基本概念     PE(Portable Execute)檔案是Windows下可執行檔案的總稱,常見的有DLL,EXE,OCX,SYS等,事實上,一個檔案是否是PE檔案與其副檔名無關,PE檔案可以是任何副檔名。     認識PE檔案不是作為單一

(一)區塊鏈的共識演算法:整體介紹 及 分叉 的通俗講解

作者:林冠巨集 / 指尖下的幽靈 本文不做一般入門的區塊鏈描述講解。著重簡述講解: 區塊鏈的分叉 共識演算法 目錄 前言 由於最近的開發工作是與以太坊公鏈相關的去中心化交易所,專案兩個多月之久,對區塊鏈相關的知識內容瞭解了一些,故擇文以記錄之,但求文字通俗易懂,無紕漏。因自身求學過程中

FusionSphere整體介紹

FusionSphere-概念 認識FusionSpherer: 華為公司面向多行業客戶推出的雲作業系統產品。 專門為雲設計和優化。 提供強大的虛擬化功能和資源池管理。 豐富的雲基礎服務元件和工具。 開放的API介面等。 水平整合資料中心物理和虛擬資

[Jasper使用總結]iReport報表設計-整體介紹(二)

iReport的檔案分為兩種,一種為.jrxml 原始檔(類似.java),一種為.jasper編譯檔案(類似.class)。我們在ireport裡拖拽生成的即為.jrxml檔案。而點選預覽生成的即為.jasper檔案。 說是.jrxml,其實也是一個XML檔案,只是這個檔

Horizon 原始碼閱讀(一)—— Horizon 整體介紹

一、寫在前面        這篇文章主要介紹一下Openstack Horizon — juno專案的整體情況,關於這方面的內容網上已經有很多相關的介紹,我在這裡只作為一個知識的搬運工,把一些分散的內

【caffe原始碼的梳理之零】caffe框架整體介紹

caffe作為深度學習框架,由C++語言開發,中間使用了大量的類的封裝、繼承、多型,在學習caffe的同時也是在對C++語言特性的學習,可謂一舉兩得。廢話不多說,直接上程式碼吧。 1、caffe原始碼的目錄結構 $ tree -d . ├── cma

Metaspace整體介紹

(永久代被替換原因、元空間特點、元空間記憶體檢視分析方法) 回顧 根據JVM記憶體區域的劃分,簡單的畫了下方的這個示意圖。

論壇模塊__論壇業務介紹整體說明

text p s 升序 測試 images 也不能 family javabean 文件 論壇模塊__論壇業務介紹與整體說明 論壇中的概念 版塊:也叫做“版面”、“討論區” ,用於對帖子進行分類。 主題:也叫做“主帖”,表示一個新的話題,可以有很多回帖,屬於某個版塊。 回復

Net分布式系統之一:系統整體框架介紹

文件 和數 mongo lan 不能 結合 logs mssql mongodb 本文轉載收藏於:https://www.cnblogs.com/Andon_liu/p/5353488.html  一、設計目的   從事.Net平臺開發系統已有8年多了,一直思考

DKH大數據整體解決方案的優勢介紹

大數據整體解決方案 大數據平臺整體解決方案 大數據技術的發展與應用已經在深刻地改變和影響我們的日常生活與工作,可以預見的是在大數據提升為國家戰略層面後,未來的幾年裏大數據技術將會被更多的行業應用。相信很多人對於大數據技術的應用還是處於一個非常陌生的階段,可能在很多地方聽說過大數據,但具體應用在哪方面可

Maven整體認識——詳細介紹

stop 詳細介紹 定義變量 系統屬性 位置 final splay packaging tps 前言 本文可以幫助你加深對Maven的整體認識,不是一篇基礎文章。如果你現在還沒有用 Maven 跑過 HelloWorld,那麽本文可能不適合你。 一、Maven簡介 Mav

go微服務框架go-micro深度學習(一) 整體架構介紹

目前 連接 and 創建 tran 自己的 穩定 idt sort 產品嘴裏的一個小項目,從立項到開發上線,隨著時間和需求的不斷激增,會越來越復雜,變成一個大項目,如果前期項目架構沒設計的不好,代碼會越來越臃腫,難以維護,後期的每次產品叠代上線都會牽一發而動

Andorid基礎介紹

1. Android的基本元件   1.1 Activity     1.1.1 Activity代表手機的一個螢幕     1.1.2 一個Android程式由多個Activity組成,即:一個Android程式由多屏內容組成   &nb