Libusb Получение списка подключенных устройств¶
CMakeLists.txt:
cmake_minimum_required(VERSION 3.23)
project(test LANGUAGES C)
# ...
find_path(LIBUSB_INCLUDE_DIR NAMES libusb.h PATH_SUFFIXES "include" "libusb" "libusb-1.0")
find_library(LIBUSB_LIBRARY NAMES usb PATH_SUFFIXES "lib" "lib32" "lib64")
message(STATUS "LIBUSB_INCLUDE_DIR: ${LIBUSB_INCLUDE_DIR}")
message(STATUS "LIBUSB_LIBRARY: ${LIBUSB_LIBRARY}")
file(GLOB_RECURSE SOURCES "${CMAKE_CURRENT_SOURCE_DIR}/src/*.c")
file(GLOB_RECURSE HEADERS "${CMAKE_CURRENT_SOURCE_DIR}/src/*.h")
add_executable(${PROJECT_NAME}
${HEADERS}
${SOURCES}
)
target_link_libraries(${PROJECT_NAME}
${LIBUSB_LIBRARY}
)
main.c:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <sys/param.h>
#if __FreeBSD__
#include <libusb.h>
#elif __linux__
#include <libusb-1.0/libusb.h>
#endif /*!__FreeBSD__*/
#include <errno.h>
#include <err.h>
void print_usb_devices() {
libusb_context *ctx = NULL;
libusb_device **list;
ssize_t count;
int rc;
// 1. Инициализация библиотеки
rc = libusb_init(&ctx);
if (rc < 0) {
fprintf(stderr, "Ошибка инициализации libusb: %s\n", libusb_error_name(rc));
return;
}
// 2. Получение списка подключенных устройств
count = libusb_get_device_list(ctx, &list);
if (count < 0) {
fprintf(stderr, "Ошибка получения списка устройств\n");
libusb_exit(ctx);
return;
}
printf("Найдено устройств: %zd\n", count);
printf("------------------------------------------------------------\n");
printf("%-10s %-10s %-20s %s\n", "ID", "Bus:Addr", "Manufacturer", "Product");
printf("------------------------------------------------------------\n");
for (ssize_t i = 0; i < count; i++) {
libusb_device *dev = list[i];
struct libusb_device_descriptor desc;
libusb_device_handle *handle = NULL;
unsigned char string_mfg[256] = "N/A";
unsigned char string_prod[256] = "N/A";
// Получаем технические характеристики устройства
if (libusb_get_device_descriptor(dev, &desc) < 0) continue;
// Чтобы получить строки, нужно открыть устройство
int res = libusb_open(dev, &handle);
if (res == 0 && handle) {
// Читаем имя производителя (iManufacturer — это индекс строки в дескрипторе)
if (desc.iManufacturer > 0) {
libusb_get_string_descriptor_ascii(handle, desc.iManufacturer, string_mfg, sizeof(string_mfg));
}
// Читаем название продукта (iProduct)
if (desc.iProduct > 0) {
libusb_get_string_descriptor_ascii(handle, desc.iProduct, string_prod, sizeof(string_prod));
}
libusb_close(handle);
}
printf("%04x:%04x %03d:%03d %-20s %s\n",
desc.idVendor, desc.idProduct,
libusb_get_bus_number(dev), libusb_get_device_address(dev),
string_mfg, string_prod);
}
printf("------------------------------------------------------------\n");
// 3. Очистка ресурсов
libusb_free_device_list(list, 1);
libusb_exit(ctx);
}
int main() {
print_usb_devices();
return EXIT_SUCCESS;
}