我正在尝试编写一个Cocoa程序来检测连接到Mac OS的iPod。我正在收听NSWorkspaceDidMountNotification和NSWorkspaceDidUnmountNotification以获取USB设备的安装和卸载通知。我可以使用NSString * path = [[notif userInfo] objectForKey:@“NSDevicePath”]获取已安装设备的设备路径;但我也不需要知道设备ID,供应商ID,产品ID等,以检查安装的设备是否是iPod。我认为前进的方向是IOKit。但我觉得它适用于低级编程。有没有其他方法可以找到这些?另外,如果是IO套件,是否有任何示例程序在我提供安装路径时会给出ID?
非常感谢。
答案 0 :(得分:2)
我正在收听NSWorkspaceDidMountNotification和NSWorkspaceDidUnmountNotification,以便USB设备挂载和卸载通知。
这不是那些通知的用途。它们是卷安装和卸载通知,卷可以来自非USB设备。磁盘映像,FireWire设备,光盘和闪存卡都是非USB设备的设备。 (该卡可能位于USB读卡器中,但该卡不是读卡器。)
我认为前进的方向是IOKit。
正确。
但我觉得它适用于低级编程。
正确。
还有其他方法可以找到这些吗?
您无法完全切断I / O Kit,但有一条快捷方式可能会为您节省一些工作。这是磁盘仲裁框架。
Register a disk-appeared callback和a 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