【发布时间】:2013-03-22 10:51:25
【问题描述】:
我有一个运行在树莓派上的节点应用程序,它跟踪一堆 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 脚本或一些本机守护程序。但是,我查看了一些热键守护程序,但它们都不起作用。
如果我能以某种方式将它包含在节点中当然会很好。
编辑:所以我做了一些测试,并做了一个简单的 sn-p:
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 不是我最强的语言,我无法确定他如何处理它(或者是否应该处理它)。而且那个守护进程甚至对我都不起作用(在树莓派上编译)。
【问题讨论】: