Condividi tramite


Come usare lo stack di driver Bluetooth

Dopo il caricamento e l'inizializzazione dello stack di driver Bluetooth, lo stack di driver individua i dispositivi Bluetooth attivi che sono già stati associati. Lo stack di driver genera quindi identificatori di dispositivo (ID dispositivo) per tutti i dispositivi associati. Successivamente, lo stack di driver usa meccanismi di Plug and Play standard (PnP) per caricare il driver di profilo appropriato per ogni dispositivo. Il driver del profilo da caricare viene selezionato in base al file INF che installa il driver del profilo e l'identificatore del dispositivo, come generato dallo stack di driver Bluetooth e descritto in Installazione di un dispositivo Bluetooth.

I driver di profilo comunicano con lo stack di driver Bluetooth tramite il meccanismo standard I/O Request Packet (IRP) usato da tutti i driver basati sull'architettura WDM. Un driver di profilo comunica con il dispositivo allocando e inviando i provider di integrazione nello stack di driver Bluetooth al driver di porta Bluetooth, Bthport.sys.

Un driver di profilo alloca e inizializza i runtime di integrazione da elaborareBthport.sys. I driver di profilo comunicano quindi con i propri dispositivi usando richieste IOCTL recapitate al dispositivo tramite un IRP_MJ_INTERNAL_DEVICE_CONTROL o IRP_MJ_DEVICE_CONTROL IRP. Il driver del profilo specifica uno dei codici di controllo di I/O nell'elenco seguente in IRP.

Lo stack di driver Bluetooth supporta i seguenti IOCTLs per i chiamanti in modalità kernel tramite IRP_MJ_DEVICE_CONTROL:

IOCTL_BTH_DISCONNECT_DEVICE

IOCTL_BTH_GET_DEVICE_INFO

IOCTL_BTH_GET_LOCAL_INFO

IOCTL_BTH_GET_RADIO_INFO

IOCTL_BTH_SDP_ATTRIBUTE_SEARCH

IOCTL_BTH_SDP_CONNECT

IOCTL_BTH_SDP_DISCONNECT

IOCTL_BTH_SDP_REMOVE_RECORD

IOCTL_BTH_SDP_SERVICE_ATTRIBUTE_SEARCH

IOCTL_BTH_SDP_SERVICE_SEARCH

IOCTL_BTH_SDP_SUBMIT_RECORD

IOCTL_BTH_SDP_SUBMIT_RECORD_WITH_INFO

Lo stack di driver Bluetooth supporta i seguenti caller IOCTLs e BRBs in modalità kernel (in genere per la comunicazione da driver a driver) tramite IRP_MJ_INTERNAL_DEVICE_CONTROL:

BRB_HCI_GET_LOCAL_BD_ADDR

BRB_L2CA_REGISTER_SERVER

BRB_L2CA_UNREGISTER_SERVER

BRB_L2CA_OPEN_CHANNEL

BRB_L2CA_OPEN_CHANNEL_RESPONSE

BRB_L2CA_CLOSE_CHANNEL

BRB_L2CA_ACL_TRANSFER

BRB_L2CA_UPDATE_CHANNEL

BRB_L2CA_PING

BRB_REGISTER_PSM

BRB_UNREGISTER_PSM

BRB_SCO_REGISTER_SERVER

BRB_SCO_UNREGISTER_SERVER

BRB_SCO_OPEN_CHANNEL

BRB_SCO_OPEN_CHANNEL_RESPONSE

BRB_SCO_CLOSE_CHANNEL

BRB_SCO_TRANSFER

BRB_SCO_GET_CHANNEL_INFO

BRB_SCO_GET_SYSTEM_INFO

BRB_SCO_FLUSH_CHANNEL

BRB_ACL_GET_MODE

BRB_ACL_ENTER_ACTIVE_MODE

BRB_GET_DEVICE_INTERFACE_STRING

IOCTL_INTERNAL_BTH_SUBMIT_BRB

IOCTL_INTERNAL_BTHENUM_GET_DEVINFO

IOCTL_INTERNAL_BTHENUM_GET_ENUMINFO

Per altre informazioni su come usare gli IOCTL descritti negli elenchi precedenti, vedere IOCTLs Bluetooth.

I driver di profilo usano principalmente IOCTL_INTERNAL_BTH_SUBMIT_BRB per comunicare e interagire con le funzionalità fornite nello stack di driver Bluetooth. Un driver di profilo usa IOCTL_INTERNAL_BTH_SUBMIT_BRB per distribuire una struttura di dati a lunghezza variabile denominata BRB (Bluetooth Request Block) al dispositivo gestito. I driver di profilo usano i database brb per aprire e chiudere le connessioni ai dispositivi remoti e per eseguire la maggior parte delle attività di input e output. IOCTL_INTERNAL_BTH_SUBMIT_BRB contiene un BRB che descrive ulteriormente l'operazione Bluetooth da eseguire. Per altre informazioni su come compilare e inviare BRB nello stack di driver Bluetooth, vedere Compilazione e invio di un BRB.

Ogni BRB inizia con un'intestazione standard definita dalla struttura BRB_HEADER che specifica il tipo di BRB, che determina la struttura del resto di BRB. Il membro Type , che deve essere uguale a uno dei valori trovati nell'enumerazione BRB_TYPE , determina il tipo di operazione Bluetooth richiesta dal driver del profilo. La struttura e le dimensioni di BRB variano in base al tipo di BRB. Il membro Length della struttura BRB_HEADER specifica le dimensioni, in byte, della struttura BRB. Le funzioni BthAllocateBrb, BthInitializeBrb e BthReuseBrb impostano automaticamente i membri Type e Length .

Ad esempio, per aprire una connessione a un dispositivo remoto, specificare uno dei codici di funzione , BRB_L2CA_OPEN_CHANNEL o BRB_SCO_OPEN_CHANNEL, per indicare che il driver del profilo sta tentando di aprire un canale di connessione L2CAP o SCO al dispositivo remoto. Lo stack di driver Bluetooth usa il membro Status della struttura BRB per restituire un codice di stato specifico del Bluetooth.

Per ogni BRB, il driver del profilo deve allocare e inizializzare la struttura corrispondente appropriata con informazioni sull'operazione Bluetooth da eseguire.

La tabella seguente descrive le strutture che corrispondono a brb specifici che i driver di profilo possono emettere:

Blocco richieste Bluetooth (BRB) Struttura corrispondente
BRB_HCI_GET_LOCAL_BD_ADDR _BRB_GET_LOCAL_BD_ADDR
BRB_L2CA_REGISTER_SERVER _BRB_L2CA_REGISTER_SERVER
BRB_L2CA_UNREGISTER_SERVER _BRB_L2CA_UNREGISTER_SERVER
BRB_L2CA_OPEN_CHANNEL _BRB_L2CA_OPEN_CHANNEL
BRB_L2CA_OPEN_CHANNEL_RESPONSE _BRB_L2CA_OPEN_CHANNEL
BRB_L2CA_CLOSE_CHANNEL _BRB_L2CA_CLOSE_CHANNEL
BRB_L2CA_ACL_TRANSFER _BRB_L2CA_ACL_TRANSFER
BRB_L2CA_UPDATE_CHANNEL _BRB_L2CA_UPDATE_CHANNEL
BRB_L2CA_PING _BRB_L2CA_PING
BRB_REGISTER_PSM _BRB_PSM
BRB_UNREGISTER_PSM _BRB_PSM
BRB_SCO_REGISTER_SERVER _BRB_SCO_REGISTER_SERVER
BRB_SCO_UNREGISTER_SERVER _BRB_SCO_UNREGISTER_SERVER
BRB_SCO_OPEN_CHANNEL _BRB_SCO_OPEN_CHANNEL
BRB_SCO_OPEN_CHANNEL_RESPONSE _BRB_SCO_OPEN_CHANNEL
BRB_SCO_CLOSE_CHANNEL _BRB_SCO_CLOSE_CHANNEL
BRB_SCO_TRANSFER _BRB_SCO_TRANSFER
BRB_SCO_GET_CHANNEL_INFO _BRB_SCO_GET_CHANNEL_INFO
BRB_SCO_GET_SYSTEM_INFO _BRB_SCO_GET_SYSTEM_INFO
BRB_SCO_FLUSH_CHANNEL _BRB_SCO_FLUSH_CHANNEL
BRB_ACL_GET_MODE _BRB_ACL_GET_MODE
BRB_ACL_ENTER_ACTIVE_MODE _BRB_ACL_ENTER_ACTIVE_MODE
BRB_GET_DEVICE_INTERFACE_STRING _BRB_GET_DEVICE_INTERFACE_STRING

Per altre informazioni sull'uso di IOCTLs e BRB Bluetooth, vedere Compilazione e invio di un BRB.