当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和序列号。
发布于 2018-03-10 10:12:06
下面是一个代码片段,它所做的正是所要求的:
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。相反,您需要从设备的父级或父级获取此信息。
https://stackoverflow.com/questions/49207803
复制相似问题