多数の UPnP プレーヤー (Sonos) を追跡するラズベリー pi で実行されるノード アプリケーションがあり、これを物理的なリモートから制御できるようにしたいと考えています。私はいくつかのエアマウスを持っています。これには、小さなキーボードと、使用したい音量ボタンがあります。
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 要求を呼び出すことができれば、それが 2 番目のオプションである 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>
最初の 4 バイトはある種のタイムスタンプであり、次の 3 バイトはマイクロ/ミリ秒のようなものである可能性があることに気付きました。
もう 1 つの奇妙な点は、すべてのキー押下で出力が生成されるわけではなく、その後の押下で 2 倍のデータが送信される可能性があり、ほとんどの場合、後続のキー押下後 (または約 20 秒後) に停止するデータの爆発を開始します。それをどう解釈してよいのか、私にはよくわかりません。このデーモンのソースを読もうとしましたhttps://github.com/baskerville/shkd/blob/masterですが、Cは私の最強の言語ではなく、彼がそれをどのように処理するかを特定できません(または処理する必要があるかどうかもわかりません) )。そして、そのデーモンは私にとってさえ機能しませんでした(ラズベリーパイでコンパイルしました)。