我有一个在树莓派上运行的节点应用程序,它跟踪一堆 UPnP 播放器(Sonos),我希望能够通过物理遥控器进行控制。我有几个空中鼠标,它们有小键盘以及我想使用的音量按钮。
我试图掌握如何在 linux 机器上读取物理按键,并得出结论,我需要从输入设备读取事件,在我的情况下是:
/dev/input/by-id/usb-Dell_Dell_QuietKey_Keyboard-event-kbd
如何找到设备和类似的东西不是问题,真正的问题是如何解释您从中读取的数据。
我知道你会收到一个 C 结构,如下所示:
struct input_event {
struct timeval time;
unsigned short type;
unsigned short code;
unsigned int value;
};
但我不确定如何从 node.js 读取这个。如果我可以运行一个由预定义的击键触发的外部应用程序,然后对我的节点调用一个 HTTP 请求,那将是我的第二个选择,一个 python 脚本或一些本机守护程序。但是,我查看了一些热键守护程序,但没有一个起作用。
如果我能以某种方式将它包含在节点中,那当然会很好。
编辑:所以我做了一些测试,并做了一个简单的片段:
var fs = require('fs');
var buffer = new Buffer(16);
fs.open('/dev/input/by-id/usb-HJT_Air_Mouse-event-kbd', 'r', function (err, fd) {
while (true) {
fs.readSync(fd, buffer, 0, 16, null);
console.log(buffer)
}
});
这会输出类似这样的内容(用于空间):
<Buffer a4 3e 5b 51 ab cf 03 00 04 00 04 00 2c 00 07 00>
<Buffer a4 3e 5b 51 c3 cf 03 00 01 00 39 00 01 00 00 00>
<Buffer a4 3e 5b 51 cb cf 03 00 00 00 00 00 00 00 00 00>
<Buffer a4 3e 5b 51 ba 40 06 00 04 00 04 00 2c 00 07 00>
<Buffer a4 3e 5b 51 cd 40 06 00 01 00 39 00 00 00 00 00>
<Buffer a4 3e 5b 51 d2 40 06 00 00 00 00 00 00 00 00 00>
我意识到前四个字节是某种时间戳,接下来的 3 个字节可能是微/毫秒的东西。
另一个奇怪的事情是,并非所有的按键都会产生输出,但是随后的按键可能会发送两倍的数据,并且大多数情况下它会开始输出数据,这些数据会在随后的按键后(或大约 20 秒左右)停止。我不确定如何解释。我已尝试阅读此守护程序的源代码https://github.com/baskerville/shkd/blob/master但 C 不是我最强的语言,我无法确定他如何处理它(或者是否应该处理它)。而且那个守护进程甚至对我不起作用(在树莓派上编译)。