请原谅我对 Linux 操作系统/硬件问题的无知...我只是一名程序员:)
我有一个应用程序,它调用一些 bash 脚本来启动外部应用程序,在本例中是 Firefox。该应用程序在具有触摸屏功能的信息亭上运行。启动 Firefox 时,我还会启动一个虚拟键盘应用程序,允许用户进行键盘输入。
不过,信息亭还配有 PS/2 和 USB 插槽,用户可以插入键盘。如果插入了键盘,我就不必启动虚拟键盘,为 Firefox 窗口提供更多屏幕空间,这样就太好了。
有没有办法让我从 bash 脚本中检测键盘是否插入?它会显示在 /dev 中吗?如果是,它会显示在一致的位置吗?如果用户使用 PS/2 或 USB 键盘,会有什么不同吗?
谢谢!
答案1
对于 USB 设备,您可以使用lsusb
并搜索具有键盘协议(接口协议 1)的人机接口设备(接口类别 3),例如
$ lsusb -v
... loads of stuff deleted ...
Interface Descriptor:
bLength 9
bDescriptorType 4
bInterfaceNumber 0
bAlternateSetting 0
bNumEndpoints 1
bInterfaceClass 3 Human Interface Device
bInterfaceSubClass 1 Boot Interface Subclass
bInterfaceProtocol 1 Keyboard
iInterface 0
... loads of stuff deleted ...
另外,你可以让udev
帮助你。列出下面的设备/dev/input/by-path/
,并以 结尾的键盘设备-kdb
(至少在 Ubuntu 中,udev 规则指定了它),例如
$ ls -l /dev/input/by-path/*-kbd
lrwxrwxrwx 1 root root 9 2010-03-25 09:14 /dev/input/by-path/pci-0000:00:1a.2-usb-0:1:1.0-event-kbd -> ../event4
$ ls -l /dev/input/by-path/*-kbd
lrwxrwxrwx 1 root root 9 2009-08-29 09:46 /dev/input/by-path/platform-i8042-serio-0-event-kbd -> ../event1
答案2
答案3
对于 USB 键盘,我通常通过在“lsusb -v”输出中搜索单词“键盘”来找到键盘设备:
lsusb -v 2>/dev/null | egrep '(^Bus|Keyboard)' | grep -B1 Keyboard
示例输出:
Bus 001 Device 004: ID 413c:2006 Dell Computer Corp.
bInterfaceProtocol 1 Keyboard
更通用的方法是搜索 /sys/bus 以查找任何同时为 bInterfaceClass 03 和 bInterfaceProtocol 01 的设备。由于您必须检测非 USB 设备,并且想要在脚本中使用输出,因此这种方法可能更适合您:
grep -l 03 /sys/bus/*/*/*/bInterfaceClass |
sed 's/Class$/Protocol/' |
xargs grep -l 01 |
xargs dirname
示例输出:
/sys/bus/usb/devices/1-4.1:1.0
警告:我找不到 PS/2 键盘来测试此脚本。由于此主题已有七年多历史,我猜原始问题的作者早已离开,不再需要 PS/2 检测。无论如何,我都会留下这个答案,希望其他人可能会觉得它有用,但请注意,我还没有使用非 USB 设备对此进行测试。
答案4
对于 USB,您可以在 /sys/bus/usb/devices 中搜索具有以下配置的设备:接口为类 HID(0x03)且协议为键盘(0x01)。
Bash 脚本:
#!/bin/bash
for dev in /sys/bus/usb/devices/*-*:*
do
if [ -f $dev/bInterfaceClass ]
then
if [[ "$(cat $dev/bInterfaceClass)" == "03" && "$(cat $dev/bInterfaceProtocol)" == "01" ]]
then
echo "Keyboard detected: $dev"
fi
fi
done