Что такое профиль hid в настройках bluetooth
Перейти к содержимому

Что такое профиль hid в настройках bluetooth

  • автор:

Профиль HID

Попытку реализации HID на КПК, я начну с ознакомления с профилями Bluetooth.

Что же такое профиль в технологии Bluetooth?

Профиль — это, всего на всего, набор функций или возможностей, доступных для определённого устройства Bluetooth и позволяющий устройству предоставлять или использовать эту возможность совместно с другими устройствами.

Так как мы рассматриваем профиль HID, то спецификация HID определена в «USB Device Class Definition for Human Interface Devices», (да-да, спецификация HID определена именно в документах USB). Bluetooth HID профиль должен использовать протоколы, процедуры и другие возможности, обозначенные именно в указанной спецификации.

Типичными примерами устройств, поддерживающих профиль HID, являются:

— клавиатуры и указывающие устройства, например мышь, трекбол, джойстик;

— оконечные устройства, например всевозможные ручки, переключатели, кнопки и слайдеры;

— устройства дистанционного контроля и управления, например пульты дистанционного управления, игровые устройства;

— устройства, не требующие действий от человека, но поддерживающие передачу данных в простом формате относительно возможностей HID, такие как: сканеры штрих-кода, термометры или вольтметры.

Класс устройств HID изначально был нацелен на устройства, взаимодействующие с человеком, однако этот класс хорошо применим к любым приложениям, требующим быстрые операции ввода-вывода с внешними интерфейсами и позволяющий устройствам описывать самих себя. Определение класса HID включает поддержку различных типов и способов вывода информации конечному пользователю. HID поддерживает инициализацию и управление описывающих самих себя устройств.

Спецификация USB включает концепцию, позволяющую вместо того, что бы иметь различные драйверы для каждого нового периферийного устройства, группировать вместе устройства, имеющие одинаковые характеристики представления данных (т.н. data reporting), в класс устройств и иметь единственный драйвер класса для каждой группы. Устройства, в свою очередь, имеют возможность описывать самих себя в драйвере класса, например, то, как они управляются и как именно они передают данные. Это позволяет отменить необходимость менять программное обеспечение драйвера для вновь разработанных устройств этого класса.

HID не специфичен относительно USB или другого типа транспорта передачи данных. Постепенно я буду описывать как использовать протокол HID поверх Bluetooth.

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

Класс устройств HID использует соответствующий драйвер класса HID для и извлечения и маршрутизации данных. Маршрутизация и извлечение данных осуществляется путем изучения дескрипторов устройства и данных, которые оно предоставляет.

Дескриптор класса устройства HID перечисляет другие имеющиеся дескрипторы и указывает из размер. Пример:

— дескриптор Report — описывает каждую часть данных, генерируемых устройством, и реальный размер этой части. Этот дескриптор, например, может определять элементы, описывающие какую либо позицию или состояние кнопки. Здесь информация элемента используется как для определения откуда маршрутизировать ввод, например, от мышки или от джойстика; или может использоваться для назначения функции ввода определенному программному обеспечению, например использовать ввод данных от джойстика для управления самолетом или танком :). Изучая элементы дескриптора Report, драйвер класса HID позволяет определять размер и состав данных, передаваемых от устройства HID.

— дескриптор Physical — устанавливает необязательные дескрипторы, которые предоставляют информацию о части или частях тела человека, используемых для активации элементов управления устройства.

На первый взгляд, то, что я здесь описал, кажется сложным. Мне тоже так казалось, когда я начал все это изучать. Надеюсь дальше все прояснится :).

Поддерживаемые профили Bluetooth

Выберите в тексте , чтобы перейти к необходимому экрану настроек.

Телевизор поддерживает следующие профили:

  • HID (Human Interface Device Profile — профиль устройства для взаимодействия с человеком)
  • HOGP (HID over GATT Profile — профиль HID через GATT)
  • A2DP (Advanced Audio Distribution Profile, расширенный профиль распространения аудио) *
  • AVRCP (Audio/Video Remote Control Profile, профиль дистанционного управления аудио/видео) *
  • 3DSP (3D Synchronization Profile — профиль синхронизации 3D) *
  • SPP (Serial Port Profile — профиль серийного порта)

* Доступность зависит от модели/региона/страны.

Модели, поддерживающие A2DP и AVRCP, имеют опцию [ Синхронизация аудио/видео ] в [ Настройки ] — [ Изображение и звук ] — [ Аудиовыход ] .

Актуальные разделы

  • Начало
  • Использование телевизора с другими устройствами
  • Устройства Bluetooth
  • Поддерживаемые профили Bluetooth

Copyright 2019 Sony Visual Products Inc.

Работаем с USB Custom HID на Android

Designed by Freepik

В современных Android — приложениях для взаимодействия с другими устройствами чаще всего используются беспроводные протоколы передачи данных, как например Bluetooth. В годы, когда часть устройств имеют беспроводную зарядку, сложно представить себе связку Android устройства и периферийного модуля, в которой необходимо использование проводных интерфейсов. Однако когда такая необходимость возникает, на ум сразу же приходит USB.

Давайте разберем с вами гипотетический кейс. Представьте, что к вам приходит заказчик и говорит: “Мне нужно Android приложение для управления устройством сбора данных и вывода этих самых данных на экран. Есть одно НО — приложение надо написать на одноплатный компьютер с операционной системой Android, а периферийное устройство подключено по USB”

Звучит фантастически, но и такое иногда случается. И тут как нельзя кстати пригодится глубокое знание USB стека и его протоколов, но данная статья не об этом. В данной статье мы рассмотрим, как управлять периферийным устройством по протоколу USB Custom HID с Android устройства. Для простоты напишем Android-приложение (HOST), которое будет управлять светодиодом на периферийным устройством (DEVICE) и получать состояние кнопки (нажатия). Код для периферийной платы приводить не буду, кому интересно — пишите в комментариях.

Итак, приступим.

Теория. Максимально коротко

Для начала немного теории, максимально коротко. Это упрощенный минимум, достаточный для понимания кода, но для большего понимания советую ознакомиться с этим ресурсом.

Для общения по USB на периферийном устройстве необходимо реализовать интерфейс взаимодействия. Разные функции (например, USB HID, USB Mass Strorage или USB CDC) будут реализовывать свои интерфейсы, а некоторые будут иметь несколько интерфейсов. Каждый интерфейс содержит в себе конечные точки — специальные каналы связи, своего рода буферы обмена.

На моем периферийном устройстве реализован Custom HID с одним интерфейсом и с двумя конечными точками, одной для приёма, другой для передачи. Обычно информация с существующими на устройстве интерфейсами и конечными точками написана в спецификации на устройство, в противном случае определить их можно через специальные программы, к примеру USBlyzer.

Устройства в USB HID общаются через репорты. Что такое репорты? Так как данные передаются через конечные точки, то нам надо как-то идентифицировать, а также распарсить в соответствие с протоколом. Устройства не просто кидают друг другу байты данных, а обмениваются пакетами, имеющими четко определенную структуру, которая описывается на устройстве в специальном дескрипторе репорта. Таким образом, по дескриптору репорта, мы можем точно определить, какой идентификатор, структуру, размер и частоту передачи имеют те или иные данные. Идентификация пакета происходит по первому байту, который представляет из себя ID репорта. Например данные о состоянии кнопки, идут в репорта с а светодиодом мы управляем через репорт с от железа, поближе к Android

В Android поддержка USB устройств появилась начиная с API версии 12 (Android 3.1) Для работы с периферийным устройством нам необходимо реализовать режим USB host. Работа с USB достаточно неплохо описана в документации.

Для начала необходимо идентифицировать ваше подключаемое устройство, среди всего разнообразия USB девайсов. USB девайсы идентифицируются по сочетанию vid (vendor id) и pid (product id). Создадим в папке xml файл device_filter.xml со следующим содержимым:

Теперь необходимо внести соответствующие разрешения и action (если вам они необходимы) в манифест приложения:

В android:resource мы указываем файл с необходимыми фильтрами для устройств. Также, как я уже говорил ранее, можно назначить intent фильтры, для запуска приложения, к примеру, в результате подключения вашего устройства.

Для начала необходимо получить UsbManager, найти устройство, интерфейс и конечные точки устройства. Это необходимо делать при каждом подключении устройства.

val usbManager = context.getSystemService(Context.USB_SERVICE) as UsbManager private var usbConnection: UsbDeviceConnection? = null private var usbInterface: UsbInterface? = null private var usbRequest: UsbRequest? = null private var usbInEndpoint: UsbEndpoint? = null private var usbOutEndpoint: UsbEndpoint? = null fun enumerate(): Boolean < val deviceList = usbManager.deviceList for (device in deviceList.values) < /* Находим девайс девайс с нашими VID и PID */ if ((device.vendorId == VENDOR_ID) and (device.productId == PRODUCT_ID)) < /* Получаем интерфейс по известному номер */ usbInterface = device.getInterface(CUSTOM_HID_INTERFACE) /* Перебираем конечные точки интерфейса и находим точки на прием и передачу */ for (idx in 0 until usbInterface. endpointCount) < if (usbInterface?.getEndpoint(idx)?.direction == USB_DIR_IN) usbInEndpoint = usbInterface?.getEndpoint(idx) else usbOutEndpoint = usbInterface?.getEndpoint(idx) >usbConnection = usbManager.openDevice(device) usbConnection?.claimInterface(usbInterface, true) usbRequest = UsbRequest() usbRequest?.initialize(usbConnection, usbInEndpoint) > > /* Возвращаем статус подключения */ return usbConnection != null > 

Здесь мы видим те самые интерфейсы и конечные точки, речь о которых шла в прошлом разделе. Зная номер интерфейса, мы находим обе конечные точки, на прием и передачу, и инициируем usb соединение. На этом все, теперь можно читать данные.

Как я уже говорил ранее, устройства общаются через репорты.

 fun sendReport(data: ByteArray) < usbConnection?.bulkTransfer(usbOutEndpoint, data, data.size, 0) >fun getReport(): ByteArray < val buffer = ByteBuffer.allocate(REPORT_SIZE) val report = ByteArray(buffer.remaining()) if (usbRequest.queue(buffer, REPORT_SIZE)) < usbConnection?.requestWait() buffer.rewind() buffer.get(report, 0, report.size) buffer.clear() >return report > 

В метод sendReport мы передаем массив байт, в котором нулевым байтом является репорт ID, берем текущее USB подключение к устройству и выполняем передачу. В качестве параметров в метод BulkTransfer передаем номер конечной точки, данные, их размер и таймаут передачи. Стоит отметить, что класс UsbDeviceConnection имеет методы для реализации обмена данными с устройством USB — методы bulkTransfer и controlTransfer. Их использование зависит от типа передачи, который поддерживает та или иная конечная точка. В данном случае используем bulkTransfer, хотя для HID чаще всего характерно использование конечных точек с типом control. Но у нас Custom HID, так что делаем что хотим. Про тип передачи советую почитать отдельно, так как от него зависит объем и частота передаваемых данных.

Для получения данных необходимо знать размер получаемых данных, который можно, как знать заранее, так и получить из конечной точки.

Метод получения данных по USB HID является синхронным и блокирующим и выполнять его необходимо в другом потоке, кроме того, репорты от устройства могут приходить постоянно, либо в любое время, поэтому необходимо реализовать постоянный опрос репорта, чтобы не пропустить данные. Сделаем это при помощи RxJava:

fun receive() < Observable.fromCallable < getReport() >.subscribeOn(Schedulers.io()) .observeOn(Schedulers.computation()) .repeat() .subscribe(< /* check it[0] (this is report id) and handle data */ >,< /* handle exeption */ >) > 

Получив массив байт, мы должны проверить нулевой байт, так как он является report ID и в соответствии с ним парсить полученные данные.

По завершении всех действий с USB нужно закрыть соединение. Можно выполнять это в onDestroy activity или в onCleared во ViewModel.

 fun close()

Заключение

В статье рассмотрен очень небольшой и примитивный, исключительно демонстративный код с реализацией для конкретного устройства. Конечно, классов USB существует много, не только HID и для них естественно реализация будет иная. Однако все методы достаточно неплохо документированы и имея хорошее представление о USB стеке можно легко разобраться в том, как их применять.

X. Полезные материалы

  • Исходный код проекта
  • USB in a NutShell
  • USB host overview

Связывание HID oem

Вы можете предоставить четкие и точные инструкции по связыванию устройства HID в OOBE, чтобы клиенты, приобретающие новые компьютеры под управлением Windows 10 с непарной беспроводной мышью и клавиатурой, могли завершить настройку компьютера. Для работы этой функции мышь и /или клавиатура должны быть включены в компьютер, а к компьютеру не должны быть подключены другие мыши или клавиатуры. Например, ноутбуки не могут использовать эту функцию.

Для правильного отображения экранов связывания HID во время запуска при первом включении должны выполняться следующие условия:

  • Компьютер должен иметь возможность Bluetooth и Bluetooth должен быть включен.
  • Радиосвязь Bluetooth должна быть сертифицирована для Windows 10.
  • Чтобы появилась страница связывания клавиатуры, необходимо убедиться, что к компьютеру не подключена проводная клавиатура.
  • Чтобы появилась страница связывания мыши, необходимо убедиться, что к компьютеру не подключена проводная мышь.
  • Oobe.xml параметры в разделе должны быть предоставлены для соответствующих страниц связывания.

Рекомендуется, чтобы изготовители оборудования включали радиомодулы Bluetooth с HEM, чтобы обеспечить работу комплексного сценария, так как до загрузки Windows в BIOS нет поддержки Bluetooth. Радио выглядит как USB-мышь и клавиатура к компьютеру и берет на себя связь Bluetooth с мышью и клавиатурой. Это позволяет устройствам работать за пределами Windows и позволяет клиентам использовать сопряженную мышь и клавиатуру Bluetooth во время BIOS.

Файл OOBE.xml, содержащий инструкции по связыванию HID, должен использоваться только для компьютеров, использующих функцию связывания HID при первом включении. Для компьютеров, которые не используют функцию связывания HID при первом включении, необходимо использовать другой файл OOBE.xml, который не содержит инструкции по связыванию HID. В противном случае существует риск того, что пользователи могут пройти через интерфейс связывания HID, даже если им не нужно или они не могут использовать эту функцию.

Настройка OOBE.xml

На компьютерах, которые поставляются с непарной беспроводной мышью и клавиатурой, экраны связывания HID отображаются клиенту во время первого взаимодействия, который находится перед выбором языка или любым другим экраном, требующим ввода пользователя при первом включении. Вы также можете включить письменные инструкции, однако в этом случае эти инструкции необходимо включить на каждом языке, который поставляется вместе с компьютером.

Чтобы обеспечить тщательный, надежный и удовлетворительный опыт связывания HID, изготовители оборудования, которые поставляют эти системы, должны включать следующие параметры Oobe.xml:

параметр Oobe.xml Описание
Путь к изображению инструкции связывания мыши. Обычно клиенты выполняют три шага: вставка батарей в мышь, включение питания и включение Bluetooth.
Путь к изображению ошибки связывания мыши. Если клиенту не удается связать мышь за три попытки, появится этот экран ошибки.
Путь к изображению инструкции по связыванию клавиатуры. Первые три шага, которые обычно выполняют клиенты, — вставка батарей в клавиатуру, включение питания и включение Bluetooth. Эти действия можно включить в первый образ. Как правило, второй набор действий, которые необходимо выполнить клиентам, — ввести пароль или код и нажать клавишу ВВОД.
Путь к изображению инструкции по связыванию клавиатуры.
Путь к изображению ошибки связывания клавиатуры. Если клиенту не удается связать клавиатуру за пять попыток, появится этот экран ошибки. Это должно сообщить клиенту о подключении проводной клавиатуры.
Текст справки, отображаемый в нижней части страницы.
Ошибка, которая отображается для пользователей вместе с изображением ошибки связывания мыши.
Ошибка, которая отображается для пользователей вместе с изображением ошибки связывания клавиатуры.
Указывает текст, в котором пользователю предлагается связать клавиатуру.
Указывает текст запроса на ввод пин-кода для клавиатуры.

Любой текст в файле или файлах Oobe.xml, например любой текст в параметре, является текстом, прочитан экранным диктором, поэтому убедитесь, что он четкий, краткий и понятный. Кортана разделяет обязанности с экранным диктором, чтобы Кортана говорила отображаемый текст пользовательского интерфейса, а экранный диктор говорил инструктивный текст.

Дополнительные сведения об этих параметрах см. в разделе параметрыOobe.xml.

Рекомендации по использованию изображений

Рекомендуется использовать фотореалистические изображения устройств HID, которые поставляются вместе с системой. Это поможет клиентам понять, что предоставленные вами инструкции относятся к только что приобретенному оборудованию. Примеры иллюстраций, которые мы предоставили, являются универсальными. Мы не используем фотореалистические изображения, поэтому наша документация, как представляется, не относится ни к одному партнеру по устройству или оборудованию.

Универсальные изображения снижают достоверность и путаницу для клиентов, которым требуется, чтобы изображения на экране соответствовали устройствам, которые они пытаются использовать. Кроме того, добавьте визуальные инструкции для действий, которые клиенты должны предпринять для связывания нового оборудования. Например, если первым шагом является вставка батарей в устройство, добавьте изображение батарей рядом с устройством.

Размер изображений не должен превышать 630 x 372 пикселей. Изображения масштабируются в книжном режиме или в небольших форм-факторах.

Ниже приведены примеры того, как могут выглядеть инструкции по связыванию HID:

Пример 1. Изображение для связывания мыши

Связывание изображений для мыши

Пример 2. Изображение для связывания клавиатуры

Связывание изображений для клавиатуры

Пример XML

 c:\fabrikam\MouseFirstInstruction.png Set up your Fabrikam mouse. Insert batteries, turn on, and press the Bluetooth button. c:\fabrikam\MouseError.png An error has occurred. Please contact Fabrikam. c:\fabrikam\KeyboardFirstInstruction.png Set up your Fabrikam keyboard. Insert batteries, turn on, and press the Bluetooth button. c:\fabrikam\KeyboardSecondInstruction.png Enter PIN and press the Enter key. C:\fabrikam\KeyboardError.png An error has occurred. Please contact Fabrikam.  

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *