Android RIL源碼研究筆記 の ril_command (一)

來源:互聯網
上載者:User
     Android源碼目錄hardware/ril/libril中總共包含5個C/CPP檔案,它們分別是ril_commands.h、ril_unsol_commands.h、ril_event.h、ril_event.cpp和ril.cpp。這篇文章主要分析commands相關的兩個標頭檔,這兩個檔案主要定義了所有telephony可以接收的命令或者響應的事件類型,以及相應的處理函數。

    進行源碼分析前,我們必須Crowdsourced Security Testing道目前主流智能手機的硬體架構中有兩個處理器,一個稱為Application Processor(AP),主要用於運行作業系統,執行應用程式;一個稱為Baseband Processor(BP),專門負責手機中和射頻無線通訊相關的功能。AP和BP晶片間通訊基於串口,通訊協定是廣泛使用的AT指令。

    接著來瞭解下RIL中的兩種Response類型:

    一是Solicited Response(經過請求的回複),應用的情境是AP主動向BP發送一個AT指令,請求BP進行相應處理並在處理結束時回複一個AT指令通知AP執行的結果。源碼中對應的檔案是ril_commands.h。

    一是Unsolicited Response(未經請求的回複),應用情境是BP主動向AP發送AT指令,用於通知AP當前系統發生的與Telephony相關的事件,例如網路訊號變化,有電話呼入等。源碼中對應的檔案是ril_unsol_commands.h。

首先當然先看下ril_commands.h檔案:

// 每一列分別對應:<br />// BP接收的請求 - BP對請求的處理函數 - AP對返回結果的處理函數<br />{0, NULL, NULL}, //none</p><p>// #define RIL_REQUEST_GET_SIM_STATUS 1(in ril.h)<br />// 擷取SIM介面和SIM卡的狀態,傳入參數"data"是NULL<br />// 響應函數"response"是const RIL_CardStatus *<br />// 有效返回碼:無,該函數必須保證成功調用<br />{RIL_REQUEST_GET_SIM_STATUS, dispatchVoid, responseSimStatus},</p><p>// #define RIL_REQUEST_ENTER_SIM_PIN 2<br />// 請求pin碼的輸入,"data"是const char**<br />// 其中((const char**)data)[0]是pin碼<br />// "response"是int*,其中((int*)response)[0]是剩餘可輸入次數<br />// 有效返回碼:SUCCESS/RADIO_NOT_AVAILABLE/GENERIC_FAILURE/PASSWORD_INCORRECT<br />{RIL_REQUEST_ENTER_SIM_PIN, dispatchStrings, responseInts},</p><p>// #define RIL_REQUEST_ENTER_SIM_PUK 3<br />// 請求PUK碼和新的數字 PIN 碼的輸入,"data"是const char**<br />// 其中((const char**)data)[0]是PUK碼,((const char**)data)[1]是新的數字 PIN 碼<br />// "response"是int*,其中((int*)response)[0]是剩餘可輸入次數<br />// 有效返回碼:SUCCESS/RADIO_NOT_AVAILABLE/GENERIC_FAILURE/PASSWORD_INCORRECT<br />{RIL_REQUEST_ENTER_SIM_PUK, dispatchStrings, responseInts},</p><p>// #define RIL_REQUEST_ENTER_SIM_PIN2 4<br />// 請求PIN2碼的輸入,"data"是const char**<br />// 其中((const char**)data)[0]是pin2碼<br />// "response"是int*,其中((int*)response)[0]是剩餘可輸入次數<br />// 有效返回碼:SUCCESS/RADIO_NOT_AVAILABLE/GENERIC_FAILURE/PASSWORD_INCORRECT<br />{RIL_REQUEST_ENTER_SIM_PIN2, dispatchStrings, responseInts},</p><p>// #define RIL_REQUEST_ENTER_SIM_PUK2 5<br />// 請求PUK2碼和新的PIN2碼的輸入,"data"是const char**<br />// 其中((const char**)data)[0]是PUK2碼,((const char**)data)[1]是新的PIN2碼<br />// "response"是int*,其中((int*)response)[0]是剩餘可輸入次數<br />// 有效返回碼:SUCCESS/RADIO_NOT_AVAILABLE/GENERIC_FAILURE/PASSWORD_INCORRECT<br />{RIL_REQUEST_ENTER_SIM_PUK2, dispatchStrings, responseInts},</p><p>// #define RIL_REQUEST_CHANGE_SIM_PIN 6<br />// 請求更改數字 PIN 碼,"data"是const char**<br />// 其中,((const char**)data)[0]是舊數字 PIN 碼,((const char**)data)[1]是新數字 PIN 碼<br />// "response"是int*,其中((int*)response)[0]是剩餘可輸入次數<br />// 有效返回碼:SUCCESS/RADIO_NOT_AVAILABLE/GENERIC_FAILURE/PASSWORD_INCORRECT<br />{RIL_REQUEST_CHANGE_SIM_PIN, dispatchStrings, responseInts},</p><p>// #define RIL_REQUEST_CHANGE_SIM_PIN2 7<br />// 請求更改PIN2碼,"data"是const char**<br />// 其中,((const char**)data)[0]是舊PIN2碼,((const char**)data)[1]是新PIN2碼<br />// "response"是int*,其中((int*)response)[0]是剩餘可輸入次數<br />// 有效返回碼:SUCCESS/RADIO_NOT_AVAILABLE/GENERIC_FAILURE/PASSWORD_INCORRECT<br />{RIL_REQUEST_CHANGE_SIM_PIN2, dispatchStrings, responseInts},</p><p>// #define RIL_REQUEST_ENTER_NETWORK_DEPERSONALIZATION 8<br />// 請求輸入網路個人碼以便去啟用,"data"是const char**<br />// 其中,((const char**)data))[0]是網路個人碼<br />// "Response"是int*,((int*)response)[0]是剩餘可輸入次數<br />// 有效返回碼是:SUCCESS/RADIO_NOT_AVAILABLE/GENERIC_FAILURE/PASSWORD_INCORRECT<br />{RIL_REQUEST_ENTER_NETWORK_DEPERSONALIZATION, dispatchStrings, responseInts},</p><p>// #define RIL_REQUEST_GET_CURRENT_CALLS 9<br />// 請求擷取當前呼叫列表,"data"是NULL<br />// "response"類型必須是const RIL_Call **<br />// 有效返回碼是:SUCCESS/RADIO_NOT_AVAILABLE/GENERIC_FAILURE<br />{RIL_REQUEST_GET_CURRENT_CALLS, dispatchVoid, responseCallList},</p><p>// #define RIL_REQUEST_DIAL 10<br />// 初始化一個語音電話,"data"是const RIL_Dial*類型<br />// "response"是NULL<br />// 有效返回碼是:SUCCESS/RADIO_NOT_AVAILABLE/GENERIC_FAILURE<br />{RIL_REQUEST_DIAL, dispatchDial, responseVoid},</p><p>// #define RIL_REQUEST_GET_IMSI 11<br />// 擷取SIM卡中的國際移動使用者識別碼IMSI,只在RADIO_STATE_SIM_READY時可用<br />// "data"是NULL,"response"是包含IMSI的const char*類型<br />// 有效返回碼是:SUCCESS/RADIO_NOT_AVAILABLE/GENERIC_FAILURE<br />{RIL_REQUEST_GET_IMSI, dispatchVoid, responseString},</p><p>// #define RIL_REQUEST_HANGUP 12<br />// 掛斷某一啟用的通話,類似AT指令:AT+CHLD=1x;在HANDUP請求返回時,RIL將在<br />// 下一次RIL_REQUEST_GET_CURRENT_CALLS請求時,顯示這個串連不可用<br />// "data"是int*,其中((int*)data)[0]包含串連的索引,即上面CHLD中的x值<br />// "response"是NULL<br />// 有效返回碼是:SUCCESS/RADIO_NOT_AVAILABLE/GENERIC_FAILURE<br />{RIL_REQUEST_HANGUP, dispatchInts, responseVoid},</p><p>// #define RIL_REQUEST_HANGUP_WAITING_OR_BACKGROUND 13<br />// 掛斷所有等待的或者保持的通話,類似AT指令:AT+CHLD=0;在HANDUP請求返回時,<br />// RIL將在下一次RIL_REQUEST_GET_CURRENT_CALLS請求時,顯示這個串連不可用<br />// "data"和"response"都是NULL<br />// 有效返回碼是:SUCCESS/RADIO_NOT_AVAILABLE/GENERIC_FAILURE<br />{RIL_REQUEST_HANGUP_WAITING_OR_BACKGROUND, dispatchVoid, responseVoid},</p><p>// #define RIL_REQUEST_HANGUP_FOREGROUND_RESUME_BACKGROUND 14<br />// 釋放所有啟用的通話並啟用保持的或者等待的通話,類似AT指令:AT+CHLD=1<br />// 在HANDUP請求返回時<br />// RIL將在下一次RIL_REQUEST_GET_CURRENT_CALLS請求時,顯示這個串連不可用<br />// "data"和"response"都是NULL<br />// 有效返回碼是:SUCCESS/RADIO_NOT_AVAILABLE/GENERIC_FAILURE<br />{RIL_REQUEST_HANGUP_FOREGROUND_RESUME_BACKGROUND, dispatchVoid, responseVoid},</p><p>// #define RIL_REQUEST_SWITCH_WAITING_OR_HOLDING_AND_ACTIVE 15<br />// 通話串連狀態的轉換,將所有啟用的通話轉為保持或等待狀態,或者將保持或等待的<br />// 通話轉為啟用狀態,類似AT指令:AT+CHLD=2<br />// 狀態的轉換有以下幾種,假設通話1處於等待態,通話處於是啟用態<br />// 轉換前 轉換後<br />// 通話1 通話2 通話1 通話2<br />// ACTIVE HOLDING HOLDING ACTIVE<br />// ACTIVE WAITING HOLDING ACTIVE<br />// HOLDING WAITING HOLDING ACTIVE<br />// ACTIVE IDLE HOLDING IDLE<br />// IDLE IDLE IDLE IDLE<br />// "data"和"response"都是NULL<br />// 有效返回碼是:SUCCESS/RADIO_NOT_AVAILABLE/GENERIC_FAILURE<br />{RIL_REQUEST_SWITCH_WAITING_OR_HOLDING_AND_ACTIVE, dispatchVoid, responseVoid},</p><p>// #define RIL_REQUEST_CONFERENCE 16<br />// 請求加入電話會議,類似AT指令:AT+CHLD=3<br />// "data"和"response"都是NULL<br />// 有效返回碼是:SUCCESS/RADIO_NOT_AVAILABLE/GENERIC_FAILURE<br />{RIL__CONFERENCE, dispatchVoid, responseVoid},</p><p>// #define RIL_REQUEST_UDUB 17<br />// 發送使用者確定使用者忙UDUB(user determined user busy)訊號<br />// "data"和"response"都是NULL<br />// 有效返回碼是:SUCCESS/RADIO_NOT_AVAILABLE/GENERIC_FAILURE<br />{RIL_REQUEST_UDUB, dispatchVoid, responseVoid},</p><p>// #define RIL_REQUEST_LAST_CALL_FAIL_CAUSE 18<br />// 請求最近一次通話中斷的錯誤碼,"data"是NULL,"response"是int*<br />// ((int*)response)[0]是RIL_LastCallFailCause類型。<br />// 有效返回碼是:SUCCESS/RADIO_NOT_AVAILABLE/GENERIC_FAILURE<br />{RIL_REQUEST_LAST_CALL_FAIL_CAUSE, dispatchVoid, responseInts},</p><p>// #define RIL_REQUEST_SIGNAL_STRENGTH 19<br />// 請求當前的訊號強度等相關資訊,當天線開啟時必須返回成功<br />// "data"是NULL,"response"是const RIL_SignalStrength<br />// 有效返回碼是:SUCCESS/RADIO_NOT_AVAILABLE<br />{RIL_REQUEST_SIGNAL_STRENGTH, dispatchVoid, responseRilSignalStrength},</p><p>// #define RIL_REQUEST_REGISTRATION_STATE 20<br />// 請求當前的註冊狀態,"data"是NULL,"response"是const char**類型<br />// ((const char **)response)[0]表示註冊狀態,取值如下:<br />// 0 - 未註冊,移動終端MT當前沒有搜尋新的電訊廠商去註冊<br />// 1 - 登入,本網<br />// 2 - 未註冊,移動終端MT當前正在搜尋新的電訊廠商去註冊<br />// 3 - 拒絕註冊<br />// 4 - 未知<br />// 5 - 登入,漫遊<br />// 10 - 類似0,但指示緊急電話使能<br />// 12 - 類似2,但指示緊急電話使能<br />// 13 - 類似3,但指示緊急電話使能<br />// 14 - 類似4,但指示緊急電話使能<br />// ((const char **)response)[1],如果註冊在GSM/WCDMA網路上,則表示LAC,<br />// 否則是NULL,有效LAC值是0x0000 -- 0xffff<br />// ((const char **)response)[2],如果註冊在GSM/WCDMA網路上,表示CID,<br />// 否則是NULL,有效CID值是0x00000000 -- 0xffffffff<br />// GSM網路中,CID指Cell ID,以16bits表示<br />// UMTS網路中(3G網路),CID指UMTS Cell Identity,以28bits表示<br />// ((const char **)response)[3],指示可用的無線技術:<br />// 0 - Unknown, 1 - GPRS, 2 - EDGE, 3 - UMTS, 4 - IS95A, 5 - IS95B<br />// 6 - 1xRTT, 7 - EvDo Rev.0, 8 - EvDo Rev.A, 9 - HSDPA, 10 - HSUPA<br />// 11 - HSPA, 12 - EVDO Rev B<br />// ((const char **)response)[4],CDMA網路中表示基站ID,否則為NULL<br />// 基站ID是十進位表示的<br />// ((const char **)response)[5],CDMA網路中表示基站緯度,否則為NULL<br />// ((const char **)response)[6],CDMA網路中表示基站經度,否則為NULL<br />// ((const char **)response)[7],CDMA網路中表示是否支援並發服務<br />// 0 - 不支援,1 - 支援<br />// ((const char **)response)[8],CDMA網路中表示系統ID,否則為NULL<br />// 取值範圍是0 - 32767<br />// ((const char **)response)[9],CDMA網路中表示網路ID,否則為NULL<br />// 取值範圍是0 - 65535<br />// ((const char **)response)[10],CDMA和EVDO網路中表示TSB-58漫遊指示符<br />// 否則為NULL,有效值是0 - 255<br />// ((const char **)response)[11],CDMA和EVDO網路中表示當前系統是否在PRL中<br />// 否則為NULL,0 - 不在,1 - 在<br />// ((const char **)response)[12],CDMA和EVDO網路中表示預設的TSB-58漫遊指示符<br />// 否則為NULL,有效值是0 - 255<br />// ((const char **)response)[13],如果註冊狀態是3(拒絕註冊),這個值表示拒絕的<br />// 原因,取值如下:0 - 一般,1 - 認證失敗,2 - IMSI在HLR中是未知的,3 - 非法MS,// 4 - 非法ME,5 - PLMN不允許,6 - 本網不允許,7 - 漫遊不允許,<br />// 8 - 本網沒有可用的蜂窩網站,9 - 網路失效,10 - 持續定點更新拒絕// ((const char **)response)[13],當前蜂窩網站的主要擾碼,十進位表示<br />// 如果未在UMTS網路中註冊,或者註冊狀態未知,則為NULL<br />// 注意:當註冊狀態未知時,在Android電話系統中將作為服務不可用來處理<br />{RIL_REQUEST_REGISTRATION_STATE, dispatchVoid, responseStrings},

To Be Continued

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在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.