获取USB HDD的序列号(Mac OS)

时间:2012-04-27 09:39:21

标签: objective-c xcode macos usb

我已经搜索了stackoverflow.com和google的答案,但找不到任何答案。

我有一个属于外部USB HDD(disk1)的分区(disk1s1)的bsdName。

我需要找出外部硬盘的序列号。 我已经尝试过以下内容(查找带有bsd名称的服务):

io_service_t io_service = IOServiceGetMatchingService(kIOMasterPortDefault,IOBSDNameMatching(kIOMasterPortDefault, 0, [@"disk1" cStringUsingEncoding:NSUTF8StringEncoding]));

问题是:返回的服务类型是IOMedia,没有字段USB Serial Number。如果我使用DiskArbitration框架(这是IOMedia的抽象),我最终会遇到同样的问题

所以我尝试了另一种方法:让所有IOUSBDevice服务迭代它们,只需查找IOUSBDevice上的bsdName或分区。遗憾的是,IOUSBDevice中没有关于任何分区或bsd名称的信息存储。

有人可以帮我解决这个问题吗?

更多信息:

  • XCode 4.3.2
  • Mac OS X Lion(10.7.3)

修改 如果我遍历所有IOUSBDevice或AppleUSBEHCI io_services,这是输出的有趣部分:

Child props: {
"Bus Power Available" = 250;
"Device Speed" = 2;
IOCFPlugInTypes =     {
    "9dc7b780-9ec0-11d4-a54f-000a27052861" = "IOUSBFamily.kext/Contents/PlugIns/IOUSBLib.bundle";
};
IOGeneralInterest = "IOCommand is not serializable";
IOUserClientClass = IOUSBDeviceUserClientV2;
"Low Power Displayed" = 0;
PortNum = 3;
"Requested Power" = 250;
"USB Address" = 6;
"USB Product Name" = "Mass Storage Device";
"USB Serial Number" = 09021000000000003740385375;
"USB Vendor Name" = JetFlash;
bDeviceClass = 0;
bDeviceProtocol = 0;
bDeviceSubClass = 0;
bMaxPacketSize0 = 64;
bNumConfigurations = 1;
bcdDevice = 2560;
iManufacturer = 1;
iProduct = 2;
iSerialNumber = 3;
idProduct = 4096;
idVendor = 34148;
kHasMSCInterface = 1;
locationID = "-99418112";
sessionID = 209792844564562;
uid = "USB:85641000003740385375";

}

正如你所看到的,我得到序列号,但我无法分辨出这个设备有哪个bsd名称。

1 个答案:

答案 0 :(得分:2)

我有一个关于如何在c ++中执行此操作的教程。给定一个io_service_t,这是下面代码片段中的usbDevice,你可以得到像这样的bsdName:

     bsdName = ( CFStringRef ) IORegistryEntrySearchCFProperty( 
        usbDevice,
        kIOServicePlane,
        CFSTR( kIOBSDNameKey ),
        kCFAllocatorDefault,
        kIORegistryIterateRecursively )

这是用C ++获取USB闪存盘的序列号的代码,但它可能适合您的目的:

http://oroboro.com/usb-serial-number-osx/