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

问题描述 投票:3回答:4

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

非常感谢。

cocoa usb mount iokit
4个回答
2
投票

我正在监听USB设备安装和卸载通知的NSWorkspaceDidMountNotification和NSWorkspaceDidUnmountNotification。

这不是这些通知的目的。它们是volume安装和卸载通知,并且卷可能来自非USB设备。磁盘映像,FireWire设备,光盘和闪存卡都是不是USB设备的设备。 (该卡可能在USB读卡器中,但该卡不是读卡器。)

我认为前进的道路是IOKit。

正确。

但是我有一种低级编程的感觉。

正确。

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

您无法完全切断I / O套件,但是有一条捷径可以节省您一些工作。它是磁盘仲裁框架。

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

我不知道该怎么办,除了您需要按照该文档中所述释放服务端口。另外,您仍然需要过滤掉非USB设备,但是至少您将拥有I / O Kit媒体对象。

另一件事:如果iPod未设置为使用或不支持磁盘模式,则此解决方案以及您当前正在使用的NSWorkspace通知可能都无法使用。 iPhone和iPod touch是目前最大的例子。如果真是这样,那么您将需要从头到尾使用I / O Kit-DiskArb和NSWorkspace都不会为您完成这项工作。


0
投票

还有Apple的DADiskCopyIOMedia示例。仔细阅读标题-尽管该框架没有很好的文档,但我认为这里有一个示例应用程序或其中的一些东西。


0
投票

您可以使用usbprobe,ioregistryexplorer,或者如果您只是想要idProduct,...您可以始终将其插入linux计算机,并使用“ lsusb -v”来获取与该设备有关的信息,这与ioregistryexplorer相反似乎在os x的每个发行版中都不断中断。

ioregistryexplorer还需要mac开发人员程序的$ 100会员资格(自山狮起)


0
投票

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

HIDUtilites

但不确定设备ID。也许

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

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

ioreg -p IOUSB -l -b | grep -E "@|idVendor|idProduct|bcdDevice"
© www.soinside.com 2019 - 2024. All rights reserved.