qt中libusb热插拔检测示例代码

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;
}
相关推荐
zh路西法5 小时前
基于yaml-cpp的C++参数服务器设计2:多级参数配置
linux·服务器·c++
啦啦啦啦啦zzzz5 小时前
算法总结(双指针)
c++·算法·双指针
wzg19690226wzg5 小时前
rust 学习 泛型
开发语言·学习·rust
techdashen5 小时前
Rust 基础设施团队 2025 Q4 回顾与 2026 Q1 计划
开发语言·后端·rust
红宝村村长5 小时前
torch.autograd.Function.apply()
开发语言·python
AI科技星5 小时前
《数术工坊:非欧射影录》类型:硬核光影·几何本源
c语言·开发语言·网络·量子计算·agi
何以解忧,唯有..5 小时前
Python 中的继承机制:从基础到高级用法详解
java·开发语言·python
QiLinkOS5 小时前
极客与商业思维的融合实践(1)
c语言·数据库·c++·人工智能·算法·开源协议
坚果派·白晓明6 小时前
鸿蒙PC】libuv适配:AtomCode Skills一站式指南
c语言·c++·华为·ai编程·harmonyos·atomcode