Android 如何连接到rild插座

Android 如何连接到rild插座,android,ril,Android,Ril,我正在尝试编写一个应用程序来与rild对话。是的,我知道这在政治上是不正确的,但它是一个嵌入式工业遥测应用程序,所以我不关心用户体验、便携性和所有这些东西 问题是,当我尝试连接时,我得到一个java.io“Permission denied”异常。有人能帮我吗 这款手机(Nexus One)以Cyanogenmod 7为基础,该应用程序以超级用户身份运行,使用来自市场的“超级用户”应用程序 我的代码(缩写): 我在/dev/socket中看到了rild(和rild调试)套接字 srw-rw---

我正在尝试编写一个应用程序来与rild对话。是的,我知道这在政治上是不正确的,但它是一个嵌入式工业遥测应用程序,所以我不关心用户体验、便携性和所有这些东西

问题是,当我尝试连接时,我得到一个java.io“Permission denied”异常。有人能帮我吗

这款手机(Nexus One)以Cyanogenmod 7为基础,该应用程序以超级用户身份运行,使用来自市场的“超级用户”应用程序

我的代码(缩写):

我在/dev/socket中看到了rild(和rild调试)套接字

srw-rw----    1 root     radio            0 Feb 13 19:14 rild
srw-rw----    1 radio    system           0 Feb 13 19:14 rild-debug
是否拨号器应用程序已经连接并占用了插座

顺便说一句,我最初尝试使用这些框架,但却遇到了大量错误,主要是关于java和未知的第三方类的错误,所以在经历了几天的纠结之后,我放弃了。我也在STFW和这个网站上看到了很多关于这个问题的讨论,但没有具体的建议

非常感谢您的帮助。
-rild套接字java端的John是com.android.internal.telephony.RIL.java的一个实例,该实例归com.android.phone.PhoneApp.java所有。PhoneApp是一款持久应用程序,毫不奇怪,它提供了手机功能。禁用PhoneApp将终止rild套接字在java端的任何使用

您可能还想尝试连接到“rild debug”,它未使用(但可能被ril守护进程忽略)

顺便说一句,您可以通过执行logcat-b无线电查看RIL层之间的通信


如果您找到了解决方法,请发回。

在Android的最新版本中(很可能在早期版本中),
rild debug
并不意味着接受全部命令;只接受预定义的命令

在这里结账


UPD:此外,RIL请求以递增方式进行编号,通过发出一个系列外事件,可以很容易有效地断开RIL/phoneapp配对。

谢谢,我会尝试一下。顺便说一句,我通过“chmod666/dev/socket/rild”解决了“权限被拒绝”的问题。我在connect上没有异常,但在发送命令时没有响应。我不确定是否发送了有效的命令(进行了反向工程)。我正在发送:int-DIAL(10)、int-seq++、字符串phonenum(“7035551234”)、int-clirmode(0)、int-no-uus(0)、int-null-uus(0)。我将汇报进展情况,以便对其他人有所帮助。你最好的办法是查看RIL.java的源代码,它定义了从java API到通过套接字传递的消息的映射。是的,我尝试过,但事实证明太难了,因为它是分层和抽象的。但我找到了真正的解决方案:我发现我可以很好地连接到“rild调试”套接字,并执行我需要的操作。谢谢你,JohnHello John:我正在做的事情和你最初问的差不多,因为我尝试连接到ril调试套接字,经过一些变通后我能够做到:现在我的问题是如何通过android中的ril调试套接字与rild套接字交换数据(读写)?。我所有的代码都是用c语言编写的。我隐约知道android中的IPC binder类通过rild的套接字交换数据包,但这种情况发生在java中,我想用c语言。你能告诉我怎么才能做到吗?如果你愿意帮忙,我可以分享详细信息。Regardsher介绍了我是如何做到这一点的:创建一个LocalSocket,将其连接到RILD_名称(“RILD debug”),getOutputStream(),对输出流进行写操作。这些命令是二进制编码的。我从hardware/ril/rild/radiooptions.c逆向工程了它们。您可能还必须使用Runtime.getRuntime并执行“su-cchmod666/dev/socket/rild debug”将套接字上的权限更改为全局可写。我会发布源代码,但它是客户项目的一部分。顺便说一句,你只能写,不能读。祝你好运-JohnOn在我的项目中,我刚刚侵入了init脚本,在librilmtk.so中对套接字名称进行了十六进制编辑,并基于Mozilla的boot2geko-rilproxy实现了一个自定义代理(必须重写大量套接字侦听代码)。另外,请参阅UPD。您能否发布一个关于如何通过rild发送USSD请求的示例,并具有root访问权限?@RankoR我现在无法显示该源,并且“root访问”本身实际上不是强制性的-我的最终应用程序可以作为普通用户运行。您最希望快速完成此任务的是针对所有具有自定义libril.so的AOSP 1-sim手机(以及一些MTK6575手机,因为它们有可用的RIL源)。只需重新构建源代码,在libril的调试源代码中添加一个命令,使用AOSP很容易(但我的目标是较新的MTK,因此必须采用二进制黑客+代理的方式)。2-sim手机和通用支持是个问题。@RankoR某种经过修改的libril.so接受AT命令在XDA@RankoR此外,还请求USSD请求,这意味着a)rild将提醒手机USSD回复b)我在回答中警告过RIL请求是递增编号的,因此,无论如何,你都必须编写代理并过滤所有ril请求。。
srw-rw----    1 root     radio            0 Feb 13 19:14 rild
srw-rw----    1 radio    system           0 Feb 13 19:14 rild-debug
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;