Linux で libudev を使用して USB デバイスの VID と PID を取得する方法

Linux で libudev を使用して USB デバイスの VID と PID を取得する方法

この記事では、libudev ライブラリを使用して hidraw デバイスにアクセスします。 libudev ライブラリを使用すると、デバイスを開かずに、デバイスのベンダー ID (VID)、製品 ID (PID)、シリアル番号、デバイス文字列を照会できます。さらに、libudev は /dev ディレクトリ内のデバイス ノードの特定の場所のパスを教えてくれるので、アプリケーションがシステム メーカーに依存しない堅牢な方法でデバイスにアクセスできるようになります。 libudev ライブラリを使用するには、libudev.h ヘッダー ファイルをインクルードし、コンパイル時に -ludev を追加して、コンパイラに udev ライブラリをリンクするように指示する必要があります。

現在システムに接続されているすべての hidraw デバイスがリストされ、デバイス ノード パス、製造元、シリアル番号などの情報が出力されます。

この情報を取得するには、フィルター条件として「hidraw」文字列を使用して udev_enumerate オブジェクトを作成する必要があります。

libudev は、フィルター文字列に一致するすべての udev_device オブジェクトを返します。

この例の手順は次のとおりです。

1. ライブラリを初期化し、struct udev ハンドルを取得する

2. デバイスを列挙する

3. 見つかった一致するデバイスのノード名を出力し、実際のUSBデバイスの開始ノードを見つけ、USBデバイスのIDとシリアル番号を出力し、最後にデバイスオブジェクトを参照解除します。

4. 列挙オブジェクトの参照解除

5. udevオブジェクトの参照解除

具体的なコードは次のとおりです。

#include <libudev.h>
#include <stdio.h>
#include <stdlib.h>
#include <locale.h>
#include <unistd.h>

int メイン (void)
{
  構造体 udev *udev;
  構造体 udev_enumerate *列挙;
  構造体 udev_list_entry *デバイス、*dev_list_entry;
  構造体 udev_device *dev;

  /* udev オブジェクトを作成する */
  udev を新規作成します。
  udevの場合{
    printf("udev を作成できません\n");
    終了(1);
  }

  /* 'hidraw' サブシステム内のデバイスのリストを作成します。 */
  列挙 = udev_enumerate_new(udev);
  udev_enumerate_add_match_subsystem(列挙、「hidraw」);
  udev_enumerate_scan_devices(列挙);
  デバイス = udev_enumerate_get_list_entry(列挙);
  /* 列挙された各項目について、その情報を出力します。
    udev_list_entry_foreachは次のように展開されるマクロです。
    ループ。ループは各メンバーに対して実行されます
    デバイス、dev_list_entry をリストエントリに設定する
    /sys 内のデバイスのパスが含まれます。 */
  udev_list_entry_foreach(dev_list_entry、デバイス) {
    const char *パス;

    /* デバイスの /sys エントリのファイル名を取得します
      そしてそれを表す udev_device オブジェクト (dev) を作成します */
    パス = udev_list_entry_get_name(dev_list_entry);
    dev = udev_device_new_from_syspath(udev、パス);

    /* usb_device_get_devnode() はデバイスノードへのパスを返します
      自身は /dev にあります。 */
    printf("デバイスノードパス: %s\n", udev_device_get_devnode(dev));

    /* devが指すデバイスには、
      hidrawデバイスに関する情報を取得するには
      USBデバイスの場合は、親デバイスを
      サブシステム/デバイスタイプのペア「usb」/「usb_device」。これにより
      ツリーのいくつかの階層にまたがるが、関数は
      それ。*/
    dev = udev_device_get_parent_with_subsystem_devtype(
         開発者、
         "USB"、
         "usb_デバイス");
    もし(!dev){
      printf("親USBデバイスが見つかりません。");
      終了(1);
    }

    /* ここから各ファイルに対してget_sysattr_value()を呼び出すことができます
      デバイスの/sysエントリに渡される文字列は
      関数(idProduct、idVendor、serialなど)が対応する
      ディレクトリ内のファイルに直接アクセスし、
      USBデバイス。USB文字列はUnicode、UCS2であることに注意してください
      エンコードされていますが、返される文字列は
      udev_device_get_sysattr_value() は UTF-8 でエンコードされています。 */
    printf(" VID/PID: %s %s\n",
        udev_device_get_sysattr_value(dev、"idVendor")、
        udev_device_get_sysattr_value(dev、"idProduct"));
    printf(" %s\n %s\n",
        udev_device_get_sysattr_value(dev、"製造元")、
        udev_device_get_sysattr_value(dev、"製品"));
    printf("シリアル: %s\n",
        udev_device_get_sysattr_value(dev、"シリアル"));
    udev_device_unref(dev);
  }
  /* 列挙子オブジェクトを解放します */
  udev_enumerate_unref(列挙);

  udev_unref(udev);

  0を返します。
}

プログラムをコンパイルします。

gcc -Wall -g -o udev_example udev_example.c -ludev

以上がこの記事の全内容です。皆様の勉強のお役に立てれば幸いです。また、123WORDPRESS.COM を応援していただければ幸いです。

以下もご興味があるかもしれません:
  • Linux で USB デバイスの信号を監視するための Python の実装
  • Linux USBホストドライバの書き方の詳細説明
  • ARM LinuxはALSAドライバを使用し、USBオーディオデバイスを使用します
  • LinuxでUSBモバイルストレージを使用する方法
  • Linux環境でUSBストレージを使用する
  • 事例を通してLinux NFSの仕組みを詳細に分析
  • Linux NFSメカニズムの動作原理と例の分析
  • IntelliJ IDEA リモート デバッグ Linux Java プログラム、ログを見るだけでなく問題を見つけます (推奨)
  • Linux bzip2 コマンドの使用

<<:  MySQL での IN データボリュームの使用の最適化された記録

>>:  Web面接でよくある質問:リフローとリペイントの原理と違い

推薦する

Mysqlはストアドプロシージャを通じて文字列を配列に分割します

文字列を配列に分割するには、次の 3 つの MySQL 関数を使用する必要があります。 REVERS...

vuex データの永続化のための 2 つの実装ソリューション

目次ビジネス要件:解決策 1: vuex-persistedstate解決策2: vuex-pers...

Vueモバイル端末に最適な適応ソリューションについての簡単な説明

序文: 最近の医療モバイル プロジェクトに基づいて、Vue はさまざまな画面のさまざまな画面サイズに...

CSS と HTML とフロントエンド テクノロジーのレイヤー図

JavascriptとDOMの関係は非常に曖昧で、CSSやHTMLのフロントエンド技術層も理解してい...

CSS3 テキストシャドウ text-shadow プロパティの詳細な説明

テキストシャドウ text-shadow プロパティの効果: 1. 右下隅の影、左下隅の影、左上隅の...

HTML テーブル マークアップ チュートリアル (16): タイトルの水平方向の配置属性 ALIGN

デフォルトでは、表のタイトルは水平方向に中央揃えされます。ALIGN 属性を使用して、タイトル テキ...

JavaScript 円グラフの例

描画効果実装コードJavaScript var キャンバス = document.getElemen...

MySQLプリコンパイル機能の詳細な説明

この記事では、MySQLのプリコンパイル機能について紹介します。具体的な内容は以下のとおりです。 1...

node_modulesを削除して再インストールする方法

目次ステップ1: プロジェクトをインストールするディレクトリにnode_modulesをインストール...

SQL Server 2019 Always On クラスターの Docker デプロイメントの実装

目次Docker デプロイメント Always on クラスターDockerをインストールする建築関...

要素 DateTimePicker+vue ポップアップボックスに時間のみが表示される問題を解決する

3つの知識ポイント: 1. CSS子孫セレクターhttps://www.w3school.com.c...

HTMLとXHTML、HTML4とHTML5のタグの違いについて簡単に紹介します。

HTML と XHTML の違い1. XHTML要素は正しくネストされている必要がある2. XHT...

MySQL データベース ターミナル - 一般的な操作コマンド コード

目次1. ユーザーを追加する2. ユーザー名とホストを変更する3. パスワードを変更する4. ユーザ...

HTML タグのカスタム属性に関する質問

以前の開発では、クラス、名前などの HTML のデフォルト属性を使用していました。 Huawei社の...

MySQL における大規模オブジェクトのマルチバージョン同時実行制御の詳細な説明

MySQL 8.0: InnoDB のラージ オブジェクトに対する MVCCこの記事では、MySQL...