Проект

Общее

Профиль

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;
}