如何连接到rild套接字。

11

我正在尝试编写一个与rild通信的应用程序。是的,我知道这不是政治正确的,但它是一个嵌入式工业遥测应用程序,所以我不关心用户体验、可移植性等等。

问题在于,当我尝试连接时,我会得到一个java.io "Permission denied"异常。有人可以帮我吗?

手机(Nexus One)已经使用Cyanogenmod 7获得了root权限,并且该应用程序正在使用Market中的“SuperUser”应用作为超级用户运行。

我的代码(缩写):

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

我在/dev/socket目录下看到了rild(和rild-debug)的套接字。

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

可能是拨号器应用程序已经连接并独占了该套接字吗?

顺便说一下,我最初尝试使用框架,但出现了大量关于Java和第三方类未知的错误,所以在苦苦挣扎了数天后放弃了。我也已经搜索过这个网站,但是只找到了有关此问题的许多泛泛而谈的信息,没有具体的建议。

非常感谢任何帮助。 -John

2个回答

8
在rild socket的Java端口上,有一个名为com.android.internal.telephony.RIL.java的实例,它属于com.android.phone.PhoneApp.java。PhoneApp是一个持久性应用程序,提供电话功能。禁用PhoneApp应该会终止对rild socket的任何Java端口使用。
您也可以尝试连接到未使用的“rild-debug”。
顺便说一下 - 您可以通过执行logcat -b radio来查看RIL层之间的通信。
如果您想出解决方法,请回复此贴。

谢谢,我会尝试。顺便说一句,我通过“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
你最好查看 RIL.java 的源代码,该文件定义了从 Java API 到通过套接字传输的消息之间的映射关系。 - Cesar Maiorino
你好,约翰:我正在做你最初提出的问题,尝试连接ril-debug socket,经过一些变通方法,我成功了:现在我的问题是如何通过Android中的ril-debug socket与rild socket交换数据(读取和写入)。我的所有代码都是用C语言编写的。我隐约知道Android中的IPC binder类可以在ril-debug套接字之间交换数据包,但它发生在Java中,而我想使用C语言。请问我该如何实现这个功能?如果你愿意帮忙,我可以分享详细信息。谢谢。 - ARDaniyal
原问题中已经给出了连接套接字的代码。我怀疑你的问题(和我的问题一样)与权限有关。用“ls -l /dev/socket/rild-debug”在ADB shell中检查/dev/socket/rild-debug。套接字必须可由全局写入。你的手机是否已经root?(你必须root才能更改权限)。 - DontPanic
@DontPanic,那么没有任何方法可以从套接字读取响应吗?我需要发送一些USSD命令并获取响应。 - YanDaik
显示剩余5条评论

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;
更新:此外,RIL请求是按顺序递增编号的,并且通过发出超出系列事件,很容易有效地打破ril/phoneapp配对。

在我的项目中,我刚刚横跨了init脚本,在librilmtk.so中十六进制编辑了套接字名称,并基于Mozilla的Boot2Gecko rilproxy实现了自定义代理(不得不重写大量的套接字监听代码..)。另外,请参见UPD。 - kagali-san
请问您能否提供一个示例,演示如何通过具有 root 访问权限的 rild 发送 USSD 请求? - artem
@RankoR,XDA上有一种修改过的libril.so可以接受AT命令。 - kagali-san
@RankoR 同时,USSD 请求是被请求的,这意味着 a) rild 将会提醒手机 USSD 回复 b) 我在我的回答中警告说 RIL 请求是递增编号的,所以你将不得不编写代理并过滤所有的 RIL 请求。 - kagali-san
@RankoR已经这样做了,还可以参考http://forum.xda-developers.com/showthread.php?t=1037075 - kagali-san
显示剩余4条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接