如何连接到rild Socket

时间:2012-02-15 18:03:07

标签: android ril

我正在尝试编写一个与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 );
}

我在/ 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应用程序是否已连接并占用套接字?

BTW我最初尝试使用这些框架但是得到了一大堆关于java和第三方类别未知的错误,所以我放弃了几天后就放弃了。我也是STFW和这个网站 - 围绕这个问题跳舞,但没有具体的建议。

任何帮助非常感谢。 -John

2 个答案:

答案 0 :(得分:8)

在rild套接字的java端是 com.android.internal.telephony.RIL.java 的一个实例,它由 com.android.phone.PhoneApp.java拥有。 。 PhoneApp是一款持久性应用程序,毫不奇怪,它提供了手机功能。禁用PhoneApp应该杀死rild套接字的任何java端使用。

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

BTW - 您可以通过 logcat -b radio 查看RIL图层之间的通信。

如果您想出一个解决方法,请回复。

答案 1 :(得分: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配对。