【问题标题】:Unique device identifiers for USB, firewire, and serial portsUSB、火线和串行端口的唯一设备标识符
【发布时间】:2011-09-11 13:37:48
【问题描述】:

我正在开展一个项目,该项目涉及自动检测从 OS X 系统插入和拔出的 USB 和火线设备。对于给定的设备,系统需要在插入时识别设备(无论是哪个端口)并加载特定于设备的捆绑包来处理它。

实现这项工作的关键显然是每个设备的唯一标识。我知道 USB 设备由供应商 ID 和产品 ID 字段的组合标识,但这不提供唯一 ID,仅提供设备的“种类”。如果我有两个相同的设备并将它们都插入计算机,我想要一些方法来区分它们。是否有一种通用且可靠的方法来执行此操作,也许使用 USB 描述符中的其他字段?

一个相关的问题,USB 串行端口如何工作?假设我插入了两个相同品牌/型号的 USB 串行端口。 OS X 应该在 /dev 树中为它们提供唯一的 inode。但是,假设它称它们为 /dev/usbserial1 和 /dev/usbserial2。如果我然后拔下端口并仅插入其中一个,该端口的名称是否与以前相同,还是仅插入 /dev/usbserial1(因为它是唯一的)端口?

对于火线设备同样的问题,虽然我认为火线设备应该有一个 64 位 GUID。在这种情况下,我正在寻找某人来验证使用 GUID 进行火线设备识别是否可靠。换句话说,如果我插入两个相同品牌和型号的独立相机,我会期望它们有不同的 GUID 吗?

我知道我可以用适当的硬件测试其中的一些,但我目前没有多个硬件,所以我希望有人至少知道上述问题的部分答案。

【问题讨论】:

  • 我有兴趣回答有关 FireWire 的问题的第二部分。

标签: macos usb device-driver firewire


【解决方案1】:

幸运的是,除了 VID/PID 组合之外,您的 USB 设备还应该有唯一的序列号。如果您要枚举 IOUSBDevice 对象,请查看 USB Serial Number 属性。

【讨论】:

  • 好的,谢谢。 “幸运”是否意味着某些设备可能不提供序列号?
  • @David:这意味着它并没有真正的要求存在(也不需要它是唯一的,因为除了 Unicode 之外对内容没有任何要求)。但假设它确实存在,它将是独一无二的,这似乎是合理的。
  • USB Spec 表示如果有一个序列号,它必须是唯一的。当心:有一些便宜的芯片不遵守这条规则。序列号本身是可选的。
  • @Turbo J:我在 USB 2.0 或 USB 3.0 规范中的任何地方都找不到这样的措辞,你能给我章节号吗?
  • 好的,我发现了一个例外,USB Mass Storage Bulk Only 规范要求设备具有至少 12 位的唯一序列号,其他规范可能有类似要求。不过,这远非普遍。
【解决方案2】:

在 Windows 上,Microsoft 通过以下方式记住特定于设备的设置:

  • 设备的序列号(USB 设备描述符中的 iSerialNumber 字段)(如果可用)
  • 或以其他方式,通过设备的“路径”:其总线(即插入的集线器等)+ USB VID 和 PID

没有序列号,USB 设备几乎无法区分。您可以区分不同的 USB 磁盘驱动器,但对于没有任何类型的非易失性存储器的设备(许多 USB 设备属于此类),它们只是无法区分,因此您只需要尽最大努力去做用户期望的。

【讨论】:

    猜你喜欢
    • 2022-09-29
    • 1970-01-01
    • 2016-03-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多