LINUX / libusb的获取USB设备路径(linux / libusb get usb de

2019-08-06 11:50发布

我使用libusb列举了一些USB的设备。 现在,我想获得“设备路径”。 我认为这不叫USB设备的路径,因为我不是成功的谷歌。

如果我连接USB装置与Linux,我得到在消息dmesg ,这里有这样的“设备路径”与USB温度传感器的一些例子(类似于此 ):

直接到USB端口: [68448.099682] generic-usb 0003:0C45:7401.0056: input,hidraw1: USB HID v1.10 Keyboard [RDing TEMPer1V1.2] on usb-0000:00:12.0-1/input0 => 12.0- 1

直接到另一个端口: [68560.853108] generic-usb 0003:0C45:7401.0058: input,hidraw1: USB HID v1.10 Keyboard [RDing TEMPer1V1.2] on usb-0000:00:13.0-1/input0 => 13.0-1

到所述第一用过的端口上的USB集线器: [68600.245809] generic-usb 0003:0C45:7401.005A: input,hidraw1: USB HID v1.10 Keyboard [RDing TEMPer1V1.2] on usb-0000:00:12.2-1.4/input0 => 12.2-1.4

在相同的USB集线器的另一个端口: [68647.925092] generic-usb 0003:0C45:7401.005C: input,hidraw1: USB HID v1.10 Keyboard [RDing TEMPer1V1.2] on usb-0000:00:12.2-1.3/input0 => 12.2-1.3

的现在之前使用上的USB集线器的USB集线器: [68740.715518] generic-usb 0003:0C45:7401.005E: input,hidraw1: USB HID v1.10 Keyboard [RDing TEMPer1V1.2] on usb-0000:00:12.2-1.4.4/input0 => 12.2-1.4.4

长话短说:内核消息总是包含了物理USB设备的位置(参见之前的粗体字)的唯一路径。 是否有可能得到这个“路径”中的libusb通过用户空间? 我试着用很多东西struct usb_busstruct usb_device ,但我始终是失败。

我需要这个来识别这些USB温度计的多,因为他们没有一个唯一的序列号,有时他们只是“重新连接”在运行时,使他们获得不同的USB的ID。 因此,我认为,以确定他们的唯一方法是通过物理位置。

谢谢您的帮助,

顺祝商祺凯文M.

-编辑-

目前我使用下面的代码来搜索我的USB设备:

usb_dev_handle *find_lvr_winusb() {

     struct usb_bus *bus;
        struct usb_device *dev;

        for (bus = usb_busses; bus; bus = bus->next) {
        for (dev = bus->devices; dev; dev = dev->next) {
                        if (dev->descriptor.idVendor == VENDOR_ID && 
                                dev->descriptor.idProduct == PRODUCT_ID ) {
                                usb_dev_handle *handle;
                                if(debug) {
                                  printf("lvr_winusb with Vendor Id: %x and Product Id: %x found.\n", VENDOR_ID, PRODUCT_ID);
                                    printf("INFO: %d\n", dev->bus->location);
                                    printf("INFO: %d %s\n", bus->location, bus->dirname);
                                }

                                if (!(handle = usb_open(dev))) {
                                        printf("Could not open USB device\n");
                                        return NULL;
                                }
                                return handle;
                        }
                }
        }
        return NULL;
}

但有了这个代码,我不能得到一个唯一的物理位置ID。 所述bus->location返回一个整数(BUS->目录名包含相同的,但作为字符串),这不是唯一的。 我知道USB具有层次结构,并在dmesg我可以看到这个hierarchys路径。

随着libusb的我只能坐公共汽车-ID(?)和一些设备的ID。 但他们不帮我,因为我需要确定两种或两种以上的温度传感器。 当温度传感器复位的连接(每5至60秒)和总线ID不是唯一的设备ID总是变化。 不幸的是,温度传感器没有唯一的序列号。

所以我觉得物理路径是识别设备的唯一途径。

此致凯文M.

Answer 1:

由于libusb的1.0.12,他们推出libusb_get_port_path(),并在1.0.16代之以它libusb_get_port_numbers() ,它允许您查询总线拓扑结构。



Answer 2:

在sysfs的结构路径的总体夏日:

1-1.3:1.0

|_usb root hub - bus number - 1
  |_ port number - 1 of root hub
    |_port number - 3 of intermediate hub
      |_current configuration number - 1
        |_ current interface number - 0

更多信息点击这里



Answer 3:

这是可能的, 喜欢这里 。

只需扫描所有总线的所有USB设备。 当你找到所需的VID / PID - 这是你的设备。

或者你也可以做简单:写udev的规则,当您将您装置,将创建符号链接,如/ dev / THERMOX。 所有你需要后是打开所需的/ dev / THERMOX。



文章来源: linux / libusb get usb device path