代码之家  ›  专栏  ›  技术社区  ›  StackedCrooked

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

  •  15
  • StackedCrooked  · 技术社区  · 15 年前

    使用udev,我能够获得特定USB设备的以下信息:

    idVendor: 13b1
    idProduct: 0018
    manufacturer:  
    product: USB 2.0 Network Adapter ver.2 
    serial: 00FFFF
    

    /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文件 总是在正确的位置?

    4 回复  |  直到 15 年前
        1
  •  23
  •   P Shved    15 年前

    lsusb 命令查询有关当前插入的USB设备的信息。你可以用它 -d

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

    $ 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
    

    lsusb -v )印刷 很多 很多东西。

    lsusb接口

        2
  •  5
  •   sdaau    12 年前

    我自己没试过 libudev's udev_device_get_property_value 应该是这样;它用于 pulseaudio's udev-util.c udev_device_get_property_value(card, "ID_VENDOR_FROM_DATABASE")) .

    这是一个小例子,我刚刚放在一起,基于 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;
    }
    

    $ ./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.
    

    usb.ids .

    希望这有帮助,

        3
  •  4
  •   sarnold    15 年前

    在我的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
    
        4
  •  1
  •   leppie    15 年前

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

    从设备本身获取这些信息会更安全,比如 libusb lsusb

        5
  •  1
  •   gxmad    6 年前
    lsusb
    

    你得到这样的东西

    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 
    

    然后: ID 1d6b:0003 可以看作: vendor = 1d6b product = 0003