如何拥有一个HID设备?

24

我希望能够拥有一个可能已经插入的HID设备,并消耗它的输出,同时防止其他人(X11或终端)消耗它的输出。

如果可以的话,我不想假装成一个终端,而是要独占某个特定的HID或字符设备。这个想法是有些HID设备可能会被x/终端识别为鼠标/键盘,但第二个鼠标或键盘可以用于其他用途,但为了实现这一点,您需要确保它们不会向打开的终端发送虚假输入。

有没有人知道如何实现这个想法?

1个回答

26

我已经完成了这个任务——我的具体应用是一个守护进程,从 USB HID 条形码读取器(呈现为 USB HID 键盘设备)中读取事件。

为此,我使用了事件设备接口,打开与所需设备对应的 /dev/input/event* 设备。您随后可以在该设备上发出 EVIOCGRAB ioctl 命令,以独占模式使用并且在事件(表示按键,鼠标移动等)可用时从设备中读取这些事件。

(当设备被独占使用时,只有您的应用程序会看到来自该设备的事件)。


2
听起来正是我需要的RFID读卡器,可以从标签中读取10位数字,并将信息呈现为键盘输入,以便与树莓派家庭自动化项目一起用作访问控制设备 - 并且仍然能够使用键盘/鼠标/监视器登录进行其他(调试)目的。 - SlySven
好的,谢谢。我想我会捕获输入并将其发送到REST webservice。在我的情况下,输入不是固定长度的。 - Michel L
1
@MichelL - 目前它还不完整,但最终我会尝试将其放在我的GitHub存储库中 - 但它将采用GPLv2+许可证,因此我不想在这里发布它,因为我还没有确定在此处发布的确切条款!基本上使用 int fd = open(devPathFile",O_RDWR | O_NONBLOCK,S_IRUSR | S_IWUSR) 打开设备并获取文件描述符号fd,然后使用ioctl(fd,EVIOCGRAB,1)来获取独占使用权。不要忘记处理将关闭您的程序的信号,以便您可以释放该独占性(虽然可能会在应用程序上自动发生... - SlySven
@SlySven 好的,谢谢。我会看看如何使用Qt处理事件。最终我会混合使用Qt和非Qt代码。 - Michel L
我有一个用Node编写的程序(不是独占读取USB设备,这也是我在这里的原因)。有趣的部分是:process.stdin.resume(); process.stdin.on("data", function (chunk) { console.log(chunk.toString()); }); process.on("SIGINT", function() { console.log("Detected Ctrl+C (SIGINT)"); process.exit(); }); - user1529413
显示剩余6条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接