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; // 设备对象
// 初始化udev
udev = 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"); // 获取厂商ID
const char *idProduct = udev_device_get_sysattr_value(dev, "idProduct"); // 获取产品ID
const 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 Controller
Device Node: /dev/bus/usb/001/002
Vendor ID: 046d
Product ID: c077
Manufacturer: Logitech
Product Name: USB Optical Mouse
Device Node: /dev/bus/usb/001/003
Vendor ID: 046d
Product ID: c31c
Manufacturer: Logitech
Product Name: USB Keyboard
Device 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