Bluetooth e WSALookupServiceBegin para descoberta de serviço

Para descobrir a existência de um serviço específico em um servidor Bluetooth, os clientes usam as funções WSALookupServiceBegin, WSALookupServiceNext e WSALookupServiceEnd. As consultas podem ser realizadas para endereços locais e remotos, mas as conexões só podem ser estabelecidas com endereços remotos. Os identificadores de serviço descobertos durante essa operação não podem ser usados para excluir o serviço por meio do WSASetService. O loopback não é suportado pela RFCOMM.

Dois tipos básicos de consultas de descoberta de serviço podem ser executados:

  • Consultas para um ou mais serviços no dispositivo local
  • Consultas para um ou mais serviços em um dispositivo de mesmo nível especificado

A função WSALookupServiceBegin recebe uma estrutura WSAQUERYSET em seu parâmetro lpqsRestrictions . WSALookupServiceBegin executa uma consulta de cliente com base no conjunto de restrições de pesquisa que o WSAQUERYSET contém. Os clientes Bluetooth devem especificar as restrições, listadas na tabela a seguir, na estrutura WSAQUERYSET ao usar a função WSALookupServiceBegin para consultar serviços.

Membro WSAQUERYSET Restrição
dwSize Defina como sizeof(WSAQUERYSET).
lpServiceClassId Defina como o UUID Bluetooth mais específico que pode ser usado para determinar o escopo da consulta. Por exemplo, definir lpServiceClassId como o UUID do protocolo L2CAP resulta em todos os serviços L2CAP retornados, essencialmente enumerando todos os registros SD no destino. Definir o UUID para um serviço específico, no entanto, retorna apenas as instâncias desse serviço.
dwNameSpace Defina como NS_BTH.
dwNumberOfCsAddrs Defina como 0.
lpszContexto Defina como o endereço do dispositivo Bluetooth com o qual estabelecer uma conexão SDP para executar a consulta de serviços. Esse membro deve ser uma cadeia de caracteres que é convertida usando a função WSAAddressToString. Se o endereço de rádio local for fornecido, os registros SDP locais serão pesquisados.
Outros membros Todos os outros membros da estrutura WSAQUERYSET são ignorados.

A conexão SDP com o dispositivo remoto não permanece ativa depois que a função WSALookupServiceBegin conclui uma consulta de serviço, a conexão é encerrada antes que WSALookupServiceBegin retorne. Os aplicativos que exigem que a conexão SDP permaneça ativa após a conclusão de uma consulta de serviço devem especificar a classe de serviço UUID à qual se conectar usando o membro serviceClassId da estrutura SOCKADDR_BTH ao emitir a chamada de função de conexão do Windows Sockets.

Os sinalizadores, listados na tabela a seguir, são usados no parâmetro dwControlFlags das funções WSALookupServiceBegin e WSALookupServiceNext para controlar os resultados da consulta. Os sinalizadores LUP_CONTAINERS e LUP_FLUSHCACHE são usados pela função WSALookupServiceBegin , o restante dos sinalizadores é usado em chamadas para a função WSALookupServiceNext .

Sinalizador Resultado
LUP_CONTAINERS Não deve ser definido.
LUP_FLUSHCACHE Os aplicativos geralmente devem especificar LUP_FLUSHCACHE. Esse sinalizador instrui o sistema a ignorar qualquer informação armazenada em cache e estabelecer uma conexão SDP over-the-air com o dispositivo especificado para executar a pesquisa SDP. Essa operação não armazenada em cache pode levar vários segundos (enquanto uma pesquisa em cache retorna rapidamente). Atualmente, o Bluetooth não armazena proativamente registros SDP de dispositivos próximos, nem armazena consultas anteriores de forma agressiva. Portanto, os aplicativos devem prever que as consultas podem retornar nenhum resultado (com um código de erro de WSASERVICE_NOT_FOUND) se LUP_FLUSHCACHE não for especificado. Os dados armazenados em cache que estão disponíveis usando a interface do Windows Sockets podem ser aprimorados no futuro.
LUP_RES_SERVICE Retornar informações sobre o endereço Bluetooth local. Esse sinalizador terá efeito somente se LUP_RETURN_ADDR também for especificado.
LUP_RETURN_NAME Retorne o nome de exibição do serviço no membro lpszServiceInstanceName da estrutura WSAQUERYSET para cada chamada para a função WSALookupServiceNext.
LUP_RETURN_TYPE Retorne a ID da classe de serviço no membro lpServiceClassId da estrutura WSAQUERYSET . Nota: O uso desse sinalizador só é aplicável à função WSALookupServiceBegin. Esse valor é sempre zero para WSALookupServiceNext.
LUP_RETURN_ADDR Retorne um endereço no membro lpcsaBuffer a ser usado com chamadas de função de conexão. O endereço retornado contém o número da porta.
LUP_RETURN_BLOB Retorne os registros SD correspondentes no membro lpBlob , formatados de acordo com a especificação de registro Bluetooth SDP.
LUP_RETURN_ALL Retorne todas as informações dos sinalizadores acima.
LUP_RETURN_COMMENT Retorne a descrição do serviço no membro lpszComment da estrutura WSAQUERYSET para cada chamada para a função WSALookupServiceNext.
LUP_FLUSHPREVIOUS Ignore o próximo registro disponível e retorne o registro que o segue.

Consultas de serviço avançadas

As operações de consulta descritas na seção anterior podem ser usadas para retornar todos os resultados de um único GUID, que deve ser suficiente para a maioria dos aplicativos. Uma consulta avançada permite que um aplicativo crie uma consulta mais específica; ele fornece a capacidade de corresponder UUIDs e atributos nas informações retornadas.

Para executar uma consulta avançada para serviços, os clientes Bluetooth devem especificar as seguintes restrições na estrutura WSAQUERYSET que é passada para o parâmetro lpqsRestrictions .

Membro WSAQUERYSET Restrição
dwSize Defina como sizeof(WSAQUERYSET).
lpszContexto Defina como o endereço do dispositivo Bluetooth com o qual estabelecer uma conexão SDP para executar a consulta de serviços. Esse membro deve ser uma cadeia de caracteres que é convertida usando a função WSAAddressToString. Se o endereço de rádio local for fornecido, os registros SDP locais serão pesquisados.
lpBlob.pBlobData Ponteiro para uma estrutura BTH_QUERY_SERVICE que contém todos os parâmetros que limitam os resultados da consulta.
dwNameSpace Defina como NS_BTH.
Outros membros Todos os outros membros da estrutura WSAQUERYSET são ignorados.

Os sinalizadores a seguir são passados no parâmetro dwControlFlags de WSALookupServiceBegin para controlar os resultados de uma consulta avançada.

Sinalizador Resultado
LUP_CONTAINERS Não deve ser definido.
LUP_FLUSHCACHE Os aplicativos geralmente devem especificar LUP_FLUSHCACHE. Esse sinalizador instrui o sistema a ignorar qualquer informação armazenada em cache e estabelecer uma conexão SDP over-the-air com o dispositivo especificado para executar a pesquisa SDP. Essa operação não armazenada em cache pode levar vários segundos (enquanto uma pesquisa em cache retorna rapidamente). O Bluetooth não armazena proativamente em cache registros SDP de dispositivos próximos, nem armazena agressivamente consultas anteriores. Portanto, os aplicativos devem esperar que as consultas possam frequentemente retornar nenhum resultado (WSASERVICE_NOT_FOUND) se LUP_FLUSHCACHE não for especificado. Os dados armazenados em cache que estão disponíveis usando a interface do Windows Sockets podem ser aprimorados no futuro.
LUP_RES_SERVICE Retornar informações para o endereço Bluetooth local. A definição desse sinalizador terá efeito somente se LUP_RETURN_ADDRR também for especificada.
LUP_RETURN_NAME Retornar o nome de exibição do serviço. Esse sinalizador é ignorado por SDP_SERVICE_SEARCH_REQUEST.
LUP_RETURN_TYPE Retornar o ID da classe de serviço. Esse sinalizador é ignorado por SDP_SERVICE_SEARCH_REQUEST.
LUP_RETURN_ADDR Retorne um endereço no membro lpcsaBuffer a ser usado com chamadas de função de conexão. O endereço retornado contém o número da porta. Esse sinalizador é ignorado por SDP_SERVICE_SEARCH_REQUEST.
LUP_RETURN_BLOB Retorne os registros SD correspondentes em um formato que esteja em conformidade com a especificação de registro Bluetooth SDP. Por SDP_SERVICE_SEARCH_REQUEST, o resultado em lpBlob para a chamada subsequente para WSALookupServiceNext é uma matriz de identificadores SDP Bluetooth. Para SDP_SERVICE_ATTRIBUTE_REQUEST e SDP_SERVICE_SEARCH_ATTRIBUTE_REQUEST, o resultado de cada chamada subsequente para WSALookupServiceNext é um registro SDP Bluetooth binário cujos atributos são restritos àqueles especificados pelo membro pRange da consulta. Esse sinalizador é necessário para SDP_SERVICE_SEARCH_REQUEST.
LUP_RETURN_COMMENT Retorne a descrição do serviço no membro lpszComment da estrutura WSAQUERYSET para cada chamada para a função WSALookupServiceNext.
LUP_FLUSHPREVIOUS Ignore o próximo registro disponível e retorne o registro que o segue.

Na entrada, lpBlob-pBlobData> aponta para uma estrutura BTH_QUERY_SERVICE que contém os valores listados na tabela a seguir.

Observação

A solicitação de pesquisa inicial deve ser capaz de caber em um pacote L2CAP. A resposta, no entanto, pode ser quebrada em muitos pacotes L2CAP.

Membro Valor
tipo Tipo de pesquisa a ser realizada. Esse valor pode ser um dos SDP_SERVICE_SEARCH_REQUEST, SDP_SERVICE_ATTRIBUTE_REQUEST ou SDP_SERVICE_SEARCH_ATTRIBUTE_REQUEST. Cada tipo de pesquisa está associado a um mecanismo de pesquisa subjacente que é definido pela especificação Bluetooth SDP. Cada retorno resulta no formulário descrito pela estrutura WSAQUERYSET definida anteriormente nesta seção (Consultas de Serviço Avançadas).
serviceHandle Usado para pesquisas de atributos. Esse valor especifica o identificador de serviço com o qual consultar os atributos no membro pRange .
uuids Usado para pesquisas service e serviceAttribute . Esse valor especifica os UUIDs que um registro deve conter para corresponder à pesquisa. Se menos de MAX_UUIDS_IN_QUERY UUIDs forem consultados, esse valor definirá o elemento SdpQueryUuid que imediatamente segue o último UUID válido para todos os zeros.
numIntervalo Usado para pesquisas de atributo e serviceAttribute . Esse valor especifica o número de elementos em pRange.
pIntervalo Usado para pesquisas de atributo e serviceAttribute . Esse valor especifica os valores de atributo a serem recuperados para quaisquer registros correspondentes.

Após cada chamada bem-sucedida para a função WSALookupServiceNext, lpBlob-pBlobData> aponta para um bloco de dados que contém os valores listados na tabela a seguir.

Valor Descrição
SDP_SERVICE_SEARCH_REQUEST Uma matriz de identificadores de registro SDP que é idêntica ao ServiceRecordHandleList definido pelo Bluetooth 1.1 SDP 4.5.2. O número de identificadores SDP retornados é calculado por (lpBlob-cbSize>)/sizeof(ULONG). Todos os resultados são retornados em uma única chamada para a função WSALookupServiceNext.
SDP_SERVICE_ATTRIBUTE_REQUEST ou SDP_SERVICE_SEARCH_ATTRIBUTE_REQUEST Um registro SDP Bluetooth binário. Por SDP_SERVICE_ATTRIBUTE_REQUEST, todos os resultados são retornados em uma única chamada para a função WSALookupServiceNext .

Observação

Se o membro lpBlob não for especificado durante a entrada para uma consulta de serviço, uma pesquisa de serviço e atributo será executada para o serviço especificado no membro lpServiceClassId em atributos de 0 a 0xFFFF.

Bluetooth e WSAQUERYSET para consulta de serviço

Descobrir dispositivos e serviços Bluetooth

Bluetooth e WSALookupServiceNext

Bluetooth e WSALookupServiceBegin para consulta de dispositivo

BTH_QUERY_SERVICE

connect

SOCKADDR_BTH

WSAAddressToString

WSALookupServiceBegin

WSALookupServiceEnd

WSALookupServiceNext

WSAQUERYSET

Windows Sockets