Поделиться через


Bluetooth и WSALookupServiceBegin для обнаружения служб

Чтобы обнаружить существование определенной службы на сервере Bluetooth, клиенты используют функции WSALookupServiceBegin, WSALookupServiceNext и WSALookupServiceEnd. Запросы можно выполнять для локальных и удаленных адресов, но подключения можно установить только с удаленными адресами. Дескриптор службы, обнаруженный во время этой операции, не может использоваться для удаления службы через WSASetService. Обратный цикл не поддерживается RFCOMM.

Можно выполнить два основных типа запросов обнаружения служб:

  • Запросы для одной или нескольких служб на локальном устройстве
  • Запросы для одной или нескольких служб на указанном одноранговом устройстве

Функция WSALookupServiceBegin получает структуру WSAQUERYSET в параметре lpqsRestrictions. WSALookupServiceBegin выполняет клиентский запрос на основе набора ограничений поиска, содержащих WSAQUERYSET . Клиенты Bluetooth должны указывать ограничения, перечисленные в следующей таблице, в структуре WSAQUERYSET при использовании функции WSALookupServiceBegin для запроса служб.

Член WSAQUERYSET Ограничение
dwSize Задайте для sizeof(WSAQUERYSET).
lpServiceClassId Задайте для определения область запроса наиболее конкретный идентификатор UUID Bluetooth. Например, задание lpServiceClassId в UUID протокола L2CAP приводит ко всем возвращенным службам L2CAP, в основном перечисляя все записи SD в целевом объекте. Однако установка UUID для определенной службы возвращает только экземпляры этой службы.
dwNameSpace Установите значение NS_BTH.
dwNumberOfCsAddrs Присвойте параметру значение 0.
lpszContext Задайте для устройства Bluetooth адрес, с помощью которого необходимо установить подключение SDP для выполнения запроса служб. Этот элемент должен быть строкой, преобразованной с помощью функции WSAAddressToString. Если указан локальный радиоадрес, то выполняется поиск локальных записей SDP.
Другие члены Все остальные члены структуры WSAQUERYSET игнорируются.

Подключение SDP к удаленному устройству не остается активным после завершения запроса службы WSALookupServiceBegin. Подключение завершается до возврата WSALookupServiceBegin. Приложения, требующие подключения SDP, которые должны оставаться активными после завершения запроса службы, должны указать идентификатор UUID класса службы, к которому необходимо подключиться с помощью члена serviceClassId структуры SOCKADDR_BTH при выполнении вызова функции подключения сокетов Windows.

Флаги, перечисленные в следующей таблице, используются в параметре dwControlFlags функций WSALookupServiceBegin и WSALookupServiceNext для управления результатами запроса. Флаги LUP_CONTAINERS и LUP_FLUSHCACHE используются функцией WSALookupServiceBegin; остальные флаги используются в вызовах функции WSALookupServiceNext.

Флаг Результат
LUP_CONTAINERS Не должно быть задано.
LUP_FLUSHCACHE Приложения обычно должны указывать LUP_FLUSHCACHE. Этот флаг указывает системе игнорировать все кэшированные сведения и устанавливать подключение SDP через воздух к указанному устройству для выполнения поиска SDP. Эта не кэшированная операция может занять несколько секунд (в то время как кэшированный поиск быстро возвращается). В настоящее время Bluetooth не кэширует записи SDP с близлежащих устройств, а также не кэширует предыдущие запросы в настоящее время агрессивно. Поэтому приложения должны ожидать, что запросы не могут возвращать результаты (с кодом ошибки WSASERVICE_NOT_FOUND), если LUP_FLUSHCACHE не указан. Кэшированные данные, доступные с помощью интерфейса сокетов Windows, могут быть улучшены в будущем.
LUP_RES_SERVICE Возвращает сведения о локальном адресе Bluetooth. Этот флаг действует только в том случае, если LUP_RETURN_ADDR также указан.
LUP_RETURN_NAME Возвращает отображаемое имя службы в элементе lpszServiceInstanceName структуры WSAQUERYSET для каждого вызова функции WSALookupServiceNext.
LUP_RETURN_TYPE Возвращает идентификатор класса службы в элементе lpServiceClassId структуры WSAQUERYSET. Примечание. Использование этого флага применимо только к функции WSALookupServiceBegin . Это значение всегда равно нулю для WSALookupServiceNext.
LUP_RETURN_ADDR Возвращает адрес в члене lpcsaBuffer , который будет использоваться с вызовами функций подключения . Возвращенный адрес содержит номер порта.
LUP_RETURN_BLOB Возвращает соответствующие записи SD в члене lpBlob , отформатированный в соответствии со спецификацией записи Bluetooth SDP.
LUP_RETURN_ALL Возвращает все указанные выше сведения о флагах.
LUP_RETURN_COMMENT Возвращает описание службы в элементе lpszComment структуры WSAQUERYSET для каждого вызова функции WSALookupServiceNext.
LUP_FLUSHPREVIOUS Пропустите следующую доступную запись и верните следующую за ней запись.

Расширенные запросы службы

Операции запроса, описанные в предыдущем разделе, можно использовать для возврата всех результатов из одного GUID, который должен быть достаточно для большинства приложений. Расширенный запрос позволяет приложению создавать более конкретный запрос; он предоставляет возможность сопоставления UUID и атрибутов в возвращаемых сведениях.

Чтобы выполнить расширенный запрос к службам, клиенты Bluetooth должны указать следующие ограничения в структуре WSAQUERYSET, передаваемой в параметр lpqsRestrictions.

Член WSAQUERYSET Ограничение
dwSize Задайте для sizeof(WSAQUERYSET).
lpszContext Задайте для устройства Bluetooth адрес, с помощью которого необходимо установить подключение SDP для выполнения запроса служб. Этот элемент должен быть строкой, преобразованной с помощью функции WSAAddressToString. Если указан локальный радиоадрес, то выполняется поиск локальных записей SDP.
lpBlob.pBlobData Указатель на структуру BTH_QUERY_SERVICE , содержащую все параметры, ограничивающие результаты запроса.
dwNameSpace Установите значение NS_BTH.
Другие члены Все остальные члены структуры WSAQUERYSET игнорируются.

Следующие флаги передаются в параметре dwControlFlags WSALookupServiceBegin для управления результатами расширенного запроса.

Флаг Результат
LUP_CONTAINERS Не должно быть задано.
LUP_FLUSHCACHE Приложения обычно должны указывать LUP_FLUSHCACHE. Этот флаг указывает системе игнорировать все кэшированные сведения и устанавливать подключение SDP через воздух к указанному устройству для выполнения поиска SDP. Эта не кэшированная операция может занять несколько секунд (в то время как кэшированный поиск быстро возвращается). Bluetooth не кэширует записи SDP с близлежащих устройств и не кэширует предыдущие запросы. Поэтому приложения должны ожидать, что запросы могут часто возвращать результаты (WSASERVICE_NOT_FOUND), если LUP_FLUSHCACHE не задано. Кэшированные данные, доступные с помощью интерфейса сокетов Windows, могут быть улучшены в будущем.
LUP_RES_SERVICE Возвращает сведения для локального адреса Bluetooth. Установка этого флага действует только в том случае, если LUP_RETURN_ADDRR также указан.
LUP_RETURN_NAME Возвращает отображаемое имя службы. Этот флаг игнорируется для SDP_SERVICE_SEARCH_REQUEST.
LUP_RETURN_TYPE Возвращает идентификатор класса службы. Этот флаг игнорируется для SDP_SERVICE_SEARCH_REQUEST.
LUP_RETURN_ADDR Возвращает адрес в члене lpcsaBuffer , который будет использоваться с вызовами функций подключения . Возвращенный адрес содержит номер порта. Этот флаг игнорируется для SDP_SERVICE_SEARCH_REQUEST.
LUP_RETURN_BLOB Возвращает соответствующие записи SD в формате, соответствующем спецификации записей Bluetooth SDP. Для SDP_SERVICE_SEARCH_REQUEST результатом lpBlob для последующего вызова WSALookupServiceNext является массив дескрипторов SDP Bluetooth. Для SDP_SERVICE_ATTRIBUTE_REQUEST и SDP_SERVICE_SEARCH_ATTRIBUTE_REQUEST результат каждого последующего вызова WSALookupServiceNext — это двоичная запись SDP Bluetooth, атрибуты которой ограничены теми, которые указаны членом запроса pRange. Этот флаг необходим для SDP_SERVICE_SEARCH_REQUEST.
LUP_RETURN_COMMENT Возвращает описание службы в элементе lpszComment структуры WSAQUERYSET для каждого вызова функции WSALookupServiceNext.
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, которые запись должна содержать для сопоставления поиска. Если запрашиваются идентификаторы UUID меньше MAX_UUIDS_IN_QUERY , это значение задает элемент SdpQueryUuid, который немедленно следует последнему допустимому идентификатору UUID для всех нулей.
numRange Используется для поиска атрибутов и serviceAttribute . Это значение указывает количество элементов в pRange.
pRange Используется для поиска атрибутов и serviceAttribute . Это значение указывает значения атрибутов для получения всех соответствующих записей.

После каждого успешного вызова функции WSALookupServiceNext lpBlob-pBlobData> указывает на блок данных, содержащий значения, перечисленные в следующей таблице.

значение Описание
SDP_SERVICE_SEARCH_REQUEST Массив дескрипторов записей SDP, идентичный ServiceRecordHandleList , определенному Bluetooth 1.1 SDP 4.5.2. Число возвращаемых дескрипторов SDP вычисляется по (lpBlob-cbSize>)/sizeof(ULONG). Все результаты возвращаются в одном вызове функции WSALookupServiceNext .
SDP_SERVICE_ATTRIBUTE_REQUEST или SDP_SERVICE_SEARCH_ATTRIBUTE_REQUEST Двоичная запись Bluetooth SDP. Для SDP_SERVICE_ATTRIBUTE_REQUEST все результаты возвращаются в одном вызове функции WSALookupServiceNext.

Примечание.

Если элемент lpBlob не указан во время ввода запроса службы, поиск службы и атрибутов выполняется для службы, указанной в члене lpServiceClassId, атрибуты от 0 до 0xFFFF.

Bluetooth и WSAQUERYSET для запроса на обслуживание

Обнаружение устройств и служб Bluetooth

Bluetooth и WSALookupServiceNext

Bluetooth и WSALookupServiceBegin для запроса устройства

BTH_QUERY_SERVICE

connect

SOCKADDR_BTH

WSAAddressToString

WSALookupServiceBegin

WSALookupServiceEnd

WSALookupServiceNext

WSAQUERYSET

Сокеты Windows