如何在 Linux 上以编程方式获取 USB 供应商和产品信息?

声明:本页面是StackOverFlow热门问题的中英对照翻译,遵循CC BY-SA 4.0协议,如果您需要使用它,必须同样遵循CC BY-SA许可,注明原文地址和作者信息,同时你必须将它归于原作者(不是我):StackOverFlow 原文地址: http://stackoverflow.com/questions/3279800/
Warning: these are provided under cc-by-sa 4.0 license. You are free to use/share it, But you must attribute it to the original authors (not me): StackOverFlow

提示:将鼠标放在中文语句上可以显示对应的英文。显示中英文
时间:2020-08-03 20:16:19  来源:igfitidea点击:

How to get USB vendor and product info programmatically on Linux?

linuxusbudev

提问by StackedCrooked

Using udev I have been able to get this information for a certain USB device:

使用 udev 我已经能够获得某个 USB 设备的信息:

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.idscontains the information that I'm looking for:

现在我想获取与供应商和产品 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

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.idsalways going to be the correct location?

但是,我不清楚应该如何在我的应用程序中检索这些数据。是否有可用的 API 或者我应该解析文件?如果我选择解析它,那么/usr/share/misc/usb.ids总是会是正确的位置?

采纳答案by P Shved

lsusbcommand queries information about currently plugged USB devices. You can use its -doption to query a certain vendor/product (but it seems to work only for currently plugged devices):

lsusb命令查询有关当前插入的 USB 设备的信息。您可以使用它的-d选项来查询某个供应商/产品(但它似乎只适用于当前插入的设备):

$ lsusb -d 0e21:0750
Bus 001 Device 005: ID 0e21:0750 Cowon Systems, Inc.

You can show information for all devices:

您可以显示所有设备的信息:

$ lsusb
Bus 001 Device 001: ID 1d6b:0002 Linux Foundation 2.0 root hub
Bus 001 Device 004: ID 0421:01c7 Nokia Mobile Phones
Bus 001 Device 003: ID 0bda:8187 Realtek Semiconductor Corp. RTL8187 Wireless Adapter
Bus 001 Device 005: ID 0e21:0750 Cowon Systems, Inc.
Bus 002 Device 001: ID 1d6b:0002 Linux Foundation 2.0 root hub
Bus 003 Device 001: ID 1d6b:0001 Linux Foundation 1.1 root hub
Bus 004 Device 001: ID 1d6b:0001 Linux Foundation 1.1 root hub
Bus 005 Device 001: ID 1d6b:0001 Linux Foundation 1.1 root hub
Bus 006 Device 001: ID 1d6b:0001 Linux Foundation 1.1 root hub
Bus 006 Device 002: ID 046d:c01b Logitech, Inc. MX310 Optical Mouse
Bus 007 Device 001: ID 1d6b:0001 Linux Foundation 1.1 root hub
Bus 008 Device 001: ID 1d6b:0001 Linux Foundation 1.1 root hub

You can also make it be verbose (lsusb -v) and printing a lotof stuff.

你也可以让它变得冗长 ( lsusb -v) 并打印很多东西。

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.

请注意,在 Linux 操作系统中访问有关系统的信息时,更倾向于通过 shell 命令(例如lsusb)而不是直接解析这些命令访问的系统文件。

回答by leppie

Your USB device does not need to match vendor and product ids to the actual correct names.

您的 USB 设备不需要将供应商和产品 ID 与实际正确的名称相匹配。

It would be safer to get this info from the device itself with something like libusbor lsusb.

使用类似libusb或 的东西从设备本身获取此信息会更安全lsusb

回答by sarnold

On my Ubuntu system, the lsusb(1)manpage says that /var/lib/usbutils/usb.idsis 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:

在我的 Ubuntu 系统上,手册lsusb(1)页说这/var/lib/usbutils/usb.ids是 id 文件的位置;实际上,有两个符号链接,其中之一是您的/usr/share/misc/usb.ids. 在信任符号链接之前,我会信任实际位置:

$ ls -l /usr/share/misc/usb.ids /var/lib/misc/usb.ids /var/lib/usbutils/usb.ids
lrwxrwxrwx 1 root root     25 2010-04-29 18:08 /usr/share/misc/usb.ids -> /var/lib/usbutils/usb.ids
lrwxrwxrwx 1 root root     19 2010-04-29 18:08 /var/lib/misc/usb.ids -> ../usbutils/usb.ids
-rw-r--r-- 1 root root 368377 2009-11-06 09:26 /var/lib/usbutils/usb.ids

回答by sdaau

Haven't tried this myself, but libudev's udev_device_get_property_valueshould be it; it is used in pulseaudio's udev-util.cas udev_device_get_property_value(card, "ID_VENDOR_FROM_DATABASE")).

这个我自己没试过,不过应该是libudev 的 udev_device_get_property_value吧;它在pulseaudio 的 udev-util.c 中用作udev_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 using udevadm(see comments in code below), and then I hardcoded it in the below program, udevl.c:

这是我刚刚放在一起的一个小例子,基于udev-util.c- 请注意,我使用了带有 FTDI FT232 芯片的 Arduino Duemillanove,我发现使用了它的 udev 路径udevadm(参见下面代码中的注释),然后我在下面的程序中对其进行了硬编码,udevl.c

// sudo apt-get install libudev-dev
// build with: gcc -o udevl -ludev -Wall -g udevl.c

#include <stdio.h>

#include <libudev.h>

int main( int argc, char **argv )
{
  const char *v;
  char t[256];
  struct udev *udev;
  struct udev_device *card = NULL;

  if (!(udev = udev_new())) {
      fprintf(stderr, "Failed to allocate udev context.\n");
      return -1;
  }

  // $ lsusb | grep FT232
  // Bus 002 Device 002: ID 0403:6001 Future Technology Devices International, Ltd FT232 USB-Serial (UART) IC    
  // $ udevadm info --name=/dev/ttyUSB0 --attribute-walk | grep "looking at device"
  // looking at device '/devices/pci0000:00/0000:00:1d.0/usb2/2-2/2-2:1.0/ttyUSB0/tty/ttyUSB0'
  // (that one is under /sys)
  // hardcode that path below:

  // udev_get_sys_path(udev) for me: '/sys'
  sprintf(t, "%s/devices/pci0000:00/0000:00:1d.0/usb2/2-2/2-2:1.0/ttyUSB0/tty/ttyUSB0", udev_get_sys_path(udev));
  fprintf(stdout, " path: %s\n", t);

  card = udev_device_new_from_syspath(udev, t);
  fprintf(stdout, " udev_device: 0x%08X\n", (unsigned int)card);

  if ((v = udev_device_get_property_value(card, "ID_MODEL_FROM_DATABASE")) )
    fprintf(stdout, "got ID_MODEL_FROM_DATABASE: %s\n", v);
  else
    fprintf(stdout, "failed getting ID_MODEL_FROM_DATABASE: %s\n", v);

  fprintf(stdout, "Done.\n");

  if (card)
    udev_device_unref(card);

  if (udev)
    udev_unref(udev);

  return 0;
}

This program (with the Arduino attached) outputs:

该程序(附有 Arduino)输出:

$ ./udevl 
 path: /sys/devices/pci0000:00/0000:00:1d.0/usb2/2-2/2-2:1.0/ttyUSB0/tty/ttyUSB0
 udev_device: 0x09FBF080
got ID_MODEL_FROM_DATABASE: FT232 USB-Serial (UART) IC
Done.

... and "FT232 USB-Serial (UART) IC" is the right entry for VID:PID 0403:6001 in usb.ids.

...和“FT232 USB-Serial (UART) IC”是usb.ids 中VID:PID 0403:6001 的正确条目。

Hope this helps,
Cheers!

希望这会
有所帮助,干杯!

回答by amdan

lsusb

you get something like this

你得到这样的东西

Bus 002 Device 001: ID 1d6b:0003 Linux Foundation 3.0 root hub
Bus 001 Device 009: ID 138a:0010 Validity Sensors, Inc. VFS Fingerprint sensor
Bus 001 Device 008: ID 13d3:3491 IMC Networks 

then: ID 1d6b:0003can be seen as : vendor = 1d6band product = 0003

那么: ID 1d6b:0003可以看作是:vendor = 1d6bproduct = 0003