linux/libusb获取usb设备路径

Kev*_*ier 9 linux usb path device libusb

我使用libusb来枚举一些usb设备.现在我想获得"设备路径".我认为这不是usb device-path,因为我没有成功使用谷歌.

如果我用linux连接usb设备,我会收到一条消息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.所以我认为识别它们的唯一方法是通过物理位置.

谢谢您的帮助,

最诚挚的问候Kevin 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;
}
Run Code Online (Sandbox Code Playgroud)

但是使用此代码我无法获得唯一的物理位置ID.所述bus->location返回一个整数(BUS->目录名包含相同的,但作为字符串),这不是唯一的.我知道usb有一个层次结构,在dmesg我可以看到这个层次结构的路径.

使用libusb我只能得到总线ID(?)和一些设备ID.但他们没有帮助我,因为我需要识别这些温度传感器中的两个或更多个.当温度传感器复位连接(每5到60秒)并且总线ID不唯一时,device-id总是会改变.不幸的是,温度传感器没有唯一的序列号.

所以我认为物理路径是识别设备的唯一方法.

最好的问候Kevin M.

ndy*_*yer 7

从libusb 1.0.12开始,他们引入了libusb_get_port_path(),并在1.0.16 中将其替换为libusb_get_port_numbers(),它允许您查询总线拓扑.

  • 使用“libusb_get_device_address”作为“/dev/input/eventX”http://libusb.sourceforge.net/api-1.0/group__dev.html#gab6d4e39ac483ebaeb108f2954715305d (2认同)