2015-10-21 65 views
0

我在Mac OS X v10.10(优胜美地)环境中使用libusb 0.1和Qt。我的目标是获取所有连接的USB密钥的序列号(usbclass = 8)。在Mac OS X上检索USB设备的序列号问题

通常第一次阅读正常发生,我不明白为什么,但有时从后续的读数中,设备不再被检测到。有时我会在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); 
       } 
      } 
     } 
    } 
} 
+0

你是怎么安装'libusb'的? –

+0

在同一个项目中,我使用libusb通过连接到Mac的打印机设备读取/写入数据,并读取连续数字。这种类型的设备没有问题。这么奇怪。我认为libusb安装正确。 – sborfedor

+0

但你是如何安装它的? –

回答

1

我不是特别熟悉的libusb,但OSX已经读出在序列号,并将其存储IOKit设备结点的相关属性。所以不需要向硬件发送请求,这可能会让主动驱动程序混淆? (Libusb大概会在设备上创建用户客户端驱动程序实例)

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