检测蓝牙遥控器上的按钮(通过GATT的HID)

我有一个蓝牙LE遥控器,我想与我的Raspberry Pi Zero配对。

我的遥控器]

我能够成功地将遥控器与Android手机配对,然后它就像键盘一样工作,而且我能够在键盘上键入数字成空白音符,甚至可以改变手机的音量。

这似乎raspbian不支持HID在关贸总协定,这意味着我需要使用Python在GATT行为实行/模拟最小的HID。(如果有更简便的方法,请纠正我。)

回答:

我可以使用lescan以下命令在Linux Terminal中找到远程服务器:

sudo hcitool lescan

...

AA:BB:CC:DD:EE:FF FancyRemoteXY

现在,在GATTTool中,我可以与遥控器配对。但是,在遥控器持续闪烁白色LED几秒钟后,遥控器与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-

ian”方式检测遥控器的按键事件。我确实尝试为在远程中找到的所有特征启用通知,但从未调用过回调。

我确实查看了GATT规范上的Bluetooth

HID,但没有找到有关如何获得按键事件通知的线索。

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

  1. 如何成功连接遥控器而不会丢失连接
  2. 如何使用GATT检测遥控器上的按下按钮

回答:

使用iOS应用程序,我能够列出以下GATT服务和特征。

使用该应用程序,我还可以连接到遥控器,但是就像Raspberry Pi一样,我也断开了连接。

图片1

图片2

回答:

感谢@ukBaz,我现在可以在我的Raspberry Pi

Zero上访问蓝牙LE遥控器,他指出了如何通过GATT(Linux中的短 访问HID :

使用配对 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

自动连接

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

Pi。

Linux中的HoG和 /dev/input

我首先想到,我将需要挂接到GATT协议栈并检测那些GATT消息和事件,以便检测遥控器的按钮事件。这是可能的,但是由于Raspberry

Pi上的BlueZ支持基于GATT的HID,即蓝牙低功耗鼠标,操纵杆,键盘,游戏控制器或遥控器。这意味着Pi上的内核会创建一个驻留在中的输入设备/dev/input/。所以一旦我被配对并连接我的BLE远程两个新项并在出现/dev/input/dev/input/event1/dev/input/event0

我做了一个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,该代码在我的遥控器上是更改程序密钥。

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

陷阱#1-更新Bluez

bluez软件包确实支持GATT上的HID,并且在此过程中进行了一些修复。在某些时候,您必须将--experimental标记添加到ExecStartbluez服务的末尾/etc/systemd/system/dbus-

org.bluez.service。但是,通过GATT的HID有时会添加到默认值中。

我确实将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。与所有这些陷阱一样,我不知道是否需要它们,但是如有疑问,通常更新系统是一个好习惯。

以上是 检测蓝牙遥控器上的按钮(通过GATT的HID) 的全部内容, 来源链接: utcz.com/qa/424125.html

回到顶部