Как подключиться к Rild Socket

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

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

В телефоне (Nexus One) используется 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 ответа

Решение

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

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

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

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

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

Другие вопросы по тегам