まず、OBEXプロトコルについて簡単に説明する。
OBEXプロトコルは、電子情報をオブジェクトとして交換する方法を規定した通信プロトコルであり、コネクション設定機能、コネクション切断機能、オブジェクト送信機能、オブジェクト受信機能等を有する。
OBEXプロトコルのセッションモデルでは、機器をクライアント(Client)とサーバ(Server)として定義し、クライアントが発行する要求(Request)に対してサーバが応答(Response)を行う形式をとる。
図1は、OBEXのセッションモデルを示す。
OBEXセッションではクライアント11が要求パケットを発行し、それに対しサーバ12が応答パケットを返すことでデータ交換が行われる。
図2及び図3は、要求パケットと応答パケットの基本的なパケットフォーマットを示す。
図2に示すように、要求パケットは、その要求の種類を示すopコード(opcode)を記載するフィールド、要求パケットの長さ(packet length)を記載するフィールド、及びOBEXヘッダ(OBEX header)から構成される。一方、図3に示すように、応答パケットは、その応答の意味(成功やエラーなど)を示す応答コード(response code)を記載するフィールド、応答パケットの長さを記載するフィールド、及びOBEX ヘッダから構成される。なお、OBEXセッションの構築(接続)処理時は、3から6バイト目にOBEXのバージョン番号、最大OBEXパケットサイズ等の情報が付加され、OBEX ヘッダは7バイト目からとなる。図4及び図5に、opコードの定義と、応答コードの定義の一部を示す。
OBEXで交換するオブジェクト(オブジェクト本体、オブジェクトの長さ、オブジェクトのタイプ、ファイル名、セッションの識別子など)はOBEX ヘッダとして表現される。OBEXヘッダは図6に示すようにヘッダID(HI)とヘッダ Value(HV)より構成される。OBEXヘッダのヘッダID (HI)の定義を図7に示す。
図8から図11に、OBEXセッション構築(Connect処理)、オブジェクト送信(Put処理)、オブジェクト取得(Get処理)、OBEXセッション切断(Disconnect処理)の通信シーケンス例を示しておく。
以下、図面を参照しながら、本発明の実施の形態について、詳細に説明する。
(第1の実施の形態)
図12は、本発明の実施の形態に従った通信機器1の構成を示す。
通信機器1はBluetoothの無線送受信機能を有する機器であり、通信プロトコルとしてOBEXを具備した機器である。
通信機器1は、BluetoothTMによる無線通信を実行するように設計された無線通信デバイス101と、無線通信デバイス101を制御しOBEXプロトコルに対して通信リンクを提供する下位プロトコルスタック部102と、下位プロトコルスタック部102を利用してOBEXプロトコルに従った動作を行うOBEX部103と、OBEX部103を利用して動作する上位アプリケーション104とを有する。
下位プロトコルスタック部102は、BluetoothTMの規格で規格化されているOBEXプロトコル以下のプロトコルスタックとして、RFCOMM,SDP,L2CAPなどのプロトコルスタックの機能を実装する。
OBEX部103は下位プロトコルスタック部102を利用して通信相手機器におけるOBEX部とデータの送受信を行う。OBEX部103のデータ送受信機能は、IrOBEX(IrDA Object Exchange Protocol)のオブジェクト交換サービスの手順に従うと共に、Bluetooth Special Interest Group (SIG)によって規定されたGeneric Object Exchange Profileをサポートするように設計され実装されている。
なお、図12では、本発明で示す機能改善を実現する上で直接影響を及ぼすことがない構成要素(例えばCPU等)は省略している。
図13は、図12に示す通信機器1同士が通信を行う様子を示す。より詳細には、図13は、OBEXクライアントとして動作するクライアント機器1と、OBEXサーバとして動作するサーバ機器1’とが通信を行う様子を示す。クライアント機器1は、サーバ機器1’に対して、OBEXのセッション(コネクション)を設定し、OBEXプロトコルに従って、オブジェクトを送信または取得する。
以下、本発明の大きな特徴の1つとなるOBEX部103について詳細に説明する。
OBEX部103は、下位プロトコルスタック部102がOBEX部103に対して提供する1つのサービスアクセスポイント(Bluetoothのプロトコルスタックで説明すると、RFCOMMの提供する一本のリンク)に対して複数のOBEXのコネクションを多重化し利用することを特徴とする。多重化の様子を図14に示す。
まず、OBEX部103の構成要素のうち基本構成要素についての説明を行う。
図15及び図16は、OBEX部103における基本構成要素の構成を示す図である。より詳細には、図15はOBEXクライアントとして動作する場合におけるOBEX部の処理の流れを含み、図16はOBEXサーバとして動作する場合におけるOBEX部の処理の流れを含む。
図15及び図16に示すように、特に図15に示すように、OBEX部103の基本構成要素は、OBEXインタフェース1000、OBEXクライアントエンジン2000、OBEXサーバエンジン3000である。
OBEXインタフェース1000は、複数のOBEXクライアントエンジン(2001,2002,…であり、その中の一つを表す場合には200Xと表記する)とOBEXサーバエンジン(3001,3002,…であり、その中の一つを表す場合には300Yと表記する)の管理を行う。
OBEXインタフェース1000は、上位アプリケーション104に対して、OBEXプロトコルのインタフェース(IF)関数(ConnectRequest、PutRequest、GetRequest、DisconnectRequestなど)を提供する。上位アプリケーション104からインタフェース関数が実行されると、OBEXインタフェース1000は適切なOBEXクライアントエンジン200Xを一つ選択し、上位アプリケーション104から指示された処理を命令する。
また、OBEXインタフェース1000はパケットの受信管理を行っており下位プロトコルスタック部102から受信したパケットを適切なOBEXクライアントエンジン200XあるいはOBEXサーバエンジン300Yへと振り分けて渡す。例えば、受信したパケットが応答パケットであれば、適切なOBEXクライアントエンジン200Xへと渡し、受信したパケットが要求パケットであれば、図16に示すように、適切なOBEXサーバエンジン300Yへと渡す。受信したパケットから適切なOBEXクライアントエンジン200XまたはOBEXサーバエンジン300Yを選択する方法については後ほど改めて説明する。
図15に示すように、OBEXクライアントエンジン200Xは、OBEXのクライアントとしての処理を実行する。OBEXインタフェース1000からConnectRequest、PutRequest、GetRequest、DisconnectRequestなどの処理命令が入力されると、OBEXのクライアントとして適切な処理をした後に、要求パケットを生成して下位プロトコルスタック部102へと出力する。また、OBEXインタフェース1000から応答パケットが入力されると、それに応じた処理を行う。上位アプリケーション104にステータスを通知する場合は、OBEXインタフェース1000を介して、イベントやメッセージの通知を行う。次の要求を送信する必要があれば、別の要求パケットを生成して下位プロトコルスタック部102へと出力する。
図16に示すように、OBEXサーバエンジン300Yは、OBEXのサーバとしての処理を実行する。OBEXインタフェース1000から要求パケットが入力されると、それに応じた処理を行う。上位アプリケーション104にステータスを通知する場合は、OBEXインタフェース1000を介して、イベントやメッセージの通知を行う。また、OBEXサーバエンジン300Yは、応答パケットを生成して下位プロトコルスタック部102へと出力する。
以下、OBEX部により行われる具体的な処理内容について説明する。
まず、OBEXセッション(あるいはOBEXコネクションと呼ぶ)の接続処理と切断処理について説明する。なお、以下の説明においてはクライアント機器1とサーバ機器1’とで通信を行う場合を示すが、クライアント機器1とサーバ機器1’の構成は同じであるとし、サーバ機器1’の構成要素については「’」の文字をつけて説明する。
[接続処理]
(1)OBEX部がクライアントとして動作する場合
図15において、上位アプリケーション104はOBEXインタフェース1000が用意するOBEXコネクションの設定要求(ConnectRequest)関数を実行する。その際、上位アプリケーション104は、相手サーバ側のアプリケーション104’への接続パラメータを指定する。
ConnectRequest 関数が実行されると、OBEXインタフェース 1000はそのOBEXコネクションのためにOBEXクライアントエンジン200X を一つ割り当て、OBEXコネクションの設定処理を進める。
より詳細には、OBEXクライアントエンジン200Xは、OBEXのConnectRequestパケットの送信を行う前に、下位プロトコルスタック部102に対して下位リンクの接続を要求する。下位プロトコルスタック部102による下位リンク接続完了(あるいは、既にリンクが存在していること)を検知すると、OBEXクライアントエンジン200Xは接続された相手サーバへ対しConnectRequestパケットを送信する。
その後、相手サーバから成功(OK_Success)を通知するConnectResponseパケットを受信するとクライアントとしてのOBEXコネクションの設定処理が完了し、上位アプリケーション104に成功を通知する。
もし、相手サーバからUnauthorizedを受信した場合は、OBEX間の認証(Authentication)処理が必要となるため、認証パスワードを確認後、再度相手サーバへ対しConnectRequestパケットを送信する。
コネクションが設定されると、その設定されたコネクションを識別するためにクライアント側のOBEXインタフェース 1000はローカルコネクションIDという識別子を割り当てることにより、設定されたコネクションとOBEXクライアントエンジン200Xとの対応を管理する。ローカルコネクションIDは同時に同じ値のものは存在しないように割り当てられるものとする。
上位アプリケーション104はOBEXインタフェース1000からローカルコネクションIDの情報を取得することができる。あるいは、OBEXインタフェース1000が上位アプリケーション104にローカルコネクションIDを通知しても良い。
(2)OBEX部がサーバとして動作する場合
図16において、相手機器との下位プロトコルスタック部102’におけるリンク接続が完了した後、ConnectRequestパケットの受信をOBEXインタフェース1000’が検知すると、OBEXインタフェース1000’ はそのOBEXコネクションのためにOBEXサーバエンジン300Y’を一つ割り当て、OBEXコネクションの設定処理を進める。
処理の結果、OBEXサーバエンジン300Y’は相手クライアントへ対しConnectResponseパケットを送信する。相手サーバへ成功(OK_Success)を通知するConnectResponseパケットを送信した時点でサーバとしてのOBEXコネクションの設定処理が完了する。OBEXサーバエンジン300Y’は、上位アプリケーション104’が存在するのであれば、上位アプリケーション104’に対してコネクションが設定されたことを通知する。
コネクションが設定された際に、サーバはそのコネクションを管理するためのコネクションIDを内部にて割り当て、それをConnectResponseパケットに含めてクライアント側の機器へと渡す。
コネクションIDは同時に同じ値のコネクションIDは存在しないものとし、OBEXインタフェース1000’は、割り当てられたコネクションIDとOBEXサーバエンジン300Y’との対応を管理する。
なお、上記で説明したサーバ側で割り当てるコネクションIDとクライアント側で割り当てるローカルコネクションIDはそれぞれの機器において決められるものであり、必ずしも等しい値ではない。
[切断処理]
(1)OBEX部がクライアントとして動作する場合
図15において、上位アプリケーション104はOBEXインタフェース1000が用意するOBEXコネクションの切断要求(DisconnectRequest)関数を実行する。その際、上位アプリケーション104は、ローカルコネクションIDを指定する。
DisconnectRequest関数が実行されると、OBEXインタフェース1000 はローカルコネクションIDから対応するOBEXクライアントエンジン 200Xを選択し、OBEXコネクションの切断処理を進める。
すなわち、OBEXクライアントエンジン200Xは相手サーバへ対しDisconnectRequestパケットを送信し、相手サーバからDisconnectResponseパケットを受信した時点でクライアントとしてのOBEXコネクションの切断処理が完了する。
ここで、DisconnectRequestパケットには、ローカルコネクションIDではなく、サーバ側で設定されたコネクションIDが含まれている。なお、OBEXコネクションの切断処理が完了した際に、下位プロトコルスタック部102のリンクについても一緒に切断しても良い。
(2)OBEX部がサーバとして動作する場合
図16において、DisconnectRequestパケットの受信をOBEXインタフェース1000’が検知すると、OBEXインタフェース1000’ はコネクションIDに対応するOBEXサーバエンジン300Y’を選択し、OBEXコネクションの切断処理を進める。
処理の結果、OBEXサーバエンジン300Y’は相手クライアントへ対しDisconnectResponseパケットを送信する。相手サーバへ成功(OK_Success)を通知するDisconnectResponseパケットを送信した時点でサーバとしてのOBEXコネクションの切断処理が完了する。上位アプリケーション104’が存在するのであれば、上位アプリケーション104’に対してコネクションが切断されたことを通知する。
次に、上述したOBEXセッション(OBEXコネクション)の接続処理及び切断処理以外の要求処理(オブジェクトの送信または取得)とそれに対応する応答処理とについて説明する。
[オブジェクトの送信要求処理または取得要求処理]
以下、OBEX部が、クライアントとして相手サーバに諸要求を行う場合の処理について説明する。
図15において、相手サーバに諸要求を行う場合、上位アプリケーション104はOBEXインタフェース1000が用意するOBEXコネクションの要求関数のうちから適切な要求(XXXRequest)関数を実行する。その際、上位アプリケーション104は、ローカルコネクションIDを指定するものとし、また、それぞれの要求関数毎に定められたパラメータを入力する。
XXXRequest関数が実行されると、OBEXインタフェース1000 はローカルコネクションIDから対応するOBEXクライアントエンジン 200Xを選択し処理を進める。
すなわち、OBEXクライアントエンジン200XはOBEXのXXXRequestパケット送信を行う。このXXXRequestパケットはサーバ側のコネクションIDを含む。その後、相手サーバから成功(OK_Success)を通知するXXXResponseパケットを受信、あるいは、エラーを通知するXXXResponseパケットを受信すると、要求送信処理が完了し、上位アプリケーション104に処理の完了を通知する。OBEXクライアントエンジン200XはOBEXのXXXRequestパケット送信を行った後で、継続(Continue)を通知するXXXResponseパケットを受信した場合は、OBEXクライアントエンジン200X内部で適切な処理をした後、処理を継続するためにXXXRequestパケット送信を行う。
[オブジェクトの送信応答処理または取得応答処理]
以下、OBEX部が、サーバとして相手クライアントに対し応答を行う場合の処理について説明する。
図16において、OBEXの要求(YYYRequest)パケットの受信をOBEXインタフェース1000’が検知すると、OBEXインタフェース1000’はコネクションIDに対応するOBEXサーバエンジン300Y’を選択し、YYYRequestに対応する処理を進める。
処理の結果、OBEXサーバエンジン300Y’は相手クライアントへ対しYYYResponseパケットを送信する。相手クライアントへ成功(OK_Success)を通知するYYYResponseパケットを送信した時点、あるいは、相手クライアントへエラーを通知するYYYResponseパケットを送信した時点でサーバとしての応答処理が完了し、上位アプリケーション104’が存在するのであれば、上位アプリケーションに対して処理の完了を通知する。OBEXサーバエンジン300Y’はOBEXのXXXRequestパケット受信して、OBEXサーバエンジン300Y’内部で処理を行った結果、クライアント機器側からの更なるRequestPacketを受信する必要がある場合には、継続(Continue)を通知するXXXResponseパケット送信を行う。
ここで、先に説明を省略した受信したパケットから適切なOBEXクライアントエンジン200XまたはOBEXサーバエンジン300Yを選択する方法について補足する。
OBEXインタフェース1000は受信したパケットが要求パケットであるか、応答パケットであるかは、次のようにして判断する。すなわち、受信パケットの最初のバイトを確認し、その値がOBEXプロトコルの仕様で規定されたopコードの値である場合は要求パケットと判断し、応答コードの値である場合は応答パケットと判断する。
OBEXクライアントエンジン200Xが、コネクションを設定するために送信するConnectRequestパケットにOBEXプロトコルの仕様で規定されたTargetヘッダが含まれている場合には、OBEXインタフェース1000はOBEXクライアントエンジン200Xとそれが送信するTargetの値とを記憶する。
OBEXプロトコルの仕様では、Targetヘッダが含まれたConnectRequestパケットを受信したサーバ側は応答として返すConnectResponseパケットにはWhoヘッダとConnectionIDヘッダとを含める。Whoヘッダの値はTargetと同じ値とし、ConnectionIDヘッダには設定したコネクションを識別するためのコネクションIDの値を含めることになっている。
そこで、OBEXインタフェース1000は、サーバからConnectResponseパケットを受信した場合に、Whoヘッダに含まれる値を確認し、先に記憶しているTargetの値と比較することで、適切なOBEXクライアントエンジン200Xを選択し、そこに受信したConnectResponseパケットを渡すことができる。その際に、OBEXインタフェース1000は、OBEXクライアントエンジン200XとTargetの値との対応に、更に、コネクションIDを追加し、OBEXクライアントエンジン200XとコネクションIDとの対応がとれるように管理する。
OBEXサーバエンジン300Y’が送信するConnectResponseパケットには、コネクションIDの情報が含まれていることから、OBEXインタフェース1000はOBEXサーバエンジン300Y’とコネクションIDとの対応がとれるように管理することは容易である。
本実施の形態におけるOBEX部103では、OBEXクライアントエンジン2000及びOBEXサーバエンジン3000は、Targetを指定して設定したOBEXコネクションにおいて、コネクション成立後に送信する全ての要求パケットおよび応答パケットに、必ずサーバ側で設定されたコネクションIDを含むConnectionIDヘッダを付加することとする。
なお、OBEXの仕様には応答パケットにConnectionIDヘッダを付加することは規定されていないが、本実施の形態のOBEX部103では応答パケットにもConnectionIDを付加する。これにより、例えばクライアント側が応答パケットを同時に受け取ったとしても各応答パケットを識別できる。つまり、OBEX部103同士で通信を行う場合、下位プロトコルスタック部102によって設定された一本の通信リンク上に複数のOBEXコネクションを多重化して通信を行うことができる。
OBEX部103の構成要素のうち基本構成要素における動作は上記に説明した通りである。すなわち、以上では、OBEXクライアントエンジン200XとOBEXサーバエンジン300Y’間でコネクションを設定しオブジェクトの送信や取得などの処理を行う方法について説明した。
以下では、OBEX部103の詳細構成要素を説明し、下位プロトコルスタック部102によって設定された一本の通信リンク上に複数のOBEXのコネクションを多重化し利用する方法について説明する。すなわち、同時に複数のOBEXクライアントエンジン200XとOBEXサーバエンジン300Y’を連携させながら動作させる多重化の仕組みについて説明する。
図17は、OBEX部103の詳細構成を示す図である。
OBEX部103は、OBEXインタフェース1000、OBEXクライアントエンジン2000、OBEXサーバエンジン3000に加えて、多重化処理実行部4000と多重化処理解析部5000とを備える。
図18は、多重化処理実行部4000と多重化処理解析部5000の内部構成例を含むOBEX部103の詳細構成図である。
多重化処理実行部4000におけるT1検出部4001は、OBEXサーバエンジン3000がPut要求を受信してからPut応答を送信するまでの処理時間として見込まれる期待値(例えば平均値)をT1秒として予め記憶する。T1検出部4001は、当該T1を相手機器から取得して記憶してもよく、また、相手機器の性能を想定した上で所定長のデータ(例えばOBEXクライアントエンジン2000で設定しているPut要求の最大パケット長)を用いて当該T1の値を自ら算出して記憶してもよい。
また、多重化処理実行部4000におけるT2設定部4002は、OBEXクライアントエンジン2000で設定しているPut要求の最大パケット長のパケット要求を送信後、相手機器のOBEXサーバエンジン3000へ届くまでの伝送時間として見込まれる期待値(例えば平均値)をT2として予め記憶する。T2設定部4002は、当該T2の値を、通信路の伝送速度等に基づいて自ら算出して記憶してもよい。また、T2設定部4002は、下位通信プロトコルスタック部104からT2の値を取得可能であれば、取得したT2の値を下位通信プロトコルスタック部104から取得して記憶しても良い。
多重化処理実行部4000におけるN計算部4003は、多重度NとしてN=[T1/T2]+1を計算するものとする。但し、[T1/T2]+1は一例であり、例えば([T1/T2]+2であってもよく、本実施の形態は、T1とT2の比率を利用して多重度Nを導くことを特徴とするものである。ここで、 [ ]はガウス記号であり、[T1/T2] はT1/T2を超えない最大の整数値であるとする。
また、N計算部4003は、下位プロトコルスタック部102が提供するSDPのサービスを利用して、相手機器が自らと同じOBEX部103を有するか否かを判別する機能を備える。判別する方法については、例えばSDPで規定されているサービスレコードに特有の情報を含め、それを検出する方法により判別可能である。
多重利用OBEXクライアントエンジン管理部4004は、N計算部4003から指定された多重度Nに基づき、必要なOBEXクライアントエンジン2000を利用して、コネクションの設定、オブジェクトの送信、コネクションの切断などの多重処理ができるように各OBEXクライアントエンジン2000を管理する。多重利用OBEXクライアントエンジン管理部4004は、多重化されたコネクションに1つ割り当てられるローカルコネクションIDについても管理を行う。多重利用OBEXクライアントエンジン管理部4004は、上位アプリケーション104からの命令を複数のOBEXクライアントエンジン2000へ分岐して伝えるとともに、各OBEXクライアントエンジン2000の処理の結果を統合して、上位アプリケーション104へ通知する。
オブジェクト分割部4005は、送信するオブジェクトを複数に分割する機能を備える。オブジェクト分割部4005は、上位アプリケーション104からオブジェクトの送信が命令された場合に、N計算部が計算した多重度Nの値に従い対象となるオブジェクトをN個に分割する。多重利用OBEXクライアントエンジン管理部4004がオブジェクト送信命令を複数のOBEXクライアントエンジン2000へ分岐して伝える際、各OBEXクライアントエンジン2000が送信するオブジェクトとして、オブジェクト分割部によって分割されたオブジェクトを指定する。
多重利用OBEXサーバエンジン管理部5001は、複数のOBEXサーバエンジン3000を利用して、コネクションの設定、オブジェクトの送信、コネクションの切断などの多重処理ができるように各OBEXサーバエンジン3000を管理する。多重利用OBEXサーバエンジン管理部5001は、複数のOBEXサーバエンジン3000がそれぞれコネクション設定処理の際に受信したConnectRequestパケットにコネクションが同一であることを示す識別情報が含まれていることを検知した場合に、多重化処理を行うOBEXサーバエンジン3000の情報を記憶管理する。
分割オブジェクト構築部5002は、多重利用OBEXサーバエンジン管理部5001が管理する複数のOBEXサーバエンジン3000で受信したオブジェクトを統合して一つのオブジェクトを構築する機能を備える。
以下、図18に示すOBEX部を備えたクライアント機器及びサーバ機器により構成されるシステムの動作について説明する。
クライアント側における上位アプリケーション104がOBEX部103に対し、OBEXコネクションの設定要求(ConnectRequest)関数を実行した場合、多重化処理実行部4000は、上位アプリケーション104が指定した相手サーバ側の上位アプリケーション104’への接続パラメータから、相手機器が自らと同じOBEX部103を有するか否かを判別する。
同じOBEX部103を有さないと判断した場合は、多重化処理実行部4000は処理をスキップし、OBEXインタフェース1000の処理として上記で説明した基本構成要素のみの場合の通りの動作を行う。
一方、同じOBEX部103を有すると判断した場合は、N個のOBEXクライアントエンジン200X1,…200XNを利用し、それぞれからOBEXのConnectRequestパケット送信を行う。
このとき、送信する複数のConnectRequestパケットには、それらが本来は同一であることを示す識別情報を含めているものとする。また、Targetヘッダの値は複数のConnectRequestパケットで異なる値を設定して送信する。識別情報については、別途特別な識別情報を付加してもよいが、Targetヘッダの値を利用することで同一であることを判断することも可能である。なお、下位プロトコルスタック部102のリンクを設定する方法は先に述べた通りである。
一方、BEX部103’を有するサーバ側の機器は、クライアント側の機器から複数のConnectRequestパケットを受信し、それぞれにOBEXサーバエンジン300Y1’,….300YN’を割り当て、独立して処理を行う。
このとき、サーバ側の多重化処理解析部5000’は、受信した複数のConnectRequestパケットにこれらが同一であることを示す識別情報が含まれているかいないかを検出する。含まれていることを検出した場合には、それらがクライアント機器側の多重化処理実行部4000により分離された要求であることを認識し、それらに対応づけられたOBEXサーバエンジン300Y1’,….300YN’の情報を記憶管理する。
以上のようにOBEX部103においては、上位アプリケーションからの1回のOBEXコネクションの設定要求に対して複数のOBEXコネクションを設定することになる。但し、上位アプリケーション104へは、複数のOBEXコネクションのうち代表する一つのOBEXコネクションに割り当てられたローカルコネクションIDのみが提供されるものとする。
上位アプリケーション104がOBEX部103に対し、OBEXのオブジェクト送信要求(PutRequest)関数を実行した場合、多重化処理実行部4000はPutRequestで指定されているローカルコネクションIDが複数のコネクションの代表であるか否かを判断する。
ローカルコネクションIDが複数のコネクションの代表でない場合は、多重化処理実行部4000は処理をスキップし、OBEXインタフェース1000の処理として上記で説明した基本構成要素のみの場合の通りの動作を行う。
ローカルコネクションIDが複数のコネクションの代表である場合は、多重化処理実行部4000は、PutRequestで送信すべきオブジェクトをN個に分割し、N個のOBEXクライアントエンジン200X1,…200XNを利用して並列に送信する。
OBEX部103’を有するサーバ側の機器は、クライアント側の機器から複数のPutRequestパケットを受信する。それぞれについてのオブジェクトの受信処理は、N個のOBEXサーバエンジン300Y1’,….300YN’が独立して行う。それぞれのOBEXサーバエンジン300Y1’,….300YN’が受信した分割されたオブジェクトの情報は多重化処理解析部5000’へと通知されるものとする。
ここで、オブジェクトの分割ルールについてはサーバ側とクライアント側とで予め合意がとれているものとする。従って、クライアント側の多重化処理実行部4000がオブジェクトを分割する際に、ブロック1、ブロック2・・・ブロックNに分割した場合には、サーバ側の多重化処理解析部5000’は受信したブロック1、ブロック2・・・ブロックNから元のオブジェクトを生成できる。
また、N個のOBEXクライアントエンジン200X1,…200XNを利用して並列に送信する場合、それぞれから送信される最初のPutRequestパケットには、オブジェクトの名前情報が含まれたNameヘッダが付加される。Nameヘッダの設定方法については、最初に送信されるN個のPutRequestパケットすべてにオリジナルのオブジェクトの名前情報を含めて送信する方法と、代表としてOBEXクライアントエンジン200X1から送信されるPutRequestパケットのみにオリジナルのオブジェクトの名前情報を含め他のN-1個のPutRequestパケットにはオリジナルと異なる名前情報を含めて送信する方法とが考えられる。
例えば、オリジナルのオブジェクトの名前が”test.txt”であった場合、前者の方法ではN個のPutRequestパケットのNameヘッダそれぞれに”test.txt”を含めて送信する。一方、後者の方法では代表する1個のPutRequestパケットのNameヘッダに”test.txt”を含めて、他は、” 2_N”、”3_N”・・・”N_N”と簡易化して送信してもよい。
分割されたオブジェクトをサーバ側で受信し統合する際には、OBEXサーバエンジン300Y1が受信したPutRequestパケットに含まれるNameヘッダの値からオリジナルのオブジェクトの名前を検出することで、オブジェクトを生成することが可能である。
上位アプリケーション104がOBEX部103に対し、OBEXのコネクション切断要求(DisconnectRequest)関数を実行した場合、多重化処理実行部4000はDisconnectRequestで指定されているローカルコネクションIDが複数のコネクションの代表であるか否かを判断する。
ローカルコネクションIDが複数のコネクションの代表でない場合は、多重化処理実行部4000は処理をスキップし、OBEXインタフェース1000の処理として上記で説明した基本構成要素のみの場合の通りの動作を行う。
ローカルコネクションIDが複数のコネクションの代表である場合は、多重化処理実行部4000は、N個のOBEXクライアントエンジン200X1,…200XNのそれぞれからOBEXコネクションの切断処理が実行されるようにする。
一方、OBEX部103’を有するサーバ側の機器は、クライアント側の機器から複数のDisconnectRequestパケットを受信する。それぞれのコネクションの切断処理をN個のOBEXサーバエンジン300Y1’,….300YN’が独立して行う。それぞれのOBEXサーバエンジン300Y1’,….300YN’での切断処理の終了は多重化処理解析部5000’へと通知されるものとする。
以上のように、本実施の形態によれば、通信機器1におけるOBEX部103は、上位アプリケーション104からの1つのコネクション設定要求に対して、内部処理として複数のOBEXコネクションを設定でき、また、オブジェクトを送信する場合に、それを分割して並列に送信することができるため、図19に示すような通信シーケンスにより効率的なデータの送信が可能となる。従来の通信機器における通信シーケンスを示す図20と比較しても分かるように、本実施の形態では、効率的なデータの送信が可能である。
(第2の実施の形態)
図21は、本実施の形態におけるOBEX部の詳細構成を示す図である。
構成上、第1の実施の形態における図18に示す構成要素との違いは、多重化処理解析部5000がT3設定部5003を備える点にある。T3設定部5003は、Put要求を受信してからPut応答を送信するまでの処理時間を測定することが可能である。T3設定部5003は、処理時間の平均値(あるいは期待値)をT3として保持し、OBEXサーバエンジン3000に通知可能である。OBEXサーバエンジン3000は、ConnectResponseパケットにT3の情報を含めて送信する。
以下、図21のOBEX部を備えたクライアント機器及びサーバ機器により構成されるシステムの動作について説明する。
まず、クライアント側の機器において、上位アプリケーション104がOBEX部103に対し、OBEXコネクションの設定要求(ConnectRequest)関数を実行する。多重化処理実行部4000はここでは処理をスキップし、OBEXインタフェース1000の処理として第1の実施の形態で説明した基本構成要素のみの場合の動作を行う。すなわち、OBEXクライアントエンジン200X1を利用して、ConnectRequestパケットを下位プロトコルスタック部102へ出力する。
OBEX部103’を有するサーバ側の機器は、クライアント側の機器からConnectRequestパケットを受信し、OBEXサーバエンジン300Y1’を割り当てて処理を行い、ConnectResponseパケットを下位プロトコルスタック部102’へ出力する。このConnectResponseパケットには先に記した通り、T3の情報が含まれている。
クライアント側の機器のOBEXインタフェース1000は、T3の情報が含まれたConnectResponseパケットを受信すると、それをOBEXクライアントエンジン200X1へ通知すると共に、T3の情報を多重化処理実行部4000へ入力する。
多重化処理実行部4000はT3の情報が入力されると、先に上位アプリケーション104からOBEX部103に対し設定が要求されたOBEXコネクションは多重化が可能であることを認識する。多重化処理実行部4000はT3の値をT1として扱い、多重度NとしてN=(T3/T2)+1を計算する。
多重化処理実行部4000は多重度Nの計算に成功すると、N−1個のOBEXクライアントエンジン200X2,…200XNを利用し、それぞれからOBEXのConnectRequestパケット送信を行う。
このとき、送信する複数のConnectRequestパケットには、OBEXクライアントエンジン200X1が設定したコネクションと同一であることを示す識別情報を含めるものとする。また、Targetヘッダの値はOBEXクライアントエンジン200X1が利用した値とそれぞれ異なる値としてConnectRequestパケットに設定されて送信される。なお、識別情報については、別途特別な識別情報を付加してもよいが、Targetヘッダの値を利用することで上記コネクションが同一であることを判断することも可能である。
OBEX部103’を有するサーバ側の機器は、クライアント側の機器からN−1のConnectRequestパケットを受信する。サーバ側の機器は、それぞれにOBEXサーバエンジン300Y2’,….300YN’を割り当て、各OBEXサーバエンジン300Y2’,….300YN’はそれぞれ独立して処理を行う。
このとき、サーバ側の多重化処理解析部5000’は、ConnectRequestパケットに含まれる識別情報から、これらのConnectRequestパケットは、OBEXサーバエンジン300Y1’で設定したコネクションと関連していることを認識し、OBEXサーバエンジン300Y1’,….300YN’の情報を記憶管理する。
クライアント側のOBEX部103は、第1の実施の形態と同じく、上位アプリケーションからの1回のOBEXコネクションの設定要求に対して複数のOBEXコネクションを設定することになるが、上位アプリケーション104へは、複数のOBEXコネクションのうち代表する一つのOBEXコネクションに割り当てられたローカルコネクションIDのみを提供するものとする。本実施の形態において、代表となるローカルコネクションIDはOBEXクライアントエンジン200X1に割り当てられた値とする。
なお、複数のコネクションを利用してオブジェクト送信要求(PutRequest)の処理を実行する方法、また複数のコネクションを切断する方法については、第1の実施の形態で説明した通りである。
本実施の形態においては、クライアント側の機器が、相手機器が自らと同じOBEX部103を有するか否かを受信したConnectResponseパケットから検知することが可能であり、必要に応じて多重化のためのコネクションを設定することが可能となる。また、本実施の形態においては、多重度Nを計算するにあたり、Put要求を受信してからPut応答を送信するまでの処理時間の平均値(あるいは期待値)を相手機器側から取得するため、第1の実施の形態にくらべて、相手機器の受信能力を適正に反映させた多重度Nの計算を行うことが可能である。
(第3の実施の形態)
第2の実施の形態では、クライアント側の機器のOBEXインタフェース1000は、T3の情報が含まれたConnectResponseパケットを受信すると、多重化処理実行部4000はそれに含まれるT3の情報を利用して多重度Nを計算する。そして、多重度Nの計算に成功すると、N−1個のOBEXクライアントエンジン200X2,…200XNを利用し、それぞれからOBEXのConnectRequestパケット送信を行う。
これに対し、本実施の形態では、多重度Nの計算に成功しても、すぐには複数のOBEXクライアントエンジン2000を利用してコネクションを設定することはしない。
本実施の形態におけるOBEX部103においては、上位アプリケーション104がOBEX部103に対し、OBEXのオブジェクト送信要求(PutRequest)関数を実行したことを起因としてコネクションの設定を行う。より詳細には、上位アプリケーション104がオブジェクト送信要求(PutRequest)関数を実行したら、多重化処理実行部4000は、オブジェクト送信要求(PutRequest)の処理を一旦保留する。多重化処理実行部4000は、第2の実施の形態で説明したように、N−1個のOBEXクライアントエンジン200X2,…200XNを利用し、それぞれからOBEXのConnectRequestパケット送信を行って、多重送信用の複数のコネクション設定を行う。複数のコネクション設定が完了すると、多重化処理実行部4000は保留していたオブジェクト送信要求(PutRequest)の処理を再開する。なお、複数のコネクションを利用してオブジェクト送信要求(PutRequest)の処理を実行する方法については、第1の実施の形態で説明した通りである。また、複数のコネクションを切断する方法についても、第1の実施の形態で説明した通りである。
本実施の形態によれば、オブジェクトの送信など多重化による送信が必要な場合にのみ、多重化コネクションを設定するため、例えば、単にコネクション設定及び切断のみを行うなどの場合に無駄な多重化コネクションを設定することを避けることが可能である。
(第4の実施の形態)
以下、本発明の第4の実施の形態について図22及び図23を用いて説明する。
本実施の形態では、第1〜第3の実施の形態で説明した多重コネクションを利用してオブジェクトを送信する場合において、送信するオブジェクトの合計サイズに応じて、利用する多重コネクション数を可変とする方法について説明する。
OBEXプロトコルでは、コネクション設定時に、設定したコネクションで以後送受信を行うパケットの最大サイズについてネゴシエーションを行う。ネゴシエーションの結果決まる最大パケットサイズに基づき、OBEXパケットのBodyヘッダあるいはEndofBodyヘッダ(図7参照)を用いて 一度に送信可能なオブジェクトのサイズL1を計算することが可能である。
オブジェクトを分割して送信する場合に、第1〜第3の実施の形態で計算したNの値を固定的に使うのではなく、送信するオブジェクトの合計サイズL2、および、一度に送信可能なオブジェクトのサイズL1の値を用いて、多重度の値を動的に変更する。
図22は、多重度の値を動的に決める方法の一例を示すフローチャートである。
多重度Nの値が3で、送信するオブジェクトの合計サイズL2が1500バイトであるとの前提の下、まず、一度に送信可能な最大サイズL1の値を計算する(ステップS301)。ここでは、L1の値は1000バイトであるとする。
次に、L2/L1を計算し、小数点以下を切り上げることにより整数値mを求める。(ステップS302)。本例ではm=2となる。
整数値mがN以下である場合は(ステップS303のNO)、多重度をmとする(ステップS304)。本例はこれに該当し、従って、2つのコネクションを利用してオブジェクトを送る。例えば、1000バイトと500バイト、あるいは、750バイトと750バイトをそれぞれのコネクションで送信する。
一方、整数値mがNより大きい場合は(ステップS303のYES)多重度をNとする(ステップS305)。従って、第1〜第3の実施の形態と同様、送信するオブジェクトを3つに分割し、3つのコネクションを利用して、それぞれのコネクションで500バイトずつ送信を行う。
図23は、多重度の値を決める別の方法を示すフローチャートである。
この方法では、送信するオブジェクトの合計サイズL2が、閾値LTより大きい場合は(ステップS401のYES)、多重度Nで多重送信を行い(ステップS402)、閾値LT以下である場合は(ステップS401のNO)、多重度を1として(ステップS403)、単一のコネクションにて送信する。
以上のように、本実施の形態によれば、送信するオブジェクトの合計サイズに応じて多重度を変更するため、例えば送信するオブジェクトの合計サイズが小さい場合などは多重化するコネクション数を減らすことで、処理負担を削減することが可能である。
(第5の実施の形態)
第1〜第3の実施の形態では多重コネクションを利用してオブジェクトを送信する場合を説明したが、本実施の形態では、多重コネクションを利用してオブジェクトを取得する場合について説明する。
図24は、本実施の形態におけるOBEX部103の詳細構成を示す図である。
第1の実施の形態で説明した図18の構成要素との違いは、多重化処理実行部4000が分割オブジェクト構築部4006を、多重化処理解析部5000がオブジェクト分割部5004を備える点にある。なお、本実施の形態においては、第1の実施の形態と同様の方法により、T2とT1を利用して多重度Nを計算するものとする。
以下、第1の実施の形態との違い中心に説明する。
多重利用OBEXクライアントエンジン管理部4004は、N計算部4003から指定された多重度Nに基づき、必要なOBEXクライアントエンジン2000を利用して、オブジェクトの取得の多重処理ができるように各OBEXクライアントエンジン2000を管理する。
また、多重利用OBEXクライアントエンジン管理部4004は多重化されたコネクションに1つ割り当てられるローカルコネクションIDについても管理を行う。多重利用OBEXクライアントエンジン管理部4004は、上位アプリケーション104からのGet命令を複数のOBEXクライアントエンジン2000へ分岐して伝えるとともに、各OBEXクライアントエンジン2000の処理の結果を統合して、上位アプリケーション104へ通知する。
分割オブジェクト構築部4006は、多重利用OBEXクライアントエンジン管理部4004が管理する複数のOBEXクライアントエンジン2000で取得したオブジェクトを統合し一つのオブジェクトを構築する機能を備える。
オブジェクトの取得要求を行うクライアント側が送信する最初のGetRequestパケットは、OBEXクライアントエンジン200X1から送信されるものとし、そのGetRequestパケットには取得を要求するオブジェクトを識別できるパラメータが含まれているものとする。
多重利用OBEXサーバエンジン管理部5001は、複数のOBEXサーバエンジン3000を利用して、オブジェクトの取得の多重処理ができるように各OBEXサーバエンジン3000を管理する。
クライアント側の機器のOBEXクライアントエンジン200X1との間でコネクションを設定しているOBEXサーバエンジン300Y1が最初のGetRequestを受信した場合、OBEXサーバエンジン300Y1は、そのGetRequestに含まれているパラメータに基づき、提供するオブジェクトを識別し、その情報を多重化処理解析部5000のオブジェクト分割部5004へ通知する。
オブジェクト分割部5004は、クライアント側の機器から取得要求されたオブジェクトを複数に分割する機能を備える。オブジェクト分割部5004は、OBEXサーバエンジン300Y1から分割するオブジェクト情報が通知された場合、多重度Nの値に従って、対象となるオブジェクトをN個に分割する。オブジェクト分割部によってN個に分割されたオブジェクトに関する情報は、それぞれが対応するOBEXサーバエンジン300Y1〜OBEXサーバエンジン300YNのいずれかに通知される。
OBEXサーバエンジン300Y1〜OBEXサーバエンジン300YNはその後の取得要求に対する応答処理において、それらの分割されたオブジェクトをGetResponseパケットに格納して、それぞれがコネクションを設定している先のOBEXクライアントエンジン200X1〜OBEXクライアントエンジン200XNへと送信する。
以上のように、本実施の形態によれば、通信機器1におけるOBEX部103は、上位アプリケーション104からの1つのコネクション設定要求に対して、内部処理として複数のOBEXコネクションを設定し、取得対象となるオブジェクトを複数に分割して並列に取得するため、図19に示す通信シーケンスにより効率的なデータの取得が可能となる。
(第6の実施の形態)
図25は、本実施の形態におけるOBEX部の詳細構成を示す図である。
第1〜第4の実施の形態では、多重コネクションを利用してオブジェクトを送信する場合に、多重度Nを、OBEXサーバエンジン3000がPut要求を受信してからPut応答を送信するまでの処理時間の平均値(あるいは期待値)であるT1秒と、OBEXクライアントエンジン2000で設定しているPut要求の最大パケット長のパケット要求を送信後、相手機器のOBEXサーバエンジン3000へ届くまでの伝送時間の平均値(あるいは期待値)T2とから計算していた。また、第5の実施の形態で説明した多重コネクションを利用してオブジェクトを取得する場合においても、オブジェクトを送信する場合と同様に多重度NをT1とT2とから計算していた。
図25において、多重化処理実行部4000におけるT4検出部4007は、OBEXクライアントエンジン2000がContinueを示すGet応答を受信してから次のGet要求を送信するまでの処理時間の平均値(あるいは期待値)を予め計算して、T4秒として記憶する。
T5設定部4008は、OBEXサーバエンジン3000がGet要求に対する応答パケットを返す場合に、最大パケット長の応答パケットを送信後、OBEXクライアントエンジン2000へ届くまでの伝送時間の平均値(あるいは期待値)を、上述したT2設定部4002と同様にして計算又は取得して、T5秒として記憶する。
N計算部4003は、多重度N1=[T1/T2]+1、N2=[T4/T5]+1の2つを計算し、記憶管理する。
N1とN2が異なる場合、以下のようにして多重送信を行う。
例えば第3の実施の形態で示したようにコネクション設定時にすぐに多重コネクションを設定するのではなくブジェクトの送信要求が発生したときに初めて多重化コネクションを設定する場合は、オブジェクトの送信要求が発生した際にN1本のコネクションを設定して多重送信を行う。一方、オブジェクトの取得要求が発生した場合に初めて多重化コネクションを設定する場合は、N2本のコネクションを設定して多重送信を行う。
また、第1の実施の形態で示したようにコネクション設定時にすぐに多重コネクションを設定する場合には、N1とN2のいずれか小さい方を選択して多重化コネクションを設定する方法などが考えられる。なお、必ずしも小さい値を選択しなくてもよく、例えば、N1とN2をランダムで選択する方法としてもよい。
以上のように、本実施の形態によれば、通信機器1におけるOBEX部103は、上位アプリケーション104からの1つのコネクション設定要求に対して、内部処理として複数のOBEXコネクションを設定し、オブジェクトを送信する場合はそれを分割して並列に送信し、オブジェクトを取得する場合はそれを分割して並列に取得するため、効率的なデータ転送を実現できる。また、本実施の形態によれば、必要に応じて、オブジェクトを分割して並列に送信する場合のコネクションの多重度と、オブジェクトを分割して並列に取得する場合のコネクションの多重度とを異なる値にすることも可能である。
(第7の実施の形態)
第6の実施の形態では図25を用いて、Getを行う場合を例として説明を行ったが、本実施の形態では、Putを行う場合において、クライアントがサーバからの応答を受信してから送信するまでの時間がある程度かかる場合に多重度を計算する方法について説明する。
本実施の形態においては、図25に示す構成要素のうち、T1検出部とT2設定部を削除した構成であってもよい。
図25において、多重化処理実行部4000におけるT5設定部4008は、OBEXクライアントエンジン2000が最大パケット長のPut要求を送信後、OBEXサーバエンジン3000が送信するPut応答を受信するまでの時間を計測し、計測した値をT5秒として記憶する。
T4検出部4007は、OBEXクライアントエンジン2000がContinueを示すPut応答を受信してから次のPut要求を送信するまでの処理時間を計測し、計測した値をT4秒として記憶する。
N計算部4003は、多重度N2=[T4/T5]+1を計算し、記憶管理する。
以上のように、本実施の形態によれば、時間測定をクライアント側で行うだけで多重度の計算を行うことができ、サーバ側での処理時間が無視できる場合に有効である。また、常に多重度を計算することによって、例えば、非常に大きなファイルを転送中に多重度の値が変化したことを検知し、変化した状態が継続するようであれば、必要に応じて利用するコネクション数を変化させるなどの工夫も可能となる。
以上までに説明した本発明の第1〜第7の実施の形態によれば、通信シーケンスが要求及び応答方式である通信プロトコルを用いてオブジェクトを送信する場合に、オブジェクトを複数に分割して並列に送信することが可能であることから効率的なデータ送信が可能となる。また、通信シーケンスが要求及び応答方式である通信プロトコルを用いてオブジェクトを取得する場合に、オブジェクトを複数に分割して並列に取得することが可能であることから効率的なデータ送信が可能となる。
なお、本発明は上記実施形態そのままに限定されるものではなく、実施段階ではその要旨を逸脱しない範囲で構成要素を変形して具体化できる。また、上記実施形態に開示されている複数の構成要素の適宜な組み合わせにより、種々の発明を形成できる。例えば、実施形態に示される全構成要素から幾つかの構成要素を削除してもよい。さらに、異なる実施形態にわたる構成要素を適宜組み合わせてもよい。