2015-10-21 6 views
0

Я работаю с libusb 0.1 и Qt в среде Mac OS X v10.10 (Yosemite). Моя цель - получить серийные номера всех подключенных USB-ключей (usbclass = 8).Проблема с получением серийного номера USB-устройств в Mac OS X

Обычно первое чтение происходит правильно, и я не могу понять, почему, но иногда из последующих чтений устройство больше не обнаруживается. Иногда я получаю код ошибки -60 в функции usb_get_string_simple(handle, device->descriptor.iSerialNumber). Как я могу исправить эту проблему?

Я пробовал USB-ключи с файловыми системами FAT, FAT32 и NTFS, но все они имели ту же проблему.

В этом же проекте я использую 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.

 Смежные вопросы

  • Нет связанных вопросов^_^