Bluetooth und WSALookupServiceBegin für die Dienstermittlung
Um das Vorhandensein eines bestimmten Diensts auf einem Bluetooth-Server zu ermitteln, verwenden Clients die Funktionen WSALookupServiceBegin, WSALookupServiceNext und WSALookupServiceEnd . Abfragen können für lokale und Remoteadressen ausgeführt werden, Verbindungen können jedoch nur mit Remoteadressen hergestellt werden. Während dieses Vorgangs ermittelte Diensthandles können nicht verwendet werden, um den Dienst über WSASetService zu löschen. Loopback wird von RFCOMM nicht unterstützt.
Es können zwei grundlegende Arten von Dienstermittlungsabfragen ausgeführt werden:
- Abfragen für einen oder mehrere Dienste auf dem lokalen Gerät
- Abfragen für einen oder mehrere Dienste auf einem angegebenen Peergerät
Die WSALookupServiceBegin-Funktion empfängt eine WSAQUERYSET-Struktur im lpqsRestrictions-Parameter . WSALookupServiceBegin führt eine Clientabfrage basierend auf den Sucheinschränkungen aus, die das WSAQUERYSET enthält. Bluetooth-Clients müssen die in der folgenden Tabelle aufgeführten Einschränkungen in der WSAQUERYSET-Struktur angeben, wenn sie die WSALookupServiceBegin-Funktion zum Abfragen von Diensten verwenden.
WSAQUERYSET-Member | Einschränkung |
---|---|
dwSize | Legen Sie auf sizeof(WSAQUERYSET) fest. |
lpServiceClassId | Legen Sie auf die spezifischste Bluetooth-UUID fest, die verwendet werden kann, um den Bereich der Abfrage zu bestimmen. Wenn Sie beispielsweise lpServiceClassId auf die UUID des L2CAP-Protokolls festlegen, werden alle L2CAP-Dienste zurückgegeben, was im Wesentlichen alle SD-Einträge auf dem Ziel aufzählt. Wenn Sie die UUID auf einen bestimmten Dienst festlegen, werden jedoch nur die Instanzen dieses Diensts zurückgegeben. |
dwNameSpace | Auf NS_BTH festgelegt. |
dwNumberOfCsAddrs | Auf 0 festlegen. |
lpszContext | Legen Sie auf die Bluetooth-Geräteadresse fest, mit der eine SDP-Verbindung hergestellt werden soll, um die Abfrage von Diensten auszuführen. Dieser Member muss eine Zeichenfolge sein, die mithilfe der WSAAddressToString-Funktion konvertiert wird. Wenn die lokale Funkadresse angegeben wird, werden die lokalen SDP-Datensätze durchsucht. |
Andere Mitglieder | Alle anderen Member der WSAQUERYSET-Struktur werden ignoriert. |
Die SDP-Verbindung mit dem Remotegerät bleibt nicht aktiv, nachdem die WSALookupServiceBegin-Funktion eine Dienstabfrage abgeschlossen hat. Die Verbindung wird beendet, bevor WSALookupServiceBegin zurückgibt. Anwendungen, die erfordern, dass die SDP-Verbindung nach Abschluss einer Dienstabfrage aktiv bleibt, sollten die Dienstklasse UUID angeben, mit der eine Verbindung hergestellt werden soll, indem sie den serviceClassId-Member der SOCKADDR_BTH-Struktur verwenden, wenn der Verbindungsfunktionsaufruf von Windows Sockets ausgegeben wird.
Die in der folgenden Tabelle aufgeführten Flags werden im dwControlFlags-Parameter der Funktionen WSALookupServiceBegin und WSALookupServiceNext verwendet, um die Abfrageergebnisse zu steuern. Die flags LUP_CONTAINERS und LUP_FLUSHCACHE werden von der WSALookupServiceBegin-Funktion verwendet. die restlichen Flags werden in Aufrufen der WSALookupServiceNext-Funktion verwendet.
Flag | Ergebnis |
---|---|
LUP_CONTAINERS | Darf nicht festgelegt werden. |
LUP_FLUSHCACHE | Anwendungen sollten im Allgemeinen LUP_FLUSHCACHE angeben. Dieses Flag weist das System an, zwischengespeicherte Informationen zu ignorieren und eine Over-the-Air-SDP-Verbindung mit dem angegebenen Gerät herzustellen, um die SDP-Suche auszuführen. Dieser nicht zwischengespeicherte Vorgang kann einige Sekunden dauern (während eine zwischengespeicherte Suche schnell zurückgibt). Bluetooth speichert SDP-Datensätze von Geräten in der Nähe derzeit nicht proaktiv zwischen, und es speichert auch keine vorherigen Abfragen aggressiv zwischen. Daher sollten Anwendungen davon ausgehen, dass Abfragen möglicherweise keine Ergebnisse zurückgeben (mit dem Fehlercode WSASERVICE_NOT_FOUND), wenn LUP_FLUSHCACHE nicht angegeben ist. Die zwischengespeicherten Daten, die mithilfe der Windows Sockets-Schnittstelle verfügbar sind, können in Zukunft verbessert werden. |
LUP_RES_SERVICE | Gibt Informationen zur lokalen Bluetooth-Adresse zurück. Dieses Flag wirkt sich nur aus, wenn auch LUP_RETURN_ADDR angegeben ist. |
LUP_RETURN_NAME | Gibt den Anzeigenamen des Diensts im lpszServiceInstanceName-Member der WSAQUERYSET-Struktur für jeden Aufruf der WSALookupServiceNext-Funktion zurück. |
LUP_RETURN_TYPE | Gibt die Dienstklassen-ID im lpServiceClassId-Member der WSAQUERYSET-Struktur zurück.
Hinweis: Die Verwendung dieses Flags gilt nur für die WSALookupServiceBegin-Funktion . Dieser Wert ist für WSALookupServiceNext immer null. |
LUP_RETURN_ADDR | Gibt eine Adresse im lpcsaBuffer-Member zurück, die bei Verbindungsfunktionsaufrufen verwendet werden soll. Die zurückgegebene Adresse enthält die Portnummer. |
LUP_RETURN_BLOB | Geben Sie die übereinstimmenden SD-Einträge im lpBlob-Member zurück, die gemäß der Bluetooth-SDP-Datensatzspezifikation formatiert sind. |
LUP_RETURN_ALL | Gibt alle Informationen der obigen Flags zurück. |
LUP_RETURN_COMMENT | Gibt die Dienstbeschreibung im lpszComment-Member der WSAQUERYSET-Struktur für jeden Aufruf der WSALookupServiceNext-Funktion zurück. |
LUP_FLUSHPREVIOUS | Überspringen Sie den nächsten verfügbaren Datensatz, und geben Sie den darauf folgenden Datensatz zurück. |
Erweiterte Dienstabfragen
Die im vorherigen Abschnitt beschriebenen Abfragevorgänge können verwendet werden, um alle Ergebnisse von einer einzelnen GUID zurückzugeben, was für die meisten Anwendungen ausreichend sein sollte. Eine erweiterte Abfrage ermöglicht es einer Anwendung, eine spezifischere Abfrage zu erstellen. Sie bietet die Möglichkeit, UUIDs und Attribute in zurückgegebenen Informationen abzugleichen.
Um eine erweiterte Abfrage für Dienste auszuführen, müssen Bluetooth-Clients die folgenden Einschränkungen in der WSAQUERYSET-Struktur angeben, die an den lpqsRestrictions-Parameter übergeben wird.
WSAQUERYSET-Member | Einschränkung |
---|---|
dwSize | Legen Sie auf sizeof(WSAQUERYSET) fest. |
lpszContext | Legen Sie auf die Bluetooth-Geräteadresse fest, mit der eine SDP-Verbindung hergestellt werden soll, um die Abfrage von Diensten auszuführen. Dieser Member muss eine Zeichenfolge sein, die mithilfe der WSAAddressToString-Funktion konvertiert wird. Wenn die lokale Funkadresse angegeben wird, werden die lokalen SDP-Datensätze durchsucht. |
lpBlob.pBlobData | Zeiger auf eine BTH_QUERY_SERVICE-Struktur , die alle Parameter enthält, die die Ergebnisse der Abfrage einschränken. |
dwNameSpace | Auf NS_BTH festgelegt. |
Andere Mitglieder | Alle anderen Member der WSAQUERYSET-Struktur werden ignoriert. |
Die folgenden Flags werden im dwControlFlags-Parameter von WSALookupServiceBegin übergeben, um die Ergebnisse einer erweiterten Abfrage zu steuern.
Flag | Ergebnis |
---|---|
LUP_CONTAINERS | Darf nicht festgelegt werden. |
LUP_FLUSHCACHE | Anwendungen sollten im Allgemeinen LUP_FLUSHCACHE angeben. Dieses Flag weist das System an, zwischengespeicherte Informationen zu ignorieren und eine Over-the-Air-SDP-Verbindung mit dem angegebenen Gerät herzustellen, um die SDP-Suche auszuführen. Dieser nicht zwischengespeicherte Vorgang kann einige Sekunden dauern (während eine zwischengespeicherte Suche schnell zurückgibt). Bluetooth speichert keine proaktiven SDP-Einträge von Geräten in der Nähe und speichert auch keine vorherigen Abfragen aggressiv zwischen. Anwendungen sollten daher erwarten, dass Abfragen häufig keine Ergebnisse (WSASERVICE_NOT_FOUND) zurückgeben, wenn LUP_FLUSHCACHE nicht angegeben ist. Die zwischengespeicherten Daten, die mithilfe der Windows Sockets-Schnittstelle verfügbar sind, können in Zukunft verbessert werden. |
LUP_RES_SERVICE | Gibt Informationen für die lokale Bluetooth-Adresse zurück. Das Festlegen dieses Flags wirkt sich nur aus, wenn auch LUP_RETURN_ADDRR angegeben ist. |
LUP_RETURN_NAME | Gibt den Anzeigenamen des Diensts zurück. Dieses Flag wird für SDP_SERVICE_SEARCH_REQUEST ignoriert. |
LUP_RETURN_TYPE | Gibt die Dienstklassen-ID zurück. Dieses Flag wird für SDP_SERVICE_SEARCH_REQUEST ignoriert. |
LUP_RETURN_ADDR | Gibt eine Adresse im lpcsaBuffer-Member zurück, die mit Verbindungsfunktionsaufrufen verwendet werden soll. Die zurückgegebene Adresse enthält die Portnummer. Dieses Flag wird für SDP_SERVICE_SEARCH_REQUEST ignoriert. |
LUP_RETURN_BLOB | Geben Sie die übereinstimmenden SD-Datensätze in einem Format zurück, das der Bluetooth-SDP-Datensatzspezifikation entspricht. Für SDP_SERVICE_SEARCH_REQUEST ist das Ergebnis in lpBlob für den nachfolgenden Aufruf von WSALookupServiceNext ein Array von Bluetooth-SDP-Handles. Für SDP_SERVICE_ATTRIBUTE_REQUEST und SDP_SERVICE_SEARCH_ATTRIBUTE_REQUEST ist das Ergebnis für jeden nachfolgenden Aufruf von WSALookupServiceNext ein binärer Bluetooth-SDP-Datensatz, dessen Attribute auf die vom pRange-Member der Abfrage angegebenen Attribute beschränkt sind. Dieses Flag ist für SDP_SERVICE_SEARCH_REQUEST erforderlich. |
LUP_RETURN_COMMENT | Geben Sie die Dienstbeschreibung im lpszComment-Member der WSAQUERYSET-Struktur für jeden Aufruf der WSALookupServiceNext-Funktion zurück. |
LUP_FLUSHPREVIOUS | Überspringen Sie den nächsten verfügbaren Datensatz, und geben Sie den darauf folgenden Datensatz zurück. |
Bei der Eingabe verweist lpBlob-pBlobData> auf eine BTH_QUERY_SERVICE-Struktur, die die in der folgenden Tabelle aufgeführten Werte enthält.
Hinweis
Die anfängliche Suchanforderung muss in ein L2CAP-Paket passen können. Die Antwort kann jedoch in viele L2CAP-Pakete unterteilt werden.
Member | Wert |
---|---|
type | Typ der auszuführenden Suche. Dieser Wert kann einer von SDP_SERVICE_SEARCH_REQUEST, SDP_SERVICE_ATTRIBUTE_REQUEST oder SDP_SERVICE_SEARCH_ATTRIBUTE_REQUEST sein. Jeder Suchtyp ist einem zugrunde liegenden Suchmechanismus zugeordnet, der durch die Bluetooth-SDP-Spezifikation definiert ist. Jede Gibt Ergebnisse in dem Formular zurück, das von der WSAQUERYSET-Struktur beschrieben wird, die weiter oben in diesem Abschnitt (Erweiterte Dienstabfragen) definiert ist. |
serviceHandle | Wird für Attributsuchen verwendet. Dieser Wert gibt das Diensthandle an, mit dem die Attribute im pRange-Member abgefragt werden sollen. |
Uuids | Wird für Dienst- und ServiceAttribute-Suchvorgänge verwendet. Dieser Wert gibt die UUIDs an, die ein Datensatz enthalten muss, um der Suche zu entsprechen. Wenn weniger als MAX_UUIDS_IN_QUERY UUIDs abgefragt werden sollen, legt dieser Wert das SdpQueryUuid-Element, das unmittelbar der letzten gültigen UUID folgt, auf alle Nullen fest. |
numRange | Wird für Attribut- und serviceAttribute-Suchvorgänge verwendet. Dieser Wert gibt die Anzahl der Elemente in pRange an. |
Prange | Wird für Attribut- und serviceAttribute-Suchvorgänge verwendet. Dieser Wert gibt die Attributwerte an, die für alle übereinstimmenden Datensätze abgerufen werden sollen. |
Nach jedem erfolgreichen Aufruf der Funktion WSALookupServiceNext verweist lpBlob-pBlobData> auf einen Datenblock, der die in der folgenden Tabelle aufgeführten Werte enthält.
Wert | BESCHREIBUNG |
---|---|
SDP_SERVICE_SEARCH_REQUEST | Ein Array von SDP-Datensatzhandles, das mit der von Bluetooth 1.1 SDP 4.5.2 definierten ServiceRecordHandleList identisch ist. Die Anzahl der zurückgegebenen SDP-Handles wird durch (lpBlob-cbSize>)/sizeof(ULONG) berechnet. Alle Ergebnisse werden in einem einzelnen Aufruf der WSALookupServiceNext-Funktion zurückgegeben. |
SDP_SERVICE_ATTRIBUTE_REQUEST oder SDP_SERVICE_SEARCH_ATTRIBUTE_REQUEST | Ein binärer Bluetooth-SDP-Eintrag. Für SDP_SERVICE_ATTRIBUTE_REQUEST werden alle Ergebnisse in einem einzelnen Aufruf der WSALookupServiceNext-Funktion zurückgegeben. |
Hinweis
Wenn das lpBlob-Element während der Eingabe für eine Dienstabfrage nicht angegeben wird, wird eine Dienst- und Attributsuche für den im lpServiceClassId-Member angegebenen Dienst für Attribute von 0 bis 0xFFFF ausgeführt.