サービス検出のためのBluetoothとWSALookupServiceBegin
Bluetoothサーバー上の特定のサービスの存在を検出するために、クライアントはWSALookupServiceBegin、WSALookupServiceNext、およびWSALookupServiceEnd関数を使用します。 クエリはローカルアドレスとリモートアドレスに対して実行できますが、接続はリモートアドレスでのみ確立できます。 この操作中に検出されたサービスハンドルを使用して、WSASetService経由でサービスを削除することはできません。 ループバックはRFCOMMではサポートされていません。
次の2種類の基本的なサービス探索クエリを実行できます。
- ローカルデバイス上の1つ以上のサービスに対するクエリ
- 指定されたピアデバイス上の1つ以上のサービスに対するクエリ
WSALookupServiceBegin関数は、lpqsRestrictionsパラメーターでWSAQUERYSET構造体を受け取ります。 WSALookupServiceBeginは、WSAQUERYSETに含まれる検索制限のセットに基づいてクライアントクエリを実行します。 Bluetoothクライアントは、WSALookupServiceBegin関数を使用してサービスを照会するときに、次の表に示す制限をWSAQUERYSET構造体で指定する必要があります。
WSAQUERYSETメンバー | 制限 |
---|---|
dwSize | sizeof (WSAQUERYSET) に設定します。 |
lpServiceClassId | クエリのスコープを決定するために使用できる最も具体的なBluetooth UUIDに設定します。 たとえば、lpServiceClassIdをL2CAPプロトコルのUUIDに設定すると、すべてのL2CAPサービスが返され、基本的にはターゲット上のすべてのSDレコードが列挙されます。 ただし、UUIDを特定のサービスに設定すると、そのサービスのインスタンスのみが返されます。 |
dwNameSpace | NS_BTHに設定します。 |
dwNumberOfCsAddrs | を 0 に設定します。 |
lpszContext | サービスのクエリを実行するSDP接続を確立するBluetoothデバイスアドレスに設定します。 このメンバーは、WSAAddressToString関数を使用して変換された文字列である必要があります。 ローカルラジオアドレスが指定されている場合は、ローカルSDPレコードが検索されます。 |
その他のメンバー | WSAQUERYSET構造体の他のすべてのメンバーは無視されます。 |
WSALookupServiceBegin関数がサービスクエリを完了した後、リモートデバイスへのSDP接続はアクティブなままになりません。WSALookupServiceBeginが返される前に接続が終了します。 サービスクエリの完了後にSDP接続をアクティブなままにする必要があるアプリケーションでは、Windowsソケットconnect関数呼び出しを発行するときに、SOCKADDR_BTH構造体のserviceClassIdメンバーを使用して、接続先のサービスクラスUUIDを指定する必要があります。
次の表に示すフラグは、クエリ結果を制御するために、WSALookupServiceBegin関数とWSALookupServiceNext関数のdwControlFlagsパラメーターで使用されます。 LUP_CONTAINERSフラグとLUP_FLUSHCACHEフラグは、WSALookupServiceBegin関数によって使用されます。残りのフラグは、WSALookupServiceNext関数の呼び出しで使用されます。
フラグ | 結果 |
---|---|
LUP_CONTAINERS | 設定しないでください。 |
LUP_FLUSHCACHE | 通常、アプリケーションではLUP_FLUSHCACHEを指定する必要があります。 このフラグは、キャッシュされた情報を無視し、SDP検索を実行する指定したデバイスへの無線SDP接続を確立するようにシステムに指示します。 この非キャッシュ操作には数秒かかる場合があります (キャッシュされた検索はすぐに返されます) 。 Bluetoothは現在、近くのデバイスからのSDPレコードを事前にキャッシュしていません。また、現在、以前のクエリを積極的にキャッシュしていません。 そのため、アプリケーションでは、LUP_FLUSHCACHEが指定されていない場合、クエリが結果を返さない (エラーコードがWSASERVICE_NOT_FOUND) ことを想定する必要があります。 Windowsソケットインターフェイスを使用して使用できるキャッシュされたデータは、将来拡張される可能性があります。 |
LUP_RES_SERVICE | ローカルBluetoothアドレスに関する情報を返します。 このフラグは、LUP_RETURN_ADDRも指定されている場合にのみ効果があります。 |
LUP_RETURN_NAME | WSALookupServiceNext関数の呼び出しごとに、WSAQUERYSET構造体のlpszServiceInstanceNameメンバーのサービスの表示名を返します。 |
LUP_RETURN_TYPE | WSAQUERYSET構造体のlpServiceClassIdメンバーのサービスクラスIDを返します。 注記: このフラグの使用は、WSALookupServiceBegin関数にのみ適用されます。 WSALookupServiceNextの場合、この値は常に0です。 |
LUP_RETURN_ADDR | connect関数呼び出しで使用されるlpcsaBufferメンバーのアドレスを返します。 返されるアドレスには、ポート番号が含まれます。 |
LUP_RETURN_BLOB | Bluetooth SDPレコード仕様に従って書式設定された、lpBlobメンバー内の一致するSDレコードを返します。 |
LUP_RETURN_ALL | 上記のすべてのフラグの情報を返します。 |
LUP_RETURN_COMMENT | WSALookupServiceNext関数の呼び出しごとに、WSAQUERYSET構造体のlpszcommentメンバーのサービスの説明を返します。 |
LUP_FLUSHPREVIOUS | 使用可能な次のレコードをスキップし、それに続くレコードを返します。 |
高度なサービスクエリ
前のセクションで説明したクエリ操作を使用すると、1つのGUIDからすべての結果を返すことができます。これは、ほとんどのアプリケーションで十分です。 高度なクエリを使用すると、アプリケーションでより具体的なクエリを作成できます。返される情報でUuidと属性を照合する機能が提供されます。
サービスに対して高度なクエリを実行するには、Bluetoothクライアントで、lpqsRestrictionsパラメーターに渡されるWSAQUERYSET構造体に次の制限を指定する必要があります。
WSAQUERYSETメンバー | 制限 |
---|---|
dwSize | sizeof (WSAQUERYSET) に設定します。 |
lpszContext | サービスのクエリを実行するSDP接続を確立するBluetoothデバイスアドレスに設定します。 このメンバーは、WSAAddressToString関数を使用して変換された文字列である必要があります。 ローカルラジオアドレスが指定されている場合は、ローカルSDPレコードが検索されます。 |
lpBlob.pBlobData | クエリの結果を制限するすべてのパラメーターを含むBTH_QUERY_SERVICE構造体へのポインター。 |
dwNameSpace | NS_BTHに設定します。 |
その他のメンバー | WSAQUERYSET構造体の他のすべてのメンバーは無視されます。 |
次のフラグは、WSALookupServiceBeginのdwControlFlagsパラメーターに渡され、高度なクエリの結果を制御します。
フラグ | 結果 |
---|---|
LUP_CONTAINERS | 設定しないでください。 |
LUP_FLUSHCACHE | 通常、アプリケーションではLUP_FLUSHCACHEを指定する必要があります。 このフラグは、キャッシュされた情報を無視し、SDP検索を実行する指定したデバイスへの無線SDP接続を確立するようにシステムに指示します。 この非キャッシュ操作には数秒かかる場合があります (キャッシュされた検索はすぐに返されます) 。 Bluetoothは、近くのデバイスからのSDPレコードを事前にキャッシュしません。また、以前のクエリを積極的にキャッシュしません。 そのため、LUP_FLUSHCACHEが指定されていない場合、アプリケーションはクエリが結果を返さないことが多い (WSASERVICE_NOT_FOUND) ことを想定する必要があります。 Windowsソケットインターフェイスを使用して使用できるキャッシュされたデータは、将来拡張される可能性があります。 |
LUP_RES_SERVICE | ローカルBluetoothアドレスの情報を返します。 このフラグを設定すると、LUP_RETURN_ADDRRも指定されている場合にのみ効果があります。 |
LUP_RETURN_NAME | サービスの表示名を返します。 このフラグは、SDP_SERVICE_SEARCH_REQUESTでは無視されます。 |
LUP_RETURN_TYPE | サービスクラスIDを返します。 このフラグは、SDP_SERVICE_SEARCH_REQUESTでは無視されます。 |
LUP_RETURN_ADDR | connect関数呼び出しで使用されるlpcsaBufferメンバーのアドレスを返します。 返されるアドレスには、ポート番号が含まれます。 このフラグは、SDP_SERVICE_SEARCH_REQUESTでは無視されます。 |
LUP_RETURN_BLOB | Bluetooth SDPレコード仕様に準拠した形式で、一致するSDレコードを返します。 SDP_SERVICE_SEARCH_REQUESTの場合、後続のWSALookupServiceNext呼び出しのlpBlobの結果は、Bluetooth SDPハンドルの配列です。 SDP_SERVICE_ATTRIBUTE_REQUESTとSDP_SERVICE_SEARCH_ATTRIBUTE_REQUESTの場合、WSALookupServiceNextの後続の各呼び出しの結果は、属性がクエリのpRangeメンバーによって指定されたものに制限されているバイナリBluetooth SDPレコードです。 このフラグは、SDP_SERVICE_SEARCH_REQUESTに必要です。 |
LUP_RETURN_COMMENT | WSALookupServiceNext関数の呼び出しごとに、WSAQUERYSET構造体のlpszcommentメンバーのサービスの説明を返します。 |
LUP_FLUSHPREVIOUS | 使用可能な次のレコードをスキップし、それに続くレコードを返します。 |
入力時に、lpBlob->pBlobDataは、次の表に示す値を含むBTH_QUERY_SERVICE構造体を指します。
Note
最初の検索要求は、1つのL2CAPパケットに収まる必要があります。 ただし、応答は多くのL2CAPパケットに分割される場合があります。
メンバー | 値 |
---|---|
type | 実行する検索の種類。 この値には、SDP_SERVICE_SEARCH_REQUEST、SDP_SERVICE_ATTRIBUTE_REQUEST、またはSDP_SERVICE_SEARCH_ATTRIBUTE_REQUESTのいずれかを指定できます。 各検索の種類は、Bluetooth SDP仕様で定義されている基になる検索メカニズムに関連付けられています。 各戻り値は、この (高度なサービスクエリ) セクションで既に定義されているWSAQUERYSET構造体で説明されている形式になります。 |
serviceHandle | 属性の検索に使用されます。 この値は、pRangeメンバーの属性を照会するために使用するサービスハンドルを指定します。 |
uuids | サービスおよびserviceAttributeの検索に使用されます。 この値は、検索に一致するためにレコードに含める必要があるUUIDを指定します。 MAX_UUIDS_IN_QUERYUUID未満のUUIDを照会する場合、この値は、最後の有効なUUIDの直後にあるSdpQueryUuid要素をすべて0に設定します。 |
numRange | 属性およびserviceAttribute検索に使用されます。 この値は、pRange内の要素の数を指定します。 |
pRange | 属性およびserviceAttribute検索に使用されます。 この値は、一致するレコードに対して取得する属性値を指定します。 |
WSALookupServiceNext関数の呼び出しが成功するたびに、lpBlob->pBlobDataは次の表に示す値を含むデータブロックを指します。
Value | 説明 |
---|---|
SDP_SERVICE_SEARCH_REQUEST | Bluetooth 1.1 SDP 4.5.2で定義されているServiceRecordHandleListと同じSDPレコードハンドルの配列。 返されるSDPハンドルの数は、「lpBlob->cbSize」/sizeof「ULONG」 によって計算されます。 すべての結果は、WSALookupServiceNext関数の1回の呼び出しで返されます。 |
SDP_SERVICE_ATTRIBUTE_REQUESTまたはSDP_SERVICE_SEARCH_ATTRIBUTE_REQUEST | バイナリBluetooth SDPレコード。 SDP_SERVICE_ATTRIBUTE_REQUESTの場合、すべての結果はWSALookupServiceNext関数の1回の呼び出しで返されます。 |
Note
サービスクエリの入力時にlpBlobメンバーが指定されていない場合、xFFFFを通じて属性のlpServiceClassIdメンバーで指定されたサービスに対して、サービスと属性の検索が実行されます。