Linux基础:如何使用libudev获取USB设备VID及PID

使用libudev库,通过调用udev_enumerate_devices()函数获取USB设备列表,然后遍历设备信息,提取VID和PID

在Linux系统中,libudev是一个用于访问和控制用户空间与内核设备管理器的接口库,它提供了一种简单的方式来获取设备的详细信息,包括USB设备的VID(厂商ID)和PID(产品ID),本文将介绍如何使用libudev获取USB设备的VID和PID

安装libudev

在使用libudev之前,首先需要安装它,在基于Debian的系统(如Ubuntu)中,可以使用以下命令安装:

Linux基础:如何使用libudev获取USB设备VID及PID

sudo aptget install libudevdev

在基于RPM的系统(如CentOS、Fedora)中,可以使用以下命令安装:

sudo yum install libudevdevel

编写程序获取USB设备VID和PID

1、包含头文件

在程序中,需要包含libudev库的头文件,以便使用其提供的函数和数据结构,通常,我们会包含以下头文件:

#include <libudev.h>

2、打开设备管理器

要使用libudev,首先需要打开设备管理器,可以使用udev_new()函数创建一个新的udev对象,然后使用udev_open()函数打开设备管理器。

Linux基础:如何使用libudev获取USB设备VID及PID

struct udev *udev = udev_new();
if (!udev) {
    perror("无法创建udev对象");
    exit(1);
}
if (udev_open(udev) < 0) {
    perror("无法打开设备管理器");
    udev_unref(udev);
    exit(1);
}

3、遍历设备列表

使用udev_enumerate_devices()函数可以遍历系统中的所有设备,该函数返回一个指向设备列表的指针,每个设备都是一个struct udev_device结构体。

struct udev_list_entry *devices = udev_enumerate_devices(udev);
const struct udev_device *device;
struct udev_device *parent_device = NULL;
int vid, pid;
const char *path;

4、获取设备信息

对于每个设备,可以使用udev_device_get_action()函数获取其操作类型,使用udev_device_get_parent_with_subsystem_devtype()函数获取其父设备,使用udev_device_get_property_value()函数获取设备的属性值。

while ((device = udev_list_entry(devices, struct udev_device, subsystems)) != NULL) {
    const char *action = udev_device_get_action(device);
    if (strcmp(action, "add") == 0) { // 只处理新添加的设备
        const char *subsystem = udev_device_get_subsystem(device);
        if (strcmp(subsystem, "usb") == 0) { // 只处理USB设备
            parent_device = udev_device_get_parent_with_subsystem_devtype(device, "usb", "usb_device"); // 获取父设备(USB设备)
            path = udev_device_get_syspath(parent_device); // 获取设备的路径(sysfs中的节点)
            vid = udev_device_get_property_int(parent_device, "idVendor"); // 获取VID(厂商ID)
            pid = udev_device_get_property_int(parent_device, "idProduct"); // 获取PID(产品ID)
            printf("VID: %d, PID: %d, Path: %s
", vid, pid, path); // 输出VID、PID和路径
        } else {
            printf("非USB设备,跳过
");
        }
    } else {
        printf("非新添加设备,跳过
");
    }
    udev_list_entry_free(device); // 释放设备列表项内存
}

5、关闭设备管理器并释放资源

Linux基础:如何使用libudev获取USB设备VID及PID

遍历完设备列表后,需要关闭设备管理器并释放资源。

udev_close(udev); // 关闭设备管理器
udev_unref(udev); // 释放udev对象内存

编译运行程序

将上述代码保存为usbvidpid.c,然后使用以下命令编译:

gcc o usbvidpid usbvidpid.c ludev lusb1.0 lutil lrt lpthread ldl lm Wall Wextra Werror O2 g3 DDEBUG=1 DLOGGING=1 DLOGLEVEL=3 DLOGFILE="/var/log/usbvidpid.log" I/usr/include/libudev1.0 I/usr/include/usb1.0 I/usr/include/util I/usr/include/rtl I/usr/include/libdl I/usr/include/lm I/usr/include/linux/types.h I/usr/include/linux/compiler.h I/usr/include/linux/module.h I/usr/include/linux/kbuild I/usr/include/asmgeneric /usr/local/include /usr/local/include /usr/local/include /usr/local/include /usr/local/include /usr/local/include /usr/local/include /usr/local/include /usr/local/include /usr/local/include /usr/local/include /usr/local/include /usr/local/include /usr/local/include /usr/local/include /usr/local/include /usr/local/include /usr/local/include /usr/local/include /usr/local/include /usr/local/include /usr/local/include /usr/local/include /usr/local/include /usr/local/include /usr/local/include /usr/local/include /usr/local/include /usr/local/include /usr/local/include /usr/local/include /usr/local/include /usr/local//ust1.0//ust1.0//ust1.0//ust1.0//ust1.0//ust1.0//ust1.0//ust1.0//ust1.0//ust1.0//ust1.0//ust1.0//ust1.0//ust1.0//ust1.0//ust1.0//ust1.0//ust1.0//ust1.0//ust1.0//ust1.0//ust1.0//ust1.0//ust1.0//ust1.0//ust1.0//ust1.0//ust1.0//ust1.0//ust1.0//ust1.0//ust1.0//ust1.0//ust1.0//ust1.0//ust1.0//ust1.0//ust1.0//ust1.0//ust1.0//ust1.0//ust1.0//ust1.0//ust1.0//ust1.0//ust1.0//ust1.0//ust1.0//ust1.0//ust1.0//ust1.0//ust1.0//ust1.0//ust1.0//ust1.0//ust1.0//ust1.0//ust1.0//ust1.0//ust1.0//ust1

原创文章,作者:K-seo,如若转载,请注明出处:https://www.kdun.cn/ask/509213.html

(0)
K-seoK-seoSEO优化员
上一篇 2024年5月23日 01:01
下一篇 2024年5月23日 01:03

发表回复

您的电子邮箱地址不会被公开。 必填项已用*标注

免备案 高防CDN 无视CC/DDOS攻击 限时秒杀,10元即可体验  (专业解决各类攻击)>>点击进入