【问题标题】:Issue retrieving serial number of USB devices on Mac OS X在 Mac OS X 上检索 USB 设备的序列号时出现问题
【发布时间】:2015-10-21 10:46:16
【问题描述】:

我在 Mac OS X v10.10 (Yosemite) 环境中使用 libusb 0.1 和 Qt。我的目标是获取所有连接的 USB 密钥的序列号 (usbclass= 8)。

通常第一次读数正常,我不明白为什么,但有时从后续读数中,不再检测到设备。有时我在 usb_get_string_simple(handle, device->descriptor.iSerialNumber) 函数上得到 -60 错误代码。我该如何解决这个问题?

我尝试过使用 FAT、FAT32 和 NTFS 文件系统的 USB 密钥,但它们都有同样的问题。

在同一个项目中,我使用 libusb 读取/写入连接到 Mac 的打印机设备,并读取序列号。这种类型的设备没有问题。好奇怪。

在 .pro 文件中:

INCLUDEPATH +=   /Users/sborfedor/Desktop/root/current/includes
DEPENDPATH  +=   /Users/sborfedor/Desktop/root/current/includes
LIBS        += -L/Users/sborfedor/Desktop/root/current/bin_osx/libs/ -lusb-legacy
DESTDIR     =    /Users/sborfedor/Desktop/root/current/bin_osx

这是我的代码:

void MainWindow::run() {
    struct usb_bus* bus = NULL;
    struct usb_device* device = NULL;
    const int MASSSTORAGE_CLASS = 8;
    usb_init();
    usb_set_debug(3);
    usb_find_busses();
    usb_find_devices();
    int ret;
    for ( bus = usb_get_busses(); bus; bus = bus->next ) {
        for ( device = bus->devices; device; device = device->next )  {
            if (device->descriptor.bDeviceClass != MASSSTORAGE_CLASS && device->descriptor.bDeviceClass != 0) {
                continue;
            }
            for ( int cid = 0; cid < device->descriptor.bNumConfigurations; ++cid ) {
                struct usb_config_descriptor* config = &( device->config[cid] );
                if (config == NULL)
                    continue;
                for ( int iid = 0; iid < config->bNumInterfaces; ++iid ) {
                    struct usb_interface* interface = &( config->interface[iid] );
                    if (interface == NULL)
                        continue;
                    usb_dev_handle* handle = usb_open( device );
                    if (handle == NULL)
                        continue;
                    for ( int sid = 0; sid < interface->num_altsetting; sid++ ) {
                        struct usb_interface_descriptor* settings = &( interface->altsetting[sid] );
                        if (settings == NULL)
                            continue;
                        int usbClass = device->descriptor.bDeviceClass;
                        if (usbClass == 0) {
                            usbClass = settings->bInterfaceClass;
                        }
                        if (usbClass != MASSSTORAGE_CLASS)
                            continue;
                        char device_serial_number[255];
                        ret = usb_get_string_simple( handle, device->descriptor.iSerialNumber, device_serial_number, sizeof(device_serial_number) );
                        if (ret > 0 ) {
                            qDebug() << "SERIAL_NUMBER="<<QString(device_serial_number);
                        } else {
                            qDebug() << "*** usb_get_string_simple( handle, device->descriptor.iSerialNumber, device_serial_number, USBX_DEVICE_SERIAL_NUMBER_MAX_SIZE ) RET="<<ret;
                        }
                    }
                    usb_close( handle );
                }
            }
        }
    }
}

【问题讨论】:

  • 你是如何安装libusb的?
  • 在同一个项目中,我使用 libusb 读取/写入连接到 Mac 的打印机设备,并读取序列号。这种类型的设备没有问题。这么奇怪。我认为 libusb 安装正确。
  • 但是你是怎么安装的呢?
  • 我已经更新了我的问题

标签: macos qt osx-yosemite libusb darwin


【解决方案1】:

我对 libusb 不是特别熟悉,但是 OSX 已经读取了序列号并将它们存储在 IOKit 设备 nubs 上的相关属性中。所以不需要向硬件发送请求,这可能会使活动驱动程序感到困惑? (Libusb 大概会在设备上创建一个用户客户端驱动实例)

磁盘仲裁框架是枚举系统中磁盘并查询其属性的好方法——这比直接使用 IOKit 容易一些。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-12-02
    • 1970-01-01
    • 2014-07-05
    • 2013-01-21
    • 1970-01-01
    • 2016-10-31
    相关资源
    最近更新 更多