Android RIL模組非啟動介面連網實戰(二)

來源:互聯網
上載者:User

原文地址::http://yangyangzhao.blog.163.com/blog/static/17581636620101163758306/

 

在Android RIL模組非啟動介面連網實戰(一)中,最後發現只需要調用radiooptions這個程式就可以達到連網的目的了,一切似乎都很簡單。

事實上如何呢?在android的shell下調用radiooptions,得到它的usage

bash-4.1# radiooptions
Usage: radiooptions [option] [extra_socket_args]
           0 - RADIO_RESET,
           1 - RADIO_OFF,
           2 - UNSOL_NETWORK_STATE_CHANGE,
           3 - QXDM_ENABLE,
           4 - QXDM_DISABLE,
           5 - RADIO_ON,
           6 apn- SETUP_PDP apn,
           7 - DEACTIVE_PDP,
           8 number - DIAL_CALL number,
           9 - ANSWER_CALL,
           10 - END_CALL
: Unknown error: 0

然後首先調用一下radio on(其實我是在已經啟動了介面的情況下實驗的,不用特意調用),發現log如下

bash-4.1# radiooptions 5
I/RILC    (  110): Debug port: Radio On
D/RILC    (  110): C[locl]> RADIO_POWER
bash-4.1# D/RILC    (  110): C[locl]< RADIO_POWER
D/RILC    (  110): C[locl]> SET_NETWORK_SELECTION_AUTOMATIC
D/RILJ    ( 1673): [UNSL]< UNSOL_RESPONSE_NETWORK_STATE_CHANGED
D/RILJ    ( 1673): [0233]> OPERATOR
D/RILC    (  110): C[locl]< SET_NETWORK_SELECTION_AUTOMATIC

看來libril在接受radio on的訊息之後會嘗試去尋找網路電訊廠商,之後再去嘗試串連setup data call,我用的是移動的卡,因此apn的名字是cmnet,於是我們嘗試傳入參數cmnet

bash-4.1# radiooptions 6 cmnet
I/RILC    (  110): Debug port: Setup Data Call, Apn :cmnet
D/RILC    (  110): C[locl]> SETUP_DATA_CALL
bash-4.1# E/RILJ    (  190): Hit EOS reading message length
I/RILJ    (  190): Disconnected from 'rild' socket
D/RILB    (  190): Notifying: radio not available
D/RILB    (  190): Notifying: radio off or not available
D/GSM     (  190): Poll ServiceState done:  oldSS=[0 home 涓浗縐誨姩 (N/A) 46000  EDGE CSS not supported -1 -1RoamInd: -1DefRoamInd: -1] newSS=[1 home null null null  Unknown CSS not supported -1 -1RoamInd: -1DefRoamInd: -1] oldGprs=0 newGprs=0 oldType=EDGE newType=EDGE

D/RILJ    (  190): [0000]> GET_CURRENT_CALLS
D/RILJ    (  190): [0000]< GET_CURRENT_CALLS error: com.android.internal.telephony.CommandException: RADIO_NOT_AVAILABLE

D/GSM     (  190): GSMDataConnTrack handleMessage { what=12 when=547391 obj=android.os.AsyncResult@45ce59c8 }

D/GSM     (  190): [GsmDataConnectionTracker] Radio is off and clean up all connection

D/GSM     (  190): [GsmDataConnectionTracker] Clean up connection due to radioTurnedOff

D/GSM     (  190): [GsmDataConnectionTracker] setState: DISCONNECTING
D/GSM     (  190): [PdpConnection] DataConnection.clearSettings()
D/GSM     (  190): [DataConnection] Stop poll NetStat
D/GSM     (  190): [GsmDataConnectionTracker] setState: IDLE
D/GSM     (  190): [IccCard] Broadcasting intent ACTION_SIM_STATE_CHANGED NOT_READY reason null

D/RILJ    (  190): [0001]> REQUEST_GET_NEIGHBORING_CELL_IDS
D/RILJ    (  190): [0001]< REQUEST_GET_NEIGHBORING_CELL_IDS error: com.android.internal.telephony.CommandException: RADIO_NOT_AVAILABLE

I/RILJ    (  190): Connected to 'rild' socket
I/RILC    (  468): libril: new connection
I/RILC    (  468): RIL Daemon version: HTC-RIL 1.6.1053G (Feb  2 2010,21:48:07)
D/RILJ    (  190): [UNSL]< UNSOL_RESPONSE_RADIO_STATE_CHANGED RADIO_UNAVAILABLE

在打出來上面的log之後,手機訊號沒有了。。。。。。。。。。。 –_–|||  重啟手機後終於能搜到訊號了。

看來直接使用radiooptions來setup data call是不行的,那我們看看介面上串連gprs是怎麼做的把,我開啟行動電話通訊的選項,發現它是這麼串連網路的

D/RILJ    (  190): [0079]> SETUP_DATA_CALL 1 0 cmnet none none 3
D/GSM     (  190): [GsmDataConnectionTracker] setState: INITING
D/RILJ    (  190): [UNSL]< UNSOL_DATA_CALL_LIST_CHANGED [DataCallState: { cid: 1, active: 2, type: IP, apn: cmnet, address: 10.129.168.228 }, DataCallState: { cid: -1, active: 0, type: , apn: , address:  }, DataCallState: { cid: -1, active: 0, type: , apn:
, address:  }]
D/GSM     (  190): GSMDataConnTrack handleMessage { what=6 when=466064 obj=android.os.AsyncResult@45c701b8 }

D/RILJ    (  190): [0079]< SETUP_DATA_CALL {1, rmnet0, 10.129.168.228}

看看和我用radiooptions串連網路的時候,差別在哪裡?參數多了很多,SETUP_DATA_CALL 1 0 cmnet none none 3,這裡有6個參數,而radiooptions只有一個參數,當然就不行了。於是去看libril和refrence-ril的代碼

 
  1. static void requestSetupDataCall(void *data, size_t datalen, RIL_Token t) //refrence-ril
  2. {
  3. const char *apn;
  4. char *cmd;
  5. int err;
  6. ATResponse *p_response = NULL;
  7. char *response[2] = { "1", PPP_TTY_PATH };
  8.  
  9. apn = ((const char **)data)[2];
  10.  

 
  1. static void debugCallback (int fd, short flags, void *param) { //libril
  2. int acceptFD, option;
  3. struct sockaddr_un peeraddr;
  4. socklen_t socklen = sizeof (peeraddr);
  5. int data;
  6. unsigned int qxdm_data[6];
  7. const char *deactData[1] = {"1"};
  8. char *actData[1];
  9. RIL_Dial dialData;
  10. int hangupData[1] = {1};
  11. int number;
  12. char **args;
  13.  
  14. //blabla
  15. case 6:
  16. LOGI("Debug port: Setup Data Call, Apn :%s\n", args[1]);
  17. actData[0] = args[1];
  18. issueLocalRequest(RIL_REQUEST_SETUP_DATA_CALL, &actData,
  19. sizeof(actData));
  20. break;
  21.  

注意到libril中傳且只傳一個參數,而reference-ril中的apn參數是從第二個取出來的,這樣強制轉換的話reference-ril就肯定會crash,難怪我那樣調用之後手機就沒有訊號了。。。

查出錯誤之後改起來就容易多了,首先要將libril裡面傳給reference-ril的參數更改,這裡我直接改成了

 
  1. issueLocalRequest(RIL_REQUEST_SETUP_DATA_CALL, /*&actData,
  2.   sizeof(actData));*/
  3. &args[1], 6*sizeof(args[1]));
  4.  

然後,將radiooptions裡面setup data call的參數限制解除。

於是,這樣就徹底解決了這個問題。不知道這算不是ril裡面的一個bug呢?

 

相關文章

聯繫我們

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