So verwenden Sie libudev in Linux, um die VID und PID eines USB-Geräts abzurufen

So verwenden Sie libudev in Linux, um die VID und PID eines USB-Geräts abzurufen

In diesem Artikel verwenden wir die Libudev-Bibliothek, um auf das Hidraw-Gerät zuzugreifen. Über die libudev-Bibliothek können wir die Hersteller-ID (VID), Produkt-ID (PID), Seriennummer und Gerätezeichenfolge des Geräts abfragen, ohne das Gerät zu öffnen. Darüber hinaus kann uns libudev den spezifischen Standortpfad des Geräteknotens im /dev-Verzeichnis mitteilen und so Anwendungen einen ausreichend robusten und vom Systemhersteller unabhängigen Zugriff auf Geräte ermöglichen. Um die libudev-Bibliothek zu verwenden, müssen Sie die Header-Datei libudev.h einbinden und beim Kompilieren -ludev hinzufügen, um dem Compiler mitzuteilen, dass er die udev-Bibliothek verknüpfen soll.

Alle aktuell mit dem System verbundenen Hidraw-Geräte werden aufgelistet und ihr Geräteknotenpfad, Hersteller, Seriennummer und andere Informationen werden ausgegeben.

Um diese Informationen zu erhalten, müssen Sie ein udev_enumerate-Objekt mit der Zeichenfolge „hidraw“ als Filterbedingung erstellen.

libudev gibt alle udev_device-Objekte zurück, die der Filterzeichenfolge entsprechen.

Die Schritte für dieses Beispiel sind wie folgt:

1. Initialisieren Sie die Bibliothek und erhalten Sie einen struct udev handle

2. Geräte aufzählen

3. Geben Sie den Knotennamen des gefundenen übereinstimmenden Geräts aus, suchen Sie den Startknoten des tatsächlichen USB-Geräts, drucken Sie die IDs und Seriennummern des USB-Geräts aus und dereferenzieren Sie schließlich das Geräteobjekt

4. Dereferenzierung von Enumerationsobjekten

5. Dereferenzieren Sie das udev-Objekt

Der spezifische Code lautet wie folgt:

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

int main (void)
{
  Struktur udev *udev;
  Struktur udev_enumerate *enumerate;
  Struktur udev_list_entry *Geräte, *dev_list_entry;
  Struktur udev_device *dev;

  /* Das udev-Objekt erstellen */
  udev = udev_new();
  wenn (!udev) {
    printf("udev\n kann nicht erstellt werden");
    Ausgang (1);
  }

  /* Erstellen Sie eine Liste der Geräte im Subsystem „hidraw“. */
  aufzählen = udev_enumerate_new(udev);
  udev_enumerate_add_match_subsystem(aufzählen, "hidraw");
  udev_enumerate_scan_devices(aufzählen);
  Geräte = udev_enumerate_get_list_entry(aufzählen);
  /* Drucken Sie für jedes aufgezählte Element die Informationen aus.
    udev_list_entry_foreach ist ein Makro, das sich zu
    eine Schleife. Die Schleife wird für jedes Mitglied in
    Geräte, dev_list_entry auf einen Listeneintrag setzen
    welches den Pfad des Geräts in /sys enthält. */
  udev_list_entry_foreach(dev_list_entry, Geräte) {
    const char *Pfad;

    /* Den Dateinamen des /sys-Eintrags für das Gerät abrufen
      und erstelle ein udev_device-Objekt (dev), das es repräsentiert */
    Pfad = udev_list_entry_get_name(dev_list_entry);
    dev = udev_device_new_from_syspath(udev, Pfad);

    /* usb_device_get_devnode() gibt den Pfad zum Geräteknoten zurück
      selbst in /dev. */
    printf("Geräteknotenpfad: %s\n", udev_device_get_devnode(dev));

    /* Das von dev gezeigte Gerät enthält Informationen über
      das Hidraw-Gerät. Um Informationen über die
      USB-Gerät, holen Sie sich das übergeordnete Gerät mit dem
      Subsystem/Gerätetyp-Paar "usb"/"usb_device". Dies wird
      mehrere Ebenen im Baum sein, aber die Funktion findet
      Es.*/
    dev = udev_device_get_parent_with_subsystem_devtype(
         Entwickler,
         "USB",
         "usb_gerät");
    wenn (!dev) {
      printf("Übergeordnetes USB-Gerät konnte nicht gefunden werden.");
      Ausgang (1);
    }

    /* Von hier aus können wir get_sysattr_value() für jede Datei aufrufen
      im /sys-Eintrag des Geräts. Die in diese
      Funktionen (idProduct, idVendor, serial, etc.) entsprechen
      direkt auf die Dateien im Verzeichnis, das darstellt
      das USB-Gerät. Beachten Sie, dass USB-Zeichenfolgen Unicode, UCS2
      codiert, aber die zurückgegebenen Zeichenfolgen
      udev_device_get_sysattr_value() sind UTF-8 kodiert. */
    printf(" VID/PID: %s %s\n",
        udev_device_get_sysattr_value(dev,"idVendor"),
        udev_device_get_sysattr_value(dev, "Produkt-ID"));
    printf(" %s\n %s\n",
        udev_device_get_sysattr_value(dev,"Hersteller"),
        udev_device_get_sysattr_value(dev,"Produkt"));
    printf("Seriell: %s\n",
        udev_device_get_sysattr_value(dev, "serial"));
    udev_device_unref(dev);
  }
  /* Enumeratorobjekt freigeben */
  udev_enumerate_unref(aufzählen);

  udev_unref(udev);

  gebe 0 zurück;
}

Kompilieren Sie das Programm:

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

Das Obige ist der vollständige Inhalt dieses Artikels. Ich hoffe, er wird für jedermanns Studium hilfreich sein. Ich hoffe auch, dass jeder 123WORDPRESS.COM unterstützen wird.

Das könnte Sie auch interessieren:
  • Implementierung von Python zur Überwachung von USB-Gerätesignalen unter Linux
  • Detaillierte Erklärung zum Schreiben von Linux-USB-Hosttreibern
  • Arm-Linux verwendet Alsa-Treiber und ein USB-Audiogerät
  • So verwenden Sie mobilen USB-Speicher unter Linux
  • Verwenden von USB-Speicher in einer Linux-Umgebung
  • Detaillierte Analyse des Linux-NFS-Mechanismus anhand von Fällen
  • Funktionsprinzip und Beispielanalyse des Linux-NFS-Mechanismus
  • IntelliJ IDEA führt Remote-Debugging für Linux-Java-Programme durch. Suchen Sie nach Problemen, ohne nur im Protokoll nachzusehen (empfohlen)
  • Verwendung des Linux-Befehls bzip2

<<:  Optimierte Aufzeichnung der Verwendung von IN-Datenvolumen in Mysql

>>:  Häufig gestellte Fragen zum Webinterview: Prinzipien und Unterschiede zwischen Reflow und Repaint

Artikel empfehlen

Grafisches Tutorial zur Installation und Konfiguration von MySQL 8.0.11 (Win10)

In diesem Artikel werden die Installations- und K...

Ein unverzichtbarer Karriereplan für Webdesigner

Originalartikel, bei Nachdruck bitte Autor und Qu...

CSS-Pseudoklasse: empty makes me shine (Beispielcode)

Jeder, der meine Artikel in letzter Zeit gelesen ...

Warum wird IE6 von den meisten Leuten verwendet?

In erster Linie bin ich Webdesigner. Genauer gesag...

Spezifische Schritte zur Verwendung des Vant-Frameworks im WeChat-Applet

Inhaltsverzeichnis 1. Öffnen Sie das Projektverze...

Beispiel für die Konfiguration von Nginx im CentOS-Server

Laden Sie das sichere Terminal MobaXterm_Personal...

Vergleich der Vorteile von vue3 und vue2

Inhaltsverzeichnis Vorteil 1: Optimierung des Dif...

Analyse von 2 Token-Gründen und Beispielcode in der Webprojektentwicklung

Inhaltsverzeichnis Frage: Es gibt 2 Token im Proj...

Zusammenfassung der Tipps zum Erstellen von Webseiten

Vorwort Dieser Artikel fasst hauptsächlich einige...

Detaillierte Erklärung inkompatibler Änderungen von Komponenten in vue3

Inhaltsverzeichnis Funktionale Komponenten So sch...

So konfigurieren Sie Nginx zur Unterstützung von IPv6 unter Linux

1. Überprüfen Sie, ob das vorhandene Nginx IPv6 u...