この記事では、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を返します。 } プログラムをコンパイルします。 以上がこの記事の全内容です。皆様の勉強のお役に立てれば幸いです。また、123WORDPRESS.COM を応援していただければ幸いです。 以下もご興味があるかもしれません:
|
<<: MySQL での IN データボリュームの使用の最適化された記録
>>: Web面接でよくある質問:リフローとリペイントの原理と違い
文字列を配列に分割するには、次の 3 つの MySQL 関数を使用する必要があります。 REVERS...
目次ビジネス要件:解決策 1: vuex-persistedstate解決策2: vuex-pers...
序文: 最近の医療モバイル プロジェクトに基づいて、Vue はさまざまな画面のさまざまな画面サイズに...
JavascriptとDOMの関係は非常に曖昧で、CSSやHTMLのフロントエンド技術層も理解してい...
テキストシャドウ text-shadow プロパティの効果: 1. 右下隅の影、左下隅の影、左上隅の...
デフォルトでは、表のタイトルは水平方向に中央揃えされます。ALIGN 属性を使用して、タイトル テキ...
描画効果実装コードJavaScript var キャンバス = document.getElemen...
この記事では、MySQLのプリコンパイル機能について紹介します。具体的な内容は以下のとおりです。 1...
目次ステップ1: プロジェクトをインストールするディレクトリにnode_modulesをインストール...
目次Docker デプロイメント Always on クラスターDockerをインストールする建築関...
3つの知識ポイント: 1. CSS子孫セレクターhttps://www.w3school.com.c...
HTML と XHTML の違い1. XHTML要素は正しくネストされている必要がある2. XHT...
目次1. ユーザーを追加する2. ユーザー名とホストを変更する3. パスワードを変更する4. ユーザ...
以前の開発では、クラス、名前などの HTML のデフォルト属性を使用していました。 Huawei社の...
MySQL 8.0: InnoDB のラージ オブジェクトに対する MVCCこの記事では、MySQL...