【问题标题】:How to Connect to rild Socket如何连接到rild Socket
【发布时间】:2012-02-15 18:03:07
【问题描述】:

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

问题是当我尝试连接时,我得到一个 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 );
}

我在 /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

会不会是 Dialer 应用程序已经连接并占用了套接字?

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

非常感谢任何帮助。 -约翰

【问题讨论】:

    标签: android ril


    【解决方案1】:

    在 rild 套接字的 java 端是 com.android.internal.telephony.RIL.java 的一个实例,它由 com.android.phone.PhoneApp.java 拥有。 PhoneApp 是一个持久的应用程序,毫不奇怪,它提供了电话功能。禁用 PhoneApp 应该会终止任何 java 端对 rild 套接字的使用。

    您可能还想尝试连接到未使用的“rild-debug”(但可能会被 ril-daemon 忽略)。

    顺便说一句 - 你可以通过 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)。我会报告进度,以便对他人有所帮助。
    • 最好的办法是查看 RIL.java 的源代码,它定义了从 java API 到通过套接字的消息的映射。
    • 是的,我试过了,但它太难了,因为它是如此分层和抽象。但我找到了真正的 解决方案:我发现我可以很好地连接到“rild-debug”套接字,然后做我需要的事情。谢谢,约翰
    • 你好约翰:我做的事情和你最初问的差不多,因为我试图连接到 ril-debug 套接字,经过一些解决方法后我能够做到这一点:现在我的问题是如何通过android中的ril-debug套接字与rild套接字交换数据(读取和写入)?我所有的代码都是c语言。我不知何故隐约知道android中的IPC binder类通过rild的套接字交换数据包,但它发生在java中,我想使用c语言。你能告诉我我将如何实现这一目标吗?如果您愿意提供帮助,我可以分享详细信息。问候
    • 我是这样做的:创建一个 LocalSocket,将其连接到 RILD_NAME ("rild-debug"),getOuputStream(),在输出流上发出写入。命令是二进制编码的。我从 hardware/ril/rild/radiooptions.c 对它们进行了逆向工程。您可能还必须使用 Runtime.getRuntime 并执行“su -c chmod 666 /dev/socket/rild-debug”将套接字上的权限更改为全局可写。我会发布源代码,但它是客户项目的一部分。顺便说一句 - AFIK 你只能写,不能读。祝你好运。 -约翰
    【解决方案2】:

    在最新版本的 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 配对。

    【讨论】:

    • 在我的项目中,我只是破解了初始化脚本,在 librilmtk.so 中对套接字名称进行了十六进制编辑,并实现了一个基于 Mozilla 的 Boot2Gecko rilproxy 的自定义代理(不得不重写大量的套接字监听代码。 .)。另请参阅 UPD。
    • 您能否发布一个有关如何通过 rild 发送 USSD 请求的示例,具有 root 访问权限?
    • @RankoR 我现在无法显示该来源,并且“root 访问权限”本身实际上并不是强制性的——我的最终应用程序可以以普通用户身份运行。快速完成此任务的最大希望是使用自定义 libril.so(以及一些 MTK6575 手机,因为它们具有可用的 RIL 源)针对所有 AOSP 1-sim 手机。只需重建源代码,再向 libril 的调试源代码添加一个命令,使用 AOSP 很容易(但我的目标是较新的 MTK,所以必须采用二进制黑客 + 代理方式)。 2-sim 电话和通用支持是个问题。
    • @RankoR 某种修改后的 libril.so 接受 AT 命令可在 XDA 获得
    • @RankoR 同样,请求 USSD 请求,这意味着 a)rild 会提醒电话有关 USSD 回复 b)我在回答中警告说 RIL 请求是递增编号的,所以你必须去写代理并过滤所有 ril 请求..
    猜你喜欢
    • 1970-01-01
    • 2018-07-26
    • 1970-01-01
    • 2012-03-17
    • 2011-07-11
    • 2015-02-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多