Как подключиться к 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, выполнив событие из серии.