Bluetooth y WSALookupServiceBegin for Service Discovery
Para detectar la existencia de un servicio determinado en un servidor Bluetooth, los clientes usan las funciones WSALookupServiceBegin, WSALookupServiceNext y WSALookupServiceEnd . Las consultas se pueden realizar para direcciones locales y remotas, pero las conexiones solo se pueden establecer con direcciones remotas. Los identificadores de servicio detectados durante esta operación no se pueden usar para eliminar el servicio a través de WSASetService. RFCOMM no admite bucle invertido.
Se pueden realizar dos tipos básicos de consultas de detección de servicios:
- Consultas para uno o varios servicios en el dispositivo local
- Consultas para uno o varios servicios en un dispositivo del mismo nivel especificado
La función WSALookupServiceBegin recibe una estructura WSAQUERYSET en su parámetro lpqsRestrictions . WSALookupServiceBegin realiza una consulta de cliente basada en el conjunto de restricciones de búsqueda que contiene WSAQUERYSET . Los clientes Bluetooth deben especificar las restricciones, enumeradas en la tabla siguiente, en la estructura WSAQUERYSET al usar la función WSALookupServiceBegin para consultar los servicios.
Miembro WSAQUERYSET | Restricción |
---|---|
dwSize | Establezca en sizeof(WSAQUERYSET). |
lpServiceClassId | Establezca en el UUID de Bluetooth más específico que se puede usar para determinar el ámbito de la consulta. Por ejemplo, establecer lpServiceClassId en el UUID del protocolo L2CAP da como resultado todos los servicios L2CAP devueltos, enumerando esencialmente todos los registros SD en el destino. Sin embargo, si se establece el UUID en un servicio específico, solo se devuelven las instancias de ese servicio. |
dwNameSpace | Establézcalo en NS_BTH. |
dwNumberOfCsAddrs | Establecer en 0. |
lpszContext | Establézcalo en la dirección del dispositivo Bluetooth con la que establecer una conexión SDP para realizar la consulta de servicios. Este miembro debe ser una cadena que se convierte mediante la función WSAAddressToString . Si se proporciona la dirección de radio local, se buscan los registros SDP locales. |
Otros miembros | Se omiten todos los demás miembros de la estructura WSAQUERYSET . |
La conexión SDP al dispositivo remoto no permanece activa después de que la función WSALookupServiceBegin complete una consulta de servicio; la conexión finaliza antes de que se devuelva WSALookupServiceBegin . Las aplicaciones que requieren que la conexión SDP permanezcan activas después de que se complete una consulta de servicio deben especificar el UUID de clase de servicio al que conectarse mediante el miembro serviceClassId de la estructura de SOCKADDR_BTH al emitir la llamada a la función connect de Windows Sockets.
Las marcas, enumeradas en la tabla siguiente, se usan en el parámetro dwControlFlags de las funciones WSALookupServiceBegin y WSALookupServiceNext para controlar los resultados de la consulta. La función WSALookupServiceBegin usa las marcas LUP_CONTAINERS y LUP_FLUSHCACHE; El resto de las marcas se usan en llamadas a la función WSALookupServiceNext.
Marca | Resultado |
---|---|
LUP_CONTAINERS | No se debe establecer. |
LUP_FLUSHCACHE | Por lo general, las aplicaciones deben especificar LUP_FLUSHCACHE. Esta marca indica al sistema que omita cualquier información almacenada en caché y establezca una conexión SDP inalámbrica al dispositivo especificado para realizar la búsqueda de SDP. Esta operación no almacenada en caché puede tardar varios segundos (mientras que una búsqueda almacenada en caché se devuelve rápidamente). Actualmente, Bluetooth no almacena en caché de forma proactiva los registros SDP de los dispositivos cercanos, ni almacena actualmente en caché las consultas anteriores de forma agresiva. Por lo tanto, las aplicaciones deben prever que las consultas no pueden devolver ningún resultado (con un código de error de WSASERVICE_NOT_FOUND) si no se especifica LUP_FLUSHCACHE . Los datos almacenados en caché que están disponibles mediante la interfaz de Windows Sockets se pueden mejorar en el futuro. |
LUP_RES_SERVICE | Devuelve información sobre la dirección Bluetooth local. Esta marca solo tiene un efecto si también se especifica LUP_RETURN_ADDR. |
LUP_RETURN_NAME | Devuelve el nombre para mostrar del servicio en el miembro lpszServiceInstanceName de la estructura WSAQUERYSET para cada llamada a la función WSALookupServiceNext . |
LUP_RETURN_TYPE | Devuelve el identificador de clase de servicio en el miembro lpServiceClassId de la estructura WSAQUERYSET .
Nota: El uso de esta marca solo se aplica a la función WSALookupServiceBegin . Este valor siempre es cero para WSALookupServiceNext. |
LUP_RETURN_ADDR | Devuelve una dirección en el miembro lpcsaBuffer que se va a usar con las llamadas de función connect . La dirección devuelta contiene el número de puerto. |
LUP_RETURN_BLOB | Devuelve los registros SD coincidentes en el miembro lpBlob , con formato según la especificación del registro SDP bluetooth. |
LUP_RETURN_ALL | Devuelve toda la información de las marcas anteriores. |
LUP_RETURN_COMMENT | Devuelve la descripción del servicio en el miembro lpszComment de la estructura WSAQUERYSET para cada llamada a la función WSALookupServiceNext . |
LUP_FLUSHPREVIOUS | Omita el siguiente registro disponible y devuelva el registro que lo sigue. |
Consultas de servicios avanzados
Las operaciones de consulta que se describen en la sección anterior se pueden usar para devolver todos los resultados de un único GUID, que debe ser suficiente para la mayoría de las aplicaciones. Una consulta avanzada permite a una aplicación crear una consulta más específica; proporciona la capacidad de buscar coincidencias con UUID y atributos en la información devuelta.
Para realizar una consulta avanzada para los servicios, los clientes Bluetooth deben especificar las siguientes restricciones en la estructura WSAQUERYSET que se pasa al parámetro lpqsRestrictions .
Miembro WSAQUERYSET | Restricción |
---|---|
dwSize | Establezca en sizeof(WSAQUERYSET). |
lpszContext | Establézcalo en la dirección del dispositivo Bluetooth con la que establecer una conexión SDP para realizar la consulta de servicios. Este miembro debe ser una cadena que se convierte mediante la función WSAAddressToString . Si se proporciona la dirección de radio local, se buscan los registros SDP locales. |
lpBlob.pBlobData | Puntero a una estructura de BTH_QUERY_SERVICE que contiene todos los parámetros que limitan los resultados de la consulta. |
dwNameSpace | Establézcalo en NS_BTH. |
Otros miembros | Se omiten todos los demás miembros de la estructura WSAQUERYSET . |
Las marcas siguientes se pasan en el parámetro dwControlFlags de WSALookupServiceBegin para controlar los resultados de una consulta avanzada.
Marca | Resultado |
---|---|
LUP_CONTAINERS | No se debe establecer. |
LUP_FLUSHCACHE | Por lo general, las aplicaciones deben especificar LUP_FLUSHCACHE. Esta marca indica al sistema que omita cualquier información almacenada en caché y establezca una conexión SDP inalámbrica al dispositivo especificado para realizar la búsqueda de SDP. Esta operación no almacenada en caché puede tardar varios segundos (mientras que una búsqueda almacenada en caché se devuelve rápidamente). Bluetooth no almacena en caché de forma proactiva los registros SDP de dispositivos cercanos, ni almacena en caché de forma agresiva las consultas anteriores. Por lo tanto, las aplicaciones deben esperar que las consultas no devuelvan con frecuencia ningún resultado (WSASERVICE_NOT_FOUND) si no se especifica LUP_FLUSHCACHE . Los datos almacenados en caché que están disponibles mediante la interfaz de Windows Sockets se pueden mejorar en el futuro. |
LUP_RES_SERVICE | Devuelve información para la dirección Bluetooth local. Establecer esta marca solo tiene un efecto si también se especifica LUP_RETURN_ADDRR. |
LUP_RETURN_NAME | Devuelve el nombre para mostrar del servicio. Esta marca se omite para SDP_SERVICE_SEARCH_REQUEST. |
LUP_RETURN_TYPE | Devuelve el identificador de clase de servicio. Esta marca se omite para SDP_SERVICE_SEARCH_REQUEST. |
LUP_RETURN_ADDR | Devuelve una dirección en el miembro lpcsaBuffer que se va a usar con las llamadas de función connect . La dirección devuelta contiene el número de puerto. Esta marca se omite para SDP_SERVICE_SEARCH_REQUEST. |
LUP_RETURN_BLOB | Devuelve los registros SD coincidentes en un formato que se ajusta a la especificación del registro SDP de Bluetooth. Por SDP_SERVICE_SEARCH_REQUEST, el resultado en lpBlob para la llamada posterior a WSALookupServiceNext es una matriz de identificadores SDP bluetooth. Para SDP_SERVICE_ATTRIBUTE_REQUEST y SDP_SERVICE_SEARCH_ATTRIBUTE_REQUEST, el resultado de cada llamada posterior a WSALookupServiceNext es un registro SDP de Bluetooth binario cuyos atributos están restringidos a los especificados por el miembro pRange de la consulta. Esta marca es necesaria para SDP_SERVICE_SEARCH_REQUEST. |
LUP_RETURN_COMMENT | Devuelve la descripción del servicio en el miembro lpszComment de la estructura WSAQUERYSET para cada llamada a la función WSALookupServiceNext . |
LUP_FLUSHPREVIOUS | Omita el siguiente registro disponible y devuelva el registro que lo sigue. |
En la entrada, lpBlob-pBlobData> apunta a una estructura de BTH_QUERY_SERVICE que contiene los valores enumerados en la tabla siguiente.
Nota:
La solicitud de búsqueda inicial debe ser capaz de caber en un paquete L2CAP. Sin embargo, la respuesta puede dividirse en muchos paquetes L2CAP.
Miembro | Value |
---|---|
type | Tipo de búsqueda que se va a realizar. Este valor puede ser uno de SDP_SERVICE_SEARCH_REQUEST, SDP_SERVICE_ATTRIBUTE_REQUEST o SDP_SERVICE_SEARCH_ATTRIBUTE_REQUEST. Cada tipo de búsqueda está asociado a un mecanismo de búsqueda subyacente definido por la especificación de Bluetooth SDP. Cada devolución da como resultado el formulario descrito por la estructura WSAQUERYSET definida anteriormente en esta sección (Consultas de servicio avanzadas). |
serviceHandle | Se usa para búsquedas de atributos. Este valor especifica el identificador de servicio con el que se van a consultar los atributos del miembro pRange . |
Uuid | Se usa para búsquedas de service y serviceAttribute . Este valor especifica los UUID que un registro debe contener para que coincida con la búsqueda. Si se van a consultar menos de MAX_UUIDS_IN_QUERY UUID, este valor establece el elemento SdpQueryUuid que sigue inmediatamente el último UUID válido a todos los ceros. |
numRange | Se usa para las búsquedas de atributo y serviceAttribute . Este valor especifica el número de elementos de pRange. |
Prange | Se usa para las búsquedas de atributo y serviceAttribute . Este valor especifica los valores de atributo que se van a recuperar para los registros coincidentes. |
Después de cada llamada correcta a la función WSALookupServiceNext, lpBlob-pBlobData> apunta a un bloque de datos que contiene los valores enumerados en la tabla siguiente.
Value | Descripción |
---|---|
SDP_SERVICE_SEARCH_REQUEST | Matriz de identificadores de registro SDP idénticas a ServiceRecordHandleList definidas por Bluetooth 1.1 SDP 4.5.2. El número de identificadores SDP que se devuelve se calcula mediante (lpBlob-cbSize>)/sizeof(ULONG). Todos los resultados se devuelven en una sola llamada a la función WSALookupServiceNext . |
SDP_SERVICE_ATTRIBUTE_REQUEST o SDP_SERVICE_SEARCH_ATTRIBUTE_REQUEST | Un registro SDP de Bluetooth binario. Por SDP_SERVICE_ATTRIBUTE_REQUEST, todos los resultados se devuelven en una sola llamada a la función WSALookupServiceNext . |
Nota
Si no se especifica el miembro lpBlob durante la entrada de una consulta de servicio, se realiza una búsqueda de servicios y atributos para el servicio especificado en el miembro lpServiceClassId en atributos de 0 a 0xFFFF.