2012-02-15 10 views
11

私はrildと対話するためのアプリを書こうとしています。そして、はい、私はこれが政治的に正しいわけではないことを知っていますが、それは組み込みの工業用テレメトリーアプリなので、私はユーザーの経験、移植性、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); 
} 

私はrild(とrild-デバッグ)を参照してくださいは/ dev /ソケットのソケット。

srw-rw---- 1 root  radio   0 Feb 13 19:14 rild 
srw-rw---- 1 radio system   0 Feb 13 19:14 rild-debug 

ダイヤラーアプリがすでに接続されていて、ソケットを突くことができますか?

私は当初、フレームワークを使用しようとしましたが、大部分はJavaおよび第三者のクラスについての幻想的なボート・ロードを取得していました。私はSTFWとこのサイトも持っています。問題についてはダンスがありますが、具体的なアドバイスはありません。

大変助かりました。 rildソケットのJavaの端部に

- ジョン

答えて

8

com.android.phone.PhoneApp.javaによって所有されているcom.android.internal.telephony.RIL.javaのインスタンスです。 PhoneAppは驚くことではないが、電話機能を提供する永続的なアプリケーションです。 PhoneAppを無効にすると、Java側でrildソケットが使用されなくなります。

"rild-debug"に接続することもできますが、これは未使用です(ril-daemonでは無視されることがあります)。

BTW - logcat -bラジオを実行すると、RILレイヤ間の通信を確認できます。

回避策が見つかった場合は、再度投稿してください。

+0

ありがとう、私はそれを試してみます。 BTW - "chmod 666/dev/socket/rild"で "permission denied"という問題が発生しました。私は接続上の例外を得ることはできませんが、私はコマンドを送信するときに応答を得ません。私は、有効なコマンド(それをリバースエンジニアリングしている)を送信しているかどうかはわかりません。私は送信しています:int DIAL(10)、int seq ++、String phonenum( "7035551234")、int clirmode(0)、int no-uus(0)、int null-uus(0)。私は進歩を報告して、他の人に助けとなるようにします。 – DontPanic

+0

RIL.javaのソースは、Java APIからソケットを経由するメッセージへのマッピングを定義しています。 –

+0

ええ、私はそれを試みましたが、それは非常に階層化され、抽象化されているので、あまりにも困難であることが判明しました。しかし、私は_real_解決策を見つけました。「rild-debug」ソケットに接続して、必要な処理を実行できることがわかりました。ありがとう、ジョン – DontPanic

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のペアを破ることは非常に簡単です。

+0

私のプロジェクトでは、ちょうどlibrilmtk.soの16進数のソケット名をinitスクリプトでハッキングし、MozillaのBoot2Gecko rilproxy(ソケットリスニングコードをたくさん書き直さなければならなかった..)に基づいてカスタムプロキシを実装しました。また、UPDを参照してください。 –

+0

rildを介してUSSDリクエストを送信する方法についての例を投稿してください。ルートにアクセスできますか? – arts777

+0

@RankoR私は現在、そのソースを表示することはできません。実際には「ルートアクセス」は必須ではありません。私の最終アプリケーションは通常のユーザーとして実行できます。これをすばやく完了するための最善の希望は、カスタムlibril.so(およびRILソースが利用可能なため、一部のMTK6575電話機)ですべてのAOSP 1-sim携帯電話をターゲットにすることです。 librilのデバッグソースにもう1つのコマンドを追加するだけで、ソースを再構築するだけで、AOSPでも簡単です(しかし、私は新しいMTKをターゲットにしていますので、バイナリのハッキング+プロキシの方法が必要でした)。 2-sim電話と一般化されたサポートが問題です。 –

関連する問題