如何让Linux忽略键盘,同时让我的程序可以读取它?

如何让Linux忽略键盘,同时让我的程序可以读取它?,linux,linux-kernel,keyboard,custom-keyboard,Linux,Linux Kernel,Keyboard,Custom Keyboard,我正在建立某种信息亭系统,为此我买了这个USB DIY键盘: 这使我有很多按钮,它们的行为就像键盘键 我正在编写一个程序(Perl),它将从键盘获取输入,并基于键盘进行操作 问题是,我需要让系统的其余部分(X和TTY)忽略该键盘,这样它就不会在终端或窗口管理器中键入随机内容。换句话说,系统应该忽略它,但设备本身必须在/dev/input/…中仍然可用 我不需要真正的键盘来控制机器,因为我通过VNC和SSH进行连接 如果您知道如何从/dev/input/读取数据,则可获得额外积分。。。键盘上输入字

我正在建立某种信息亭系统,为此我买了这个USB DIY键盘:

这使我有很多按钮,它们的行为就像键盘键

我正在编写一个程序(Perl),它将从键盘获取输入,并基于键盘进行操作

问题是,我需要让系统的其余部分(X和TTY)忽略该键盘,这样它就不会在终端或窗口管理器中键入随机内容。换句话说,系统应该忽略它,但设备本身必须在/dev/input/…中仍然可用

我不需要真正的键盘来控制机器,因为我通过VNC和SSH进行连接

如果您知道如何从/dev/input/读取数据,则可获得额外积分。。。键盘上输入字母,就像在终端中使用标准输入法一样


谢谢

我在这里找到了一个解决方案,在条形码阅读器的情况下,有人想要完全相同的东西:

然后用供应商和产品ID替换xxxxyyyy,如
lsusb
中所示。所以在我的例子中,1c4f0002

Bus 001 Device 003: ID 1c4f:0002 SiGma Micro Keyboard TRACER Gamma Ivory
udevadm控件--reload(重新加载)这件事对我没用,我不得不重新启动

理论上,键盘上输入的数据应该可以在
/dev/diykeyboard
(SYMLINK变量)上找到

不幸的是,在我的例子中,有多个事件与这个供应商+产品匹配,为了匹配正确的事件,我需要在创建符号链接的第二行中添加
DEVPATH==“*:1.0/*”,KERNEL==“event*”
。令人惊讶的是,它没有在/dev中创建链接,所以我不得不做一些肮脏的事情,用ln自己创建一个链接:

SUBSYSTEM=="input", ACTION=="add", ATTRS{idVendor}=="1c4f", ATTRS{idProduct}=="0002", RUN+="/bin/sh -c 'echo remove > /sys$env{DEVPATH}/uevent'"
SUBSYSTEM=="input", ACTION=="add", ATTRS{idVendor}=="1c4f", ATTRS{idProduct}=="0002", DEVPATH=="*:1.0/*", KERNEL=="event*", RUN+="/bin/sh -c 'ln -sf /dev/input/$kernel /diykeyboard'"
(不要在/tmp中创建链接,因为udev发生在引导时安装/tmp之前)

从那里,我可以通过显示键入的键的evtest读取
/diykeyboard
(通常指向
/dev/input/event0
),或者直接使用我的程序读取扫描码

SUBSYSTEM=="input", ACTION=="add", ATTRS{idVendor}=="1c4f", ATTRS{idProduct}=="0002", RUN+="/bin/sh -c 'echo remove > /sys$env{DEVPATH}/uevent'"
SUBSYSTEM=="input", ACTION=="add", ATTRS{idVendor}=="1c4f", ATTRS{idProduct}=="0002", DEVPATH=="*:1.0/*", KERNEL=="event*", RUN+="/bin/sh -c 'ln -sf /dev/input/$kernel /diykeyboard'"