서비스 검색용 Bluetooth 및 WSALookupServiceBegin
Bluetooth 서버에서 특정 서비스의 존재를 검색하기 위해 클라이언트는 WSALookupServiceBegin, WSALookupServiceNext및 WSALookupServiceEnd 함수를 사용합니다. 로컬 및 원격 주소에 대해 쿼리를 수행할 수 있지만 연결은 원격 주소로만 설정할 수 있습니다. 이 작업 중에 검색된 서비스 핸들은 WSASetService통해 서비스를 삭제하는 데 사용할 수 없습니다. 루프백은 RFCOMM에서 지원되지 않습니다.
두 가지 기본 유형의 서비스 검색 쿼리를 수행할 수 있습니다.
- 로컬 디바이스에서 하나 이상의 서비스에 대한 쿼리
- 지정된 피어 디바이스에서 하나 이상의 서비스에 대한 쿼리
WSALookupServiceBegin 함수는 lpqsRestrictions 매개 변수에서 WSAQUERYSET 구조를 받습니다. WSALookupServiceBeginWSAQUERYSET 포함된 검색 제한 집합에 따라 클라이언트 쿼리를 수행합니다. 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 소켓 연결 함수 호출을 실행할 때 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 구조체의 다른 모든 멤버는 무시됩니다. |
다음 플래그는 고급 쿼리의 결과를 제어하기 위해 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_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 패킷으로 나눌 수 있습니다.
구성원 | 값 |
---|---|
형식 | 수행할 검색 유형입니다. 이 값은 SDP_SERVICE_SEARCH_REQUEST, SDP_SERVICE_ATTRIBUTE_REQUEST또는 SDP_SERVICE_SEARCH_ATTRIBUTE_REQUEST중 하나일 수 있습니다. 각 검색 유형은 Bluetooth SDP 사양에 의해 정의된 기본 검색 메커니즘과 연결됩니다. 각 반환은 이(고급 서비스 쿼리) 섹션의 앞부분에서 정의된 WSAQUERYSET 구조에 설명된 형식으로 생성됩니다. |
serviceHandle | 특성 검색에 사용됩니다. 이 값은 pRange 멤버의 특성을 쿼리할 서비스 핸들을 지정합니다. |
uuids | 서비스 및 serviceAttribute 검색에 사용됩니다. 이 값은 레코드가 검색과 일치하도록 포함해야 하는 UUID를 지정합니다. MAX_UUIDS_IN_QUERY 미만의 UUID를 쿼리할 경우 이 값은 마지막 유효한 UUID 바로 뒤에 오는 SdpQueryUuid 요소를 모든 0으로 설정합니다. |
numRange | 특성 및 serviceAttribute 검색에 사용됩니다. 이 값은 pRange요소 수를 지정합니다. |
pRange | 특성 및 serviceAttribute 검색에 사용됩니다. 이 값은 일치하는 레코드에 대해 검색할 특성 값을 지정합니다. |
WSALookupServiceNext 함수를 성공적으로 호출한 후 lpBlob>pBlobData 다음 표에 나열된 값이 포함된 데이터 블록을 가리킵니다.
값 | 묘사 |
---|---|
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 및 WSALookupServiceBegin