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


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

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

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

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

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

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

Дополнительные сведения об использовании IOCTLs, описанных в предыдущих списках, см. статью 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 использует элемент состояния структуры BRB для возврата кода состояния Bluetooth.

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

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

Блок запроса 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_ВХОД_В_АКТИВНЫЙ_РЕЖИМ _BRB_ACL_ENTER_ACTIVE_MODE
BRB_GET_DEVICE_INTERFACE_STRING _BRB_GET_DEVICE_INTERFACE_STRING

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