栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 系统运维 > 运维 > 服务器

Linux如何使用libudev获取USB设备VID及PID

服务器 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

Linux如何使用libudev获取USB设备VID及PID

在本文将使用libudev库来访问hidraw的设备。通过libudev库,我们可以查询设备的厂家ID(Vendor ID, VID),产品ID(Product ID, PID),序列号和设备字符串等而不需要打开设备。进一步,libudev可以告诉我们在/dev目录下设备节点的具体位置路径,为应用程序提供一种具有足够鲁棒性而又和系统厂家独立的访问设备的方式。使用libudev库,需要包含libudev.h头文件,并且在编译时加上-ludev告诉编译器去链接udev库。

将列出当前连接在系统中的所有hidraw设备,并且输出它们的设备节点路径、生产商、序列号等信息。

为了获取这些信息,需要创建一个udev_enumerate对象,其中“hidraw”字符串作为过滤条件,

libudev将返回所有匹配这个过滤字符串的udev_device对象。

这个列子的步骤如下:

1、 初始化库,获取一个struct udev句柄

2、枚举设备

3、对找到的匹配设备输出它的节点名称,找到实际USB设备的起始节点,打印出USB设备的IDs和序列号等,最后解引用设备对象

4、解引用枚举对象

5、解引用udev对象

具体代码如下:

#include 
#include 
#include 
#include 
#include 

int main (void)
{
  struct udev *udev;
  struct udev_enumerate *enumerate;
  struct udev_list_entry *devices, *dev_list_entry;
  struct udev_device *dev;

  
  udev = udev_new();
  if (!udev) {
    printf("Can't create udevn");
    exit(1);
  }

  
  enumerate = udev_enumerate_new(udev);
  udev_enumerate_add_match_subsystem(enumerate, "hidraw");
  udev_enumerate_scan_devices(enumerate);
  devices = udev_enumerate_get_list_entry(enumerate);
  
  udev_list_entry_foreach(dev_list_entry, devices) {
    const char *path;

    
    path = udev_list_entry_get_name(dev_list_entry);
    dev = udev_device_new_from_syspath(udev, path);

    
    printf("Device Node Path: %sn", udev_device_get_devnode(dev));

    
    dev = udev_device_get_parent_with_subsystem_devtype(
  dev,
  "usb",
  "usb_device");
    if (!dev) {
      printf("Unable to find parent usb device.");
      exit(1);
    }

    
    printf(" VID/PID: %s %sn",
 udev_device_get_sysattr_value(dev,"idVendor"),
 udev_device_get_sysattr_value(dev, "idProduct"));
    printf(" %sn %sn",
 udev_device_get_sysattr_value(dev,"manufacturer"),
 udev_device_get_sysattr_value(dev,"product"));
    printf(" serial: %sn",
 udev_device_get_sysattr_value(dev, "serial"));
    udev_device_unref(dev);
  }
  
  udev_enumerate_unref(enumerate);

  udev_unref(udev);

  return 0;
}

编译程序:

gcc -Wall -g -o udev_example udev_example.c -ludev

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持考高分网。

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/176846.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号