在 QT 中使用 libusb 检测 MAC 上的 USB 设备

本文介绍了如何在QT中使用libusb库来检测MAC上的USB设备。首先,详细讲解了libusb的下载、安装和运行示例程序。接着,阐述了静态和动态链接库的创建过程。最后,重点讲述在QT项目中集成libusb动态链接库的步骤,包括添加库文件、修改编译选项以及编写并执行测试程序,成功获取MAC上的USB设备列表。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

最近在用 QT 做一个 MAC 上的 Kindle 批注管理软件,遇到的第一个问题就是检测 MAC 上连接的 USB 设备的状态。如果是在 Cocoa 进行开发,会有对应的系统 API 可供使用,但是由于我是在 QT 平台进行的开发,所以无形中加大了一点难度。就在这时,我发现了一个库:libusb

libusb 介绍

libusb 设计了一系列的外部API 为应用程序所调用,通过这些API应用程序可以操作硬件,从libusb的源代码可以看出,这些API 调用了内核的底层接口,和kernel driver中所用到的函数所实现的功能差不多,只是libusb更加接近USB 规范。使得libusb的使用也比开发内核驱动相对容易的多。(From: 百度百科

0x00 下载 libusb

在 libusb 项目主页(http://libusb.info)我们可以找到最新的源码,下载下来,并且解压。这里我下载的是 libusb-1.0.20.tar.bz2,把它解压出来。

0x01 安装 libusb

cd libusb-1.0.20/
./configure
make
make install

这时就已经在机器上编译安装完成了 libusb

0x02 运行示例程序

cd examples/
make

然后我们看到在 examples/ 目录下多了几个可执行程序:

  • listdevs:列出当前所有的 USB 设备

  • hotplugtest:USB 热插拔测试

  • dpfp_threaded:操作 U.are.U 4000b 指纹采集仪的 Demo

  • dpfp:初始化 U.are.U 4000b 指纹采集仪

  • sam3u_benchmark:测试 Atmel SAM3U USB 主控的同步传输的性能的 Demo

  • fxload:USB 固件操作

Usage: fxload [-v] [-V] [-t type] [-d vid:pid] [-p bus,addr] [-s loader] -i firmware

  -i <path>       -- Firmware to upload
  -s <path>       -- Second stage loader
  -t <type>       -- Target type: an21, fx, fx2, fx2lp, fx3
  -d <vid:pid>    -- Target device, as an USB VID:PID
  -p <bus,addr>   -- Target device, as a libusb bus number and device address path
  -v              -- Increase verbosity
  -q              -- Decrease verbosity (silent mode)
  -V              -- Print program version
  • xusb:USB 测试程序
usage: /Users/jason/Downloads/libusb-1.0.20/examples/.libs/xusb [-h] [-d] [-i] [-k] [-b file] [-l lang] [-j] [-x] [-s] [-p] [-w] [vid:pid]

   -h      : display usage
   -d      : enable debug output
   -i      : print topology and speed info
   -j      : test c
<think>好的,用户想在Qt项目中集成libusb库来监测USB设备的插拔状态。首先,我需要确认用户是否已经具备基本的开发环境,比如安装好了Qt Creator和必要的编译工具。然后,需要考虑如何在Qt项目中正确引入libusb库,这可能涉及到库的安装、头文件的包含以及链接库的设置。 接下来,我需要回忆libusb的基本用法,比如初始化和打开设备,设置回调函数来监测插拔事件。不过Qt有自己的事件循环机制,可能需要将libusb的回调与Qt的信号槽结合,或者使用多线程来处理,避免阻塞主界面。另外,用户可能还需要处理跨平台的问题,因为libusb在不同系统上的配置可能有差异,比如Windows需要安装驱动,而Linux可能需要udev规则。 然后,我需要考虑如何编写示例代码,展示如何在Qt中初始化libusb,注册热插拔回调,并将事件传递给Qt的界面部分。可能需要用到Qt的定时器或者自定义事件来在主线程中更新UI。同时,还要提醒用户注意内存管理和错误处理,确保库的释放和资源的正确回收。 最后,用户可能需要相关的参考资料或进一步的问题,比如如何获取设备信息、处理数据传输,或者优化性能。需要确保回答结构清晰,步骤明确,并引用提供的参考资料中的相关内容,比如提到的QT_USB设备开发基础,可能涉及引用[^1]中的视频课程链接。</think>### 在Qt中集成libusb实现USB设备插拔监控 #### 1. **环境准备** - **安装libusb库**: - Linux:`sudo apt-get install libusb-1.0-0-dev` - Windows:从[libusb官网](https://libusb.info/)下载预编译库,配置到Qt的编译路径中 - **Qt项目配置**: 在`.pro`文件中添加库链接: ```pro LIBS += -lusb-1.0 # Linux/Mac LIBS += -L/path/to/libusb -llibusb-1.0 # Windows需指定库路径 INCLUDEPATH += /usr/include/libusb-1.0 # 头文件路径 ``` #### 2. **实现设备插拔监控** 使用libusb的**热插拔回调机制**,结合Qt事件循环: ```cpp #include <libusb.h> #include <QObject> #include <QDebug> class UsbMonitor : public QObject { Q_OBJECT public: UsbMonitor() { libusb_init(&ctx); libusb_set_option(ctx, LIBUSB_OPTION_LOG_LEVEL, LIBUSB_LOG_LEVEL_INFO); } void startMonitoring() { // 注册热插拔回调 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, this, &callback_handle ); // 启动Qt定时器轮询libusb事件 startTimer(100); // 每100ms轮询一次 } signals: void deviceConnected(QString info); void deviceDisconnected(QString info); protected: void timerEvent(QTimerEvent*) override { timeval tv = {0, 0}; libusb_handle_events_timeout_completed(ctx, &tv, nullptr); } private: libusb_context* ctx; libusb_hotplug_callback_handle callback_handle; static int hotplugCallback(libusb_context* ctx, libusb_device* dev, libusb_hotplug_event event, void* user_data) { UsbMonitor* monitor = static_cast<UsbMonitor*>(user_data); libusb_device_descriptor desc; libusb_get_device_descriptor(dev, &desc); QString info = QString("VID:%1 PID:%2") .arg(desc.idVendor, 4, 16, QLatin1Char('0')) .arg(desc.idProduct, 4, 16, QLatin1Char('0')); if (event == LIBUSB_HOTPLUG_EVENT_DEVICE_ARRIVED) { Q_EMIT monitor->deviceConnected(info); } else { Q_EMIT monitor->deviceDisconnected(info); } return 0; } }; ``` #### 3. **在Qt界面中使用** ```cpp // MainWindow.cpp UsbMonitor* monitor = new UsbMonitor(this); connect(monitor, &UsbMonitor::deviceConnected, [](QString info){ qDebug() << "Device connected:" << info; }); connect(monitor, &UsbMonitor::deviceDisconnected, [](QString info){ qDebug() << "Device disconnected:" << info; }); monitor->startMonitoring(); ``` #### 4. **关键注意事项** 1. **跨线程处理**: - libusb事件需在主线程轮询(通过Qt定时器实现) - 复杂设备操作建议在独立线程中进行[^1] 2. **Windows特殊配置**: - 需要安装WinUSB驱动(可用Zadig工具) - 添加`.inf`文件到设备管理器 3. **权限问题**: - Linux需配置udev规则: ```rules ACTION=="add", SUBSYSTEM=="usb", MODE="0666" ``` #### 5. **扩展功能建议** - 获取设备详细信息:`libusb_get_string_descriptor_ascii()` - 处理特定设备:在回调中过滤`idVendor`和`idProduct` - 数据读写:结合`libusb_open()`和异步传输接口
评论 10
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值