1

我正在寻找一种方法来动态查找 HID (USB) 设备的系统路径。

在我的 Ubuntu 机器上,它是 /dev/usb/hiddevX,但我想有些发行版会将 hiddevices 安装在其他地方。

更具体地说:我需要在 C 程序中打开 HID 设备 - 这应该适用于每个系统,无论设备安装在哪里。

当前功能:

int openDevice(int vendorId, int productId) {

    char devicePath[24];
    unsigned int numIterations = 10, i, handle;

    for (i = 0; i < numIterations; i++) {

        sprintf(devicePath, "/dev/usb/hiddev%d", i);

        if((handle = open(devicePath, O_RDONLY)) >= 0) {

            if(isDesiredDevice(handle, vendorId, productId))
                break;

            close(handle);
        }
    }

    if (i >= numIterations) {
        ThrowException(Exception::TypeError(String::New("Could not find device")));
    }

    return handle;
}

它运作良好,但我不喜欢硬编码的/dev/usb/hiddev

编辑:事实证明,其他一些程序员使用 /dev/usb/hid/hiddevX 和 /dev/hiddevX 的后备,所以我也内置了这些后备。

更新方法:

/**
 * Returns the correct handle (file descriptor) on success
 *
 * @param int vendorId
 * @param int productId
 * @return int
 */
int IO::openDevice(int vendorId, int productId) {

    char devicePath[24];

    const char *devicePaths[] = {
        "/dev/usb/hiddev\%d",
        "/dev/usb/hid/hiddev\%d",
        "/dev/hiddev\%d",
        NULL
    };

    unsigned int numIterations = 15, i, j, handle;

    for (i = 0; devicePaths[i]; i++) {

        for (j = 0; j < numIterations; j++) {

            sprintf(devicePath, devicePaths[i], j);

            if((handle = open(devicePath, O_RDONLY)) >= 0) {

                if(isDesiredDevice(handle, vendorId, productId))
                    return handle;

                close(handle);
            }
        }
    };

    ThrowException(Exception::Error(String::New("Couldn't find device!")));
    return 0;
};
4

0 回答 0