第 9 章 待ち受けアプリケーション
10.2 OBEX 外部接続API
10.2.2 OBEXサーバーAPI
Copyright Ⓒ 2008-2012 NTT DOCOMO, Inc. All Rights Reserved.
● アプリケーションプログラムが設定したオペレーション種別やOBEXヘッダ、オブジェクトデータの内容は、
1回のオペレーションでのみ有効です。1回の接続で連続してオペレーションを実行する場合、その都度これ らを設定しなおすようにしてください。
● OBEXサーバーから返却されたレスポンスコードが異常を示す値(0x20番台以外のコード)であった場合、
iアプリ実行環境は例外をスローします。
● DoJa-2.0プロファイル以降に対応した携帯電話では、外部との通信機能を一切停止して、通信を使用しない
機能のみ利用可能とするセルフモード機能が搭載されます。ユーザーが携帯電話をセルフモードにしている 状態では、iアプリの起動を行うことはできますが起動されたiアプリがOBEX外部接続を行うことはでき ません。
● 非活性化状態の待ち受けアプリケーションは、OBEX外部接続を行うことはできません。また、活性化状態 の待ち受けアプリケーションがOBEX外部接続を行っている際に非活性化状態に遷移しようとすると、
OBEX外部接続は失敗します。
● iアプリが赤外線通信を行っている間は、iアプリ実行環境は通信を実行中である旨のメッセージを表示し ます。また通信リンクの確立が行えなかった場合や、タイムアウト、ユーザー操作などにより通信が中断さ れた場合には、iアプリ実行環境はその旨をユーザーに伝えるメッセージを表示します。これらのメッセー ジを非表示とすることはできません。
Copyright Ⓒ 2008-2012 NTT DOCOMO, Inc. All Rights Reserved.
String name = soc.getName();
String type = soc.getType();
long time = soc.getTime();
// 送信されたオブジェクトの読み出し処理
InputStream in = soc.openInputStream();
:
in.close();
// 正常終了を示すステータスコードをOBEXクライアントに返す
soc.sendResponse(ObexConnection.SUCCESS);
} else if (operation==ObexConnection.DISCONNECT) { // 切断要求 break;
}
}
// 通信リンクを切断し、通信を終了する soc.close();
} catch (IOException ioe) { // 例外処理
// APIがスローするIOException、ConnectionExceptionの処理を行う
:
}
アプリケーションプログラムは ServerObexConnection を使用する際に、まず accept()メソ ッドを呼び出して OBEX クライアントからの赤外線通信のリンク確立要求(OBEX クライアント の connect()メソッド実行)を待ちます。いったん確立された通信リンク上では、複数のオペレ ーションを連続して処理することができます。前出のサンプルコードでは、1 回確立した通信リン ク上で、 OBEX クライアントからの切断要求を受け付けるまで繰り返しオペレーションの処理を行 っています。
OBEX サーバーでは、オペレーションの処理は以下の手順に従って行います。
1. receiveRequest()メソッドを使用して要求を受け付けます。このメソッドは、OBEXクライアントか らの要求を受け付けるまでブロックします。
2. getOperation()メソッドを使用して要求のオペレーション種別を取得します。オペレーション種別と してObexConnection.DISCONNECTを受け取った場合は、OBEXクライアントが通信リンクの開放を 通知したことを示しています。この要求を受け取った場合、OBEXサーバーもコネクションオブジェク トをクローズするようにしてください。
3. ObexConnectionで定義されているアクセスメソッドを使用して、OBEXリクエストヘッダの内容を取 得します。アクセスメソッドを使用して取得することのできるOBEXリクエストヘッダにはNameヘッ ダ、Typeヘッダ、Timeヘッダがあります。
4. PUTオペレーションの場合、OBEXクライアントから送信されたオブジェクトボディの内容を読み出し ます。この操作は、コネクションオブジェクトのopenInputStream()または
openDataInputStream()メソッドで取り出した入力ストリームを使用して行います。オブジェクトボ ディの長さは、コネクションオブジェクトのgetContentLength()メソッドを使用して取得すること ができます。
5. ObexConnectionで定義されているアクセスメソッドを使用して、OBEXレスポンスヘッダの内容を設 定します。アクセスメソッドを使用して設定することのできるOBEXレスポンスヘッダにはNameヘッ ダ、Typeヘッダ、Timeヘッダがあります。
6. GETオペレーションの場合、OBEXクライアントが要求しているオブジェクトのオブジェクトボディを 書き込みます。この操作は、コネクションオブジェクトのopenOutputStream()または
openDataOutputStream()メソッドで取り出した出力ストリームを使用して行います。
7. sendResponse()メソッドを使用して、OBEXクライアントにレスポンスを返します。このメソッドの 引数には、ObexConnectionで定義されているOBEXレスポンスコードを指定します。なお、
ObexConnectionで定義されているOBEXレスポンスコードは、OBEX規格におけるレスポンスコー ドの規定に準拠しています。各コードの意味などの詳細についてはOBEX規格を参照してください。
Copyright Ⓒ 2008-2012 NTT DOCOMO, Inc. All Rights Reserved.
OBEXサーバーがOBEXクライアントの要求を正常に処理できた場合、一般的にはOBEXサーバーアプ リケーションは、OBEXレスポンスコードとしてiアプリ実行環境
(ServerObexConnection.sendResponse()メソッド)にObexConnection.SUCCESSを返しま す。
OBEX サーバーの処理は、全体として上記のシーケンスに合致するようにしてください。例えばオ ペレーション処理要求を受け付けていない状態で OBEX リクエストヘッダを取得しようとすると 例外が発生します。
次の図に、ServerObexConnection の状態遷移を示します。
図 14: ServerObexConnection の状態遷移
注意事項:
● OBEX外部接続においては、Connectorクラスから直接openInputStream()、
openDataInputStream()、openOutputStream()、openDataOutputStream()の各メソッドにより入 出力ストリームを取り出すことはできません。アプリケーションプログラムはConnector.open()メソッ ドでServerObexConnectionオブジェクトを取得し、そのオブジェクトから入出力ストリームを取り出す 必要があります。
● 携帯電話の赤外線ポートへの通電は、アプリケーションプログラムから
ServerObexConnection.accept()を呼び出した際に、システムにより自動的に行われます。
● OBEXクライアントからのPUTオペレーションに対して、OBEXサーバーがオブジェクトを送信することは できません。OBEXサーバーはGETオペレーションに対してのみオブジェクトを送信することができます。
接続状態
Connector.open()
通信完了
読み取り可能 読み取り完了
InputStream.read()
InputStream.close() 初期状態
ServerObexConnection.openInputStream()
書き込み可能 書き込み完了
OutputStream.write()
OutputStream.close()
クローズ
ServerObexConnection.sendResponse()
ServerObexConnection.close()
凡例
状態 状態遷移 ServerObexConnection.accept()
受信完了
ServerObexConnection.receiveRequest()
ServerObexConnection.openOutputStream()
Copyright Ⓒ 2008-2012 NTT DOCOMO, Inc. All Rights Reserved.
● OBEXサーバーにおけるコネクションオブジェクトのオープンモードは、READモードがPUTオペレーショ
ンに、WRITEモードがGETオペレーションに対応します。1回の接続でGET、PUTの両オペレーションを
受け付ける可能性がある場合はREAD_WRITEモードを使用するようにしてください。
● Nameヘッダ、Typeヘッダの値にはそれぞれ最大63文字まで指定可能です。また、Typeヘッダの値にはASCII 文字のみ使用することができます。
● 1つのiアプリから同時に確立可能な通信リンクは1つだけです。また、iアプリのバックグラウンドで動 作しているネイティブ機能を含め、パケット通信が行われている状況では、OBEX外部接続の通信リンクを 確立することはできません。
● あるスレッドがaccept()メソッドやreceiveRequest()メソッドを呼び出してOBEXクライアントのア クションを待っている時、他のスレッドがServerObexConnectionオブジェクトのclose()メソッドを 呼び出すと通信は切断されます。また、タイムアウト発生やユーザーの中断操作といった要因により、通信 が切断されることがあります。
● GET、PUTの両オペレーションとも、1回につき100Kバイトまでのオブジェクトを送受信することができま す。この制限を越えたサイズのオブジェクトを送受信することはできません。
【DoJa-3.0】
送受信可能なオブジェクトサイズの制限は、DoJa-3.0プロファイルで緩和されました。DoJa-2.0プロフ ァイルでは、送受信可能なオブジェクトサイズは30Kバイトまでに制限されています。
● アプリケーションプログラムが設定したOBEXヘッダやオブジェクトデータの内容は、1回のオペレーショ ンでのみ有効です。1回の接続で連続してオペレーションを実行する場合、その都度これらを設定しなおす ようにしてください。
● DoJa-2.0プロファイル以降に対応した携帯電話では、外部との通信機能を一切停止して、通信を使用しない
機能のみ利用可能とするセルフモード機能が搭載されます。ユーザーが携帯電話をセルフモードにしている 状態では、iアプリの起動を行うことはできますが起動されたiアプリがOBEX外部接続を行うことはでき ません。
● 非活性化状態の待ち受けアプリケーションは、OBEX外部接続を行うことはできません。また、活性化状態 の待ち受けアプリケーションがOBEX外部接続を行っている際に非活性化状態に遷移しようとすると、
OBEX外部接続は失敗します。
● iアプリが赤外線通信を行っている間は、iアプリ実行環境は通信を実行中である旨のメッセージを表示し ます。また通信リンクの確立が行えなかった場合や、タイムアウト、ユーザー操作などにより通信が中断さ れた場合には、iアプリ実行環境はその旨をユーザーに伝えるメッセージを表示します。これらのメッセー ジを非表示とすることはできません。