Bluetooth et WSALookupServiceBegin pour la découverte de services
Pour découvrir l’existence d’un service particulier sur un serveur Bluetooth, les clients utilisent les fonctions WSALookupServiceBegin, WSALookupServiceNext et WSALookupServiceEnd . Les requêtes peuvent être effectuées pour les adresses locales et distantes, mais les connexions ne peuvent être établies qu’avec des adresses distantes. Les descripteurs de service découverts au cours de cette opération ne peuvent pas être utilisés pour supprimer le service via WSASetService. Le bouclage n’est pas pris en charge par RFCOMM.
Deux types de requêtes de découverte de service de base peuvent être effectués :
- Requêtes pour un ou plusieurs services sur l’appareil local
- Requêtes pour un ou plusieurs services sur un appareil homologue spécifié
La fonction WSALookupServiceBegin reçoit une structure WSAQUERYSET dans son paramètre lpqsRestrictions . WSALookupServiceBegin exécute une requête cliente basée sur l’ensemble de restrictions de recherche que contient WSAQUERYSET . Les clients Bluetooth doivent spécifier les restrictions répertoriées dans le tableau suivant dans la structure WSAQUERYSET lors de l’utilisation de la fonction WSALookupServiceBegin pour rechercher des services.
Membre WSAQUERYSET | Restriction |
---|---|
dwSize | Défini sur sizeof(WSAQUERYSET). |
lpServiceClassId | Définissez sur l’UUID Bluetooth le plus spécifique qui peut être utilisé pour déterminer l’étendue de la requête. Par exemple, si vous définissez lpServiceClassId sur l’UUID du protocole L2CAP, tous les services L2CAP sont retournés, énumérant essentiellement tous les enregistrements SD sur la cible. Toutefois, la définition de l’UUID sur un service spécifique retourne uniquement les instances de ce service. |
dwNameSpace | Définissez sur NS_BTH. |
dwNumberOfCsAddrs | Définit la valeur 0. |
lpszContext | Définissez sur l’adresse de l’appareil Bluetooth avec laquelle établir une connexion SDP pour effectuer la requête des services. Ce membre doit être une chaîne convertie à l’aide de la fonction WSAAddressToString . Si l’adresse radio locale est fournie, les enregistrements SDP locaux sont recherchés. |
Autres membres | Tous les autres membres de la structure WSAQUERYSET sont ignorés. |
La connexion SDP à l’appareil distant ne reste pas active une fois que la fonction WSALookupServiceBegin a terminé une requête de service ; la connexion est terminée avant le retour de WSALookupServiceBegin . Les applications qui nécessitent que la connexion SDP reste active une fois la requête de service terminée doivent spécifier l’UUID de la classe de service à laquelle se connecter à l’aide du membre serviceClassId de la structure SOCKADDR_BTH lors de l’émission de l’appel de fonction Windows Sockets Connect .
Les indicateurs, répertoriés dans le tableau suivant, sont utilisés dans le paramètre dwControlFlags des fonctions WSALookupServiceBegin et WSALookupServiceNext pour contrôler les résultats de la requête. Les indicateurs LUP_CONTAINERS et LUP_FLUSHCACHE sont utilisés par la fonction WSALookupServiceBegin ; les autres indicateurs sont utilisés dans les appels à la fonction WSALookupServiceNext .
Indicateur | Résultats |
---|---|
LUP_CONTAINERS | Ne doit pas être défini. |
LUP_FLUSHCACHE | Les applications doivent généralement spécifier LUP_FLUSHCACHE. Cet indicateur indique au système d’ignorer toutes les informations mises en cache et d’établir une connexion SDP ota à l’appareil spécifié pour effectuer la recherche SDP. Cette opération non mise en cache peut prendre plusieurs secondes (alors qu’une recherche mise en cache retourne rapidement). Actuellement, Bluetooth ne met pas en cache de manière proactive les enregistrements SDP à partir d’appareils à proximité, et il ne met actuellement pas en cache agressivement les requêtes précédentes. Par conséquent, les applications doivent s’attendre à ce que les requêtes ne retournent aucun résultat (avec un code d’erreur WSASERVICE_NOT_FOUND) si LUP_FLUSHCACHE n’est pas spécifié. Les données mises en cache disponibles à l’aide de l’interface Windows Sockets peuvent être améliorées à l’avenir. |
LUP_RES_SERVICE | Retourne des informations sur l’adresse Bluetooth locale. Cet indicateur a un effet uniquement si LUP_RETURN_ADDR est également spécifié. |
LUP_RETURN_NAME | Retourne le nom complet du service dans le membre lpszServiceInstanceName de la structure WSAQUERYSET pour chaque appel à la fonction WSALookupServiceNext . |
LUP_RETURN_TYPE | Retourne l’ID de classe de service dans le membre lpServiceClassId de la structure WSAQUERYSET .
Note: L’utilisation de cet indicateur s’applique uniquement à la fonction WSALookupServiceBegin . Cette valeur est toujours égale à zéro pour WSALookupServiceNext. |
LUP_RETURN_ADDR | Retourne une adresse dans le membre lpcsaBuffer à utiliser avec les appels de fonction de connexion . L’adresse retournée contient le numéro de port. |
LUP_RETURN_BLOB | Retourne les enregistrements SD correspondants dans le membre lpBlob , mis en forme selon la spécification de l’enregistrement SDP Bluetooth. |
LUP_RETURN_ALL | Retourne toutes les informations des indicateurs ci-dessus. |
LUP_RETURN_COMMENT | Retourne la description du service dans le membre lpszComment de la structure WSAQUERYSET pour chaque appel à la fonction WSALookupServiceNext . |
LUP_FLUSHPREVIOUS | Ignorez l’enregistrement disponible suivant et retournez l’enregistrement qui le suit. |
Requêtes de service avancées
Les opérations de requête décrites dans la section précédente peuvent être utilisées pour retourner tous les résultats d’un GUID unique, ce qui doit être suffisant pour la plupart des applications. Une requête avancée permet à une application de créer une requête plus spécifique ; il offre la possibilité de faire correspondre des UUID et des attributs dans les informations retournées.
Pour effectuer une requête avancée pour les services, les clients Bluetooth doivent spécifier les restrictions suivantes dans la structure WSAQUERYSET qui est passée au paramètre lpqsRestrictions .
Membre WSAQUERYSET | Restriction |
---|---|
dwSize | Défini sur sizeof(WSAQUERYSET). |
lpszContext | Définissez sur l’adresse de l’appareil Bluetooth avec laquelle établir une connexion SDP pour effectuer la requête des services. Ce membre doit être une chaîne convertie à l’aide de la fonction WSAAddressToString . Si l’adresse radio locale est fournie, les enregistrements SDP locaux sont recherchés. |
lpBlob.pBlobData | Pointeur vers une structure de BTH_QUERY_SERVICE qui contient tous les paramètres qui limitent les résultats de la requête. |
dwNameSpace | Définissez sur NS_BTH. |
Autres membres | Tous les autres membres de la structure WSAQUERYSET sont ignorés. |
Les indicateurs suivants sont passés dans le paramètre dwControlFlags de WSALookupServiceBegin pour contrôler les résultats d’une requête avancée.
Indicateur | Résultats |
---|---|
LUP_CONTAINERS | Ne doit pas être défini. |
LUP_FLUSHCACHE | Les applications doivent généralement spécifier LUP_FLUSHCACHE. Cet indicateur indique au système d’ignorer toutes les informations mises en cache et d’établir une connexion SDP ota à l’appareil spécifié pour effectuer la recherche SDP. Cette opération non mise en cache peut prendre plusieurs secondes (alors qu’une recherche mise en cache retourne rapidement). Bluetooth ne met pas en cache de manière proactive les enregistrements SDP à partir d’appareils à proximité et ne met pas en cache agressivement les requêtes précédentes. Par conséquent, les applications doivent s’attendre à ce que les requêtes ne retournent fréquemment aucun résultat (WSASERVICE_NOT_FOUND) si LUP_FLUSHCACHE n’est pas spécifié. Les données mises en cache disponibles à l’aide de l’interface Windows Sockets peuvent être améliorées à l’avenir. |
LUP_RES_SERVICE | Retourne des informations pour l’adresse Bluetooth locale. La définition de cet indicateur a un effet uniquement si LUP_RETURN_ADDRR est également spécifié. |
LUP_RETURN_NAME | Retourne le nom complet du service. Cet indicateur est ignoré pour SDP_SERVICE_SEARCH_REQUEST. |
LUP_RETURN_TYPE | Retourne l’ID de la classe de service. Cet indicateur est ignoré pour SDP_SERVICE_SEARCH_REQUEST. |
LUP_RETURN_ADDR | Retourne une adresse dans le membre lpcsaBuffer à utiliser avec les appels de fonction de connexion . L’adresse retournée contient le numéro de port. Cet indicateur est ignoré pour SDP_SERVICE_SEARCH_REQUEST. |
LUP_RETURN_BLOB | Retourne les enregistrements SD correspondants dans un format conforme à la spécification d’enregistrement SDP Bluetooth. Pour SDP_SERVICE_SEARCH_REQUEST, le résultat en lpBlob pour l’appel suivant à WSALookupServiceNext est un tableau de handles SDP Bluetooth. Par SDP_SERVICE_ATTRIBUTE_REQUEST et SDP_SERVICE_SEARCH_ATTRIBUTE_REQUEST, le résultat de chaque appel suivant à WSALookupServiceNext est un enregistrement SDP Bluetooth binaire dont les attributs sont limités à ceux spécifiés par le membre pRange de la requête. Cet indicateur est requis pour SDP_SERVICE_SEARCH_REQUEST. |
LUP_RETURN_COMMENT | Retourne la description du service dans le membre lpszComment de la structure WSAQUERYSET pour chaque appel à la fonction WSALookupServiceNext . |
LUP_FLUSHPREVIOUS | Ignorez l’enregistrement disponible suivant et retournez l’enregistrement qui le suit. |
Lors de l’entrée, lpBlob-pBlobData> pointe vers une structure BTH_QUERY_SERVICE qui contient les valeurs répertoriées dans le tableau suivant.
Notes
La demande de recherche initiale doit être en mesure de tenir dans un paquet L2CAP. Toutefois, la réponse peut être divisée en de nombreux paquets L2CAP.
Membre | Valeur |
---|---|
type | Type de recherche à effectuer. Cette valeur peut être SDP_SERVICE_SEARCH_REQUEST, SDP_SERVICE_ATTRIBUTE_REQUEST ou SDP_SERVICE_SEARCH_ATTRIBUTE_REQUEST. Chaque type de recherche est associé à un mécanisme de recherche sous-jacent défini par la spécification SDP Bluetooth. Chaque retour génère le formulaire décrit par la structure WSAQUERYSET définie précédemment dans cette section (Requêtes de service avancées). |
serviceHandle | Utilisé pour les recherches d’attributs. Cette valeur spécifie le handle de service avec lequel interroger les attributs dans le membre pRange . |
uuids | Utilisé pour les recherches service et serviceAttribute . Cette valeur spécifie les UUID qu’un enregistrement doit contenir pour correspondre à la recherche. Si moins de MAX_UUIDS_IN_QUERY uUID doivent être interrogés, cette valeur définit l’élément SdpQueryUuid qui suit immédiatement le dernier UUID valide sur tous les zéros. |
numRange | Utilisé pour les recherches d’attributs et de serviceAttribute . Cette valeur spécifie le nombre d’éléments dans pRange. |
Prange | Utilisé pour les recherches d’attributs et de serviceAttribute . Cette valeur spécifie les valeurs d’attribut à récupérer pour tous les enregistrements correspondants. |
Après chaque appel réussi à la fonction WSALookupServiceNext, lpBlob-pBlobData> pointe vers un bloc de données qui contient les valeurs répertoriées dans le tableau suivant.
Valeur | Description |
---|---|
SDP_SERVICE_SEARCH_REQUEST | Tableau de descripteurs d’enregistrement SDP identiques au ServiceRecordHandleList défini par Bluetooth 1.1 SDP 4.5.2. Le nombre de handles SDP retournés est calculé par (lpBlob-cbSize>)/sizeof(ULONG). Tous les résultats sont retournés en un seul appel à la fonction WSALookupServiceNext . |
SDP_SERVICE_ATTRIBUTE_REQUEST ou SDP_SERVICE_SEARCH_ATTRIBUTE_REQUEST | Enregistrement SDP Bluetooth binaire. Par SDP_SERVICE_ATTRIBUTE_REQUEST, tous les résultats sont retournés en un seul appel à la fonction WSALookupServiceNext . |
Notes
Si le membre lpBlob n’est pas spécifié lors de l’entrée pour une requête de service, une recherche de service et d’attribut est effectuée pour le service spécifié dans le membre lpServiceClassId sur les attributs de 0 à 0xFFFF.