Share via


Bluetooth サービス プロバイダ

Bluetooth サービス プロバイダ

Bluetooth ワイヤレス技術サービス プロバイダは、デバイス間のネットワーク接続を簡単にセットアップできるように設計された低コスト・低電力のワイヤレス技術である。ここでは、Microsoft® Windows® Powered Pocket PC 2002 と共に Bluetooth を使う方法について説明する。

  Microsoft DirectPlay® の Bluetooth サービス プロバイダは Pocket PC 2002 でのみサポートされている。デスクトップ バージョンでは利用できない。デスクトップと Pocket PC 2002 との間で処理を行うアプリケーションでは DirectPlay インターネット プロトコル (IP) サービス プロバイダを使うこと。

DirectPlay における Bluetooth のネイティブ サポートでは、セッションの全プレーヤも Bluetooth サービス プロバイダを使っている場合にセッションのホストとなるように設計されている。このシナリオでは、すべてのプレーヤが参加する互いのプレーヤと Bluetooth 無線の到達範囲内に位置する必要がある。DirectPlay では、1 つのセッション内でサービス プロバイダを組み合わせて使うことはできない。Bluetooth は他のネットワーク タイプのアクセス技術としても使えることに注意すること。たとえば、プレーヤはネットワーク アクセス ポイントを使って IP 接続を取得できる。この場合、基本的に DirectPlay は Bluetooth デバイスを認識しない。アプリケーションでは代わりにIP サービス プロバイダを使う。

DirectPlay 用 Bluetooth サービス プロバイダは IP サービス プロバイダと同等の機能を備えている。すべてのセッション タイプ (クライアント、サーバー、ピア) とそれぞれの全機能をサポートしている。しかしここでは、Bluetooth を使ったアドレスと列挙の設定について、多少異なる点を説明する。

アドレス設定

アプリケーションでは、Bluetooth を使うかユーザーにオプションとして提供する前に、Bluetooth サービス プロバイダを利用できるかどうかを必ず確認すること。Bluetooth が利用できるかどうかを確認するには、IDirectPlay8Peer::EnumServiceProvidersIDirectPlay8Client::EnumServiceProvidersIDirectPlay8Server::EnumServiceProviders のいずれかのメソッドを使う。

Bluetooth サービス プロバイダが見つかったら、次の例に示すように、アプリケーションで IDirectPlay8Address::SetSP を呼び出し、アドレス オブジェクトのサービス プロバイダとして Bluetooth を設定する。

IDirectPlay8Address*    pAddress;
hr = CoCreateInstance( CLSID_DirectPlay8Address, NULL,                         CLSCTX_INPROC_SERVER,
                       IID_IDirectPlay8Address,
                       (LPVOID*) &pAddress);
.
.
.
pAddress->SetSP(&CLSID_DP8SP_BLUETOOTH);

IDirectPlay8Address オブジェクトを作成するとき、アプリケーションは ホスト名 アドレス コンポーネントを使ってホスト デバイスのアドレスを指定する必要がある。次の例に示すように、各ホスト名は 16 進形式の文字列で指定する。

WCHAR * wszDeviceAddress=L" 50c20003c418";
pAddress->AddComponent(DPNA_KEY_HOSTNAME, wszDeviceAddress,
(wcslen(wszDeviceAddress)+1)*sizeof(WCHAR), DPNA_DATATYPE_STRING );

列挙処理の結果、DirectPlay からアプリケーションに提供されるアドレス オブジェクトは、名前情報コンポーネントを追加して拡張できる。この情報は、アドレスが表す Pocket PC 2002 デバイスの名前を示し、Bluetooth デバイス アドレスよりユーザーにわかりやすい文字列を表す。したがって、アプリケーションは列挙の結果を表示するときに DPNA_KEY_NAMEINFO フィールドの有無を調べ、できればそのフィールドの値をユーザーに表示すること。このフィールドは情報提供専用であり、DirectPlay では使われない。列挙を使ってアドレス オブジェクトを取得するのではなく、独自のアドレス オブジェクトを作成するアプリケーションでは、常に DPNA_KEY_HOSTNAME フィールドを使ってリモート デバイスのアドレスを指定すること。DPNA_KEY_NAMEINFO コンポーネントのみ使ったデバイスへの接続はサポートされていない。

列挙

Bluetooth デバイスを列挙するとき、DirectPlay は最初に領域内のすべての Bluetooth デバイスを検出しようとする。見つかった各デバイスには 1 回に 1 つずつ通信し、列挙要求を送信する。この処理はアプリケーションからは認識されないが、初期デバイス検出処理が完了するまでに 10 秒以上かかることがある。したがって、IDirectPlay8Peer::EnumHosts または IDirectPlay8Client::EnumHosts を呼び出すと、最初は応答がなく、約 10 秒後に一連の応答が高速に発生する。

列挙には時間がかかり、各デバイスの Bluetooth アドレスは固定されているため、プレーヤが接続している最後の 2、3 個のアドレスを保存する機構をアプリケーションが提供することをお勧めする。このようにすると、ユーザーは毎回 16 進アドレスを入力したり列挙の完了まで待機する必要がなく、最近の接続のリストからアドレスを取得できる。

EnumHosts の呼び出しは、Bluetooth サービス プロバイダの場合と少し違った動作を行う。次のパラメータが異なる。

  • dwEnumCount は使わない。
  • dwRetryInterval は、DirectPlay が次のデバイスに移動するまでに 1 つのデバイスからの応答を待つ時間をミリ秒単位で指定する。
  • dwTimeout は列挙処理に利用できる全体時間を指定する。

  上で説明した最低限検出にかかる時間を考慮に入れると、dwTimeout を 15 秒未満に設定しても意味がない。この値は Infinity (無期限) に設定し、ユーザーが列挙を取り消すかセッションを選択するまで待機することをお勧めする。

セッションに接続するか、セッションのホストとなると、実行中の列挙は自動的に取り消される。接続により列挙を取り消すと、DPN_MSGID_ASYNC_OP_COMPLETE メッセージに入る列挙の結果コードは DPNERR_CONNECTING になる。ホストになったために列挙を取り消すと、結果コードは DPNERR_HOSTING になる。

セッションの制限

Bluetooth の仕様による制限のため、ピアツーピア セッションでサポートされるデバイスの最大数は 8 個である。クライアント/サーバー セッションの場合、1 台のサーバーに 7 台までのクライアントを接続できる。

Bluetooth ではホストの移行に数秒かかることがあり、その間はデバイス間でデータを転送されない。したがって、ホスト プレーヤがゲームからドロップすると、ネットワーク接続が再確立されるまでの間、残りのプレーヤが送信したメッセージはキューに入る。

Bluetooth は基本的にはクライアント/サーバー アーキテクチャである。DirectPlay はこれを見えないようにし、ホストの移行を使ったピアツーピア モードを提供しているが、このシナリオでもホスト経由ですべてのデータを転送する必要がある。遅延時間と利用可能な帯域幅について想定する場合、アプリケーションでは以上のことを考慮に入れる必要がある。