Android 無線介面層(Radio Layer Interface)

來源:互聯網
上載者:User

原文地址::http://liangxh2008.blog.163.com/blog/static/1124116792010029490222/

 

 

INDEX
介紹
RIL 初始化
RIL 互動
主動請求
被動請求
實現RIL
RIL初始化
RIL函數
RIL 主動命令請求
RIL 被動請求的命令

介紹
  Android的無線介面層(RIL)提供了Android電話語音(android.telephony)與無線電硬體之間的抽象層。RIL是通訊無關的,提供基於GSM的網路支援。
  顯示了RIL位於Android電話系統架構中的位置。圖1
  

  實線框表示Android部分,虛線框表示夥伴所專用的部分。
  
  RIL包含兩個基本組件:
  RIL守護進程(RIL Daemon):RIL守護進程初始化Vendor RIL,管理所有來自Android通訊服務的通訊,將其作為被請求的命令(solicited commands)調度給Vendor RIL。
  Vendor RIL:ril.h檔案中的無線電專用Vendor RIL掌管著所有和無線電硬體的通訊,並且通過未被請求的命令(unsolicited commands)分發給RIL 守護進程。
  
RIL初始化
  Android在啟動時初始化通訊棧和Vendor RIL,描述如下:
  1. RIL守護進程讀取rild.lib路徑和rild.libargs系統參數,決定應該使用的Vendor RIL庫和向Vendor RIL提供的初始化參數
  2. RIL守護進程載入Vendor RIL庫,執行RIL_Init初始化RIL並為RIL函數擷取參數
  3. RIL守護進程調用Android通訊棧中RIL_register,為Vendor RIL函數提供參考。
  
  RIL守護進程源碼請參考//device/commands/rild/rild.c
  
RIL 互動
  RIL控制代碼提供了兩種互動方式:
  主動請求命令(Solicited commands):主動請求命令來自RIL lib,比如DIAL和HANGUP。
被動請求命令(Unsolicited responses):被動請求命令來自基帶,比如CALL_STATE_CHANGED 和 NEW_SMS。
  
主動請求
  以下程式碼片段屬於主動請求命令
  void OnRequest (int request_id, void *data, size_t datalen, RIL_Token t);
  void OnRequestComplete (RIL_Token t, RIL_Error e, void *response, size_t responselen);
  
  有超過60個主動請求命令:
* SIM PIN,IO和IMSI/IMEI(11)
* 電話狀態和動作(撥號,應答,靜音…)(16)
* 網路狀態查詢(4)
* 網路設定(禁止,轉寄,選擇…)(12)
* 簡訊(3)
* PDP串連(4)
* 電源和複位(2)
* 輔助服務(5)
* 供應商定義及其支援(4)
  
  表明了Android系統一個主動請求的電話過程,圖2


  
被動請求
  以下程式碼片段屬於被動請求命令
  void OnUnsolicitedResponse (int unsolResponse, void *data, size_t datalen);
  
  有超過10條被動請求命令:
* 網路狀態改變(4)
* 新簡訊通知(3)
* 新USSD通知(2)
* 訊號強度和時間改變(2)
  
  表明Android系統中一個被動請求的電話過程:圖3


實現RIL
  為了實現一個通訊專用RIL,需要執行一系列函數以建立一個共用庫,保證Android能夠相應無線通訊請求。所需要的函數被定義在RIL頭部(/include/telephony/ril.h)
  Android通訊介面是通訊無關的,Vendor RIL可以使用任意協議進行無線通訊。Android提供了一個參考Vendor RIL,使用的是賀式(Hayes)AT命令裝置,可作為一個商用的快速入門指導以及通訊測試使用。RIL參考源碼在/commands/reference-ril/。
  通常將你自己的Vendor RIL編譯為以下形式:
  libril-<companyname>-<RIL version>.so
  比如:
  libril-acme-124.so
  其中:
   libril:所有vendor RIL的開頭;
   <companyname>:專用公司縮寫
   <RIL version>:RIL版本number
   so:檔案擴充
  
RIL初始化
  特定的Vendor RIL必須定義一個初始化函數,提供一系列控制代碼函數以處理每一個通訊請求。Android RIL守護進程會在啟動時調用RIL_Init以初始化RIL。
  RIL_RadioFunctions *RIL_Init (RIL_Env* env, int argc, char **argv);
   RIL_Init 返回一個RIL_RadioFunctions結構體包含無線電函數指標。
  type structure {
   int RIL_version;
   RIL_RequestFunc onRequest;
   RIL_RadioStateRequest onStateRequest;     
   RIL_Supports supports;
   RIL_Cancel onCancel;
   RIL_GetVersion getVersion;
  }
  RIL_RadioFunctions;
  
RIL函數
  ril.h定義了RIL狀態和變數,比如RIL_UNSOL_STK_CALL_SETUP, RIL_SIM_READY, RIL_SIM_NOT_READY,具體函數描述見下表。忽略標頭檔細節。
  
  RIL主動命令請求
  Vendor RIL必須提供下表中的函數用以發送主動命令。RIL主動命令請求類型定義在ril.h的RIL_REQUEST_prefix中。
  
  
  
  
  
名稱
描述
void (*RIL_RequestFunc) (int request, void *data, size_t datalen, RIL_Token t);
RIL主動命令入口指標,必須能夠處理各種RIL主動請求(定義於ril.h的RIL_REQUEST_ prefix)
* request 是一種 RIL_REQUEST_*
* data 是一個指向RIL_REQUEST_*資料的指標
* t 應當被用於RIL_onResponse的後續調用
* datalen 由調用者所有,應當由被調者修改或釋放
必須調用RIL_onRequestComplete()函數完成通訊。?RIL_onRequestComplete() 在這個函數返回前或之後可能被任意線程調用。這個函數總會調用同一個線程,因此返回到這裡意味著無線通訊準備去處理其他命令(無論前面命令是否完成傳輸)。
RIL_RadioState (*RIL_RadioStateRequest)();
這個函數應該返回當前通訊同步狀態

int (*RIL_Supports)(int requestCode);
如果提供指定RIL_REQUEST代碼,返回1,否則返回0.


void (*RIL_Cancel)(RIL_Token t);
本函數用來指示取消一個待處理請求。函數將被一個獨立線程所調用,而不是RIL_RequestFunc函數。
一旦取消,被調用者應當盡量放棄請求並在這之後調用RIL_onRequestComplete 函數的RIL_Errno CANCELLED 。
響應請求後調用 RIL_onRequestComplete 併產生其他結果是可以被接受的,但會被忽略(理應忽略被取消的請求)。
RIL_Cancel 調用應該被立刻返回,不需要等待取消。


const char * (*RIL_GetVersion) (void);
向你的Vendor RIL返回版本字串
  
  Vendor RIL使用以下回呼函數與Android RIL守護進程通訊。
名稱
描述
void RIL_onRequestComplete(RIL_Token t, RIL_Errno e, void *response, size_t responselen);
* t 是之前通訊傳遞至RIL_Notification的參數
* 如果e != SUCCESS,則可以沒有相應,並且被忽略
* response 由調用者所有,應當由被調用者修改或者釋放。
* RIL_onRequestComplete 將儘快返回


void RIL_requestTimedCallback (RIL_TimedCallback callback, void *param, const struct timeval *relativeTime);
使用者指定的回呼函數的線程中,RIL_RequestFunc 函數被調用。
如果指定了relativeTime,那麼回調前將等待一個一個特定的時間值。
如果 relativeTime 為空白,或者指標指向了一個空的結構體,回呼函數會儘快被執行。
  
  RIL被動命令
  下表函數是Vedor RIL使用的回呼函數,用來喚醒被動命令在Android平台的相應機制。
名稱
描述
void RIL_onUnsolicitedResponse(int unsolResponse, const void *data, size_t datalen);
* unsolResponse 是 RIL_UNSOL_RESPONSE_* 其中之一
* data 是指向RIL_UNSOL_RESPONSE_*資料的指標
* data被調用者所有,應當由被調用者修改或者釋放
  
阿虛(Rockie Cheng)翻譯,如果有些地方看不懂,請參考英文原文,我翻譯的太爛
http://www.netmite.com/android/mydroid/development/pdk/docs/telephony.html

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.