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.