서비스 검색을 위한 Bluetooth 및 WSALookupServiceBegin

Bluetooth 서버에서 특정 서비스의 존재를 검색하기 위해 클라이언트는 WSALookupServiceBegin, WSALookupServiceNextWSALookupServiceEnd 함수를 사용합니다. 로컬 및 원격 주소에 대해 쿼리를 수행할 수 있지만 원격 주소로만 연결을 설정할 수 있습니다. 이 작업 중에 검색된 서비스 핸들은 WSASetService를 통해 서비스를 삭제하는 데 사용할 수 없습니다. 루프백은 RFCOMM에서 지원되지 않습니다.

두 가지 기본 유형의 서비스 검색 쿼리를 수행할 수 있습니다.

  • 로컬 디바이스에서 하나 이상의 서비스에 대한 쿼리
  • 지정된 피어 디바이스에서 하나 이상의 서비스에 대한 쿼리

WSALookupServiceBegin 함수는 해당 lpqsRestrictions 매개 변수에서 WSAQUERYSET 구조를 받습니다. WSALookupServiceBeginWSAQUERYSET 에 포함된 검색 제한 집합에 따라 클라이언트 쿼리를 수행합니다. 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_CONTAINERSLUP_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 구조체의 다른 모든 멤버는 무시됩니다.

다음 플래그는 고급 쿼리의 결과를 제어하기 위해 WSALookupServiceBegindwControlFlags 매개 변수에 전달됩니다.

플래그 결과
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_REQUESTSDP_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 멤버에 지정된 서비스에 대해 서비스 및 특성 검색이 수행됩니다.

서비스 문의용 Bluetooth 및 WSAQUERYSET

Bluetooth 디바이스 및 서비스 검색

Bluetooth 및 WSALookupServiceNext

디바이스 조회용 Bluetooth 및 WSALookupServiceBegin

BTH_QUERY_SERVICE

연결

SOCKADDR_BTH

WSAAddressToString

WSALookupServiceBegin

WSALookupServiceEnd

WSALookupServiceNext

WSAQUERYSET

Windows 소켓