qt中libusb热插拔检测示例代码
cpp
#include <QCoreApplication>
#include <QDebug>
#include <libusb/libusb.h>
// 回调函数
int hotplugCallback(libusb_context *ctx, libusb_device *dev, libusb_hotplug_event event, void *user_data) {
libusb_device_descriptor desc;
if (libusb_get_device_descriptor(dev, &desc) != LIBUSB_SUCCESS) {
qDebug() << "无法获取设备描述符";
return 0;
}
uint8_t busNumber = libusb_get_bus_number(dev);
uint8_t deviceAddress = libusb_get_device_address(dev);
if (event == LIBUSB_HOTPLUG_EVENT_DEVICE_ARRIVED) {
qDebug() << "【设备插入】"
<< "VID: " << QString::number(desc.idVendor, 16)
<< ", PID: " << QString::number(desc.idProduct, 16)
<< ", 总线号: " << busNumber
<< ", 设备地址: " << deviceAddress;
// 获取接口信息
libusb_config_descriptor *config;
if (libusb_get_active_config_descriptor(dev, &config) == LIBUSB_SUCCESS) {
for (int i = 0; i < config->bNumInterfaces; i++) {
const libusb_interface &interface = config->interface[i];
for (int j = 0; j < interface.num_altsetting; j++) {
const libusb_interface_descriptor &altsetting = interface.altsetting[j];
qDebug() << "接口号: " << altsetting.bInterfaceNumber
<< ", 端点数: " << altsetting.bNumEndpoints
<< ", 类别: " << altsetting.bInterfaceClass;
}
}
libusb_free_config_descriptor(config);
}
} else if (event == LIBUSB_HOTPLUG_EVENT_DEVICE_LEFT) {
qDebug() << "【设备拔出】"
<< "VID: " << QString::number(desc.idVendor, 16)
<< ", PID: " << QString::number(desc.idProduct, 16)
<< ", 总线号: " << busNumber
<< ", 设备地址: " << deviceAddress;
}
return 0;
}
int main(int argc, char *argv[]) {
QCoreApplication a(argc, argv);
// 初始化 libusb
libusb_context *ctx = nullptr;
if (libusb_init(&ctx) < 0) {
qDebug() << "libusb 初始化失败";
return 1;
}
qDebug() << "libusb 初始化成功";
// 检查是否支持热插拔
if (!libusb_has_capability(LIBUSB_CAP_HAS_HOTPLUG)) {
qDebug() << "当前系统不支持 USB 热插拔检测";
libusb_exit(ctx);
return 1;
}
// 注册热插拔回调
libusb_hotplug_callback_handle callbackHandle;
int result = libusb_hotplug_register_callback(ctx,
LIBUSB_HOTPLUG_EVENT_DEVICE_ARRIVED | LIBUSB_HOTPLUG_EVENT_DEVICE_LEFT,
LIBUSB_HOTPLUG_ENUMERATE,
LIBUSB_HOTPLUG_MATCH_ANY,
LIBUSB_HOTPLUG_MATCH_ANY,
LIBUSB_HOTPLUG_MATCH_ANY,
hotplugCallback,
nullptr,
&callbackHandle);
if (result != LIBUSB_SUCCESS) {
qDebug() << "注册回调失败: " << libusb_error_name(result);
libusb_exit(ctx);
return 1;
}
qDebug() << "USB 热插拔检测已启动...";
// 循环处理事件
while (true) {
libusb_handle_events(ctx);
}
// 退出前释放资源
libusb_hotplug_deregister_callback(ctx, callbackHandle);
libusb_exit(ctx);
return 0;
}