QT USB硬件ID检测Mac OS 10.8.x和Mac Book(Pro)

时间:2013-02-22 06:06:21

标签: c++ macos qt osx-mountain-lion usbserial

背景:
我们有一个使用QT框架编写的应用程序。一个关键要求是我们可以正确检测所使用的 USB闪存驱动器的硬件序列号(不是外部硬盘驱动器)。此功能已正常工作4年,适用于Windows XP,Windows Vista,Windows 2007和所有Mac版本。

令我们惊讶的是,我们让客户抱怨USB硬件ID没有被完全读取和显示。经过广泛测试后发现,只有 Mac OS Mountain Lion + Mac Book(Pro)的组合才能检测到硬件ID。

在迷你Mac上的iMac上的Mountain Lion工作正常。 Leopard,Snow Leopard和Lion适用于所有Mac,包括Mac Book Pro。

我们一直在寻找近一个月的修复但没有结果。任何人都可以提供一小段代码,这些代码可以工作或提供导致此问题的信息(实际上只有这个组合)以及如何修复它。

请注意 在互联网上可以找到与山狮有问题的其他USB硬件的几种资源,但是如上所述,没有给出解决方案的答案。

其他信息: 我们现在使用以下代码在除了具有USB3.0端口的Mac之外的所有Mac上都能正常工作。

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);

0 个答案:

没有答案