web-dev-qa-db-ja.com

モデムコードはどのように通信するのですかAndroid code

AndroidモデムコードがAndroidアプリケーションレイヤーにメッセージを呼び出し/渡す)方法の概要を知りたい。SMS例:ネットワークがSMSおよびモデム(たとえば、Qualcomm Cコードがそれを解析する)を送信する場合)Androidアプリケーション層にどのように送信されますか?

常にJNI呼び出しが発生していますか?モデムとAndroid間のインターフェースとして?情報を教えてください。ありがとう

40
David Prun

AOSP/CAF/CMソース(それぞれAndroidオープンソースプロジェクト、CodeAuroraフォーラム、Cyanogenmod)にあるほとんどすべてのAndroidソースベースには、リルド、(無線インターフェース)と呼ばれるCコードがありますレイヤーデーモン)。これは通常、ソースツリーの_/hardware/ril_内にあります。

このデーモンは、Androidが起動した瞬間から実行され、_/dev/socket/rild_および_/dev/socket/rild-debug_というソケットを作成します。起動時に実行時に動的にロードされる、HTCのQualcommからの専用ライブラリがあります。無線ファームウェアと通信するのは、その独自のライブラリです。そして、rildのプロプライエタリライブラリへのコールバックのためのフックがそこで確立されます。

rildレイヤーでは、前述のソケットを介して、Androidレイヤー(ソースツリーにある_frameworks/base/telephony/com/Android/internal/telephony/RIL.Java_)がどのように通信するかを示します。

Java側では、読み取り/書き込み用にソケットを開き、インテントを確立し、このソケットを介してイベントをブロードキャスト/受信するためのデリゲートを設定します。

たとえば、着信コールであるプロプライエタリライブラリは、rildで設定されたコールバックフックを呼び出します。 rildは、標準の汎用AT Hayesモデムコマンドをソケットに書き込み、Java側で、モデムコマンドを読み取って解釈し、そこから PhoneManager は_CALL_STATE_RINGING_をブロードキャストし、 Phone アプリケーション(ソース_packages/apps/Phone_にあります)がレシーバーを登録し、ユーザーをキックスタートしますインターフェース、それがあなたが電話に答える方法です。

別の例として、発信する場合、Androidで番号をダイヤルすると、インテントが作成され、次に PhoneManager これがそれすべて、ここでは、頭の上を思い出せない、_frameworks/base/core/Java_のソースツリーのどこかにあると考えて)インテントを受け取り、それをATのシーケンスのいずれかに変換します_ Hayesモデムコマンド、それをソケットに書き込み、rildが専用ライブラリへのコールバックを呼び出し、専用ライブラリが無線ファームウェアに委譲します。

最後の例では、 Messaging (_packages/apps/Mms_ソースツリーにあります)アプリケーションからテキストメッセージを送信すると、入力したテキストが PhoneManager はインテントを受け取り、テキストを7ビットGSM文字(IIRC)を使用してGSMエンコードに変換し、ソケットに書き出されます。rildは、独自仕様へのコールバックを呼び出しますライブラリ、次に独自のライブラリが無線ファームウェアに委任され、テキストはハンドセットのドメインを離れ、電波のどこかにあります... :) Android自体の中でブロードキャストメッセージを送信するとともに、 _READ_PHONE_STATE_権限が使用され、AndroidManifest.xmlで指定されている場合。

同様に、逆に、テキストメッセージを受信すると、その逆で、無線ファームウェアがいくつかのバイトを受信し、専用ライブラリがrildへのコールバックを呼び出し、バイトをソケットに書き込みます。 Java側では、それを読み取り、バイトシーケンスをデコードし、既知のようにテキストに変換し、メッセージ受信通知でブロードキャストを開始します。次に、 Messaging アプリケーションは、上記のブロードキャストの受信者を登録し、通知バーに「 + xxxxxxから受信した新しいメッセージ」のようなメッセージを送信するインテントを送信します。 "

インテントは_frameworks/base/telephony/Java/com/Android/internal/telephony/TelephonyIntents.Java_にあります

これがテレフォニーシステムの動作の要点です。本当の美しさは、汎用のAT Hayesモデムコマンドを使用することで、実際の独自のメカニズムを簡素化および非表示にすることです。

QualcommやHTCなどは、問題のライブラリをオープンソース化するとは考えないでください。無線電話層がS-o-C(System on a Chip)回路に埋め込まれているためです。

これはまた、付記として、無線ファームウェアをフラッシュするのが危険な理由でもあります。一部のハンドセットは、それを実行する機能を提供し、間違ったファームウェア(ハンドセットに互換性がないか不適切)などをフラッシュし、ハンドセットに別れを告げて使用しますドアストッパーやペーパーウェイトとして! :)

関与するJNIメカニズムはゼロであることに注意してください。

これは、それがどのように機能するかについての私の理解から、私が知ることができることから、これは、無線ファームウェアが、Linuxカーネルがアドレス空間を予約し、それに触れていない場所のメモリアドレスに読み込まれます。 DOSが起動した日、BIOSが使用する予約済みアドレスがあったと思います。ここでも同様です。予約済みとしてマークされたアドレスは、専用の無線ライブラリが通信するファームウェアによって占有されています-ライブラリが実行されているためカーネルが所有するアドレス空間、ルート権限を持つルートが所有するláは、それと「通信」できます。もしあなたがpeek and pokeの古いBASIC方言を使うことを考えれば、私はあなたが遠くないと思うでしょうそのアドレスに特定のバイトシーケンスを書き込むことによって、そこにマークを付けると、無線ファームウェアが割り込みベクトルテーブルを持っているように動作します。 :)

72
t0mm13b

T0mm13bによる説明に続き、スマートフォンについて話すときは、SMS /通話に対する3層の操作を考えてください。

RIL(ユーザーレベル)<-> AP <-> CP

AP:アプリケーションプロセッサ(Android OSが実行される場所。このプロセッサで実行されているゲーム、曲、ビデオ、カメラなどを考えてください)

CP:セルラープロセッサ(実際には、着信/発信コール/ smsのエアインターフェースを扱い、ネットワークタワーなどと対話します。)

ここで、CP側で一部のデータが受信されたとしましょう(インターネットデータ/ sms /コールの可能性があります)。これで、APとCPの間に特定の論理チャネルができました。したがって、CPは受信したデータを、データのタイプに基づいて対応するチャネルにプッシュします。このデータはAPによって受信されます。 APはこのデータをRIL/Appに送り返します。 RILはこのデータ(特に、call/smsデータ)をデコードします。これに基づいて、SMS /コールについてユーザーに通知します。

2
Kunal