gpt4 book ai didi

python - 检测蓝牙 Remote 上的按钮(HID over GATT)

转载 作者:行者123 更新时间:2023-12-01 08:19:33 35 4
gpt4 key购买 nike

我有一个蓝牙 LE Remote ,我想将其与我的 Raspberry Pi Zero 配对。

My Remote ]

我能够成功地将 Remote 与 Android 手机配对,然后它就像键盘一样工作,我能够在键盘上将数字输入到空白笔记中,甚至可以更改手机上的音量。

seems raspbian 不支持 HID over Gatt,这意味着我需要使用 python 实现/模仿最小的 HID over GATT 行为。 (如果有更直接的方法,请纠正我。)

树莓派

我可以使用 lescan 在 Linux 终端中发现远程:

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

现在在 GATTTool 中我可以与 Remote 配对。然而,几秒钟后,当 Remote 的白色 LED 灯持续闪烁时, Remote 与我的 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 Library

我现在可以读取特性,并且我过去也已经处理过 BLE 和读/写特性来控制灯泡。

目前尚不清楚如何以“GATT-ian”方式检测 Remote 的按键事件。我did try to enable notifications for all the characteristics I found in the remote但回调从未被调用。

我确实看过Bluetooth HID over GATT Specification但没有找到如何实现按键事件通知的线索。

总结一下。我的问题如下:

  1. 如何成功连接远程而不丢失连接
  2. 如何使用 GATT 检测 Remote 上按下的按钮

附录:蓝牙浏览器 GATT 属性

使用iOS app我能够列出以下 GATT 服务和特征。

使用这个应用程序,我也能够连接到 Remote ,但也像使用 Raspberry Pi 一样断开连接。

image 1 image 2

最佳答案

感谢@ukBaz,我现在能够在我的 Raspberry Pi Zero 上访问蓝牙 LE Remote 谁pointed out如何通过 GATT 访问 HID(Linux 中的简称 HoG:

使用bluetoothctl配对 Remote

这只能发生一次。

首先,我同时按住 1 和 3 以清除 Remote 上的所有当前配对。这是特定于我的远程模型的,但很高兴知道在连接之前重置设备可能是必要的。

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

自动连接

bluetoothctl 中,提示会显示您是否已连接到设备。 60 秒后,连接断开。我认为这是一个问题, Remote 现在不会向 PI 发送命令,但值得注意的是,一旦建立配对, Remote 似乎会自动连接到我的 Raspberry Pi。

Linux 中的 HoG 和 /dev/input

我首先想到我需要连接到 GATT 协议(protocol)栈并检测那些 GATT 消息和事件,以便检测 Remote 的按钮事件。这是可能的,但由于 Raspberry Pi 上的 BlueZ 支持 GATT 上的 HID,即蓝牙低功耗鼠标、操纵杆、键盘、游戏 Controller 或 Remote 。这意味着 Pi 上的内核创建了一个驻留在 /dev/input/ 中的输入设备。因此,一旦我配对并连接了 BLE Remote,两个新条目就会出现在 /dev/input 中:/dev/input/event1/dev/input/event0.

我做了一个cat/dev/input/event1,当我按下 Remote 上的一个键时,我看到一些字节垃圾飞过终端。这样我就可以验证 Remote 是否正在向 Pi 发送事件。

使用 evdev 读取事件

更新:evdev 有一个模块,可让您快速输出所选设备的事件:

python3 -m evdev.evtest

@ukBaz指出我可以使用pip3包evdev访问我的设备。通过运行以下 python 代码,我能够检测到 Remote 上的按钮🎉

安装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我的 Remote 是更改程序键。

请注意,静音键有某种双重分配,您可能需要以不同的方式处理。

问题 #1 - 更新 Bluez

bluez 软件包确实支持 GATT 上的 HID,并且在此过程中进行了一些修复。在某些时候,您必须将 --experimental 标志添加到 bluez 服务 /etc/systemd/system/dbus-org 中 ExecStart 的末尾。 bluez.service。然而,HID over GATT 在某个时候被添加到默认值中。

我确实将 bluez 更新到了最新版本,即 bluez-5.50。我从源代码中做到了这一点,这并不太难,并且 described here

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

只是为了确保我确实使用 rpi-update 将树莓派更新到最新版本。与所有这些陷阱一样,我不知道它们是否是必需的,但如果有疑问,更新系统通常是一个好习惯。

关于python - 检测蓝牙 Remote 上的按钮(HID over GATT),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54745576/

35 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com