что такое профиль hid в блютуз
Профиль 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: справочник пользователя
В настоящее время интерфейс Bluetooth широко применяется в ПК, мобильных телефонах и множестве других цифровых устройств. Естественно, что время от времени пользователи сталкиваются с различными проблемами. В большинстве случаев разобраться в причинах неполадок не так уж сложно — для этого достаточно знать основные принципы работы данного интерфейса. В настоящей статье, построенной в форме ответов на часто задаваемые вопросы, мы приведем наиболее важную информацию, касающуюся интерфейса Bluetooth.
Что такое Bluetooth?
Bluetooth — это беспроводной интерфейс с небольшим радиусом действия, созданный в 1994 году инженерами шведской компании Ericsson. В 1998-м компании Ericsson, IBM, Intel, Nokia и Toshiba основали организацию Bluetooth Special Interest Group (Bluetooth SIG), которая и по сей день занимается разработкой и продвижением данной технологии. Впоследствии членами Bluetooth SIG стали многие компании: в минувшем году их количество превысило 13 тыс.
Основными преимуществами Bluetooth по сравнению с конкурирующими решениями являются низкий уровень энергопотребления и невысокая стоимость приемопередатчиков, что позволяет применять его даже в малогабаритных устройствах с миниатюрными элементами питания. Кроме того, производители оборудования не должны выплачивать лицензионные отчисления за использование интерфейса Bluetooth в своих изделиях. Разумеется, этот фактор также способствовал широкому распространению данного интерфейса.
Для чего нужен Bluetooth?
Основным назначением Bluetooth является создание так называемых персональных сетей (Private Area Networks, PAN), которые обеспечивают возможность обмена данными между расположенными поблизости (внутри одного дома, помещения, транспортного средства и т.д.) настольными и портативными ПК, периферийными и мобильными устройствами и пр.
Варианты топологии пикосетей
Сколько устройств можно подключить при помощи Bluetooth?
Посредством Bluetooth можно объединить как два, так и сразу несколько устройств. В первом случае подключение осуществляется по схеме «точкаточка», во втором — по схеме «точкамноготочка». Независимо от применяемой схемы одно из устройств является ведущим (master), остальные — ведомыми (slave). Ведущее устройство задает шаблон, который будут использовать все ведомые устройства, а также синхронизирует их работу. Соединенные таким образом устройства образуют пикосеть (piconet). В рамках одной пикосети могут быть объединены одно ведущее и до семи ведомых устройств. Кроме того, допускается наличие в пикосети дополнительных ведомых устройств (сверх семи), которые имеют статус заблокированных (parked): они не участвуют в обмене данными, но при этом находятся в синхронизации с ведущим устройством.
Несколько пикосетей можно объединить в распределенную сеть (scatternet). Для этого устройство, работающее в качестве ведомого в одной пикосети, должно выполнять функции ведущего в другой (см. вторую схему). При этом пикосети, входящие в состав одной распределенной сети, не синхронизированы друг с другом и используют разные шаблоны.
Топология распределенной сети, объединяющей несколько пикосетей
Максимальное количество пикосетей в составе распределенной сети не может превышать десяти. Таким образом, распределенная сеть позволяет объединить в общей сложности до 71 устройства.
Как осуществляется передача данных?
Передача данных ведется по радиоканалу в частотном диапазоне 2,4-2,4835 ГГц с использованием метода псевдослучайной перестройки рабочей частоты (Frequency-Hopping Spread Spectrum, FHSS). Этот диапазон разбит на 79 каналов, каждый из которых занимает полосу шириной в 1 МГц. В верхней и нижней частях диапазона предусмотрены неиспользуемые (защитные) полосы. Для передачи данных применяется гауссова фазовая модуляция, которая предусматривает изменение несущей частоты во времени в соответствии с гауссовой кривой, что позволяет ограничить спектр излучаемого сигнала.
Обмен данными осуществляется внутри временных интервалов (тайм-слотов) длиной 625 мкс. После передачи каждого слота производится переход на другой частотный канал. На канальном уровне обмен данными осуществляется пакетами, каждый из которых может иметь длину от одного до пяти слотов. Часть слотов может быть зарезервирована для синхронных каналов (которые задействуются для передачи потоковых данных). Таким образом, параллельно с синхронными данными могут передаваться и асинхронные.
Спецификация Bluetooth предусматривает два вида связи: синхронную с установлением соединения (Synchronous Connection-Oriented, SCO) и асинхронную без установления соединения (Asynchronous Connection-Less, ACL). Первый вариант используется для организации канала «точкаточка» между ведущим и ведомыми устройствами. Второй служит для связи по схеме «точкамноготочка» между ведущим и всеми ведомыми устройствами данной пикосети.
Что такое классы Bluetooth?
В зависимости от мощности и эффективного радиуса действия приемопередатчики Bluetooth подразделяются на три класса (см. таблицу). Наиболее распространенным вариантом, который применяется в большинстве ныне выпускаемых мобильных электронных устройствах и ПК, являются приемопередатчики Bluetooth Class 2. Маломощными системами Class 3 оснащается медицинская аппаратура, а основной сферой применения наиболее «дальнобойных» модулей Class 1 являются системы мониторинга и управления промышленным оборудованием.
Чем различаются версии Bluetooth?
Если кратко, то набором поддерживаемых технологий передачи данных, протоколов и профилей, а также максимальной скоростью соединения. По мере развития технологий и расширения функциональности мобильных устройств возникает необходимость во внесении соответствующих изменений и дополнений в спецификацию Bluetooth. Это позволяет реализовать новые функциональные возможности, а также повысить пропускную способность интерфейса.
Первая версия спецификации (Bluetooth 1.0) была утверждена в 1999 году. В ходе эксплуатации первых устройств было выявлено немало недостатков, в том числе проблемы перекрестной совместимости продуктов разных производителей.
Вскоре после промежуточной спецификации (Bluetooth 1.0В) была утверждена Bluetooth 1.1 — в ней были исправлены ошибки и устранены многие недостатки первой версии.
В 2003 году была утверждена базовая спецификация Bluetooth 1.2. Одним из ее ключевых новшеств стало внедрение метода адаптивной перенастройки рабочей частоты (Adaptive frequency-hopping spread spectrum, AFH), благодаря которому беспроводное соединение стало гораздо более устойчивым к воздействию электромагнитных помех. Кроме того, удалось сократить время, затрачиваемое на выполнение процедур обнаружения и подключения устройств.
Еще одним важным улучшением версии 1.2 стало повышение скорости обмена данными до 433,9 Кбит/с в каждую сторону при использовании асинхронной связи по симметричному каналу. В случае асимметричного канала пропускная способность составляла 723,2 Кбит/с в одну сторону и 57,6 Кбит/с — в другую.
Кроме того, был добавлен усовершенствованный вариант технологии синхронной связи с установлением соединения (Extended Synchronous Connections, eSCO), который позволил улучшить качество передачи потокового звука за счет использования механизма повторной отправки пакетов, поврежденных в процессе передачи.
В конце 2004 года была утверждена базовая спецификация Bluetooth 2.0 + EDR. Наиболее важным новшеством второй версии стала технология Enhanced Data Rate (EDR), благодаря внедрению которой удалось значительно (в несколько раз) увеличить пропускную способность интерфейса. Теоретически использование EDR позволяет достичь скорости передачи данных 3 Мбит/с, однако на практике этот показатель обычно не превышает 2 Мбит/с.
Необходимо отметить, что EDR не является обязательной функцией для приемопередатчиков, соответствующих спецификации Bluetooth 2.0.
Устройства, оборудованные приемопередатчиками Bluetooth 2.0, обратно совместимы с модулями предыдущих версий (1.x). Естественно, что скорость передачи данных ограничивается возможностями более медленного устройства.
В 2007 году была утверждена базовая спецификация Bluetooth 2.1 + EDR. В ней была добавлена технология расширенного запроса характеристик устройства для дополнительной фильтрации списка при сопряжении. Еще одно новшество — энергосберегающая технология Sniff Subrating, которая позволила значительно (от 3 до 10 раз) увеличить продолжительность автономной работы мобильных устройств. Также была существенно упрощена процедура установления связи между двумя устройствами и реализована поддержка NFC-соединений.
В августе 2008-го были утверждены базовые дополнения (Core Specification Addendum, CSA) к спецификациям Bluetooth 2.0 + EDR и Bluetooth 2.1 + EDR. Внесенные изменения направлены на снижение уровня энергопотребления, повышение уровня защиты передаваемых данных и оптимизацию процедур идентификации и соединения Bluetooth-устройств.
В апреле 2009 года была утверждена базовая спецификация Bluetooth 3.0 + HS. Аббревиатура HS в данном случае расшифровывается как High Speed — высокая скорость. Ее главное новшество — реализация технологии Generic Alternate MAC/PHY (AMP), обеспечивающей возможность передачи данных со скоростью до 24 Мбит/с. Кроме того, предусматривается использование двух модулей приемопередатчиков: низкоскоростного с невысоким энергопотреблением и высокоскоростного, совмес-тимого со стандартом 802.11. В зависимости от ширины потока транслируемых данных (или размера передаваемого файла) задействуется либо низкоскоростной (до 3 Мбит/с), либо высокоскоростной приемопередатчик. Это позволяет снизить уровень энергопотребления в тех случаях, когда не требуется высокая скорость передачи данных.
В июне 2010 года была утверждена базовая спецификация Bluetooth 4.0. Ключевая особенность этой версии — использование технологии передачи данных с низким энергопотреблением (low energy technology). Снижение энергопотребления достигается как за счет ограничения скорости передачи данных (не более 1 Мбит/с), так и за счет того, что приемопередатчик не работает постоянно, а включается только на время обмена данными. Применение данной технологии обеспечивает до нескольких лет автономной работы устройств, получающих питание от малогабаритной литиевой батарейки.
Необходимо отметить, что спецификация Bluetooth 4.0 ориентирована главным образом на миниатюрные цифровые устройства и различные электронные датчики (температуры, давления, влажности и т.д.), применяемые в медицинских и промышленных системах удаленного мониторинга.
Что такое профили Bluetooth?
Любое устройство, оборудованное интерфейсом Bluetooth, поддерживает заданный его производителем набор профилей. Каждый профиль обеспечивает поддержку определенных функций (например, передачу файлов или потока медиаданных, обеспечение сетевого соединения и т.д.), которые могут быть задействованы при подключении двух или более устройств посредством Bluetooth. Таким образом, набор профилей определяет функциональные возможности устройства, доступные через Bluetooth-соединение.
Чтобы задействовать Bluetooth-соединение для выполнения определенной задачи, требуется наличие поддержки соответствующего профиля как у ведущего, так и у ведомого устройства. Так, передать по Bluetooth-соединению список контактов с одного мобильного телефона на другой можно лишь при условии, что оба аппарата поддерживают профиль OPP (Object Push Profile). А, например, для использования мобильного телефона в качестве беспроводного сотового модема необходимо, чтобы этот аппарат и применяемый компьютер поддерживали профиль DUN (Dial-up Networking Profile). Если же Bluetooth-соединение между двумя устройствами установлено, но выполнить какоелибо действие (скажем, передать файл) не удается, то вероятной причиной возникновения этой проблемы может быть отсутствие поддержки соответствующего профиля у одного из устройств.
Иерархия профилей Bluetooth
Существует большое количество разнообразных профилей Bluetooth, которые описывают разные варианты и способы использования подключенных устройств.
Каждый профиль Bluetooth обязательно содержит следующую информацию:
Всё многообразие профилей можно разделить на две группы: базовые и прикладные. Далее приведена краткая информация о трех базовых профилях:
В настоящее время существует большое количество прикладных профилей, обеспечивающих работу самых разных функций. Далее мы рассмотрим лишь те из них, которые получили наибольшее распространение в ПК, периферийных устройствах и современных гаджетах:
С помощью Bluetooth вы можете выполнять такие действия, как соединение телефона с динамиками для прослушивания музыки, передачи и получения файлов на другие устройства и от них, подключение смартфона без порта к беспроводным наушникам и т. д. Однако существуют специальные «Профили», которые делают это возможным для устройства Bluetooth, чтобы эффективно выполнять свои функции.
Существует множество устройств, которыми можно управлять с помощью Bluetooth, и для каждой функции есть специальные профили Bluetooth.
Проще говоря, профили Bluetooth определенный спецификации беспроводного интерфейса. Вы когда-нибудь задумывались, как вы можете осуществлять беспроводную потоковую передачу звука со смартфона на Bluetooth наушники, или звуковую панель; или как вы можете обмениваться файлами с другим устройством через Bluetooth? Тогда вам следует взглянуть на некоторые из наиболее распространенных профилей Bluetooth.
1. Расширенный профиль распространения аудио (A2DP)
Если вы используете наушники Bluetooth, наушники, автомобильную стереосистему, ваше устройство использует этот профиль для обеспечения передачи высококачественного звука.
2. Аудио/видео профиль дистанционного управления (AVRCP)
Этот профиль отвечает за функциональность удаленного управления устройствами Bluetooth. Вы найдете этот профиль на таких устройствах, как телевизоры, наушники, интеллектуальные колонки, звуковые панели, смартфоны и другое стереооборудование. ACRCP предоставляет интерфейс, который позволяет вашему устройству Bluetooth ставить на паузу музыку, увеличивать и уменьшать громкость, переходить к следующему и предыдущему файлу в вашем списке воспроизведения и т. д.
AVRCP играет жизненно важную роль в управляющем устройстве (например, смартфоне) и целевом устройстве (гарнитуре Bluetooth, динамике и т. д.).
Когда вы нажимаете кнопку (воспроизведение, паузы, затем и т. д.) На управляющем устройстве, команда обнаруживается контроллером с помощью AVRCP. Профиль впоследствии преобразует команду в A/V-сигнал управления, который он передает целевому устройству.
3. Профиль передачи файлов (FTP)
4. Профиль громкой связи (HFP)
Как указано в названии, профиль Hands-Free (HFP) отвечает за успешное выполнение беспроводных телефонных звонков с устройства Bluetooth. Вы найдете этот профиль в мобильных телефонах, автомобильной информационно-развлекательной системе, наушниках и т. д.
HFP использует кодек Continuious Variable Slope Delta (CVSD) (кодирование используется для сжатия данных аудиосигналов) для передачи голоса и для определения некоторых параметров управления голосом (например, громкости). Если вы собираетесь использовать громкую связь во время вождения или в любом другом месте, ваше устройство должно иметь этот профиль.
5. Профиль гарнитуры (HSP)
6. Базовый профиль печати (BPP)
7. Профиль устройства интерфейса пользователя (HID)
Этот профиль обычно используется периферийными устройствами с поддержкой Bluetooth, такими как беспроводные клавиатуры, мыши, игровые контроллеры и т. д. Профиль Human Interface Device определяет функции и протоколы, с помощью которых эти устройства взаимодействуют с устройством Bluetooth.
Хотя существует более 20 профилей Bluetooth, вышеупомянутые профили являются наиболее важными, поскольку они используются в нашей повседневной жизни. Они находятся в устройствах, которыми вы пользуетесь каждый день: мобильные телефоны, ноутбуки, гарнитуры, периферийные устройства, принтеры, автомобили, умные бытовые приборы и т. д.
Работаем с USB Custom HID на Android
В современных 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, найти устройство, интерфейс и конечные точки устройства. Это необходимо делать при каждом подключении устройства.
Здесь мы видим те самые интерфейсы и конечные точки, речь о которых шла в прошлом разделе. Зная номер интерфейса, мы находим обе конечные точки, на прием и передачу, и инициируем usb соединение. На этом все, теперь можно читать данные.
Как я уже говорил ранее, устройства общаются через репорты.
В метод sendReport мы передаем массив байт, в котором нулевым байтом является репорт ID, берем текущее USB подключение к устройству и выполняем передачу. В качестве параметров в метод BulkTransfer передаем номер конечной точки, данные, их размер и таймаут передачи. Стоит отметить, что класс UsbDeviceConnection имеет методы для реализации обмена данными с устройством USB — методы bulkTransfer и controlTransfer. Их использование зависит от типа передачи, который поддерживает та или иная конечная точка. В данном случае используем bulkTransfer, хотя для HID чаще всего характерно использование конечных точек с типом control. Но у нас Custom HID, так что делаем что хотим. Про тип передачи советую почитать отдельно, так как от него зависит объем и частота передаваемых данных.
Для получения данных необходимо знать размер получаемых данных, который можно, как знать заранее, так и получить из конечной точки.
Метод получения данных по USB HID является синхронным и блокирующим и выполнять его необходимо в другом потоке, кроме того, репорты от устройства могут приходить постоянно, либо в любое время, поэтому необходимо реализовать постоянный опрос репорта, чтобы не пропустить данные. Сделаем это при помощи RxJava:
Получив массив байт, мы должны проверить нулевой байт, так как он является report ID и в соответствии с ним парсить полученные данные.
По завершении всех действий с USB нужно закрыть соединение. Можно выполнять это в onDestroy activity или в onCleared во ViewModel.
Заключение
В статье рассмотрен очень небольшой и примитивный, исключительно демонстративный код с реализацией для конкретного устройства. Конечно, классов USB существует много, не только HID и для них естественно реализация будет иная. Однако все методы достаточно неплохо документированы и имея хорошее представление о USB стеке можно легко разобраться в том, как их применять.