工作原理
显示 USB 设备接入后立刻对外声明的自身信息。设备描述符包含 USB-IF 分配的供应商 ID、制造商选定的产品 ID、它声称遵循的 USB 规范版本、产品自身的版本,以及设备若有提供的制造商、产品和序列号文本。
下方会列出完整的树:每个配置及其接口,每个接口的类、子类和协议三元组并转换为 USB-IF 官方名称,以及每个端点的地址、方向、传输类型和最大包长。带有多个备用设置的接口——摄像头和声卡上很常见——会单独列出。
本工具只读取描述符:从不与设备建立会话,从不占用接口,也从不向它发送一个字节,因此不会干扰正在使用它的驱动程序。整棵树可以导出为 JSON,便于附在报告里或与另一台电脑的结果对比。
示例
046D:C52B0x00 / 0x00 / 0x00 → 3 × HID (0x03)键鼠无线接收器在设备层声明类 0x00,因此真正的类型由各个接口决定:这里是三个 HID 接口,每个带一个中断输入端点。0x08 / 0x06 / 0x50Mass Storage · SCSI transparent command set · Bulk-Only TransportU 盘或移动硬盘的典型三元组:两个批量端点,一进一出,SCSI 命令就在上面传输。0x02 / 0x02 / 0x01Communications and CDC Control · Abstract Control Model · AT Commands (ITU-T V.250)这是开发板或调制解调器的虚拟串口:一个带中断端点的控制接口,加上一个带两个批量端点、负责传输数据的 CDC-Data 接口。使用场景
- 查出设备准确的供应商 ID 和产品 ID,以便寻找驱动程序或在 Linux 上编写 udev 规则。
- 当操作系统不直接显示时,查看 U 盘、读卡器或适配器的序列号。
- 在开发固件时确认设备发布了预期的接口、备用设置和端点,并且类别正确。
- 在为设备写代码之前,弄清楚该通过哪个端点、用哪种传输类型与它通信。
- 通过比较版本、接口和包长,分辨两台看起来一样的设备。
- 把整棵树导出为 JSON,为一台电脑的 USB 配置留档。
常见问题
为什么在我的 iPhone 和 Firefox 上用不了?
WebUSB API 在基于 Chromium 的浏览器——Chrome、Edge 和 Opera——的 Windows、macOS、Linux、ChromeOS 和 Android 版本中实现。Firefox 和 Safari 没有实现它,而在 iOS 上所有浏览器都使用系统内核,所以那里同样不可用。此外还需要 HTTPS,并且页面不能被嵌入在另一个站点里。
设备已经接上,但选择框里看不到它。
可能是所选筛选条件太窄:试试列出全部设备的选项。若仍未出现,很可能它在浏览器的屏蔽名单里;出于安全考虑,该名单排除了某些产品——其中包括 FIDO 安全密钥——以免任何网页碰到它们。在 Linux 上也可能缺少对设备节点的系统权限。
为什么设备显示类 0x00?
设备描述符里的类 0x00 表示「请看接口」。几乎所有复合设备都用它,因为它们把不同功能合在同一根线上:内置集线器的键盘、同时提供麦克风的摄像头,或者多功能一体机。这种情况下,每个功能的真实类型在各个接口的类里,而不在设备的类里。
什么是端点?像 0x81 这样的地址是什么意思?
端点就是数据进出某个接口的一个个信箱。地址的低七位是端点编号,最高位表示方向,所以 0x81 是输入端点 1——从设备到电脑——而 0x01 则是输出端点 1。传输类型决定了它得到的待遇:批量适合没有时限的大量数据,中断适合按键这类频繁的小事件,同步适合音视频,它们宁可丢一个包也不愿迟到。
这个工具会不会改动或弄坏设备?
不会。它只读取浏览器在枚举设备时已经取得的描述符;从不建立会话,从不占用接口,也从不写入。正因如此,即使是操作系统此刻正在使用的键盘或 U 盘也能检查,尽管网页并不被允许与它们通信。
为什么制造商或产品是空的?
这些文本是可选描述符:很多廉价设备根本不写入,有些操作系统也不会把它们交给浏览器。遇到这种情况,工具会到 Linux USB 项目的 usb.ids 目录里查找供应商 ID 和产品 ID,那里记录着制造商的官方名称,很多时候也有产品名称。
设备的数据会离开我的电脑吗?
描述符在你的浏览器里读取,不会发送到任何服务器。唯一的例外是 usb.ids 目录查询,它只查询供应商 ID 和产品 ID——这两个数字标识型号,而不是你的电脑或你手上的这一台——而且你可以在选择设备之前关掉它。序列号从不发送。
接口的备用设置是什么?
同一个接口可以声明多组端点,但只保留一组处于活动状态。摄像头和声卡用它来提供不同的分辨率或音质组合:每个备用设置在总线上预留的带宽不同,操作系统在开始传输时挑选合适的那一个。设备空闲时保持活动的是 0 号备用设置。