- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我有一个蓝牙 LE Remote ,我想将其与我的 Raspberry Pi Zero 配对。
]
我能够成功地将 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
我现在可以读取特性,并且我过去也已经处理过 BLE 和读/写特性来控制灯泡。
目前尚不清楚如何以“GATT-ian”方式检测 Remote 的按键事件。我did try to enable notifications for all the characteristics I found in the remote但回调从未被调用。
我确实看过Bluetooth HID over GATT Specification但没有找到如何实现按键事件通知的线索。
总结一下。我的问题如下:
使用iOS app我能够列出以下 GATT 服务和特征。
使用这个应用程序,我也能够连接到 Remote ,但也像使用 Raspberry Pi 一样断开连接。
最佳答案
感谢@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。
/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 是更改程序键。
请注意,静音键有某种双重分配,您可能需要以不同的方式处理。
bluez 软件包确实支持 GATT 上的 HID,并且在此过程中进行了一些修复。在某些时候,您必须将 --experimental
标志添加到 bluez 服务 /etc/systemd/system/dbus-org 中
。然而,HID over GATT 在某个时候被添加到默认值中。ExecStart
的末尾。 bluez.service
我确实将 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
rpi-update
只是为了确保我确实使用 rpi-update
将树莓派更新到最新版本。与所有这些陷阱一样,我不知道它们是否是必需的,但如果有疑问,更新系统通常是一个好习惯。
关于python - 检测蓝牙 Remote 上的按钮(HID over GATT),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54745576/
我正在构建一个 HID 设备。有谁知道 HID 协议(protocol)是否支持两种通信方式——主机可以向设备发送命令,例如,打开或关闭 LED、关闭电源等...? 最佳答案 是的。例如。可以使用 h
我正在尝试与某些 HID 设备进行数据交换。我设法使用 libusb_interrupt_transfer 函数实现从该设备读取,但我不知道如何实现向 HID 发送缓冲区,因为设备没有 OUT 端点。
我正在寻找为 HID 设备(具有自定义 VID/PID)创建一个 inf 文件。我只想用我们的字符串替换我们设备的字符串“HID 兼容设备”和“USB 输入设备”。 我知道这需要由 Microsoft
我在生成 HID 描述符时遇到了一些问题。 我想使用简单的报告,ID1 用于输入,ID2 用于输出 64 字节数据。 我意识到尽管 RTFMing 和谷歌搜索,我仍然不知道 HID 描述符中的某些字段
我有一个带有几个按钮的蓝牙 LE 操纵杆。我想不使用蓝牙设置直接将它连接到应用程序,而是通过 BluetoothLeScanner 连接到它. 我已经可以连接到心率监测器并定期收到心率值通知。 我还创
关闭。这个问题不符合Stack Overflow guidelines .它目前不接受答案。 我们不允许提问寻求书籍、工具、软件库等的推荐。您可以编辑问题,以便用事实和引用来回答。 关闭 4 年前。
我试图通过 HID OMNIKEY 5427 CK 通过 APDUs 命令来操作 MIFARE 卡,即。 Ultralight C 卡,在 Windows 10 x64 操作系统环境中使用 WinSC
我正在尝试使用 AOA 2.0 协议(protocol)和 libusb 将按键发送到 Android 设备。我能够设置设备配件模式并能够注册 HID 设备。但是,每当我发送事件时,我都会收到错误:
使用 USB HID 传感器,我似乎只能用 chrome.usb API 枚举设备在 ChromeOS 上。 在 OS X 上我可以用 chrome.hid API 枚举没问题。 在 Chrome 操
我正在尝试使用 IOHIDManager API 从 Mac OsX 上的设备的 HID 报告中读取数据,例如鼠标的 X、Y、button1、Button2(Magic Apple Mouse) 使用
我正在尝试编写用户空间设备驱动程序以从自定义 HID 设备中提取一些数据。我执行以下操作以将 HID 管理中的设备引用存储到变量中。 CFSetRef device = IOHIDManagerCop
我正在尝试安装 cython-hidapi 以在 Ubuntu 12.04 上读取 USB。我已按照 https://github.com/gbishop/cython-hidapi 的说明进行操作并
在 Safari 4.0 上,我有一张打印“????”的支票。如果隐藏 === "#but0_0" 作品: $("#but0_0").attr("onmousedown",function(){ale
这个问题可能与 this 重复和 this线。但是由于他们都没有为我的问题提供明确的解决方案,所以我再次询问。 我需要的任务是通过 USB 连接 2 个键盘,然后通过 Java 应用程序分别管理每个键
我正在从事一个使用蓝牙 HID 配置文件的项目。我知道 Android 中的 BlueZ 堆栈具有 HID 支持,但它没有通过 Android Framework 扩展到应用程序层。 我主要关心的是了
我问@Stackoverflow 有点新,但这是我所拥有的最接近圣经的东西(除了 Ritchie 的 C 书),特别是在我的大多数主题的期末项目的这些日子里。无论如何,我的问题是关于与 HID 设备通
我正在尝试使用 UsbDeviceConnection.controlTransfer 获取 USB 设备的 HID 报告描述符,这样我就可以看到 USB HID 设备有哪些按钮。 我已经能够使用 b
我对使用 libhid 访问我们在 PIC 微 Controller 上开发的自定义 HID 设备很感兴趣。我已经能够成功运行 test_libhid 代码。使用此库读取和写入设备的说明在 test_
我正在尝试将 STM32F0-disco 用作 Windows PC 的键盘。正在打印的字符有问题。 下面的代码等到板载按钮被按下,然后应该打印一次这三个字符。 /* USER CODE BE
我想解构从 hid_read 的hidapi函数收到的原始报告。 据我了解,这可以通过使用设备报告描述符中的信息来实现。但是,当尝试查询那些描述符时,我迷失在HID Spec和hidapi中可用的方法
我是一名优秀的程序员,十分优秀!