この記事では、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面接でよくある質問:リフローとリペイントの原理と違い
LIKE 演算子は、列内の指定されたパターンを検索するため、WHERE 句で使用されます。文法: 列...
序文私たちの日常の開発プロセスでは、ソートが頻繁に使用され、そのような要求がある場合もあります。たと...
企業では、データベースの高可用性は常に最優先事項です。多くの中小企業は、MySQL マスター スレー...
1. ワイヤレスPowerShell を実行し、次のコマンドを入力します。 install-wind...
最近では、特定のフォルダ内の特定のファイルを自動的に検索する必要があり、ファイルパスとファイル名を別...
最初はブラウザのスクロールバーのスタイルを変更して効果を実現したいと思っていましたが、情報を調べてみ...
ドロップダウン メニューやスライド メニューを使用している Web サイトをたくさん見つけたので、私...
使用状態useState は、関数コンポーネント内で呼び出すことで、コンポーネントに内部状態を追加し...
この記事では、JavaScriptシミュレーション計算機の具体的なコードを参考までに紹介します。具体...
相対パス - ファイルを参照する Web ページの場所に基づいて確立されたディレクトリ パス。そのた...
質問: インデックスは作成されているのに、Like ファジー クエリがまだ遅いのはなぜですか?インデ...
序文InnoDB はデータをテーブルスペースに保存します。デフォルト設定では、初期サイズが 10 M...
序文プロジェクトを .net core に移行した後、 System.Drawing.Commonコ...
目次1. はじめに2. 本文2.1 単一列のソート2.2 複数の列を並べ替える2.3 ソート方法2....
手工芸デザインからグラフィックデザイン、そしてウェブデザインまで、デザインの原則は同じままですが、私...