我有一个注册为HID设备的RFID USB设备(一个或多个USB键盘)。
我正在寻找一种捕获此输入的方法,并在它击中普通键盘事件处理程序之前对其进行阻止/过滤(并将10位RFID代码输出到控制台)。
我当然必须专门捕获该设备,而不必留下真正的键盘输入(或传递它)。
我最初的想法是在UDEV中阻止该设备(因此usbhid / event / kbd内核模块未绑定到该设备)并为该设备编写我自己的基本驱动程序- 但我不知道从哪里开始,或者是否甚至会工作。
很棒(而且我不确定是否可以完成这样的事情)-是如果我编写了一个事件过滤器模块,该模块可以与事件驱动程序串联,并捕获(然后过滤)来自RFID单元,但让其他所有东西都通过。我想这样的模块不需要太多的代码,并且将是最实用的。
帮帮我?
[编辑:我应该补充一点,未安装Xorg-仅限控制台]
cat /proc/bus/input: I: Bus=0003 Vendor=0419 Product=0912 Version=0100 N: Name="NewRoad Sem. NewRoad System PS2 Interface" P: Phys=usb-0000:00:1d.3-2/input0 S: Sysfs=/devices/pci0000:00/0000:00:1d.3/usb5/5-2/5-2:1.0/input/input20 U: Uniq= H: Handlers=sysrq kbd mouse0 event3 B: PROP=0 B: EV=120017 B: KEY=70000 0 0 e080ffdf01cfffff fffffffffffffffe B: REL=103 B: MSC=10 B: LED=1f
更多信息:
lsusb -d 0419:0912 -v Bus 005 Device 019: ID 0419:0912 Samsung Info. Systems America, Inc. Device Descriptor: bLength 18 bDescriptorType 1 bcdUSB 1.00 bDeviceClass 0 (Defined at Interface level) bDeviceSubClass 0 bDeviceProtocol 0 bMaxPacketSize0 8 idVendor 0x0419 Samsung Info. Systems America, Inc. idProduct 0x0912 bcdDevice 0.01 iManufacturer 1 NewRoad Sem. iProduct 2 NewRoad System PS2 Interface iSerial 0 bNumConfigurations 1 Configuration Descriptor: bLength 9 bDescriptorType 2 wTotalLength 34 bNumInterfaces 1 bConfigurationValue 1 iConfiguration 4 bmAttributes 0xa0 (Bus Powered) Remote Wakeup MaxPower 100mA 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 5 HID Device Descriptor: bLength 9 bDescriptorType 33 bcdHID 1.00 bCountryCode 0 Not supported bNumDescriptors 1 bDescriptorType 34 Report wDescriptorLength 119 Report Descriptors: ** UNAVAILABLE ** Endpoint Descriptor: bLength 7 bDescriptorType 5 bEndpointAddress 0x81 EP 1 IN bmAttributes 3 Transfer Type Interrupt Synch Type None Usage Type Data wMaxPacketSize 0x0008 1x 8 bytes bInterval 10 Device Status: 0x0000 (Bus Powered)
因此,根据我在此处找到的帖子,我整理了一个概念验证应用
它确实满足了我的要求-即使我仍然会分享我的解决方案。
#include <stdio.h> #include <stdlib.h> #include <string.h> #include <unistd.h> #include <errno.h> #include <fcntl.h> #include <dirent.h> #include <linux/input.h> #include <sys/types.h> #include <sys/stat.h> #include <sys/select.h> #include <sys/time.h> #include <termios.h> #include <signal.h> int main(int argc, char* argv[]) { struct input_event ev[64]; int fevdev = -1; int result = 0; int size = sizeof(struct input_event); int rd; int value; char name[256] = "Unknown"; char *device = "/dev/input/event3"; fevdev = open(device, O_RDONLY); if (fevdev == -1) { printf("Failed to open event device.\n"); exit(1); } result = ioctl(fevdev, EVIOCGNAME(sizeof(name)), name); printf ("Reading From : %s (%s)\n", device, name); printf("Getting exclusive access: "); result = ioctl(fevdev, EVIOCGRAB, 1); printf("%s\n", (result == 0) ? "SUCCESS" : "FAILURE"); while (1) { if ((rd = read(fevdev, ev, size * 64)) < size) { break; } value = ev[0].value; if (value != ' ' && ev[1].value == 1 && ev[1].type == 1) { printf ("Code[%d]\n", (ev[1].code)); } } printf("Exiting.\n"); result = ioctl(fevdev, EVIOCGRAB, 1); close(fevdev); return 0; }