Поделиться через


Использование стека драйверов Bluetooth

После загрузки и инициализации стека драйверов Bluetooth Windows обнаруживает активные устройства Bluetooth, которые уже были связаны. Затем стек драйверов создает идентификаторы устройств (идентификаторы устройств) для всех парных устройств. Затем стек драйверов использует стандартные механизмы Plug and Play (PnP) для загрузки соответствующего драйвера профиля для каждого устройства. Загружаемый драйвер профиля выбирается на основе INF-файла, устанавливающего драйвер профиля, и идентификатора устройства, созданного стеком драйверов Bluetooth и описанного в разделе Установка устройства Bluetooth.

Драйверы профилей взаимодействуют со стеком драйверов Bluetooth с помощью стандартного механизма на основе пакета запроса ввода-вывода (IRP), используемого всеми драйверами на основе архитектуры WDM. Драйвер профиля взаимодействует со своим устройством, выделяя и отправляя IRP в стеке драйверов Bluetooth в драйвер порта Bluetooth, Bthport.sys.

Драйвер профиля выделяет и инициализирует IRP для обработки Bthport.sys. Затем драйверы профиля взаимодействуют со своими устройствами с помощью запросов IOCTL, которые доставляются на устройство с помощью IRP_MJ_INTERNAL_DEVICE_CONTROL или IRP_MJ_DEVICE_CONTROL IRP. Драйвер профиля указывает один из кодов управления вводом-выводом в следующем списке в IRP.

Стек драйверов Bluetooth поддерживает следующие ioCTL для вызывающих объектов режима ядра через 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

Стек драйверов Bluetooth поддерживает следующие объекты IOCTL и BRB в режиме ядра (как правило, для обмена данными между драйверами) через 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

Дополнительные сведения об использовании ioCTL, описанных в предыдущих списках, см. в разделе Bluetooth IOCTLs.

Драйверы профилей в основном используют IOCTL_INTERNAL_BTH_SUBMIT_BRB для взаимодействия с функциями, предоставляемыми в стеке драйверов Bluetooth. Драйвер профиля использует IOCTL_INTERNAL_BTH_SUBMIT_BRB для доставки структуры данных переменной длины, называемой блоком запросов Bluetooth (BRB), на управляемое устройство. Драйверы профилей используют brb для открытия и закрытия подключений к удаленным устройствам, а также для выполнения большинства задач ввода и вывода. IOCTL_INTERNAL_BTH_SUBMIT_BRB содержит BRB, в котором подробно описывается выполняемая операция Bluetooth. Дополнительные сведения о сборке и отправке BRB в стеке драйверов Bluetooth см. в статье Создание и отправка BRB.

Каждый BRB начинается со стандартного заголовка, определенного структурой BRB_HEADER , которая указывает тип BRB, который определяет структуру остальной части BRB. Элемент Type , который должен равняться одному из значений перечисления BRB_TYPE , определяет тип операции Bluetooth, запрашиваемой драйвером профиля. Структура и размер BRB зависят от типа BRB. Элемент Length структуры BRB_HEADER указывает размер BRB в байтах. Функции BthAllocateBrb, BthInitializeBrb и BthReuseBrb автоматически задают элементы Type и Length .

Например, чтобы открыть подключение к удаленному устройству, укажите один из кодов функций, BRB_L2CA_OPEN_CHANNEL или BRB_SCO_OPEN_CHANNEL, чтобы указать, что драйвер профиля пытается открыть канал подключения L2CAP или SCO к удаленному устройству. Стек драйверов Bluetooth использует элемент Status структуры BRB для возврата кода состояния, относящегося к Bluetooth.

Для каждого BRB драйвер профиля должен выделить и инициализировать соответствующую структуру со сведениями об выполняемой операции Bluetooth.

В следующей таблице описаны структуры, соответствующие конкретным ББР, которые могут выдаваться драйверами профилей.

Блок запросов Bluetooth (BRB) Соответствующая структура
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

Дополнительные сведения об использовании IOCTL и BRB по Bluetooth см. в разделе Создание и отправка BRB.