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

Detailliertes Installationstutorial für Mysql5.7.19 unter Centos7

1. Herunterladen Laden Sie mysql-5.7.19-linux-gli...

Natives JS zum Erzielen von Laufschrifteffekten

Heute werde ich Ihnen einen Laufschrifteffekt zei...

So erstellen Sie einen Redis-Cluster mit Docker

Inhaltsverzeichnis 1. Erstellen Sie ein Redis-Doc...

Natives JS zur Implementierung der Formularvalidierungsfunktion

Inhaltsverzeichnis Bei der Entwicklung kann eine ...

Verständnis und Beispielcode des Vue-Standardslots

Inhaltsverzeichnis Was ist ein Slot Grundlegendes...

Analyse von MySQL-Lock-Wait- und Deadlock-Problemen

Inhaltsverzeichnis Vorwort: 1. Verstehen Sie Lock...

Lassen Sie uns über Parameter in MySQL sprechen

Vorwort: In einigen früheren Artikeln haben wir h...

Beispielcode für die programmgesteuerte Verarbeitung von CSS-Stilen

Vorteile eines programmatischen Ansatzes 1. Globa...

So deinstallieren Sie MySQL 5.7.19 unter Linux

1. Finden Sie heraus, ob MySQL zuvor installiert ...

JavaScript-Flusskontrolle (Verzweigung)

Inhaltsverzeichnis 1. Prozesskontrolle 2. Sequent...