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

C++ 如何使用C+获取Ubuntu中设备的USB视频、PID和序列号+;从/dev/xxx路径,c++,ubuntu,C++,Ubuntu,当USB摄像头插入Linux时,/dev文件夹中会出现一个设备。例如,第一个摄像头将显示为video0。在我们正在构建的系统中,使用多个摄像头,我们可以得到video0、video1和video2 我的要求是用C++编程编程读取USB摄像头的VendorID(VID)、PuffIDID(PID)和序列号。 目前,我们使用UDEV规则将特定设备映射到/dev/camera_one;但我们希望通过编程读取序列号,并检查设备是否已更改 我们可以使用libudev枚举所有USB设备,因此我们知道可以从l

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

我的要求是用C++编程编程读取USB摄像头的VendorID(VID)、PuffIDID(PID)和序列号。 目前,我们使用UDEV规则将特定设备映射到/dev/camera_one;但我们希望通过编程读取序列号,并检查设备是否已更改

我们可以使用libudev枚举所有USB设备,因此我们知道可以从libudev()获取信息


但是,在给定/dev/vidon路径的情况下,我们如何使用libudev来提取所需的VID、PID和序列号。

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

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);
}
void ReadUsbIdentifiers(std::string dev_path){
自动udev=udev_new();
如果(!udev){return;}
结构stat statbuf;
if(stat(dev_path.c_str(),&statbuf)<0){return;}
自动类型=S_ISBLK(statbuf.st_模式)?'b':S_ISCHR(statbuf.st_模式)?'c':0;
自动打开的设备(udev,type,statbuf.strdev);
自动开发=已打开\u开发;
while(dev!=nullptr)
{
自动串行=udev_设备获取系统属性值(dev,“串行”);
if(nullptr==串行)
{
dev=udev\u设备获取父设备(dev);
}
其他的
{

std::cout下面是一段代码片段,它完全按照要求执行:

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);
}
void ReadUsbIdentifiers(std::string dev_path){
自动udev=udev_new();
如果(!udev){return;}
结构stat statbuf;
if(stat(dev_path.c_str(),&statbuf)<0){return;}
自动类型=S_ISBLK(statbuf.st_模式)?'b':S_ISCHR(statbuf.st_模式)?'c':0;
自动打开的设备(udev,type,statbuf.strdev);
自动开发=已打开\u开发;
while(dev!=nullptr)
{
自动串行=udev_设备获取系统属性值(dev,“串行”);
if(nullptr==串行)
{
dev=udev\u设备获取父设备(dev);
}
其他的
{

std::cout不
udev_device_new_from_syspath
做你需要的事?@Ulrich-udev_device_new_from_syspath()不适用于/dev/style路径。它只适用于从我所知的/sys开始的路径。不
udev_device_new_from_syspath
做你需要的事吗?@Ulrich-udev_device_new_from_syspath()不适用于/dev/style路径。据我所知,它仅适用于以/sys开头的路径。该代码不起作用,因为串行可由多个设备共享,但不同的输入。该代码不起作用,因为串行可由多个设备共享,但输入不同