问题描述
我正在构建某种信息亭系统,并且为此购买了USB USB DIY键盘:https://www.amazon.com/gp/product/B07QPXQQ7L
这使我有很多按钮,它们的行为类似于键盘按键。
我正在编写一个程序(Perl),它将从该键盘获取输入并根据该输入执行操作。
问题是我需要让系统的其余部分(X和TTY)都忽略该键盘,以便它不会在终端或窗口管理器中键入随机内容。换句话说,系统应该忽略它,但是设备本身仍然必须在/ dev / input /...
中可用。我不需要真正的键盘来控制机器,因为我通过VNC和SSH连接。
如果您知道如何从/ dev / input / ...键盘进行读取并以与终端中的STDIN相同的方式输入字母,则奖励积分。
谢谢!
解决方法
我在这里找到了解决方案,在这种情况下,对于条形码读取器,有人想要完全一样的东西: https://serverfault.com/questions/385260/bind-usb-keyboard-exclusively-to-specific-application/976557#976557
SUBSYSTEM=="input",ACTION=="add",ATTRS{idVendor}=="xxxx",ATTRS{idProduct}=="yyyy",RUN+="/bin/sh -c 'echo remove > /sys$env{DEVPATH}/uevent'"
ACTION=="add",SYMLINK+="diykeyboard"
然后用lsusb
中的供应商和产品ID替换 xxxx 和 yyyy 。因此,以我为例 1c4f 和 0002 :
Bus 001 Device 003: ID 1c4f:0002 SiGma Micro Keyboard TRACER Gamma Ivory
udevadm control --reload
的事情对我没有帮助,我不得不重新启动。
那么从理论上讲,应该在/dev/diykeyboard
(SYMLINK变量)处可以使用键盘上键入的数据。
现在不幸的是,在我的情况下,有多个事件与此供应商+产品匹配,并且与正确的事件匹配,我需要在第二行中添加DEVPATH=="*:1.0/*",KERNEL=="event*"
,以创建SYMLINK。然后惊奇的是它没有在/ dev中创建链接,所以我不得不做点脏事,自己用ln创建一个链接:
SUBSYSTEM=="input",ATTRS{idVendor}=="1c4f",ATTRS{idProduct}=="0002",RUN+="/bin/sh -c 'echo remove > /sys$env{DEVPATH}/uevent'"
SUBSYSTEM=="input",DEVPATH=="*:1.0/*",KERNEL=="event*",RUN+="/bin/sh -c 'ln -sf /dev/input/$kernel /diykeyboard'"
(不要在/ tmp中创建链接,因为udev发生在引导时/ tmp的安装之前)
从那里我可以用/diykeyboard
来显示/dev/input/event0
(通常指向evtest
),它显示键入的密钥,或者直接用我的程序读取然后解码扫描代码。 / p>