4

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

非常感谢。

4

4 回答 4

5

我认为您可以通过以下方式获取产品和供应商 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
于 2019-11-02T21:18:45.620 回答
2

我正在收听 NSWorkspaceDidMountNotification 和 NSWorkspaceDidUnmountNotification 以获取 USB 设备安装和卸载通知。

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

我认为前进的方向是 IOKit。

正确的。

但我有一种感觉,它适用于低级编程。

正确的。

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

您无法完全删除 I/O Kit,但有一个捷径可以为您节省一些工作。这是磁盘仲裁框架。

注册一个磁盘出现的回调一个磁盘消失的回调。您实现的每个回调函数都需要一个DADiskRef. 您可以将此传递给函数DADiskCopyIOMedia以获取磁盘的 I/O Kit 媒体对象的服务端口。

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

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

于 2010-01-07T15:19:12.407 回答
0

还有来自 Apple的HIDUtilites示例。阅读标题——虽然这个框架没有很好的文档,但我认为有一个示例应用程序或其他东西。

于 2010-01-18T15:48:42.910 回答
0

您可以使用 usbprobe、ioregistryexplorer 或者如果您只想要 idProduct 并且......您可以随时将其插入 linux 机器并使用“lsusb -v”以非常理智的方式获取有关设备的信息,而不是 ioregistryexplorer 似乎os x 的每个版本都会不断中断。

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

于 2013-01-20T08:12:03.140 回答