繁体   English   中英

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

[英]how to get Device id, vendor id and product id of a mounted usb device in Mac OS cocoa

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

非常感谢。

我认为您可以通过以下方式获取产品和供应商 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

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

那不是这些通知的用途。 它们是挂载和卸载通知,卷可以来自不是 USB 设备的东西。 磁盘映像、火线设备、光盘和闪存卡都是非 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 都不能为您完成这项工作。

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

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM