Обнаружение идентификатора оборудования USB QT Mac OS 10.8.x и Mac Book (Pro)

Фон:
У нас есть приложение, написанное с использованием инфраструктуры QT. Одним из ключевых требований является то, что мы можем правильно определить серийный номер оборудования флешка используется (не внешний жесткий диск). Эта функция работала правильно в течение 4 лет и работала в Windows XP, Windows Vista, Windows 2007 и на всех версиях Mac.

К нашему удивлению, мы получили клиентов, которые жаловались на то, что идентификатор оборудования USB не читается и отображается не полностью. После тщательного тестирования выясняется, что только сочетание Mac OS Mountain Lion + Mac Book (Pro) НЕ определяет идентификатор оборудования.

Mountain Lion на iMac, на Mini Mac, отлично работает. Leopard, Snow Leopard и Lion отлично работают на всех компьютерах Mac, включая Mac Book Pro.

Мы искали исправление почти 1 месяц, но безрезультатно. Может ли кто-нибудь предоставить небольшой фрагмент кода, который работает или дать информацию, что вызывает эту проблему (и действительно только на этой комбинации) и как ее исправить.

Заметка
В Интернете можно найти несколько ресурсов о другом USB-оборудовании, которое имеет проблемы с горным львом, но нигде не было дано ответа на решение именно этой проблемы, как описано выше.

Дополнительная информация:
На данный момент мы используем следующий код, который работает корректно на всех компьютерах Mac, за исключением тех, которые имеют порт USB3.0.

matchingDict = IOServiceMatching(kIOUSBDeviceClassName);
if (matchingDict == NULL)
{
return uret; // fail
}

/* Now we have a dictionary, get an iterator.*/
kr = IOServiceGetMatchingServices(kIOMasterPortDefault, matchingDict, &iter);
if (kr != KERN_SUCCESS)
{
return uret;
}

/* iterate */
/* scan all USB device in Mac machine*/
while ((device = IOIteratorNext(iter)))
{
int vendorId;
int productId;
getVidAndPid(device, &vendorId, &productId);
/*Get USB serial number by CFTypeRef*/
CFTypeRef  serialNoRef = IORegistryEntryCreateCFProperty(device, CFSTR("USB Serial   Number"), 0, 0);
/*Get USB bsd name by CFStringRef */
CFStringRef bsdNameRef = (CFStringRef)IORegistryEntrySearchCFProperty(device,  kIOServicePlane,CFSTR(kIOBSDNameKey),kCFAllocatorDefault, kIORegistryIterateRecursively );
char* bsdName = cfStringRefToCString(bsdNameRef) ;
qDebug() << "bsd Name " << bsdName ;
if (bsdName != NULL)
{
char* serialNo = cfTypeToCString(serialNoRef);
qDebug() << "serialNo " << serialNo ;
/*Get USB manufacturerRef by CFTypeRef */
CFTypeRef manufacturerRef =IORegistryEntrySearchCFProperty(device,     kIOServicePlane, CFSTR(kUSBVendorString), kCFAllocatorDefault, 0);
char* manufacrurer = cfTypeToCString(manufacturerRef);
qDebug() << "manufacrurer " << manufacrurer ;
}
IOObjectRelease(device);
}

/* Done, release the iterator */
IOObjectRelease(iter);

1

Решение

Задача ещё не решена.

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]