Можно ли считать физические нажатия клавиш в файле node.js?
У меня есть нодовое приложение, которое работает на Raspberry Pi, которое отслеживает группу 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;
};
Но я'Я не уверен, как бы я прочитал это с узла. Если бы я мог запустить внешнее приложение, которое было бы вызвано предварительно определенными нажатиями клавиш, а затем вызвать 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)
}
});
Это выводит что-то вроде этого (для пространства):
Я понимаю, что первые четыре байта являются своего рода меткой времени, а следующие 3 байта могут быть чем-то вроде микро / миллисекунды.
Еще одна странность состоит в том, что не все нажатия клавиш выдают результат, но последующее нажатие может отправлять вдвое больше данных, и большую часть времени он начинает обрабатывать данные, которые прекращаются после последующих нажатий клавиш (или примерно через 20 секунд или около того). Я'Я не совсем уверен, как это интерпретировать. Я пытался прочитать исходный код этого демонаhttps://github.com/baskerville/shkd/blob/master но С не мой самый сильный язык, и я могуне определить, как он справляется с этим (или даже должен ли он быть обработан). И этот демон недаже не работает для меня (скомпилировал его на малиновом пи).