Обнаружение кнопок на пульте Bluetooth (HID over GATT) - PullRequest
0 голосов
/ 18 февраля 2019

У меня есть Bluetooth LE Remote, который я хотел бы соединить с моим Raspberry Pi Zero.

My Remote]

Мне удалось успешно выполнить сопряжение пульта с телефоном Android, и тогда он работал как клавиатура, и я смог набрать цифры на клавиатуре в пустую заметку идаже изменить громкость на телефоне.

Кажется, , кажется, raspbian не поддерживает HID поверх Gatt, что означает, что мне нужно реализовать / имитировать минимальное поведение HID поверх GATT с использованием python.(Пожалуйста, исправьте меня, если есть более простой способ сделать это.)

Raspbian

Я могу обнаружить пульт в терминале Linux, используя lescan:

sudo hcitool lescan
...
AA:BB:CC:DD:EE:FF FancyRemoteXY

Теперь в GATTTool я могу соединиться с пультом.Однако через несколько секунд, пока пульт продолжает мигать белым светодиодом, пульт отключается от моего Pi.Это не происходит с телефоном Android.Поэтому между пультом и хостом должно быть какое-то рукопожатие, чтобы соединение было сохранено.

# Press 1 & 3 to unpair the remote from existing devices
gatttool -I -b AA:BB:CC:DD:EE:FF
connect
# Press the OK button on the remote

Библиотека Python GATT

Теперь я могу прочитатьхарактеристики, и я также уже имел дело с BLE и характеристиками чтения / записи в прошлом для управления лампочкой.

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

Я посмотрел на Bluetooth HID over GATT Specification , но не нашел подсказок о том, как добиться, чтобы получать уведомления о событиях нажатия клавиш.

Подводя итог,У меня следующие вопросы:

  1. Как я могу успешно подключить пульт без потери соединения
  2. Как я могу обнаружить нажатие кнопок на пульте с помощью GATT

Приложение: свойства Bluetooth Explorer GATT

Использование приложения для iOS Мне удалось перечислить следующие службы и характеристики GATT.

Используя это приложение, я также смог подключитьсяк пульту, но также я был отключен, как с Raspberry Pi.

image 1 image 2

1 Ответ

0 голосов
/ 19 февраля 2019

Теперь я могу получить доступ к Bluetooth-пульту LE на моем Raspberry Pi Zero благодаря @ ukBaz , который указал , как получить доступ к HID через GATT (короткий HoG в Linux:

Выполните сопряжение пульта с помощью bluetoothctl

Это должно произойти только один раз.

Сначала я нажимаю и удерживаю 1 и 3 одновременно, чтобы очистить любойтекущее соединение на пульте дистанционного управления. Это характерно для моей удаленной модели, но полезно знать, что может потребоваться перезагрузка устройства перед его подключением.

sudo bluetoothctl
power on
agent on
# you might need to do `scan on` / `scan off` until you see the remote
pair AA:BB:CC:DD:EE:FF
# click ok on the remote or otherwise confirm the pairing
trust AA:BB:CC:DD:EE:FF
connect AA:BB:CC:DD:EE:FF # Pairing might perform a connect, but it does not hurt
info # info shows you if you're connected and or paired with the remote

Теперь перезагрузите RaspberryPi

Auto-Connect

В bluetoothctl появится приглашение, если вы подключены к устройству. Через 60 секунд соединение было отключено. Я подумал, что это проблема, и пульт не будет отправлять командык PI сейчас, но важно отметить, что после установления соединения пульт, кажется, автоматически подключается к моему Raspberry Pi.

HoG в Linux и /dev/input

Сначала я подумалчто я будуНужно подключиться к стеку протокола GATT и обнаружить эти сообщения и события GATT, чтобы обнаружить события кнопок моего пульта дистанционного управления.Это возможно, но поскольку BlueZ на Raspberry Pi поддерживает HID over GATT, а именно: мыши с низким энергопотреблением Bluetooth, джойстики, клавиатуры, игровые контроллеры или пульты дистанционного управления.Это означает, что Ядро на Pi создает устройство ввода, которое находится в /dev/input/.Поэтому, когда я подключился и подключил свой BLE Remote, в /dev/input появились /dev/input/event1 и /dev/input/event0 и *1030*.

я сделал cat /dev/input/event1 и однажды нажал клавишу на пультеЯ увидел какой-то байт-мусор, летящий через терминал.Таким образом, я мог убедиться, что пульт отправлял события на Pi.

Чтение событий с использованием evdev

Обновление : у evdev есть модуль, который позволяет вам быстро выводитьсобытия для устройства по вашему выбору:

python3 -m evdev.evtest

@ ukBaz указали, что я могу использовать пакет pip3 evdev для доступа к моему устройству.Запустив следующий код Python, я смог обнаружить кнопки на моем пульте ДУ ?

Установить evdev и запустить консоль python3:

pip3 install evdev
python3

Запустить скрипт python

import evdev
device = evdev.InputDevice('/dev/input/event1')
print(device)
# device /dev/input/event1, name "Swisscom RC", phys "AA:BB:CC:DD:EE:FF"
for event in device.read_loop():
  if event.type == evdev.ecodes.EV_KEY:
    print(evdev.categorize(event))

Это вывело бы следующее:

key event at 1550575506.080840, 2 (KEY_1), down
key event at 1550575506.230643, 2 (KEY_1), up
key event at 1550575506.410622, 3 (KEY_2), down
key event at 1550575506.560618, 3 (KEY_2), up
key event at 1550575506.730621, 4 (KEY_3), down
key event at 1550575506.880608, 4 (KEY_3), up
key event at 1550575507.080630, 5 (KEY_4), down
key event at 1550575507.230630, 5 (KEY_4), up
key event at 1550575507.430884, 6 (KEY_5), down
key event at 1550575507.580611, 6 (KEY_5), up
key event at 1550575507.770633, 7 (KEY_6), down
key event at 1550575507.930623, 7 (KEY_6), up
key event at 1550575514.040805, 104 (KEY_PAGEUP), down
key event at 1550575514.295156, 104 (KEY_PAGEUP), hold
key event at 1550575514.345174, 104 (KEY_PAGEUP), hold
key event at 1550575514.395158, 104 (KEY_PAGEUP), hold
key event at 1550575514.445154, 104 (KEY_PAGEUP), hold
key event at 1550575514.495155, 104 (KEY_PAGEUP), hold
key event at 1550575514.545187, 104 (KEY_PAGEUP), hold
key event at 1550575514.595153, 104 (KEY_PAGEUP), hold
key event at 1550575514.645155, 104 (KEY_PAGEUP), hold
key event at 1550575514.695154, 104 (KEY_PAGEUP), hold
key event at 1550575514.745153, 104 (KEY_PAGEUP), hold
key event at 1550575514.795154, 104 (KEY_PAGEUP), hold
key event at 1550575514.840643, 104 (KEY_PAGEUP), up
key event at 1550575517.290737, 116 (KEY_POWER), down
key event at 1550575517.440740, 116 (KEY_POWER), up
key event at 1550575520.110901, 158 (KEY_BACK), down
key event at 1550575520.230905, 158 (KEY_BACK), up
key event at 1550575658.372344, 113 (['KEY_MIN_INTERESTING', 'KEY_MUTE']), down
key event at 1550575658.375718, 113 (['KEY_MIN_INTERESTING', 'KEY_MUTE']), up
key event at 1550575520.530643, 164 (KEY_PLAYPAUSE), down
key event at 1550575520.680666, 164 (KEY_PLAYPAUSE), up
key event at 1550575520.880818, 167 (KEY_RECORD), down
key event at 1550575521.020807, 167 (KEY_RECORD), up

Объект события имеет значение 0,1,2, которое вверх и удерживается, и код, такой как 104, который может быть преобразован всоответствующий код KEY_PAGEUP, который на моем пульте дистанционного управления является программной клавишей изменения.

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

Gotcha # 1 - Обновление Bluez

Пакет bluez поддерживает HID поверх GATT, и некоторые исправления были сделаны по пути.В какой-то момент вам придется добавить флаг --experimental в конце ExecStart в службе bluez /etc/systemd/system/dbus-org.bluez.service.Однако HID over GATT в какой-то момент был добавлен в Default.

Я обновил bluez до последней версии, bluez-5.50.Я сделал это из источника, который не слишком сложен и описан здесь

bluetoothctl -v
5.43

sudo apt-get install libdbus-1-dev libglib2.0-dev libudev-dev libical-dev libreadline-dev -y

wget www.kernel.org/pub/linux/bluetooth/bluez-5.50.tar.xz
tar xvf bluez-5.50.tar.xz 
cd cd bluez-5.50/

./configure --prefix=/usr --mandir=/usr/share/man --sysconfdir=/etc --localstatedir=/var --enable-experimental 
make -j4
sudo make install
sudo reboot
bluetoothctl -v
# bluetoothctl: 5.50

Получил # 2 - Выполнить rpi-update

Просто чтобы убедиться, что я обновилRaspberry Pi до последней версии, используя rpi-update.Как и во всех этих ошибках, я не знаю, требуются ли они, но в случае сомнений обычно рекомендуется обновлять систему.

...