首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何使用C++从/dev/xxx路径获取Ubuntu中设备的USB、PID和序列号

问如何使用C++从/dev/xxx路径获取Ubuntu中设备的USB、PID和序列号
EN

Stack Overflow用户
提问于 2018-03-10 10:05:41
回答 1查看 3.4K关注 0票数 0

当USB摄像头插入Linux时,设备会出现在/dev文件夹中。例如,第一个摄像头将以video0的形式出现。在我们正在构建的系统中,使用多个摄像头,我们可以得到video0、video1和video2。

我的要求是以编程方式读取USB摄像机的VendorID (VID)、ProductID (PID)和使用C++的序列号。

目前,我们使用UDEV规则将特定设备映射到/dev/camera这样的设备上;但我们希望以编程方式读取序列号,并检查设备是否已被更改。

我们可以使用libudev枚举所有USB设备,这样我们就可以从libudev ( usb.c )获得信息。

但是,如何使用libudev提取给定/dev/videoN路径的所需的VID、PID和序列号。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2018-03-10 10:12:06

下面是一个代码片段,它所做的正是所要求的:

代码语言:javascript
复制
void ReadUsbIdentifiers(std::string dev_path){
    auto udev = udev_new();
    if (!udev) { return; }

    struct stat statbuf;
    if (stat(dev_path.c_str(), &statbuf) < 0) { return; }
    auto type =  S_ISBLK(statbuf.st_mode) ? 'b' : S_ISCHR(statbuf.st_mode) ? 'c' : 0;

    auto opened_dev = udev_device_new_from_devnum(udev, type, statbuf.st_rdev);
    auto dev = opened_dev;

    while (dev != nullptr)
    {
        auto serial = udev_device_get_sysattr_value(dev, "serial");
        if (nullptr == serial)
        {
            dev = udev_device_get_parent(dev);
        }
        else
        {
            std::cout << "VID: " <<  udev_device_get_sysattr_value(dev, "idVendor") << std::endl;
            std::cout << "PID: " <<  udev_device_get_sysattr_value(dev, "idProduct") << std::endl;
            std::cout << "Serial Number: " <<  serial << std::endl;
        }
    }
    if (opened_dev) { udev_device_unref(opened_dev); }
    udev_unref(udev);
}

代码有两个重要方面。

首先,使用linux函数stat()获取/dev文件的状态,该状态包含st_rdev,即device_ID,然后可以在UDEV函数udev_device_new_from_devnum()中使用。

其次,udev_device_new_from_devnum()返回的设备是物理USB设备的“子”,它本身不知道序列号、供应商Id或产品Id。相反,您需要从设备的父级或父级获取此信息。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/49207803

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档