서비스 검색을 위한 Bluetooth 및 WSALookupServiceBegin
Bluetooth 서버에서 특정 서비스의 존재를 검색하기 위해 클라이언트는 WSALookupServiceBegin, WSALookupServiceNext 및 WSALookupServiceEnd 함수를 사용합니다. 로컬 및 원격 주소에 대해 쿼리를 수행할 수 있지만 원격 주소로만 연결을 설정할 수 있습니다. 이 작업 중에 검색된 서비스 핸들은 WSASetService를 통해 서비스를 삭제하는 데 사용할 수 없습니다. 루프백은 RFCOMM에서 지원되지 않습니다.
두 가지 기본 유형의 서비스 검색 쿼리를 수행할 수 있습니다.
- 로컬 디바이스에서 하나 이상의 서비스에 대한 쿼리
- 지정된 피어 디바이스에서 하나 이상의 서비스에 대한 쿼리
WSALookupServiceBegin 함수는 해당 lpqsRestrictions 매개 변수에서 WSAQUERYSET 구조를 받습니다. WSALookupServiceBegin 은 WSAQUERYSET 에 포함된 검색 제한 집합에 따라 클라이언트 쿼리를 수행합니다. Bluetooth 클라이언트는 WSALookupServiceBegin 함수를 사용하여 서비스를 쿼리할 때 WSAQUERYSET 구조에서 다음 표에 나열된 제한을 지정해야 합니다.
WSAQUERYSET 멤버 | 제한 사항 |
---|---|
dwSize | sizeof(WSAQUERYSET)로 설정합니다. |
lpServiceClassId | 쿼리의 scope 확인하는 데 사용할 수 있는 가장 구체적인 Bluetooth UUID로 설정합니다. 예를 들어 lpServiceClassId 를 L2CAP 프로토콜의 UUID로 설정하면 모든 L2CAP 서비스가 반환되어 기본적으로 대상의 모든 SD 레코드를 열거합니다. 그러나 UUID를 특정 서비스로 설정하면 해당 서비스의 인스턴스만 반환됩니다. |
dwNameSpace | 를 NS_BTH. |
dwNumberOfCsAddrs | 0으로 설정합니다. |
lpszContext | 서비스 쿼리를 수행하기 위해 SDP 연결을 설정할 Bluetooth 디바이스 주소로 설정합니다. 이 멤버는 WSAAddressToString 함수를 사용하여 변환되는 문자열이어야 합니다. 로컬 라디오 주소가 제공되면 로컬 SDP 레코드가 검색됩니다. |
다른 멤버 | WSAQUERYSET 구조체의 다른 모든 멤버는 무시됩니다. |
WSALookupServiceBegin 함수가 서비스 쿼리를 완료한 후에도 원격 디바이스에 대한 SDP 연결이 활성 상태로 유지되지 않습니다. WSALookupServiceBegin이 반환되기 전에 연결이 종료됩니다. 서비스 쿼리가 완료된 후 SDP 연결이 활성 상태로 유지되어야 하는 애플리케이션은 Windows Sockets 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 | 사용 가능한 다음 레코드를 건너뛰고 그 뒤에 오는 레코드를 반환합니다. |
고급 서비스 쿼리
이전 섹션에서 설명한 쿼리 작업을 사용하여 대부분의 애플리케이션에 충분해야 하는 단일 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 구조를 가리킵니다.
참고
초기 검색 요청은 하나의 L2CAP 패킷에 맞을 수 있어야 합니다. 그러나 응답은 많은 L2CAP 패킷으로 나눌 수 있습니다.
멤버 | 값 |
---|---|
type | 수행할 검색 유형입니다. 이 값은 SDP_SERVICE_SEARCH_REQUEST, SDP_SERVICE_ATTRIBUTE_REQUEST 또는 SDP_SERVICE_SEARCH_ATTRIBUTE_REQUEST 중 하나일 수 있습니다. 각 검색 유형은 Bluetooth SDP 사양에 의해 정의된 기본 검색 메커니즘과 연결됩니다. 각 반환은 이(고급 서비스 쿼리) 섹션의 앞부분에서 정의된 WSAQUERYSET 구조체에 설명된 형식으로 생성됩니다. |
serviceHandle | 특성 검색에 사용됩니다. 이 값은 pRange 멤버의 특성을 쿼리할 서비스 핸들을 지정합니다. |
Uuid | 서비스 및 serviceAttribute 검색에 사용됩니다. 이 값은 검색과 일치하도록 레코드에 포함되어야 하는 UUID를 지정합니다. MAX_UUIDS_IN_QUERY 미만의 UUID를 쿼리할 경우 이 값은 마지막 유효한 UUID 바로 뒤에 오는 SdpQueryUuid 요소를 모든 0으로 설정합니다. |
numRange | 특성 및 serviceAttribute 검색에 사용됩니다. 이 값은 pRange의 요소 수를 지정합니다. |
pRange | 특성 및 serviceAttribute 검색에 사용됩니다. 이 값은 일치하는 레코드에 대해 검색할 특성 값을 지정합니다. |
WSALookupServiceNext 함수를 성공적으로 호출한 후 lpBlob-pBlobData>는 다음 표에 나열된 값이 포함된 데이터 블록을 가리킵니다.
값 | Description |
---|---|
SDP_SERVICE_SEARCH_REQUEST | Bluetooth 1.1 SDP 4.5.2에서 정의한 ServiceRecordHandleList 와 동일한 SDP 레코드 핸들의 배열입니다. 반환되는 SDP 핸들 수는 (lpBlob-cbSize>)/sizeof(ULONG)로 계산됩니다. 모든 결과는 WSALookupServiceNext 함수에 대한 단일 호출로 반환됩니다. |
SDP_SERVICE_ATTRIBUTE_REQUEST 또는 SDP_SERVICE_SEARCH_ATTRIBUTE_REQUEST | 이진 Bluetooth SDP 레코드입니다. SDP_SERVICE_ATTRIBUTE_REQUEST 경우 WSALookupServiceNext 함수에 대한 단일 호출에서 모든 결과가 반환됩니다. |
참고
서비스 쿼리에 대한 입력 중에 lpBlob 멤버를 지정하지 않으면 0에서 0xFFFF 특성의 lpServiceClassId 멤버에 지정된 서비스에 대해 서비스 및 특성 검색이 수행됩니다.