如何在 Linux 上以编程方式获取 USB 供应商和产品信息?
使用 udev,我已经能够获取某个 USB 设备的信息:
idVendor: 13b1
idProduct: 0018
manufacturer:
product: USB 2.0 Network Adapter ver.2
serial: 00FFFF
现在我想获取与供应商和产品 ID 关联的完整字符串。我发现文件 /usr/share/misc/usb.ids
包含我正在查找的信息:
13b1 Linksys
000b WUSB11 v4.0 802.11b Adapter
000d WUSB54G Wireless Adapter
0011 WUSB54GP v4.0 802.11g Adapter
0018 USB200M 10/100 Ethernet Adapter
001a HU200TS Wireless Adapter
001e WUSBF54G 802.11bg
0020 WUSB54GC 802.11g Adapter [ralink rt73]
0023 WUSB54GR
0024 WUSBF54G v1.1 802.11bg
但是,我不清楚如何在应用程序中检索此数据。是否有可用的 API 或者我应该只解析该文件?如果我选择解析它,那么 /usr/share/misc/usb.ids
总是正确的位置吗?
Using udev I have been able to get this information for a certain USB device:
idVendor: 13b1
idProduct: 0018
manufacturer:
product: USB 2.0 Network Adapter ver.2
serial: 00FFFF
Now I want to get the full strings that are associated with the vendor and product ids. I found that the file /usr/share/misc/usb.ids
contains the information that I'm looking for:
13b1 Linksys
000b WUSB11 v4.0 802.11b Adapter
000d WUSB54G Wireless Adapter
0011 WUSB54GP v4.0 802.11g Adapter
0018 USB200M 10/100 Ethernet Adapter
001a HU200TS Wireless Adapter
001e WUSBF54G 802.11bg
0020 WUSB54GC 802.11g Adapter [ralink rt73]
0023 WUSB54GR
0024 WUSBF54G v1.1 802.11bg
However, it's not clear to me how I should retrieve this data in my application. Is there an API available or should I just parse the file? If I choose to parse it, then is /usr/share/misc/usb.ids
always going to be the correct location?
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(6)
lsusb
命令查询当前插入的 USB 设备的信息。您可以使用其-d
选项来查询某个供应商/产品(但它似乎仅适用于当前插入的设备):您可以显示所有设备的信息:
您还可以使其变得详细(
lsusb -v
)并打印很多的东西。请注意,在 Linux 操作系统中访问有关系统的信息时,最好通过 shell 命令(例如 lsusb)来完成,而不是直接解析这些命令访问的系统文件。
lsusb
command queries information about currently plugged USB devices. You can use its-d
option to query a certain vendor/product (but it seems to work only for currently plugged devices):You can show information for all devices:
You can also make it be verbose (
lsusb -v
) and printing a lot of stuff.Note that when accessing information about the system in Linux OS, it's much preferred to do it via shell commands (such as
lsusb
) than to directly parse the system files these commands access.我自己没有尝试过,但是libudev 的 udev_device_get_property_value 应该是它;它用于 pulseaudio 的 udev-util .c 为udev_device_get_property_value(card, "ID_VENDOR_FROM_DATABASE"))
。这是我刚刚放在一起的一个小示例,基于
udev-util.c
- 请注意,我使用了带有 FTDI FT232 芯片的 Arduino Duemillanove,我使用udevadm< 找到了其 udev 路径/code> (请参阅下面代码中的注释),然后我将其硬编码到下面的程序中,
udevl.c
:该程序(附有 Arduino)输出:
。 .. 而“FT232 USB 串行 (UART) IC” 是 usb.ids。
希望这有帮助,
干杯!
Haven't tried this myself, but libudev's udev_device_get_property_value should be it; it is used in pulseaudio's udev-util.c asudev_device_get_property_value(card, "ID_VENDOR_FROM_DATABASE"))
.Here is a small example I just put together, based on
udev-util.c
- note that I've used an Arduino Duemillanove with FTDI FT232 chip, whose udev path I find usingudevadm
(see comments in code below), and then I hardcoded it in the below program,udevl.c
:This program (with the Arduino attached) outputs:
... and "FT232 USB-Serial (UART) IC" is the right entry for VID:PID 0403:6001 in usb.ids.
Hope this helps,
Cheers!
在我的 Ubuntu 系统上,
lsusb(1)
联机帮助页显示/var/lib/usbutils/usb.ids
是 id 文件的位置;事实上,有两个符号链接,其中之一是您的/usr/share/misc/usb.ids
。在信任符号链接之前我会信任实际位置:On my Ubuntu system, the
lsusb(1)
manpage says that/var/lib/usbutils/usb.ids
is the location of the id file; in fact, there are two symlinks, one of which is your/usr/share/misc/usb.ids
. I'd trust the actual location before trusting the symlinks:你会得到这样的结果
:
ID 1d6b:0003
可以被视为:vendor = 1d6b
和product = 0003
you get something like this
then:
ID 1d6b:0003
can be seen as :vendor = 1d6b
andproduct = 0003
您的 USB 设备不需要将供应商和产品 ID 与实际的正确名称相匹配。
使用 libusb 或 lsusb 等方式从设备本身获取此信息会更安全。
Your USB device does not need to match vendor and product ids to the actual correct names.
It would be safer to get this info from the device itself with something like
libusb
orlsusb
.我认为这是使用 libudev 问题的最佳解决方案:
udev_device_get_sysattr_value(usbDev, "idVendor")
I think this is the best solution for the issue with using libudev:
udev_device_get_sysattr_value(usbDev, "idVendor")