【问题标题】:Mac OSX get USB vendor id and product idMac OSX 获取 USB 供应商 ID 和产品 ID
【发布时间】:2014-02-26 13:19:50
【问题描述】:

我是 Mac OSX 世界的新手,我必须编写一个脚本,为我提供连接的 USB 设备的供应商 ID 和产品 ID。我已经为 Windows 和 Linux 做过,但对于 Mac,我不知道从哪里开始。

我已经看到了这个post,但是与示例的链接不起作用。对于我可以从哪里开始或在哪里可以找到一些示例,你们有什么建议吗?

具体来说,我应该使用哪种语言?

【问题讨论】:

  • 你在 Linux 上使用了什么语言等等。我原以为 C 会是一个很好的起点。基于 Linux / OSX Unix 根
  • 我在 Linux 上使用 C,在 Windows 上使用 C++,但我也可以使用任何其他语言。

标签: macos bash usb


【解决方案1】:

您用bash 标记了您的问题,所以我会像您在询问如何在 bash 中执行此操作一样回答它,而不是询问要使用哪种语言(这会使问题脱离 StackOverflow 的主题) .

您可以使用内置工具从 system_profiler 解析现有数据。例如,这里是 vendor:product 对的转储,带有“Location ID”和制造商...

#!/bin/bash

shopt -s extglob

while IFS=: read key value; do
  key="${key##+( )}"
  value="${value##+( )}"
  case "$key" in
    "Product ID")
        p="${value% *}"
        ;;
    "Vendor ID")
        v="${value%% *}"
        ;;
    "Manufacturer")
        m="${value}"
        ;;
    "Location ID")
        l="${value}"
        printf "%s:%s %s (%s)\n" "$v" "$p" "$l" "$m"
        ;;
  esac
done < <( system_profiler SPUSBDataType )

这依赖于 Location ID 是每个 USB 设备列出的最后一项这一事实,我尚未最终验证。 (对我来说就是这样。)

如果您想要 (1) 更易于阅读且 (2) 不依赖 bash 并因此更便携(但这不是问题;所有 Mac 都带有 bash),您可能需要考虑做您的使用 awk 而不是纯 bash 进行繁重的工作:

#!/bin/sh

system_profiler SPUSBDataType \
    | awk '
      /Product ID:/{p=$3}
      /Vendor ID:/{v=$3}
      /Manufacturer:/{sub(/.*: /,""); m=$0}
      /Location ID:/{sub(/.*: /,""); printf("%s:%s %s (%s)\n", v, p, $0, m);}
    '

甚至避免将其完全包装在外壳中:

#!/usr/bin/awk -f

BEGIN {

  while ("system_profiler SPUSBDataType" | getline) {
    if (/Product ID:/)   {p=$3}
    if (/Vendor ID:/)    {v=$3}
    if (/Manufacturer:/) {sub(/.*: /,""); m=$0}
    if (/Location ID:/)  {sub(/.*: /,""); printf("%s:%s %s (%s)\n", v, p, $0, m)}
  }

}

请注意,您还可以从system_profiler 获取 XML 格式的输出:

$ system_profiler -xml SPUSBDataType

不过,您需要一个 XML 解析器来处理该输出。而且你会发现在原生 bash 中解析 XML 的工作量很大。

【讨论】:

  • 还有:system_profiler -json SPUSBDataType
【解决方案2】:

根据您想对这些信息做什么,您可以在System Information 中查找。

点击屏幕左上角的Apple菜单About this MacMore InfoSystem Report并选择左上角的Hardware,然后选择USB

您也许可以编写 Applescript 来做到这一点,但如果您打算继续以某种方式与设备交互,这可能不是最好的方法。

【讨论】:

  • 我需要一个脚本,给定 USB 路径,它会返回设备的供应商 ID 和产品 ID。我需要这些信息独立(我不必与设备交互)。
【解决方案3】:

您可以使用 system_profiler 命令,如下所示:

system_profiler -detailLevel full

并从中解析输出。或者,您可以在 system_profiler 命令中添加 -xml 选项,然后使用 awk/grep 或 Perl 中的 XML 模块轻松解析 XML。

示例摘录:

  | |   |   | +-o FaceTime HD Camera (Built-in)@0  <class IOUSBInterface, id 0x1000002b2, registered, matched, active, busy 0 (26 ms), retain 7>

| |   |   | |   {
| |   |   | |     "IOCFPlugInTypes" = {"2d9786c6-9ef3-11d4-ad51-000a27052861"="IOUSBFamily.kext/Contents/PlugIns/IOUSBLib.bundle"}
| |   |   | |     "bcdDevice" = 0x755
| |   |   | |     "IOUserClientClass" = "IOUSBInterfaceUserClientV3"
| |   |   | |     "idProduct" = 0x850b
| |   |   | |     "bConfigurationValue" = 0x1
| |   |   | |     "bInterfaceSubClass" = 0x1
| |   |   | |     "locationID" = 0xfffffffffa200000
| |   |   | |     "USB Interface Name" = "FaceTime HD Camera (Built-in)"
| |   |   | |     "idVendor" = 0x5ac

关于 USB 设备的路径,我不知道你会如何在 Mac 上做到这一点。我可能会想跑:

find /dev -type b -o -type c

在插入 USB 设备并保存输出之前。然后让您的用户插入设备并再次运行相同的命令,以查看由于插入设备而添加了哪些设备特殊文件。也许粗糙,也许有效——只是一个想法。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-01-02
    • 2019-09-18
    • 1970-01-01
    • 1970-01-01
    • 2011-02-25
    • 1970-01-01
    相关资源
    最近更新 更多