Czy byłoby możliwe odczytanie fizycznych uderzeń klawiatury w node.js?

Mam aplikację węzłową, która działa na raspberry pi, która śledzi grupę graczy UPnP (Sonos), które chciałbym móc kontrolować za pomocą fizycznego pilota. Mam kilka masek powietrznych, które mają małe klawiatury i przyciski głośności, których chciałbym użyć.

Próbowałem zdobyć wiedzę na temat odczytywania fizycznych uderzeń klawiszy na komputerze z systemem Linux i doszedłem do wniosku, że muszę odczytać zdarzenia z urządzenia wejściowego, które w moim przypadku byłoby:

/dev/input/by-id/usb-Dell_Dell_QuietKey_Keyboard-event-kbd

Jak znaleźć urządzenie i tego typu rzeczy nie stanowi problemu, prawdziwym problemem jest to, jak interpretować dane, które z niego czytasz.

Wiem, że otrzymasz strukturę C, taką jak ta:

struct input_event {
    struct timeval time;
    unsigned short type;
    unsigned short code;
    unsigned int value;
};

Ale nie jestem pewien, jak bym czytał to z węzła. Gdybym mógł uruchomić zewnętrzną aplikację, która byłaby uruchamiana z predefiniowanych naciśnięć klawiszy, a następnie wywołać żądanie HTTP przeciwko mojemu węzłowi, byłaby to moja druga opcja, skrypt Pythona lub jakiś rodzimy demon. Spojrzałem jednak na niektóre demony skrótów klawiszowych, ale żaden z nich nie działał.

Gdyby oczywiście było miło, gdybym mógł jakoś je zawrzeć w węźle.

EDYCJA: Więc zrobiłem kilka testów i zrobiłem prosty fragment kodu:

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)
    }
});

W ten sposób powstaje coś takiego (dla spacji):

<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>

Zdaję sobie sprawę, że pierwsze cztery bajty są pewnego rodzaju datownikiem, a kolejne 3 bajty mogą być czymś w rodzaju mikro / milisekundy.

Inną dziwną rzeczą jest to, że nie wszystkie naciśnięcia klawiszy generują dane wyjściowe, ale kolejne naciśnięcie może wysłać dwa razy więcej danych, a przez większość czasu zaczyna wysadzać dane, które zatrzymałyby się po kolejnych naciśnięciach klawiszy (lub po około 20 sekundach). Nie jestem pewien, jak to zinterpretować. Próbowałem odczytać źródło tego demonahttps://github.com/baskerville/shkd/blob/master ale C nie jest moim najsilniejszym językiem i nie mogę określić, jak on sobie z tym radzi (lub czy powinien być obsługiwany). I ten demon nawet nie działał dla mnie (skompilowałem go na piśmie Raspberry).

questionAnswers(2)

yourAnswerToTheQuestion