Теперь я могу получить доступ к 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
.Как и во всех этих ошибках, я не знаю, требуются ли они, но в случае сомнений обычно рекомендуется обновлять систему.