Bluetooth e WSALookupServiceBegin per l'individuazione dei servizi
Per individuare l'esistenza di un determinato servizio in un server Bluetooth, i client usano le funzioni WSALookupServiceBegin, WSALookupServiceNext e WSALookupServiceEnd. Le query possono essere eseguite per indirizzi locali e remoti, ma le connessioni possono essere stabilite solo con indirizzi remoti. Gli handle del servizio individuati durante questa operazione non possono essere usati per eliminare il servizio tramite WSASetService. Il loopback non è supportato da RFCOMM.
È possibile eseguire due tipi di base di query di individuazione dei servizi:
- Query per uno o più servizi nel dispositivo locale
- Query per uno o più servizi in un dispositivo peer specificato
La funzione WSALookupServiceBegin riceve una struttura WSAQUERY edizione Standard T nel parametro lpqsRestrictions. WSALookupServiceBegin esegue una query client basata sul set di restrizioni di ricerca contenute in WSAQUERY edizione Standard T. I client Bluetooth devono specificare le restrizioni elencate nella tabella seguente nella struttura WSAQUERY edizione Standard T quando si usa la funzione WSALookupServiceBegin per eseguire query per i servizi.
Membro WSAQUERY edizione Standard T | Restrizione |
---|---|
dwSize | Impostare su sizeof(WSAQUERY edizione Standard T). |
lpServiceClassId | Impostare sull'UUID Bluetooth più specifico che può essere usato per determinare l'ambito della query. Ad esempio, l'impostazione di lpServiceClassId sull'UUID del protocollo L2CAP comporta la restituzione di tutti i servizi L2CAP, essenzialmente l'enumerazione di tutti i record SD nella destinazione. L'impostazione dell'UUID su un servizio specifico, tuttavia, restituisce solo le istanze di tale servizio. |
dwNameSpace | Impostare su NS_BTH. |
dwNumberOfCsAddrs | Impostare su 0. |
lpszContext | Impostare su Indirizzo dispositivo Bluetooth con cui stabilire una connessione SDP per eseguire la query dei servizi. Questo membro deve essere una stringa convertita tramite la funzione WSAAddressToString. Se viene fornito l'indirizzo radio locale, vengono cercati i record SDP locali. |
Altri membri | Tutti gli altri membri della struttura WSAQUERY edizione Standard T vengono ignorati. |
La connessione SDP al dispositivo remoto non rimane attiva dopo che la funzione WSALookupServiceBegin completa una query del servizio. La connessione viene terminata prima che WSALookupServiceBegin restituisca. Le applicazioni che richiedono che la connessione SDP rimanga attiva dopo il completamento di una query del servizio devono specificare la classe di servizio UUID a cui connettersi usando il membro serviceClassId della struttura SOCKADDR_BTH quando si esegue la chiamata di funzione di connessione di Windows Sockets.
I flag elencati nella tabella seguente vengono usati nel parametro dwControlFlags delle funzioni WSALookupServiceBegin e WSALookupServiceNext per controllare i risultati della query. I flag LUP_CONTAINERS e LUP_FLUSHCACHE vengono usati dalla funzione WSALookupServiceBegin. Il resto dei flag viene usato nelle chiamate alla funzione WSALookupServiceNext.
Flag | Risultato |
---|---|
LUP_CONTAINERS | Non deve essere impostato. |
LUP_FLUSHCACHE | Le applicazioni devono in genere specificare LUP_FLUSHCACHE. Questo flag indica al sistema di ignorare le informazioni memorizzate nella cache e stabilire una connessione SDP over-the-air al dispositivo specificato per eseguire la ricerca SDP. Questa operazione non memorizzata nella cache può richiedere alcuni secondi , mentre una ricerca memorizzata nella cache restituisce rapidamente. Bluetooth attualmente non memorizza nella cache in modo proattivo i record SDP dai dispositivi vicini, né attualmente memorizza nella cache le query precedenti in modo aggressivo. Pertanto, le applicazioni devono prevedere che le query potrebbero non restituire risultati (con un codice di errore WSA edizione StandardRVICE_NOT_FOUND) se non viene specificato LUP_FLUSHCACHE. I dati memorizzati nella cache disponibili tramite l'interfaccia Windows Sockets potrebbero essere migliorati in futuro. |
LUP_RES_edizione Standard RVICE | Restituisce informazioni sull'indirizzo Bluetooth locale. Questo flag ha un effetto solo se viene specificato anche LUP_RETURN_ADDR . |
LUP_RETURN_NAME | Restituisce il nome visualizzato del servizio nel membro lpszServiceInstanceName della struttura WSAQUERY edizione Standard T per ogni chiamata alla funzione WSALookupServiceNext. |
LUP_RETURN_TYPE | Restituisce l'ID classe del servizio nel membro lpServiceClassId della struttura WSAQUERY edizione Standard T. Nota: l'uso di questo flag è applicabile solo alla funzione WSALookupServiceBegin . Questo valore è sempre zero per WSALookupServiceNext. |
LUP_RETURN_ADDR | Restituire un indirizzo nel membro lpcsaBuffer da usare con le chiamate di funzione di connessione . L'indirizzo restituito contiene il numero di porta. |
LUP_RETURN_BLOB | Restituisce i record SD corrispondenti nel membro lpBlob , formattati in base alla specifica del record SDP Bluetooth. |
LUP_RETURN_ALL | Restituisce tutte le informazioni sui flag precedenti. |
LUP_RETURN_COMMENT | Restituisce la descrizione del servizio nel membro lpszComment della struttura WSAQUERY edizione Standard T per ogni chiamata alla funzione WSALookupServiceNext. |
LUP_FLUSHPREVIOUS | Ignorare il record disponibile successivo e restituire il record che lo segue. |
Query avanzate del servizio
Le operazioni di query descritte nella sezione precedente possono essere usate per restituire tutti i risultati da un singolo GUID, che deve essere sufficiente per la maggior parte delle applicazioni. Una query avanzata consente a un'applicazione di creare una query più specifica; offre la possibilità di trovare corrispondenze tra UUID e attributi nelle informazioni restituite.
Per eseguire una query avanzata per i servizi, i client Bluetooth devono specificare le restrizioni seguenti nella struttura WSAQUERY edizione Standard T passata al parametro lpqsRestrictions.
Membro WSAQUERY edizione Standard T | Restrizione |
---|---|
dwSize | Impostare su sizeof(WSAQUERY edizione Standard T). |
lpszContext | Impostare su Indirizzo dispositivo Bluetooth con cui stabilire una connessione SDP per eseguire la query dei servizi. Questo membro deve essere una stringa convertita tramite la funzione WSAAddressToString. Se viene fornito l'indirizzo radio locale, vengono cercati i record SDP locali. |
lpBlob.pBlobData | Puntatore a una struttura BTH_QUERY_edizione Standard RVICE che contiene tutti i parametri che limitano i risultati della query. |
dwNameSpace | Impostare su NS_BTH. |
Altri membri | Tutti gli altri membri della struttura WSAQUERY edizione Standard T vengono ignorati. |
I flag seguenti vengono passati nel parametro dwControlFlags di WSALookupServiceBegin per controllare i risultati di una query avanzata.
Flag | Risultato |
---|---|
LUP_CONTAINERS | Non deve essere impostato. |
LUP_FLUSHCACHE | Le applicazioni devono in genere specificare LUP_FLUSHCACHE. Questo flag indica al sistema di ignorare le informazioni memorizzate nella cache e stabilire una connessione SDP over-the-air al dispositivo specificato per eseguire la ricerca SDP. Questa operazione non memorizzata nella cache può richiedere alcuni secondi , mentre una ricerca memorizzata nella cache restituisce rapidamente. Bluetooth non memorizza nella cache proattiva i record SDP dai dispositivi vicini, né memorizza nella cache in modo aggressivo le query precedenti. Pertanto, le applicazioni devono prevedere che le query non restituiscono spesso risultati (WSA edizione StandardRVICE_NOT_FOUND) se non viene specificato LUP_FLUSHCACHE. I dati memorizzati nella cache disponibili tramite l'interfaccia Windows Sockets potrebbero essere migliorati in futuro. |
LUP_RES_edizione Standard RVICE | Restituisce informazioni per l'indirizzo Bluetooth locale. L'impostazione di questo flag ha effetto solo se viene specificato anche LUP_RETURN_ADDRR . |
LUP_RETURN_NAME | Restituisce il nome visualizzato del servizio. Questo flag viene ignorato per SDP_edizione StandardRVICE_edizione StandardARCH_REQUEST. |
LUP_RETURN_TYPE | Restituisce l'ID classe del servizio. Questo flag viene ignorato per SDP_edizione StandardRVICE_edizione StandardARCH_REQUEST. |
LUP_RETURN_ADDR | Restituire un indirizzo nel membro lpcsaBuffer da usare con le chiamate di funzione di connessione . L'indirizzo restituito contiene il numero di porta. Questo flag viene ignorato per SDP_edizione StandardRVICE_edizione StandardARCH_REQUEST. |
LUP_RETURN_BLOB | Restituisce i record SD corrispondenti in un formato conforme alla specifica del record SDP Bluetooth. Per SDP_edizione StandardRVICE_edizione StandardARCH_REQUEST, il risultato in lpBlob per la chiamata successiva a WSALookupServiceNext è una matrice di handle SDP Bluetooth. Per SDP_edizione StandardRVICE_ATTRIBUTE_REQUEST e SDP_edizione StandardRVICE_edizione StandardARCH_ATTRIBUTE_REQUEST, il risultato per ogni chiamata successiva a WSALookupServiceNext è un record SDP Bluetooth binario i cui attributi sono limitati a quelli specificati dal membro pRange della query. Questo flag è obbligatorio per SDP_edizione StandardRVICE_edizione StandardARCH_REQUEST. |
LUP_RETURN_COMMENT | Restituisce la descrizione del servizio nel membro lpszComment della struttura WSAQUERY edizione Standard T per ogni chiamata alla funzione WSALookupServiceNext. |
LUP_FLUSHPREVIOUS | Ignorare il record disponibile successivo e restituire il record che lo segue. |
In caso di input, lpBlob-pBlobData> punta a una struttura BTH_QUERY_edizione Standard RVICE che contiene i valori elencati nella tabella seguente.
Nota
La richiesta di ricerca iniziale deve essere in grado di adattarsi a un pacchetto L2CAP. La risposta, tuttavia, può essere suddivisa in molti pacchetti L2CAP.
Membro | Valore |
---|---|
type | Tipo di ricerca da eseguire. Questo valore può essere uno dei SDP_edizione StandardRVICE_edizione StandardARCH_REQUEST, SDP_edizione StandardRVICE_ATTRIBUTE_REQUEST o SDP_edizione StandardRVICE_edizione StandardARCH_ATTRIBUTE_REQUEST. Ogni tipo di ricerca è associato a un meccanismo di ricerca sottostante definito dalla specifica SDP Bluetooth. Ogni risultato restituito viene restituito nel modulo descritto dalla struttura WSAQUERY edizione Standard T definita in precedenza in questa sezione (Query avanzate del servizio). |
serviceHandle | Usato per le ricerche degli attributi. Questo valore specifica l'handle del servizio con cui eseguire una query sugli attributi nel membro pRange . |
uuids | Usato per le ricerche di service e serviceAttribute . Questo valore specifica gli UUID che un record deve contenere per corrispondere alla ricerca. Se è necessario eseguire una query su meno di MAX_UUIDS_IN_QUERY UUID, questo valore imposta l'elemento SdpQueryUuid che segue immediatamente l'ultimo UUID valido su tutti gli zeri. |
numRange | Usato per le ricerche di attributi e serviceAttribute . Questo valore specifica il numero di elementi in pRange. |
pRange | Usato per le ricerche di attributi e serviceAttribute . Questo valore specifica i valori dell'attributo da recuperare per tutti i record corrispondenti. |
Dopo ogni chiamata riuscita alla funzione WSALookupServiceNext, lpBlob-pBlobData> punta a un blocco di dati che contiene i valori elencati nella tabella seguente.
Valore | Descrizione |
---|---|
SDP_edizione StandardRVICE_edizione StandardARCH_REQUEST | Matrice di handle di record SDP identici a ServiceRecordHandleList definiti da Bluetooth 1.1 SDP 4.5.2. Il numero di handle SDP restituiti viene calcolato da (lpBlob-cbSize>)/sizeof(ULONG). Tutti i risultati vengono restituiti in una singola chiamata alla funzione WSALookupServiceNext. |
SDP_edizione StandardRVICE_ATTRIBUTE_REQUEST o SDP_edizione StandardRVICE_edizione StandardARCH_ATTRIBUTE_REQUEST | Record SDP Bluetooth binario. Per SDP_edizione StandardRVICE_ATTRIBUTE_REQUEST, tutti i risultati vengono restituiti in una singola chiamata alla funzione WSALookupServiceNext. |
Nota
Se il membro lpBlob non viene specificato durante l'input per una query del servizio, viene eseguita una ricerca di servizi e attributi per il servizio specificato nel membro lpServiceClassId sugli attributi da 0 a 0xFFFF.