Qt 获取当前系统中连接的所有USB设备的信息 libudev版
flyfish
环境
Ubuntu22.04
Qt 6.2.4
#include <QCoreApplication> // 包含 Qt 核心模块
#include <libudev.h> // 包含 libudev 库
#include <stdio.h> // 包含标准输入输出函数
#include <stdlib.h> // 包含标准库函数
#include <string.h> // 包含字符串处理函数// 用于获取USB设备的信息并打印出来
void listUSBInfo() {struct udev *udev; // udev 上下文struct udev_enumerate *enumerate; // 用于枚举设备的对象struct udev_list_entry *devices, *dev_list_entry; // 设备列表和当前设备条目struct udev_device *dev; // 设备对象// 初始化udevudev = udev_new(); // 创建一个新的 udev 上下文if (!udev) {fprintf(stderr, "Can't create udev\n"); // 如果创建失败,输出错误信息并返回return;}// 创建一个用于枚举设备的对象enumerate = udev_enumerate_new(udev); // 创建一个新的 udev_enumerate 对象if (!enumerate) {fprintf(stderr, "Can't create udev enumerate\n"); // 如果创建失败,输出错误信息并释放 udev 资源udev_unref(udev);return;}// 添加子系统过滤器,只枚举USB设备udev_enumerate_add_match_subsystem(enumerate, "usb"); // 添加子系统过滤器,只枚举 USB 子系统的设备udev_enumerate_scan_devices(enumerate); // 扫描设备// 获取设备列表devices = udev_enumerate_get_list_entry(enumerate); // 获取设备列表if (!devices) {fprintf(stderr, "No devices found\n"); // 如果没有找到设备,输出错误信息并释放资源udev_enumerate_unref(enumerate);udev_unref(udev);return;}// 遍历设备列表udev_list_entry_foreach(dev_list_entry, devices) { // 遍历设备列表const char *path; // 设备路径path = udev_list_entry_get_name(dev_list_entry); // 获取设备路径dev = udev_device_new_from_syspath(udev, path); // 从系统路径创建设备对象if (dev) {const char *devnode = udev_device_get_devnode(dev); // 获取设备节点const char *idVendor = udev_device_get_sysattr_value(dev, "idVendor"); // 获取厂商IDconst char *idProduct = udev_device_get_sysattr_value(dev, "idProduct"); // 获取产品IDconst char *manufacturer = udev_device_get_sysattr_value(dev, "manufacturer"); // 获取制造商名称const char *product = udev_device_get_sysattr_value(dev, "product"); // 获取产品名称if (devnode) {printf("Device Node: %s\n", devnode); // 输出设备节点}if (idVendor) {printf("Vendor ID: %s\n", idVendor); // 输出厂商ID}if (idProduct) {printf("Product ID: %s\n", idProduct); // 输出产品ID}if (manufacturer) {printf("Manufacturer: %s\n", manufacturer); // 输出制造商名称}if (product) {printf("Product Name: %s\n", product); // 输出产品名称}printf("\n"); // 输出换行,使每个设备信息之间有空行分隔udev_device_unref(dev); // 释放设备对象}}// 释放资源udev_enumerate_unref(enumerate); // 释放 udev_enumerate 对象udev_unref(udev); // 释放 udev 上下文
}int main(int argc, char *argv[]) {QCoreApplication a(argc, argv); // 创建 QCoreApplication 对象listUSBInfo(); // 调用 listUSBInfo 函数获取并打印 USB 设备信息return a.exec(); // 进入事件循环
}
结果
Device Node: /dev/bus/usb/001/001
Vendor ID: 1d6b
Product ID: 0002
Manufacturer: Linux 6.8.0-48-generic xhci-hcd
Product Name: xHCI Host ControllerDevice Node: /dev/bus/usb/001/002
Vendor ID: 046d
Product ID: c077
Manufacturer: Logitech
Product Name: USB Optical MouseDevice Node: /dev/bus/usb/001/003
Vendor ID: 046d
Product ID: c31c
Manufacturer: Logitech
Product Name: USB KeyboardDevice Node: /dev/bus/usb/002/001
Vendor ID: 1d6b
Product ID: 0003
Manufacturer: Linux 6.8.0-48-generic xhci-hcd
Product Name: xHCI Host Controller