linux / libusb получить путь к usb-устройству

Я использую libusb для перечисления нескольких usb-устройств. Теперь мне нравится получать "device-path". Я думаю, что это не называется usb device-path, потому что я не был успешным с google.

если я подключу 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_bus и struct usb_device, но я всегда безуспешно.

мне нужно это, чтобы идентифицировать несколько из этих USB-термометров, потому что у них нет уникального серийного номера, и иногда они просто "подключаются" во время выполнения, поэтому они получают разные идентификаторы usb. Поэтому я думаю, что единственный способ идентифицировать их - это физическое местоположение.

Спасибо за помощь,

лучшие С уважением Кевин М.--12-->

-edit -

в настоящее время я использую следующий код для поиска моего 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: %dn", dev->bus->location);
                                    printf("INFO: %d %sn", bus->location, bus->dirname);
                                }

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

но с этим кодом я не могу получить уникальный физический идентификатор установки. The bus->location возвращает целое число (bus->dirname содержит то же самое, но как строка), которое не является уникальным. Я знаю, что usb имеет иерархию и в dmesg Я вижу это hierarchys пути.

С libusb я могу получить только bus-id (?) и некоторые идентификаторы устройств. Но они не помогают. я, потому что мне нужно идентифицировать два или более из этих датчиков температуры. Идентификатор устройства всегда изменяется, когда датчик температуры сбрасывает соединение (каждые 5 до 60 секунд), а идентификатор шины не уникален. К сожалению, датчик температуры имеет уникальный серийный номер.

поэтому я думаю, что физический путь-единственный способ идентифицировать устройство.

С наилучшими пожеланиями Кевин М.--12-->

3 ответов


начиная с libusb 1.0.12, они ввели libusb_get_port_path (), а в 1.0.16 заменили его на libusb_get_port_numbers () что позволяет запрашивать топологию шины.


общее лето пути структуры 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

дополнительная информация здесь


возможно, как тут.

просто сканируйте все USB-устройства на всех шинах. Когда вы найдете необходимый VID / PID - это ваше устройство.

или вы можете сделать проще: напишите udev-правило, которое создаст символическую ссылку, такую как /dev/thermoX при подключении устройства. Все, что вам нужно после, это открыть необходимый / dev / thermoX.