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;
}
相关推荐
Maybe_ch21 分钟前
.NET-键控服务依赖注入
开发语言·c#·.net
超浪的晨28 分钟前
Java UDP 通信详解:从基础到实战,彻底掌握无连接网络编程
java·开发语言·后端·学习·个人开发
终焉暴龙王30 分钟前
CTFHub web进阶 php Bypass disable_function通关攻略
开发语言·安全·web安全·php
Edingbrugh.南空1 小时前
Aerospike与Redis深度对比:从架构到性能的全方位解析
java·开发语言·spring
CodeCraft Studio2 小时前
借助Aspose.HTML控件,在 Python 中将 HTML 转换为 Markdown
开发语言·python·html·markdown·aspose·html转markdown·asposel.html
QQ_4376643142 小时前
C++11 右值引用 Lambda 表达式
java·开发语言·c++
aramae2 小时前
大话数据结构之<队列>
c语言·开发语言·数据结构·算法
封奚泽优2 小时前
使用Python实现单词记忆软件
开发语言·python·random·qpushbutton·qtwidgets·qtcore·qtgui
liulilittle3 小时前
C++/CLI与标准C++的语法差异(一)
开发语言·c++·.net·cli·clr·托管·原生
daixin88484 小时前
什么是缓存雪崩?缓存击穿?缓存穿透?分别如何解决?什么是缓存预热?
java·开发语言·redis·缓存