Linux上的C ++:作为systemd服务运行时监听键盘输入

问题描述 投票:2回答:1

因此,对此主题有一些疑问,但没有真正高质量的答案。

我的问题是:我有一个在Raspberry Pi上运行的嵌入式应用程序,该应用程序是通过init.d启动的。整个设置没有屏幕,并且通常应该在生产使用的网络禁用的情况下正常工作(因为它将进入WiFi /蓝牙干扰可能成问题的环境)。

我想使用通用USB键盘/数字键盘作为输入设备,以进行配置和故障排除。自然,我不能只从cin读取内容,因为我的程序不在终端上运行(实际上,没有终端)。

我应该如何做到这一点,最好是在我不必担心键盘布局和/或插入的输入设备的数量的水平上?

edit我可能的解决方法是涉及自动登录和.profile脚本。不过,如果有人对此有解决方案,将不胜感激。

c++ input raspberry-pi embedded-linux systemd
1个回答
0
投票

似乎@meuh赢得了Cookie的最佳建议:libevdev恰到好处。

[我发现this answer解决了将键(ALT-X)绑定以自动启动程序的相关问题,并且整体结构确实很容易适应(我的修改后的代码在下面)。

在获得的每个struct input_event中,您寻找ev.type == EV_KEY来挑选键盘事件(而不是鼠标或其他事件),ev.code包含键的代码(KEY_UPKEY_0,[ C0],KEY_KP5等。我仅使用数字键盘进行测试,所以我没有得到班次或alt之类的信息,但我怀疑它很简单。

您还可以查看KEY_BACKSPACE,它可以是:

  • ev.value-按下键
  • [EV_KEY-键重复值(可选,可以大于一个)]
  • EV_REL-向上键

我想对于某些应用程序,您可以忽略EV_SYN以外的所有内容来捕获按键事件;这就是我要做的。

EV_SYN

请注意,键值不是ASCII,也不是传统的键盘扫描代码-它们是一个全新的名称空间,可能还有其他一些抽象层可以转换为常规ASCII,但我没有将其用作KEY_ *代码适合我的应用。但这比我以前使用的糟糕的$ sudo ./evtest Device /dev/input/event1 is open and associated w/ libevent KEY: Value=EV_KEY; Code=KEY_KP7 <-- KP = keypad KEY: Value=EV_SYN; Code=KEY_KP7 KEY: Value=EV_KEY; Code=KEY_KP8 KEY: Value=EV_SYN; Code=KEY_KP8 KEY: Value=EV_KEY; Code=KEY_KP9 KEY: Value=EV_SYN; Code=KEY_KP9 机制要好。

它确实需要root权限,这是有道理的,因为否则您的用户模式程序可能会躺在等待超级用户登录控制台的过程中,从而抓住他们的密码。对于嵌入式应用程序,我确定这不会成为问题。

谢谢,@ meuh给了个很好的建议。而且,我什至不必编写设备驱动程序!

下面的代码在运行Debian Buster的BeagleBone上运行。

/dev/hidraw0
© www.soinside.com 2019 - 2024. All rights reserved.