来自 evdev 的 wiki:
evdev(“事件设备”的缩写)是 Linux 内核和 FreeBSD 中的通用输入事件接口。[1] 它概括了来自设备驱动程序的原始输入事件,并使其可通过 /dev/input/ 目录中的字符设备使用。
以及 udev 的 wiki:
udev作为devfsd和hotplug的后继者,主要管理/dev目录下的设备节点。同时,udev 还处理当硬件设备添加到系统中或从系统中删除时引发的所有用户空间事件,包括某些设备所需的固件加载。
据我了解,当插入/删除设备时,udev 将广播事件并应用某些规则。但是,两者似乎都共同负责在 /dev/input(对于 evdev)和 /dev(对于 udev)下创建设备节点。然后可以从这些设备节点读取事件。
是什么决定了设备节点是由一个设备节点还是另一个设备节点创建的?
我正在使用伟大的"evdev"库来收听USB条形码阅读器输入,我需要检测设备是否突然被拔出/无响应,因为否则读取循环的python脚本会在单个线程上达到100%cpu使用率慢慢开始吃掉所有可用的内存,这会导致整个系统崩溃.
我们的想法是检测设备何时拔出并终止当前脚本,导致主管尝试重新启动它,直到设备重新插入/变为响应状态.
我用来读取输入的代码如下:
devices = map(InputDevice, list_devices())
keys = {
2: 1,
3: 2,
4: 3,
5: 4,
6: 5,
7: 6,
8: 7,
9: 8,
10: 9,
11: 0,
}
dev = None
for d in devices:
if d.name == 'Symbol Technologies, Inc, 2008 Symbol Bar Code Scanner':
print('%-20s %-32s %s' % (d.fn, d.name, d.phys))
dev = InputDevice(d.fn)
break
if dev is not None:
code = []
for event in dev.read_loop():
if event.type == ecodes.EV_KEY:
if event.value == 00: …Run Code Online (Sandbox Code Playgroud) 我喜欢使用python evdev向设备发送隆隆声效果。这应该通过函数来实现,它需要一个缓冲区对象作为输入。upload_effect()
这就是capabilities()揭示:
('EV_FF', 21L): [
(['FF_EFFECT_MIN', 'FF_RUMBLE'], 80L),
('FF_PERIODIC', 81L),
(['FF_SQUARE', 'FF_WAVEFORM_MIN'], 88L),
('FF_TRIANGLE', 89L),
('FF_SINE', 90L),
('FF_GAIN', 96L),
],
Run Code Online (Sandbox Code Playgroud)
如何创建该缓冲区?
要发送字母“a”,HID 设备会发送以下扫描代码:00 00 04 00 00 00 00 00。
与字符“a”对应的值是<AC01>(在 中找到/usr/share/X11/xkb/symbols/us)。根据/usr/share/X11/xkb/keycodes/evdev,<AC01>通过按钮代码映射到38(这是我们必须从设备获取的)。
evtest /dev/input/event#显示代码30。为什么?
我正在使用Raspian操作系统在Raspberry Pi上使用Python。我安装了evdev-0.4.7它,并且对Python 2.7正常工作。但是,当我为Python 3.3尝试时,出现错误。显然,它仅安装在Python 2.7上。
如何evdev在Python 3.3上安装?
当我在 Linux 内核 v5.14 上连接游戏手柄时,会显示两个新设备:
/dev/input/event23
/dev/input/js1
Run Code Online (Sandbox Code Playgroud)
如果我cat <file> | xxd两个设备文件都提供游戏手柄事件信息。但event23比 更加冗长js1。
另外,在 上evtest给出错误,但在 上工作正常。当我使用 libevdev 两个设备文件时,也会发生同样的情况。Invalid Argumentjs1event23
看起来每个事件都会js1转储结构的内容input_event(在 中定义linux/input.h)
设备文件之间有什么区别?为什么他们有不同的信息以及event23提供了哪些更多信息js1?
有没有办法python-evdev在Mac OS上安装库?当我尝试安装它时,Mac说The linux/input.h header file is missing.(当然).可以在Mac下安装它吗?或者你知道其他任何选择吗?
我有一个读取Wacom输入的应用程序,/dev/input/wacom它在Linux上运行良好,但我也试图在Mac下运行它.
我有一个以下代码,用于捕获条形码扫描器的输入.问题在于我想将整个扫描的代码保存在数据库中,但代码的每个字符都在新行上打印:
#!/usr/bin/env python
from evdev import InputDevice, ecodes, list_devices
from select import select
keys = "X^1234567890XXXXqwertzuiopXXXXasdfghjklXXXXXyxcvbnmXXXXXXXXXXXXXXXXXXXXXXX"
dev = InputDevice("/dev/input/event10")
barcode = ""
while True:
r,w,x = select([dev], [], [])
for event in dev.read():
if event.type == 1 and event.value == 1:
barcode += (keys[event.code])
print barcode
# sudo ./bar-code-test.py
#0
#00
#00
#000
#001
#1001
#0017
#70017
#00170
#000170
#001708
#8001708
#0017085
#50017085
#00170853
#300170853
#001708531
#1001708531
#0017085316
#60017085316
#00170853160
#000170853160
#001708531601
#1001708531601
#0017085316013
#30017085316013
#00170853160131
#100170853160131
#00170853160131X
#00170853160131X
Run Code Online (Sandbox Code Playgroud)
我是python的新手,所以任何帮助将不胜感激.
我正在编写一个守护进程,它监听输入设备的按键按下并通过 D-Bus 发送信号。主要目标是通过请求更改或通知更改来管理音频音量和屏幕背光级别。我使用libevdev来处理输入设备事件。
我写了一个函数来打开位于指定路径的输入设备:
Device device_open(const char *path);
Run Code Online (Sandbox Code Playgroud)
该函数运行良好,但是当我为它编写单元测试时,我想创建具有不同属性(文件的存在、读取访问等)的文件装置来检查我的函数和内存管理的错误处理(如我将数据存储在结构中)。
但是使用真实的输入设备(位于 /dev/input/event*)测试它需要root访问权限。在 /dev/input/event* 文件上为每个人设置读取访问权限有效,但对我来说似乎有风险。以 root 身份执行我的测试更糟!
使用mknod作品创建设备,但需要以 root 身份完成。
我还尝试使用字符特殊文件(因为输入设备是其中之一)允许所有人读取(例如 /dev/random、/dev/zero、/dev/null 甚至我当前使用的终端设备:/dev /tty2)。
但是这些设备不处理ioctllibevdev 所需的请求:EVIOCGBIT是第一个返回错误“设备的 ioctl 不合适”的请求。
我希望能够以普通用户(执行单元测试的用户)的身份创建设备文件。然后,通过设置访问权限,我应该能够针对不同类型的文件(只读、不允许读取、错误设备类型等)测试我的函数行为。如果这看起来不可能,我肯定会使用私人助手重构我的功能。但是怎么做。有什么例子吗?
谢谢。
编辑:我试图更好地表达我的需求。