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

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

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

Телефон (Nexus One) укоренен с Cyanogenmod 7, и приложение работает как суперпользователь, используя приложение "SuperUser" на Market.

Мой код (сокращенно):

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 уже подключено и запутывает сокет?

BTW Я изначально пытался использовать фреймворки, но получал грузинский багаж ошибок, в основном из-за неизвестных java и третьих сторон, поэтому я отказался после нескольких дней вытягивания волос. У меня также STFW и этот сайт - много танцующих вокруг проблемы, но никаких конкретных советов.

Любая помощь очень ценится. -Джон

Ответ 1

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

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

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

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

Ответ 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, выпустив событие вне серии.