Разбираемся с Bluetooth Low Energy на примере превращения USB-клавиатуры в беспроводную

в 9:00, , рубрики: BLE, bluetooth, D-bus, HID, hidraw, linux, ruvds_статьи, systemd, udev
Разбираемся с Bluetooth Low Energy на примере превращения USB-клавиатуры в беспроводную - 1

Меня давно интересовало, как работают беспроводные клавиатуры, но как-то не сильно вдавался в подробности, пока не возникла идея превратить свою механическую клавиатуру в беспроводную. Честно говоря, не думал, что узнаю так много нового и интересного.

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

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

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

Реализация Bluetooth-клавиатуры, с моей точки зрения, не является идеальной, но я хотел просто добавить немного практики, которая сделает изучение Bluetooth более занимательным. Когда ты видишь, как работает созданный тобой механизм, ощущения совсем другие, чем когда ты просто прочитал несколько статей по теме. Без практики словарный запас пополняется, приходит некоторое понимание, но страх нового никуда не исчезает, а полученные знания быстро забываются. Именно практика позволяет избавиться от этого страха и лучше закрепить знания в памяти.

Проект с исходным кодом вы можете найти в моём Github-репозитории.

Содержание

Теория по HID и Bluetooth

Я замечаю такую тенденцию, что обычно в литературе рассматривают или низкоуровневые аспекты Bluetooth, или слишком высокоуровневые, в результате читатель получает базовые знания, практическое применение которым он найти не может. Я же рассмотрю технологию Bluetooth с прикладным примером на примере конкретного Bluetooth-стека.

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

▍ HID

Наверное, сейчас практически никого не удивляет тот факт, что можно просто подключить USB-клавиатуру или мышь к компьютеру и сразу начать ею пользоваться. Но если задаться вопросом, а как это возможно, всё становится гораздо интереснее. Этому можно посвятить не одну статью, но если кратко, то без спецификации HID (Human Interface Device), которую реализуют производители устройств и разработчики операционных систем, это было бы невозможно.

HID (Human Interface Device) — это устройство, посредством которого человек вводит данные в компьютер или получает данные от него. HID-протокол унифицирует это взаимодействие, а благодаря поддержке HID в современных операционных системах вы можете просто подключить компьютерную мышь или клавиатуру, не обременяя себя установкой драйверов. Разумеется, если ваше устройство имеет специфический функционал, для его поддержки нужно будет установить драйверы от производителя устройства.

Изначально HID-протокол разрабатывался для устройств, которые подключались по USB, однако позже он был адаптирован для Bluetooth BR/EDR, Bluetooth Low Energy, I2C.

Порция данных, передаваемых в HID-протоколе, называется репортом (report). Существует три вида репортов:

  • Input Report — данные, передаваемые от устройства к хосту;
  • Output Report — данные, передаваемые от хоста к устройству;
  • Feature Report — данные, содержащие конфигурацию устройства и передаваемые в обоих направлениях.

Для того, чтобы хост знал, что из себя представляет подключённое HID-устройство, формат получаемых и отправляемых данных, каждое HID-устройство должно иметь как минимум один HID Report-дескриптор.

▍ HID Report-дескриптор

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

Для просмотра, создания и редактирования HID Report-дескрипторов существуют различные программы и сайты. Классическую программу для работы с HID Report-дескрипторами можно загрузить с сайта USB Implementers Forum.

Несмотря на то, что программе больше 25 лет, её можно использовать для более углублённого изучения HID Report-дескрипторов. К сожалению, её использование ограничено операционной системой Windows.

В hidtools oт Microsoft исправлены некоторые баги, допущенные в предыдущей программе.

Также можно воспользоваться сайтом или утилитой hidrd-convert в Linux. Утилиту hidrd-convert вам, скорее всего, придётся собрать из исходников.

Много полезной информации о HID в Linux можно найти на сайте kernel.org

Спецификацию для HID можно найти на сайте консорциума USB. Здесь находятся два основополагающих документа:

▍ Bluetooth

Также сейчас никого не удивишь технологией Bluetooth, которая проникла везде, где только можно: от телефонов до чайников и зубных щёток.

Существует множество версий спецификации Bluetooth, однако ключевой версией в нашей статье является версия Bluetooth 4.0, когда под названием Bluetooth объединились две близкие, но всё-таки немного разные технологии: Bluetooth BR/EDR (Bluetooth Basic Rate/Enhanced Data Rate) и Bluetooth Low Energy (Bluetooth LE или BLE). Первую часто называют Bluetooth Classic. В данной статье мы будем использовать Bluetooth LE. Устройства с Bluetooth 4.0 у меня не оказалось. Минимальная доступная для меня версия была 4.1 на Raspberry Pi Zero W 2, который к тому же имеет компактные размеры, что делает его лучшим претендентом для устройства, превращающего проводную клавиатуру в беспроводную. Но если у вас нет Raspberry Pi, не расстраивайтесь, вы можете соорудить аналогичное по функционалу устройство из стационарного компьютера или ноутбука с USB-портами, где можно установить Linux cо стеком Bluez 5.55 и выше. Я не проверял работу устройства при использовании версии стека ниже 5.55.

▍ Профили Bluetooth

Как я говорил ранее, у Bluetooth множество сфер применения, каждая сфера определяется в спецификации, называемой профилем Bluetooth. Профиль содержит требования к Bluetooth-устройствам. Например, для беспроводных гарнитур одни требования (профиль HSP), для пульта дистанционного управления — другие (профиль AVRCP). Так как у одного и того же Bluetooth-устройства может быть несколько сфер применения, одно и то же устройство может поддерживать несколько профилей. Например, Bluetooth-гарнитура может поддерживать Hands-Free Profile (HFP) для звонков по телефону, Advanced Audio Distribution Profile (A2DP) для стриминга аудио с/на телефон и Headset Profile (HSP) для стриминга аудио.

Существующие профили Bluetooth можно посмотреть на этой странице

▍ HID-профили Bluetooth

Что касается реализации HID поверх Bluetooth, на сайте консорциума приведены две спецификации:

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

Спецификации на сайтах USB и Bluetooth дополняют друг друга, и при разработке Bluetooth HID-устройств вам придётся пользоваться обоими сайтами.

Если вы открыли файлы спецификаций, то вам понятно, что полное рассмотрение HID и Bluetooth займёт не одну статью, но я думаю, что информации в статье достаточно для понимания основ.

▍ Стеки Bluetooth

Когда дело доходит до реализации технологии Bluetooth на конкретном устройстве, говорят о стеке Bluetooth. Стек Bluetooth по смыслу напоминает стек TCP/IP. Стек может реализовывать один или несколько профилей.

Большинство современных операционных систем имеют в своем составе стек Bluetooth. В периферийных устройствах, таких как клавиатура, мышь, наушники тоже есть стек Bluetooth, но он является специализированным и более ограниченным.

▍ Типичный сценарий работы Bluetooth

Работа с Bluetooth Classic и BLE отличается, хотя операционные системы компьютеров и смартфонов скрывают этот факт на уровне пользовательского интерфейса. Поэтому многие пользователи, наверное, и не догадываются, что под названием Bluetooth скрываются две разные технологии. Если не вдаваться в особенности реализации, многие аспекты для пользователя выглядят одинаково. К ним относятся:

  1. Поиск и обнаружение устройств.
  2. Подключение устройств.
  3. Сопряжение устройств на основе их возможностей.
  4. Создание защищённого канала.
  5. Bonding устройств.

▍ Bluetooth Classic Inquiry и BLE Advertising

Для того, чтобы Bluetooth-устройства могли находить друг друга и определять возможности устройств, находящихся поблизости, в классическом Bluetooth используется процедура Bluetooth Inquiry, а в BLE используется Advertising. Эти процедуры отличаются в значительной степени, мы будем использовать BLE Advertising.

▍ Сопряжение устройств Bluetooth

Обычно, чтобы два устройства могли безопасно обмениваться данными между собой, они должны пройти процедуру сопряжения (pairing). Она инициируется устройством, к которому пытается подключиться другое устройство.

Как правило, устройства сопрягаются только один раз, при первом соединении, после этого устройства становятся Bonded.

Существует несколько методов сопряжения (pairing methods). Какой метод сопряжения будет выбран, зависит от того, какие возможности активны у каждого из сопрягаемых устройств. Перед выбором метода сопряжения устройства обмениваются этой информацией.

▍ Bonded, Paired, Connected

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

  • connected — между устройствами налажено физическое зашифрованное или нет соединение;
  • paired — между устройствами выполнен обмен ключами шифрования;
  • bonded — ключи шифрования сохранены на сопрягаемых устройствах и зашифрованное соединение может быть выполнено без процедуры сопряжения (pairing).

▍ Объектная модель GATT Profile

Разработка приложений, использующих BLE, а не Bluetooth Classic, отличается в том плане, что приложения ориентированы на объекты, а не на передачу данных, как это происходит в Bluetooth Classic. В профиле GATТ определена объектная модель, которую необходимо использовать разрабатывающим приложения BLE.

В GATT определены следующие сущности:

  • службы — объекты, выполняющие определённые функции и обладающие определёнными характеристиками;
  • характеристики — объекты, которые содержат определенную информацию, которую BLE-устройство может считать, изменить или подписаться на уведомления об изменении;
  • дескрипторы — объекты, содержащие метаинформацию о характеристиках.

▍ Объектная модель HoGP

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

Объектная модель HoGP объединяет сущности из двух объектных моделей HID и GATT. Полный перечень служб, характеристик и дескрипторов можно прочитать в спецификации HoGP. Я же ограничусь только теми, которые использовал в своём приложении.

Важны следующие службы:

  • HID Service — само HID-устройство;
  • Battery — информация о батарее;
  • Device Info — общая информация об устройстве.

У службы HID важны следующие характеристики:

  • ReportMap — содержит HID Report-дескриптор;
  • Report — служит для передачи данных с периферийного устройства и в обратном направлении;
  • HID Control Point — служит для сообщения периферийному устройству, что центральное переходит в определённое состояние;
  • HID Information — информация о HID-устройстве;
  • Protocol Mode — информация о том, в каком режиме (Boot Protocol или Report Protocol) работает устройство.

Важные подсистемы Linux, необходимые для понимания приложения

Так как мы разрабатываем Bluetooth-приложение, которое будет работать в операционной системе Linux, желательно понимание следующих тем.

▍ Evdev

Evdev — высокоуровневая подсистема Linux, которая позволяет работать с устройствами ввода. Нажатие клавиши на клавиатуре, перемещение мыши генерируют события, которые приложение может обработать.

▍ Hidraw

Hidraw — это подсистема Linux, которая позволяет работать с HID-устройствами, подключёнными к хосту из пространства пользователя на низком уровне. HID-устройство представляется в операционной системе в виде файла устройства, к которому можно обратиться при помощи операций чтения/записи. Для расширенной работы с HID-устройством используется интерфейс ioctl.

Нажатия клавиш в hidraw и evdev кодируются по-разному, поэтому необходимо выполнять преобразования, если мы хотим послать данные, полученные из evdev в hidraw.

Основное различие между evdev и hidraw заключается в том, что evdev генерирует события, которые соответствуют различным действиям пользователя, в то время как hidraw предоставляет доступ к исходным данным, передаваемым устройством.

Evdev, в отличие от hidraw, работает не только с HID-устройствами, например, она генерирует события от нажатия клавиш на PS/2 клавиатуре, которой до сих пор является встроенная клавиатура многих ноутбуков.

В evdev нажатия клавиш кодируются в соответствии со стандартом X.org, в то время как в hidraw они кодируются в соответствии со стандартом HID.

С целью упрощения программы мы будем использовать hidraw и без всяких преобразований отсылать коды клавиш посредством Bluetooth Low Energy.

▍ Ioctl

Ioctl позволяет работать с устройствами из пространства пользователя. Интерфейс ioctl позволяет приложениям выполнять специальные операции с HID-устройствами. Например, приложения могут использовать ioctl для получения информации о HID-устройстве, для настройки параметров HID-устройства или для выполнения специальных функций HID-устройства.

▍ Udev

Udev — подсистема Linux, которая реализует подход Plug and Play.

При подключении/отключении устройства создаётся сообщение в подсистеме udev. Обрабатывая эти сообщения и выполняя запросы, можно получить имена файлов устройств, подключённых к хосту.

Для программного доступа к списку файлов, представляющих устройства, как правило, используется библиотека libudev.

Подсистема udev часто интегрируется с systemd. Например, при обнаружении Bluetooth-адаптера запускается служба bluetooth подсистемы systemd.

▍ Systemd

После запуска ядра Linux возникает задача инициализации операционной системы в пространстве пользователя. Это выполняет определённый процесс с именем init. Реализации этого процесса называются системами инициализации. В ранних версиях Linux использовалась система System V, перенесённая из Unix, однако в настоящее время в большинстве дистрибутивов это будет systemd, если, конечно, это не какой-нибудь легковесный дистрибутив для встраиваемого устройства.

Работающая операционная система представляет собой совокупность запущенных процессов, которые обычно не имеют пользовательского интерфейса (демоны или сервисы) и процессов с пользовательским интерфейсом. Systemd, как и любая другая система инициализации, решает задачу управления сервисами в соответствии с конфигурацией.

Нам необходимо будет создать сервис, реализующий эмулятор Bluetooth-клавиатуры, получающий данные из подключённых к хосту USB-клавиатур.

▍ D-Bus

D-Bus-интерфейс присутствует во многих дистрибутивах Linux. Основная задача D-Bus-интерфейса — организация межпроцессного взаимодействия в объектно-ориентированном стиле. Если у вас был опыт работы с COM/DCOM, CORBA, RMI, Net Remoting, то вам будет проще понять D-Bus.

Работа D-Bus обеспечивается специальной программой-демоном для обмена сообщениями между процессами по протоколу D-Bus.

На данный момент в Linux-дистрибутивах распространены две реализации этого демона, а значит и D-Bus: dbus-daemon и более новый dbus-broker. Какая версия запущена именно на вашем дистрибутиве Linux, можно узнать при помощи команды:

$ sudo ps -aux | grep dbus

Базовые понятия D-Bus: интерфейс, путь и объект. Объект представляет собой сущность, которая выполняет некоторые функции и уникально идентифицируется в системе при помощи пути. Обратиться к функциям и свойствам объекта можно через интерфейс. В операционной системе присутствует множество объектов D-Bus, принадлежащих разным процессам и взаимодействующим между собой.

Реализация Bluetooth в Linuх

Linux, пожалуй, лучшая операционная система, для углублённого изучения технологии Bluetooth.

В книгах и статьях, часто можно встретить примеры программ на Си, которые касаются технологии Bluetooth Classic. Мы же будем использовать BLE и язык Python.

▍ BlueZ

В подавляющем большинстве Linux-дистрибутивов используется Bluetooth-стек BlueZ. Часть BlueZ включена в ядро Linux и работает в режиме ядра, другая часть работает в пользовательском режиме и включается в дистрибутив Linux в виде пакетов.

Мы не будем разбирать работу с Bluetooth в режиме ядра, так как для решения нашей задачи нам это не нужно.

Наиболее важная программа из BlueZ, которая работает в пользовательском режиме, — это bluetoothd.

▍ Bluetoothd

Bluetoothd — программа-daemon, позволяющая управлять устройствами bluetooth. Так как это демон, у него нет графического интерфейса и интерфейса командной строки. Он отвечает за обнаружение, подключение и управление Bluetooth-устройствами. Управление программой осуществляется или при помощи конфигурационных файлов, или при помощи программного интерфейса D-Bus. Вы можете непосредственно использовать D-Bus API, а можете воспользоваться программой bluetoothctl, которая предоставляет интерактивный интерфейс или интерфейс командной строки для доступа к функциям bluetoothd. Второй похожей программой является btmgmt. Bluetoothctl и btmgmt имеют сходное назначение, но немного различаются в возможностях.

▍ Bluetooth service

Как правило, bluetoothd должна загружаться при обнаружении bluetooth-адаптера в операционной системе. В большинстве дистрибутивов Linux эту задачу решает сиcтема инициализации Systemd. Задачу обнаружения bluetooth-адаптера выполняет подсистема udev, которая генерирует событие в этом случае, а systemd запускает службу bluetooth.

▍ BlueZ D-Bus API

Низкоуровневой альтернативой D-Bus являются сокеты и пайпы, но большинство функций bluetoothd представлены в виде D-Bus-интерфейса, и работа с Bluetooth Low Energy в стеке Bluetooth, как правило, подразумевает работу объектами D-Bus.

Наша задача — создать GATT-сервер, который будет реализовывать функционал HID-клавиатуры, поддерживающей профиль HoG (HID over GATT). Для этого необходимо написать код нескольких объектов и зарегистрировать их в стеке BlueZ, реализовав несколько интерфейсов, которые требует стек. К ним относятся:

  • org.bluez.GattService1
  • org.bluez.GattCharacteristic1
  • org.bluez.GattDescriptor1
  • org.freedesktop.DBus.Properties

Так как мне захотелось создать приложение, которое будет требовать от пользователя минимального количества действий, необходимо реализовать интерфейсы, требуемые для advertising и сопряжения:

  • org.bluez.LEAdvertisement1
  • org.bluez.Agent1

Для регистрации созданных нами объектов будут использоваться интерфейсы:

  • org.freedesktop.DBus.ObjectManager
  • org.bluez.GattManager1
  • org.bluez.AgentManager1
  • org.bluez.LEAdvertisingManager1

Реализация приложения

Ну вот вы и дочитали до реализации приложения. Вы можете посмотреть, как всё работает, выполнив следующую последовательность шагов. Ниже приведена инструкция для тех, кто будет использовать Raspberry Pi Zero 2 W.

▍ Инструкция, как пользоваться приложением

1. Загрузить Raspberry Pi Imager с сайта raspberrypi.com.

2. Запустить Raspberry Pi Imager и выбрать Raspberry Pi Zero 2 W.

Разбираемся с Bluetooth Low Energy на примере превращения USB-клавиатуры в беспроводную - 2

3. Выбрать Raspberry Pi OS (Legacy, 32-bit).

Разбираемся с Bluetooth Low Energy на примере превращения USB-клавиатуры в беспроводную - 3

4. Вставить в компьютер SD-карту для записи образа Raspberry Pi OS и выбрать её.

5. Нажать Next и выбрать EDIT SETTINGS.

6. Настроить WiFi для своей локальной сети на вкладке GENERAL.

Разбираемся с Bluetooth Low Energy на примере превращения USB-клавиатуры в беспроводную - 4

7. В современных дистрибутивах Raspberry OS ssh отключён по умолчанию. Необходимо его активировать на вкладке SERVICES.

Разбираемся с Bluetooth Low Energy на примере превращения USB-клавиатуры в беспроводную - 5

8. Нажать SAVE.

9. Согласиться с правкой настроек и выполнить запись образа на карту.

10. Извлечь SD-карту из компьютера и вставить её в Raspberry Pi.

11. Включить Raspberry Pi.

12. Подключиться к Raspberry Pi при помощи SSH-клиента. Я использовал PuTTY.

Разбираемся с Bluetooth Low Energy на примере превращения USB-клавиатуры в беспроводную - 6

13. Выполнить вход в операционную систему.

Разбираемся с Bluetooth Low Energy на примере превращения USB-клавиатуры в беспроводную - 7

14. Установить недостающие пакеты.

$ sudo apt install libdbus-1-3 libdbus-1-dev libcairo2-dev libxt-dev libgirepository1.0-dev git mc

15. Склонировать исходный код программы с моего репозитория.

$ git clone https://github.com/artyomsoft/ble-hid-keyboard.git

16. Перейти в директорию ble-hid-keyboard.

$ cd ble-hid-keyboard

17. Установить службу bli-hid-keyboard.

$ sudo ./install.sh

18. Подключить к USB-порту Raspberry Pi проводную USB-клавиатуру.

19. Raspberry Pi теперь виден как BLE Keyboard.

20. Выполнить соединение компьютера или мобильного телефона с BLE Keyboard.

21. Ввести код на подключённой USB-клавиатуре.

22. Теперь, если вы будете нажимать клавиши на USB-клавиатуре, символы будут вводиться на подключённом компьютере или мобильном телефоне.

▍ Коротко по структуре приложения

Приложение состоит из:

  • GATT-сервера, реализующего профиль HoGP gatt_server.py, и скрипта отключения Bluetooth BR/EDR bluetooth-init.sh;
  • файлов с реализациией основного функционала в директории core;
  • инсталляционных скриптов install.sh и uninstall.sh;
  • файла описания службы ble-hid-keyboard.service и скрипта отключения Bluetooth BR/EDR bluetooth-init.sh.

▍ C чем я столкнулся при разработке приложения

  1. Опция ControllerMode = le в файле /etc/bluetooth/main.conf отключает запуск SDP-сервера, необходимого для Bluetooth Classic, но адаптер продолжает работать в dual-режиме (BR/EDR и BLE). BR/EDR необходимо отключить при помощи утилиты btmgmt.
  2. Эта настройка оказалась персистентной (сохранялась после перезагрузки) на моём ноутбуке с Pop OS, но на Raspberry Pi пришлось эту настройку менять при каждом запуске.
  3. Macbook Pro M2 c macOS Ventura наотрез отказывался выводить сообщение при сопряжении с разрабатываемой клавиатурой. Путём анализа трафика пришёл к выводу, что для характеристики HID Info нужно поставить secure-read.
  4. Macbook Pro M2 c macOS Ventura и iPhone 15 Pro сопрягались, но не подписывались на нотификацию о нажатии клавиш. Причина оказалась в том, что они требуют обязательное указание ReportID в HID ReportMap. Соответственно, пришлось немного изменить ReportMap, а также добавить деcкриптор для характеристики Report.

Отладка Bluetooth-приложения

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

Первое, что приходит на ум — это мониторить трафик bluetooth, как это делается при использовании WiFi (адаптер переводится в monitor mode). Однако для меня было неожиданностью, что Bluetooth-адаптеры не поддерживают такой режим. Необходимо приобретать дополнительные устройства, например, Nordic nRF52840 Dongle для мониторинга и анализа BLE-трафика.

Но если вам не нужны низкоуровневые подробности, то в Linux можно посмотреть локальный трафик между хостом и контроллером Bluetooth при помощи команды btmon. Также можно использовать Wireshark и интерфейс Bluetooth.

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

В macOS и Windows анализ трафика потребует небольших танцев с бубном.

В macOS используется PacketLogger. Мне он показался менее удобным, чем Wireshark. Wireshark поддерживает формат логов, используемых PacketLogger, поэтому вы можете использовать привычный вам Wireshark для работы с логами.

В Windows, если ваш Bluetooth-адаптеров использует USB-интерфейс, можно изучить трафик при помощи USBPCap, который поддерживает Wireshark.

Чтобы посмотреть логи инициализации Bluetooth в ядре Linux:

$ sudo dmesg | grep Bluetooth

Или

$ sudo journalctl -b -t kernel | grep Bluetooth

Чтобы посмотреть логи bluetooth.service, запущенной в пространстве пользователя:

$ sudo journalctl -b -u bluetooth.service

Чтобы посмотреть log разработанного нами приложения:

$ sudo journalctl -b -u ble-hid-keyboard.service

Выводы

После того как я потратил значительные усилия, чтобы понять причину отказа работать с Bluetooth-клавиатурой macOS, iOS и разных версий Android, я стал по другому смотреть на надписи на коробках, где указывается, что поддерживается Windows, Linux, macOS, Android.

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

Есть возможности для улучшения программы:

  • Например, логика для обнаружения, сопряжения, подключения устройств реализована на базовом уровне, и не учтены некоторые краевые случаи.
  • Настройка работы устройством возможна только через SSH, что не очень удобно для рядового пользователя, и было бы полезно или сделать Web-интерфейс, или уже оформить в виде устройства с физическими кнопками и индикатором.

Хотелось в статью включить максимальное количество полезной информации по Bluetooth, но так как это всё же статья, к сожалению, всё уместить не удалось.

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

Автор:
artyomsoft

Источник

* - обязательные к заполнению поля


https://ajax.googleapis.com/ajax/libs/jquery/3.4.1/jquery.min.js