Как подключиться к Rild Socket - PullRequest
11 голосов
/ 15 февраля 2012

Я пытаюсь написать приложение, чтобы поговорить с Rild. И да, я знаю, что это не является политически корректным, но это встроенное промышленное приложение телеметрии, поэтому меня не волнует пользовательский опыт, портативность и все такое.

Проблема в том, что когда я пытаюсь подключиться, я получаю исключение java.io "Permission denied". Кто-нибудь может мне помочь?

Телефон (Nexus One) имеет root-права на Cyanogenmod 7, и приложение работает как суперпользователь с помощью приложения "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-debug) в /dev/socket.

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 и этот сайт, вокруг которого много танцев, но нет конкретных советов.

Любая помощь с благодарностью. -John

Ответы [ 2 ]

8 голосов
/ 16 февраля 2012

На java-конце сокета rild находится экземпляр com.android.internal.telephony.RIL.java , владельцем которого является com.android.phone.PhoneApp.java .PhoneApp - это постоянное приложение, которое, что неудивительно, обеспечивает функциональность телефона.Отключение PhoneApp должно прервать любое использование Java стороны сокета rild.

Вы также можете попробовать подключиться к «rild-debug», который не используется (но может быть проигнорирован ril-daemon).

BTW - Вы можете увидеть связь между слоями RIL, выполнив logcat -b radio .

Пожалуйста, отправьте сообщение, если вы найдете обходной путь.

1 голос
/ 27 ноября 2013

В последних версиях 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, выполнив событие из серии.

...