需要拦截HID键盘事件(然后阻止它们)

我有一个注册为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;

}

以上是 需要拦截HID键盘事件(然后阻止它们) 的全部内容, 来源链接: utcz.com/qa/427423.html

回到顶部