この記事では、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面接でよくある質問:リフローとリペイントの原理と違い
目次ネイティブJS GETリクエストの送信方法投稿リクエストの送信方法パラメータ付きのGETリクエス...
MySQL 一時テーブルは、一時的なデータを保存する必要がある場合に非常に便利です。一時テーブルは現...
実際のプロジェクトでは、緊急事態を防ぐためにデータベースを頻繁にバックアップする必要があります。しば...
目次実装のアイデアアカウント パスワードを保存する方法は 3 つあります。機能インターフェースアカウ...
方法1: cmdコマンドを使用するまず、DOS ウィンドウを開き、スタート、実行、cmd と入力しま...
ant-design-vue は Ali iconfont icons の使用をカスタマイズします\...
これまで react.forwardRef は react の高階コンポーネントには適用できませんで...
Centos7 の起動プロセス: 1.post(電源投入時のセルフテスト) 電源投入時のセルフテスト...
はじめに<br />誰もが高速インターネット接続にアクセスできるわけではありません。たと...
1 hupからイメージを取得する docker プル nginx 2 マウントするディレクトリを作成...
導入アニメーションを使用すると、JavaScript や jQuery に依存せずに、純粋な CSS...
World Wide Web Consortium (W3C) は、HTML 5 仕様のドラフトをリ...
縦型テーブル垂直テーブル分割とは、多数の列を持つテーブルを複数のテーブルに分割することを意味します。...
HTML 初心者は、ファイルを正しく参照する方法という問題によく遭遇します。たとえば、HTML ペー...
メタ属性には、name と http-equiv の 2 つがあります。 name 属性は主に、We...