如何在Mac OS cocoa中获取已安装的USB设备的设备ID,供应商ID和产品ID

时间:2010-01-07 13:41:29

标签: cocoa usb mount iokit

我正在尝试编写一个Cocoa程序来检测连接到Mac OS的iPod。我正在收听NSWorkspaceDidMountNotification和NSWorkspaceDidUnmountNotification以获取USB设备的安装和卸载通知。我可以使用NSString * path = [[notif userInfo] objectForKey:@“NSDevicePath”]获取已安装设备的设备路径;但我也不需要知道设备ID,供应商ID,产品ID等,以检查安装的设备是否是iPod。我认为前进的方向是IOKit。但我觉得它适用于低级编程。有没有其他方法可以找到这些?另外,如果是IO套件,是否有任何示例程序在我提供安装路径时会给出ID?

非常感谢。

4 个答案:

答案 0 :(得分:2)

  

我正在收听NSWorkspaceDidMountNotification和NSWorkspaceDidUnmountNotification,以便USB设备挂载和卸载通知。

这不是那些通知的用途。它们是安装和卸载通知,卷可以来自非USB设备。磁盘映像,FireWire设备,光盘和闪存卡都是非USB设备的设备。 (该卡可能位于USB读卡器中,但该卡不是读卡器。)

  

我认为前进的方向是IOKit。

正确。

  

但我觉得它适用于低级编程。

正确。

  

还有其他方法可以找到这些吗?

您无法完全切断I / O Kit,但有一条快捷方式可能会为您节省一些工作。这是磁盘仲裁框架。

Register a disk-appeared callbacka disk-disappeared callback。您实现的每个回调函数都需要DADiskRef。您可以将其传递给the DADiskCopyIOMedia function以获取磁盘的I / O Kit媒体对象的服务端口。

我不知道该怎么做,除了您需要按照该文档中的描述释放服务端口。此外,您仍然需要过滤掉非USB设备,但至少您将拥有I / O Kit媒体对象来执行此操作。

另一件事:此解决方案以及您当前使用的NSWorkspace通知,如果iPod未设置为使用或不支持磁盘模式,则可能两者都不起作用。 iPhone和iPod touch是目前最大的例子。如果是这种情况,那么您将不得不从头到尾使用I / O Kit - DiskArb和NSWorkspace都不会为您完成这项任务。

答案 1 :(得分:0)

还有来自Apple的HIDUtilites样本。仔细阅读标题 - 虽然这个框架没有很好的文档,但我认为有一个示例应用程序或其中的内容。

答案 2 :(得分:0)

你可以使用usbprobe,ioregistryexplorer或者你只是想要idProduct和...你可以随时将它插入linux机器并使用“lsusb -v”以非常理智的方式获取有关设备的信息,而不是ioregistryexplorer这似乎在每次发布os x时都会不断破解。

ioregistryexplorer还要求山狮的mac开发者计划的100美元会员资格

答案 3 :(得分:0)

我认为您可以通过以下方式获取产品和供应商ID

ioreg -p IOUSB -l -b | grep -E "@|idVendor|idProduct"

,但不确定设备ID。也许

ioreg -p IOUSB -l -b | grep -E "@|idVendor|idProduct|bcdDevice"

对于我的Arduino Uno,这些是我得到的信息:

+-o Arduino Uno@14100000  <class AppleUSBDevice, id 0x100000bec, registered, matched, active, busy 0 (2 ms), retain 13>
      "idProduct" = 67
      "bcdDevice" = 1
      "idVendor" = 10755