Фон:
У нас есть приложение, написанное с использованием инфраструктуры 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);
Задача ещё не решена.
Других решений пока нет …