【完走賞ゲット-14】node-hid の hid-showdevicesコマンドで HIDデバイスに関する情報を出力（Node.js、JavaScript）

## はじめに
こちらは、[完走賞ゲットのため小ネタを毎日投稿しようとチャレンジする Advent Calendar 2022](https://qiita.com/advent-calendar/2022/youtoy) の 14日目の記事です。

記事の内容は、「JavaScript ＋ HID用のライブラリ」という組み合わせで検索をすると、検索上位に出てくる [node-hid](https://www.npmjs.com/package/node-hid) の話です。
もう少し補足すると、その node-hid の公式情報の中に出てくる「hid-showdevices」のコマンドに関する内容です。
![node-hid の hid-showdevices について](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/50868/28686cf4-77ca-c094-c9ee-44a7ca1b0398.png)
これに興味を持った経緯は、以下のとおりです。

1. 個人的に HID関連の技術の話が気になってきた
1. WebHID や HID 関連の調べものをした（※ [WebHID については Qiita の記事も書いたりした](https://qiita.com/youtoy/items/f94d861ba5b433aa7008)）
1. HID を使った開発のお試しを進めていこうと思い、それに役立ちそうなものを調べた
1. node-hid の公式情報の中に出てくる「hid-showdevices」を見かけた
1. PC に USB接続された HIDデバイスの情報を取得するのに便利そうで試したくなった
　
## node-hid について
本題に入る前に、node-hidなどについて、少し触れておきます。

node-hid は公式での説明書きにもあるとおり、「USB接続された HIDデバイスの情報を Node.js で取得できる」というものです。
![node-hid のページトップ](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/50868/47699e88-a91f-d9be-e7ef-297059b68967.png)

## hid-showdevices関連の話
node-hid に含まれる hid-showdevices についても、少し補足します。

### hid-showdevices について
hid-showdevices は、記事の冒頭などでも書いたとおり、USB接続された HIDデバイスの情報を確認することができる仕組みのようです。

公式ページにあるとおり、node-hid をグローバルインストールした場合は、コマンドとして利用できるようです（`libusb` と `hidraw` のものがあるけれど、公式の説明を見ると、Linux以外の環境では気にせず一方を使えば良さそう？）。

```bash
$ npm install -g node-hid
$ hid-showdevices libusb
$ hid-showdevices hidraw
```

hid-showdevices の実装は、公式の GitHubリポジトリ内の以下を見ると、確認することができるようです。
●node-hid/show-devices.js at master · node-hid/node-hid · GitHub
　https://github.com/node-hid/node-hid/blob/master/src/show-devices.js

### hid-showdevices を実際に使ってみる
#### hid-showdevices の準備と実行するコマンド（※ ローカルインストールの場合）
それでは hid-showdevicesコマンドを、実際に試してみます。
自分は、パッケージのインストールで、よくローカルインストールを使っているので、ここでのお試しでもその方法でやっていきます。

インストールは `npm install node-hid` で行います。
その後、hid-showdevices コマンドを使います。コマンドを実行する際、node-hid をグローバルインストールしていないため、直接 hid-showdevices は実行できない状況ですので、「npxコマンド」 を活用します。

hid-showdevicesコマンドの実行は、以下で行います（最初に、 `npx` をつけるだけです）。
この後は、 `libusb` のほうを使って進めていこうと思います。

```bash
$ npx hid-showdevices libusb
$ npx hid-showdevices hidraw
```

#### Windows と Mac でインストール
なお、自分はこの手順を、Windows と Mac の両方で試してみました。

※ Windows のコマンドプロンプトでインストール
![Windows の場合](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/50868/5dd5b228-6eea-1a42-6a16-6719ecd86fd2.png)

※ Mac のターミナルでインストール
![Macの場合](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/50868/9c94515e-1851-ecbf-d1aa-e8f31d4a6b98.png)

どちらの環境でも、問題なくインストールを完了させられました。

#### Mac で hid-showdevices を実行した結果の例（※　一部のみ）
それでは、hid-showdevices を実行してみます。
Mac（MacBook Pro 13-inch, 2020）に USB接続された機器が無い状態で、 `npx hid-showdevices libusb` を実行してみました。

実行後の出力でいろいろ出てきましたが、Apple関連のものの一部のみを抜粋してみます。

- manufacturer: 'Apple Inc.' ／ 'Apple' （vendorId: 1452）
   - productId: 33026, product: 'Touch Bar Backlight',
   - productId: 33027, product: 'Headset',
   - productId: 638, product: 'Apple Internal Keyboard / Trackpad',
   - productId: 33378, product: 'Ambient Light Sensor',
   - productId: 33538, product: 'Touch Bar Display',

上記の中の、例えば「Touch Bar Backlight」についてはこんな感じで出力されます。
![2022-12-14_10-09-06.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/50868/59c38944-2cb3-138c-c6c2-0a58549cc78f.jpeg)

また、外部デバイスを何かつないだ状態でも試してみます。
DualShock 4 を USB接続した後に再度コマンドを実行してみます。きちんと情報がとれているようです。
![DualShock 4 に関する出力](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/50868/e9c4fa03-d141-d44f-0196-4277e84f1a32.jpeg)

それと、別の外部デバイスのお試しを。
以下の写真の右のほうにうつっている、有線のコントローラーでも試してみました。

https://twitter.com/youtoy/status/1602915398239895552

そして、こんな結果が出力されました。
![2022-12-14_16-11-26.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/50868/1a1ab931-2956-61c3-466c-e0975002be42.jpeg)

いろいろ、HIDデバイスの情報を閲覧できそうです。

## おわりに
node-hid の hid-showdevicesコマンドで、HIDデバイスの情報を見てみるというのをやってみました。
引き続き、HIDデバイス絡みのことは、手をつけていければと思っています。ちなみに、WebHID をあれこれ試してみようと思っていたりします。

### 余談
ふと思ったことを余談で書いてみます。
HID を略さず書くと「Human Interface Device」で、タイトルなどに書いた「HIDデバイス」という呼び方を今までも使っていたけど、よく考えたら「Device　が二重になっている？」とか思いました。
　●Human interface device - Wikipedia
　　https://en.wikipedia.org/wiki/Human_interface_device

でも、HIDデバイスって言い方で、今まで見かけていたような気もすると思ったので、あらためて確認。「以下の WebHID の仕様のページ」を見るのが間違いなかな、と思って見てみたら「HID devices」などという記載があったので、気にしなくて大丈夫そうだなと思ったりなど。
　●WebHID API
　　https://wicg.github.io/webhid/
![WebHID API のページ](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/50868/db8d3668-bcad-0757-4f86-0f69d6c6f0a2.png)