【问题标题】:how to get Device id, vendor id and product id of a mounted usb device in Mac OS cocoa如何在 Mac OS cocoa 中获取已安装 USB 设备的设备 ID、供应商 ID 和产品 ID
【发布时间】:2011-01-02 12:02:28
【问题描述】:

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

非常感谢。

【问题讨论】:

    标签: cocoa usb mount iokit


    【解决方案1】:

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

    【讨论】:

      【解决方案2】:

      我认为您可以通过

      获取产品和供应商 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
      

      【讨论】:

        【解决方案3】:

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

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

        【讨论】:

          【解决方案4】:

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

          这不是那些通知的用途。它们是 volume 挂载和卸载通知,并且卷可以来自不是 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 媒体对象。

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

          【讨论】:

          • 非常感谢您的回答。我对 Mac 和 IOKit 非常陌生。我认为对于通用解决方案,我将从一开始就使用 IO Kit。即使没有安装 iPod 也能正常工作吗?您能否提供一些线索,例如在哪里可以找到更多信息和 IO 套件示例。
          • 当然它工作,因为它提供了对设备树的访问。但是如果 iPod 没有连接,它就不会出现在设备树中,因为设备树只是那些连接的设备。例如:developer.apple.com/mac
          猜你喜欢
          • 1970-01-01
          • 2011-02-25
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2012-06-06
          • 1970-01-01
          • 1970-01-01
          • 2021-07-11
          相关资源
          最近更新 更多