2012-02-15 69 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