본문 바로가기

IT/리눅스

리눅스, USB에 장치가 연결되었는지 검사하기(libusb 사용, 블루투스 동글 등)

반응형

libusb 라이브러리를 이용하여 usb에 연결된 장치를 검사하는 방법이다.

 

 

1. libusb 소스 빌드

 

https://libusb.info/

 

libusb

Overview libusb is a C library that provides generic access to USB devices. It is intended to be used by developers to facilitate the production of applications that communicate with USB hardware. It is portable: Using a single cross-platform API, it provi

libusb.info

 

위사이트에서 libusb-1.0.26 소스를 내려받아 다음과 같이 빌드하고 설치한다. 

chmod 777 configure
./configure
make
make install

 

개발하는 소스의 Make파일에 헤더와 라이브러리 경로 추가 

CFLAGS, LDFLAGS에 설치한 파일 위치를 추가한다. 

CFLAGS += -I./libusb-1.0/ilibusb/libusb.h 

LDFLAGS += lusb-1.0   

 

 

반응형

 

2. 검사함수 작성 

 

#include <libusb-1.0/libusb.h>

#define BLUETOOTH_VENDOR_ID 0x0a12   // 블루투스 동글의 벤더 ID

int check_bt_donggle() {
    libusb_device **devs;
    libusb_context *ctx = NULL;
    ssize_t count;
    int i;
    int bluetooth_device_found = 0;

    // libusb 초기화
    if (libusb_init(&ctx) < 0) {
        perror("Error initializing libusb");
        return -1;
    }

    // USB 장치 목록 가져오기
    count = libusb_get_device_list(ctx, &devs);
    if (count < 0) {
        perror("Error getting USB device list");
        libusb_exit(ctx);
        return -2;
    }

    // USB 장치 목록 탐색
    for (i = 0; i < count; i++) {
        struct libusb_device_descriptor desc;
        libusb_device *dev = devs[i];

        // USB 장치의 디스크립터 가져오기
        if (libusb_get_device_descriptor(dev, &desc) < 0) {
            perror("Error getting device descriptor");
            continue;
        }

        // 블루투스 동글인지 확인
        if (desc.idVendor == BLUETOOTH_VENDOR_ID) {
            printf("Bluetooth dongle found.\n");
            bluetooth_device_found = 1;
            break;
        }
    }

    // 블루투스 동글이 없는 경우 메시지 출력
    if (!bluetooth_device_found) {
        printf("Bluetooth dongle not found.\n");
        return -3;
    }

    // USB 장치 목록 해제 및 libusb 종료
    libusb_free_device_list(devs, 1);
    libusb_exit(ctx);

    return 0;
}

 

간단한 코드지만 아주 정확히 잘 동작한다. 

 

반응형