2012-02-15 71 views
11

我正在嘗試編寫一個應用程序來與rild交談。是的,我知道這在政治上是不正確的,但它是一個嵌入式工業遙測應用程序,所以我不關心用戶體驗,便攜性和所有這些東西。如何連接到rild套接字

問題是,當我嘗試連接時,出現java.io「Permission denied」異常。有誰能夠幫助我?

手機(Nexus One)植根於Cyanogenmod 7,該應用程序以超級用戶的身份使用Market中的「SuperUser」應用程序運行。

我的代碼(略):

try { 
    mSocket = new LocalSocket(); 
    mSockAddr = new LocalSocketAddress("rild", LocalSocketAddress.Namespace.RESERVED); 
    mSocket.connect(mSockAddr); 
} 
catch(Exception e) { 
    dbg.p("connect failed: "+e); 
} 

我看到RILD(和RILD調試)插座中的/ dev /插座。

srw-rw---- 1 root  radio   0 Feb 13 19:14 rild 
srw-rw---- 1 radio system   0 Feb 13 19:14 rild-debug 

難道說撥號器應用程序已連接並佔用插槽嗎?

順便說一句我最初嘗試使用框架,但得到了大部分關於java和第三方類未知的錯誤的humongus,所以我放棄了幾天的頭髮拉。我也有STFW和這個網站 - 很多人圍繞這個問題跳舞,但沒有具體的建議。

任何幫助非常感謝。 -John

回答

8

在RILD插座的java的到底是com.android.internal.telephony.RIL.java,這是由com.android.phone.PhoneApp.java擁有的一個實例。 PhoneApp是一個持久的應用程序,毫不奇怪,它提供了手機功能。禁用PhoneApp應該終止對rild套接字的任何java端使用。

您也可能想嘗試連接到未使用(但可能會被ril-daemon忽略)的「rild-debug」。

順便說一句 - 你可以通過做logcat -b radio看到RIL層之間的通信。

如果您想出解決方法,請回復。

+0

謝謝,我會試試看。順便說一句 - 我能通過「chmod 666/dev/socket/rild」獲得「權限被拒絕」問題。我可以在連接上沒有異常,但在發送命令時沒有迴應。我不確定我是否發送了有效的命令(反向設計它)。我發送:int DIAL(10),int seq ++,String phonenum(「7035551234」),int clirmode(0),int no-uus(0),int null-uus(0)。我會報告進展情況,以便對其他人有幫助。 – DontPanic 2012-02-17 15:56:54

+0

最好的辦法是查看RIL.java的源代碼,它定義了從java API到穿過套接字的消息的映射。 – 2012-02-17 19:06:21

+0

是的,我嘗試過,但事實證明太困難了,因爲它是如此的分層和抽象。但是我發現了_real_解決方案:我發現我可以連接到「rild-debug」套接字,並且可以做我所需要的。謝謝,約翰 – DontPanic 2012-02-21 18:59:45

1

在最新版本的Android中(以及可能在早期版本中),rild-debug並不意味着接受全部命令;只接受預定義的命令。

結賬ril.cpp這裏;

static void debugCallback (int fd, short flags, void *param) 
... 

    case 0: 
     LOGI ("Connection on debug port: issuing reset."); 
     issueLocalRequest(RIL_REQUEST_RESET_RADIO, NULL, 0); 
     break; 
    case 1: 
     LOGI ("Connection on debug port: issuing radio power off."); 
     data = 0; 
     issueLocalRequest(RIL_REQUEST_RADIO_POWER, &data, sizeof(int)); 
     // Close the socket 
     close(s_fdCommand); 
     s_fdCommand = -1; 
     break; 

UPD:也是,RIL請求增量編號,它很容易通過發行外的的系列事件有效突破RIL/phoneapp配對。

+0

在我的項目中,我只是在initril腳本,librilmtk.so中的十六進制編輯的套接字名稱以及基於Mozilla的Boot2Gecko rilproxy(必須重寫大量套接字偵聽代碼......)的情況下實施自定義代理。另請參閱UPD。 – 2013-12-23 12:21:26

+0

您可以發表一個關於如何通過rild發送USSD請求的例子,並擁有root權限嗎? – arts777 2013-12-23 12:55:44

+0

@RankoR我現在無法顯示這個源代碼,而且「root訪問權限」本身並不是強制性的 - 我的最終應用程序可以像普通用戶一樣運行。你最好的希望是快速完成這個任務 - 將所有AOSP 1-sim手機定位到自定義libril.so(以及一些MTK6575手機,因爲它們具有RIL源)。只需重新構建源代碼,再向libril的調試源添加一個命令,使用AOSP很容易(但我選擇了新的MTK,因此必須採用二進制黑客+代理方式)。 2-sim手機和廣義支持是一個問題。 – 2013-12-23 18:20:57