OBEX ( OBject EXchangeの略称、IrOBEXとも呼ばれる) は、デバイス間でのバイナリ オブジェクトの交換を容易にする通信プロトコルです。これは、Infrared Data Associationによって管理されていますが、 Bluetooth Special Interest GroupやOpen Mobile Alliance (OMA) のSyncML部門でも採用されています。OBEX の最も初期の人気アプリケーションの 1 つは、Palm IIIに搭載されていました。このPDAとその後継機の多くは、OBEX を使用して名刺、データ、さらにはアプリケーションを交換しています。
OBEX は当初赤外線用に設計されましたが、現在ではBluetoothに採用されており、RS-232、USB、WAPやLivescribeスマートペンなどのデバイスでも使用されています。
HTTPとの比較
OBEX は、クライアントにサーバーに接続するための信頼性の高いトランスポートを提供し、オブジェクトを要求または提供するという点で、設計と機能がHTTPに似ています。しかし、OBEX は多くの重要な点で異なります。
- HTTP は通常、TCP/IP リンクの上に階層化されます。OBEXも同様ですが、IrDAデバイスのIrLAP / IrLMP / Tiny TPスタック上に実装されるのが一般的です。Bluetooth では、OBEX はBaseband / ACL / L2CAP (および従来の用途ではRFCOMM )スタック上に実装されます。USB 経由など、OBEX の他のそのような「バインディング」も可能です。
- HTTP は人間が判読できるテキストを使用しますが、OBEX は「ヘッダー」と呼ばれるバイナリ形式のタイプ、長さ、値の3 つ組を使用して、リクエストまたはオブジェクトに関する情報を交換します。これらは、リソースが制限されたデバイスで解析するのがはるかに簡単です。
- HTTP トランザクションは本質的にステートレスです。通常、HTTP クライアントは接続を開き、単一の要求を行い、その応答を受信し、接続を閉じるか、または関連のない他の要求を行います。OBEX では、単一のトランスポート接続で多くの関連操作を実行できます。実際、OBEX 仕様に最近追加された機能により、突然閉じられたトランザクションをすべての状態情報を保持したまま再開できるようになりました。
オブジェクト
OBEX は、接続のパラメータの確立、データの送信と要求、現在のパスまたはファイルの属性の変更など、さまざまな目的で使用される オブジェクトを交換することによって機能します。
オブジェクトはフィールドとヘッダーです。たとえば、携帯電話から電話帳を要求するために使用されるオブジェクトは次のようになります。
このオブジェクトには、2 つのフィールド (コマンドと長さ) と 2 つのヘッダーが含まれています。最初のフィールド (コマンド) は、それがデータの要求 (GET) であることを指定します。2 番目のフィールドは、2 つのフィールドを含むオブジェクトの合計サイズです。
このオブジェクトには、「接続 ID」と「名前」という 2 つのヘッダーも含まれています。各ヘッダーの最初のバイトは、ヘッダーの名前とコンテンツ タイプです。この場合、次のようになります。
- 0xCB は、このヘッダーが以前に取得された番号である「接続 ID」であることを意味します。0xCB の最上位 2 ビットは 11 であり、このペアはこれを 4 バイトの量として指定します。
- 2 番目のヘッダーの最初のバイトは 0x01 です。このバイトは、このヘッダーが「名前」ヘッダーであることを示します。0x01 の最初の 2 ビットは 00 です。これは、このヘッダーの内容が、ヌルで終了する Unicode 文字列 ( UCS-2形式) であり、先頭にバイト数 (0x00 0x1e) が付加されていることを意味します。
要求されたデータを含む応答の例としては、次のものが考えられます。
この例では、電話帳は 1 つの応答オブジェクトに収まるほど短いと想定されています。唯一のヘッダーの識別子は 0x49 です。これは、これが「本文の終わり」、つまり最後の情報チャンク (この場合も唯一の情報チャンク) であることを意味します。0x49 の最初の 2 ビットは 01 です。これは、このヘッダーの内容が長さプレフィックス付きデータであることを意味します。次の 2 バイト 0x00 0x2F はこのデータの長さ (10 進数で 47) を示し、それに続くバイトはデータです。この場合、電話帳は47 バイトの 空のvCardのみで構成されています。
この例では、単一の GET コマンドとその応答を示します。関係するヘッダーは、接続 ID、名前、本文の終わりだけです。これを発行する前に、接続 ID を含む接続のいくつかのパラメーターを確立するために、CONNECT コマンドを送信する必要があります。その他のコマンドは、put、setpath、action、abort、disconnect です。その他の注目すべきヘッダーには、type、time、description、target などがあります。
セッション
クライアント (例: コンピュータ) がサーバー (例: モバイル) に接続した後、典型的なセッションは、クライアントがいくつかのオブジェクトを送信し、サーバーから応答を取得することから構成されます。例:
- CONNECT: フィールドの 1 つは、クライアントが受信できるパケットの最大サイズを指定します。TARGET ヘッダーは、クライアントが期待するサービスの種類 (ファイル ブラウジング、同期 ml、電話帳アクセス) を指定します。サーバーは、最大パケット長、接続 ID、およびその他のデータで応答します。
- GET: クライアントは接続ID、ファイル名、および/またはそのタイプを指定してファイルを要求します。サーバーはファイルの内容またはその一部を返します。後者の場合、クライアントはファイルの残りの部分を取得するために他のGETオブジェクトを送信する必要があります。
- SETPATH: クライアントは、接続IDとフォルダ名を2つのヘッダーで指定して、サーバーに別のファイルフォルダに切り替えるように指示します。
- GET: クライアントは、接続 ID と適切な TYPE ヘッダー (例: ファイル転送の場合は「x-obex/folder-listing」、電話帳アクセスの場合は「x-bt/vcard-listing」) を含むオブジェクトを送信して、フォルダーの内容の一覧を要求します。
- PUT: クライアントはファイルをサーバーに送信します。ファイルが大きすぎて単一のパケットに収まらない場合、サーバーはCONTINUE応答で次の部分を要求します。
- DISCONNECT: クライアントはサーバーにセッションを終了することを通知します
交換はサービスによって大きく異なる場合があります。たとえば、SyncML はSETPATH を使用しませんが、OBEX プッシュは CONNECT (TARGET ヘッダーなし)、PUT、およびオプションの DISCONNECT のみで構成されます。
プロトコル
次のプロトコルは OBEX 上で実行されるか、または OBEX 上で実行するためのバインディングを持っています。
- OBEXプッシュ
- リクエストの発信元から受信者にファイルを転送します。ターゲットを含まないCONNECTIONオブジェクトが送信され、その後PUTを使用してファイルを転送します。
- OBEX ファイル転送プロトコル
- FTPと同様に、ファイルを保存および取得します。CONNECTION オブジェクトのターゲット ヘッダーは {0xF9、0xEC、0x7B、0xC4、0x95、0x3C、0x11、0xD2、0x98、0x4E、0x52、0x54、0x00、0xDC、0x9E、0x09} です。応答には、後続の GET、PUT、SETPATH、および ACTION オブジェクトで使用する接続 ID が含まれます。
- 電話帳アクセス
- ファイル転送に似ていますが、ターゲット {0x79、0x61、0x35、0xF0、0xF0、0xC5、0x11、0xD8、0x09、0x66、0x08、0x00、0x20、0x0C、0x9A、0x66} を使用します。電話帳エントリは、GET および SETPATH を使用して、telecom/ の下の特定のディレクトリから一覧表示 (さまざまな順序とフィルターを使用) および取得できます。
- イルマック
- IrMC は、電話帳エントリ、カレンダーエントリ、デジタル名刺、ToDo リストの交換用に設計されました。コネクションレス形式では、単一の PUT を使用してデータを転送します。それ以外の場合は、telecom/ 内のさまざまなファイルとフォルダーを取得またはプッシュできます。GET 要求では、ターゲット ヘッダー {'I'、'R'、'M'、'C'、'-'、'S'、'Y'、'N'、'C'} を使用して、使用されるインデックスの種類を区別できます。
- シンクML
- SyncML は、電話帳、カレンダー、メモ、およびその他のデータを同期できます。 OBEX バインディングでは、CONNECT オブジェクトのターゲットは {'S'、'Y'、'N'、'C'、'M'、'L'、'-'、'S'、'Y'、'N'、'C'} です。セッションは、名前のないXMLまたはWBXMLファイルが順番に送受信される PUT-GET ペアのシーケンスで構成されます。
実装
javax.obex
Bluetooth用Java APIのオプションパッケージjavax.obexは、JavaでのOBEXの実装を提供します。[1]
オープンオベックス
OpenObex は、 C言語で書かれた OBEX のオープンソース実装です。 IrDA、Bluetooth、USB、TCP/IP経由で接続し、オブジェクトを構築して受信したデータを処理するための機能を提供します。 クライアント アプリケーションのスキーマの例は次のとおりです。
void callback_function (...) { /* 受信したデータを処理する */ }
int main () { OBEX_Init (..., callback_function ); OBEX_TransportConnect (...);
オブジェクト= OBEX_ObjectNew (...); OBEX_ObjectAddHeader (オブジェクト、...); OBEX_ObjectAddHeader (オブジェクト、...); OBEX_Request (...、オブジェクト); while (...) OBEX_HandleInput (...)
オブジェクト= OBEX_ObjectNew (...); OBEX_ObjectAddHeader (オブジェクト, ...); OBEX_Request (...,オブジェクト); while (...) OBEX_HandleInput (...)
/* ... */
OBEX_TransportDisconnect (ハンドル);
OBEX_Cleanup (ハンドル); }
オブジェクトは によって送信されますOBEX_Request。 を呼び出した後OBEX_HandleInput、受信データはコールバック関数 ( の呼び出し時に指定されたOBEX_Init) で処理されます。 コールバック関数は、応答が完全に受信されたかどうか、したがってメイン プログラムがwhile実行中のループから終了できるかどうかを判断できます。
PyOBEX と nOBEX
PyOBEXはPythonでOBEXの部分的なサポートを提供します。[2] nOBEXはPyOBEXのフォークであり、より完全なOBEXサポートとBluetoothハンズフリープロファイルのサポートを備えており、自動車インフォテインメントシステムでのOBEXテストを容易にします。[3]
プロフィール
OBEX は、多くの上位層の「プロファイル」の基盤となります。
サポートされているデバイス
- Palm Pre、Palm Pre Plus、Palm Pixi、Palm Pixi Plus を除く、Palm III以降のすべてのPalm 。
- 赤外線またはBluetoothポートを備えたほとんどのSharp、Motorola、Samsung、Sony Ericsson、HTC、Nokia の携帯電話
- LG EnVタッチ(VX11000)
- 2003年以降の他の多くのPDA
- 赤外線またはBluetoothポートを備えた他の多くの携帯電話
- Android バージョン 2.1 以降
- Windows Phone 7.8 および 8 デバイス (「Bluetooth 共有」アプリ経由の写真、音楽、ビデオの転送に限定されます)。
参照
参考文献
- ^ javax.obex API
- ^ ピオベックス
- ^ いいえ
外部リンク
- IrDA.org の OBEX 仕様
- OBEX および OBEX ベースのプロトコル (GOEP、FTP、OBEX プッシュ、SYNC) の仕様を含む Bluetooth プロファイル
- OpenOBEX は OBEX プロトコルのオープンソース実装です
