我拥有的:
- Linux 机器(Debian 稳定版)无显示器、键盘、无 X 运行
- USB 设备,其作用类似于 USB 键盘(如许多条形码阅读器 [1])
我(不)想要的是:
- 我只想将此设备用于一个特定的应用程序。
- 我不想让该设备干扰
login
启动后的进程或其他任何事情 - 除了一个应用程序。 - 无论如何,我希望能够插入一个普通的旧 USB 键盘并使用它 - 不管是否连接了上述多少其他 USB 设备。
我(不知道)的是:
- 我找到了一些示例代码,关于如何直接从事件设备读取,并且可以在我的应用程序中使用它(如果需要)。
- 我不知道,如何禁用除此特定应用程序之外的整个系统的特定键盘?这可能吗?
谢谢任何提示...!
[1] 当设备读取条形码时,它会将检测到的代码作为单击按键发送并提交return。
答案1
一个具有挑战性且有趣的问题!
我认为udev
也许可以做到这一点。创建一个文件/etc/udev/rules.d/99-barcode-reader.rules
并在其中放入类似以下内容的内容:
ACTIONS!="add", GOTO="barcode_end"
SUBSYSTEM=="usb", ENV{DEVTYPE}=="usb_device", ATTRS{idVendor}=="dead", ATTRS{idProduct}=="beef", PROGRAM="/bin/sh -c 'logger -p user.info Hey, I see a new device $env{BUSNUM} $env{DEVNUM}'", RUN+="/bin/sh -c '/usr/local/bin/your_barcode_application &'"
LABEL="barcode_end"
将“dead”和“beef”替换为您获得的 idVendor 和 idProduct 的值lsusb
。
重新启动udevd
或简单地重新启动您的服务器,看看会发生什么。
答案2
我不知道这是否是您想要做的,但如果您想禁用在 stdin/console 中输出条形码序列的键盘模拟,请尝试以下操作:
创建文件“/etc/udev/rules.d/10-barcode.rules”
SUBSYSTEM=="input", ACTION=="add", ATTRS{idVendor}=="xxxx", ATTRS{idProduct}=="yyy", RUN+="/bin/sh -c 'echo remove > /sys$env{DEVPATH}/uevent'"
ACTION=="add", ATTRS{idVendor}=="xxxx", ATTRS{idProduct}=="yyyy", SYMLINK+="barcode"
当然,将 xxxx 和 yyyy 替换为你自己的 vendor_id 和 product_id,然后使用“udevadm control --reload”重新加载规则
这将删除模拟键盘的事件/输入部分,并保留 hidraw 部分以访问条形码扫描。第二行只是创建一个 /dev/barcode 设备来读取链接到 hidraw
只需在代码中打开该文件即可读取条形码发送的字符串
答案3
对于它的价值以及任何遇到类似问题的人来说;
我不知道是否可以禁用“键盘”,但由于系统无论如何都是无头的,您只需运行服务来处理 TTY1 中的输入,替换正常的登录提示。您仍然可以通过 ssh 或任何其他 TTY 正常登录,但在启动时,默认情况下,条形码阅读器输入无需额外操作即可得到正确处理。
一个很好的好处是在屏幕会话中运行所有这些,这样您就可以使用 ssh 连接到它。
有关说明,请查看我在 SU 上的回答这里。