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 8.0.20 のインストールと設定方法のグラフィックチュートリアル

MySQLのダウンロードとインストール(バージョン8.0.20)のチュートリアルは参考までに、具体的...

MySQL マスタースレーブ同期遅延の原因と解決策

歴史的な理由により、MySQL レプリケーションは、REDO ログではなく論理バイナリ ログに基づい...

Nginx の場所に関する一般的なルールの優先順位の問題

目次1. 場所/マッチング2. 場所 = / 一致Locaitonには、完全一致(=)、プレフィック...

Vue3+スクリプト設定+ts+Vite+Volarプロジェクト

目次Viteを使用してvue + tsプロジェクトを作成するVue 3の3つの構文オプションAPIコ...

Docker を使用して Nginx+Flask+Mongo アプリケーションをデプロイする

サーバーにはNginx、データベースサポートにはMongo、Python言語のWebフレームワークに...

Ubuntu ベースのディストリビューションに Microsoft TrueType フォントをインストールするチュートリアル

Linux 上の LibreOffice で Microsoft ドキュメントを開くと、フォントが少...

Webフロントエンドベクターアイコンの使い方

序文フロントエンドページを書くとき、小さなアイコンなどの画像を使うことが多いです。画像を使うとコード...

vue-router のハッシュモードと履歴モードの違い

vue-routerには2つのモードがありますハッシュモード履歴モード1. シングルページアプリケー...

MySQL をデプロイするときに発生する「テーブル mysql.plugin が存在しません」という問題の解決方法

今日、MySQL の無料インストール版をデプロイしたところ、テーブル 'mysql.plug...

Linuxでディスク使用量を確認する方法

1. dfコマンドを使用してディスク全体の使用量を表示します。 df コマンドは、ハードディスクのマ...

MySQL のロックに関する問題

ロックの分類:データ操作の粒度から:テーブルロック:操作時にテーブル全体がロックされます。行ロック:...

Nginx+Tomcat 負荷分散クラスタのインストールと構成のケースの詳細な説明

目次序文1. Nginx+Tomcat 2. Nginxサーバーを構成する3. Tomcatアプリケ...

Ubuntu 20.04 aptの国内ソースを変更する方法

UPD 2020.2.26 現在、Ubuntu 20.04 LTSはまだリリースされていないため、チ...

javascript:void(0) の意味と使用例

voidキーワードの紹介まず、void キーワードは JavaScript で非常に重要なキーワード...

CentOS7にMariaDB 10.2.4をインストールする方法の詳細な説明

CentOS 6 以前のバージョンでは、MySQL サーバー/クライアント インストール パッケージ...