gpt4 book ai didi

c - 除了/dev/input/eventx 之外,是否有更高级别(字符?)的方式来访问 Linux 键盘?

转载 作者:太空狗 更新时间:2023-10-29 12:39:39 24 4
gpt4 key购买 nike

我正在尝试编写一个需要从类键盘 (HID) 设备获取输入的 Linux 守护程序 - 它不是控制台键盘,而是第二个设备(如果有任何区别,它实际上是一维条形码扫描仪) .守护进程将处理它接收到的数据(来自字母数字条形码的“击键”)。

我知道守护进程可以使用 ioctl(EVIOCGRAB) 从/dev/input/eventx 中获取该设备,然后读取 () 事件(struct input_event from ),这是有效的,但它太低了满足我需要的水平。我不需要知道每个上下键事件,我宁愿不必解码/处理同步键,即我不想知道 KEY_DOWN+KEY_RTSHIFT、KEY_DOWN+KEY_A、KEY_UP+KEY_RTSHIFT、KEY_UP+KEY_A ,我只想收到“A”。

使用输入事件需要编写一大堆额外的代码,只是为了从中得到“A”——这似乎是在浪费时间和精力,因为几乎肯定有现有的键盘处理程序(或类似的东西) ) 这比我一起破解代码要好得多 - 我就是找不到它们!

有没有什么方法可以将现有的(键盘?)软件层放到/dev/input/eventx 上,然后守护进程可以从中专门读取简单的 ascii 流?

对于这个设备,/proc/bus/input/devices 报告 ...

H: Handlers=sysrq kbd leds event9

...这可能表明某些东西已经在其上放置了一个“kbd”层,但是如何访问它呢?

如果我不使用 EVIOCGRAB,那么当我扫描条形码时,我会看到关于“在/dev/tty1 上登录失败”的系统日志,因此键盘输入显然是在尝试登录到某处的终端/shell :-/(有这台机器上也没有 X、桌面等。)

最佳答案

我不知道有这样的库或守护进程。

然而,编写一个守护进程来执行此操作并不像您想象的那么难。以我的观点/经验,如果您不需要实现自动重复(也就是说,只有在类似键盘的设备发送自动重复按键时才执行自动重复),守护进程非常简单。

特别是,主循环只是一个阻塞读取,然后是零个或多个阻塞写入,中间是一个数组查找。

您可以使用命名管道(在这种情况下,您在打开设备之前打开管道,因为只有在另一个进程打开命名管道或 FIFO 进行读取后,打开才会成功),或者套接字; Unix 域套接字,或者 TCP 或 UDP 套接字(在环回接口(interface)上)。我可能会使用命名管道,/var/run/barcode-scanner

我会为输入映射使用单独的配置文件,并且我会支持来自 /usr/include/linux/input-event-codes 的预处理器宏名称 (KEY_) .h,使用辅助 awk 脚本解析为数组。键映射文件可能位于 /etc/barcode-scanner/keymap 中,并包含类似于

的定义
KEY_1 = 1
KEY_NUMERIC_1 = 1
KEY_E = e
shift KEY_E = E
ctrl KEY_E = \5
altgr KEY_E = €
KEY_UP = \033[A

等等。定义文件中未列出的事件将被忽略或可选择记录。

可以使用数组,因为最多有768个(0到KEY_MAX,含;虽然0是KEY_RESERVED)个不同的键盘事件;作为二维数组,您可能需要 16 个数组,以支持 ShiftCtrlAltAltGr(或右 alt 键),当按下每个键时。在内部,您只需要处理 KEY_LEFTSHIFTKEY_RIGHTSHIFTKEY_CAPSLOCK(以管理换档状态); KEY_LEFTALT(管理 alt 状态); KEY_RIGHTALT(管理 altgr 状态);以及 KEY_LEFTCTRLKEY_RIGHTCTRL(用于管理 ctrl 状态)。如果使用位掩码来指示当前状态,则可以将其用作查找数组外部维度的索引。这真的非常简单。

请注意,每个数组元素都是一个字符串,当按下该状态的键时会发出该字符串(ev.value == 1 对于按键,ev.value == 2 用于自动重复)。除了上述特殊键,您根本不需要处理键释放。

嗯。我想知道是否还有其他人需要这样的守护进程?如果源代码位于 GitHub,您会使用 GPL3 许可的吗?

关于c - 除了/dev/input/eventx 之外,是否有更高级别(字符?)的方式来访问 Linux 键盘?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50309081/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com