香港云主机最佳企业级服务商!

ADSL拨号VPS包含了中国大陆(联通,移动,电信,)

中国香港,国外拨号VPS。

当前位置:云主机 > 服务器资讯 >

电信ADSL拨号VPS
联通ADSL拨号VPS
移动ADSL拨号VPS

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


时间:2020-10-17 17:53 作者:admin610456


在本文将使用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 <libudev.h>#include <stdio.h>#include <stdlib.h>#include <locale.h>#include <unistd.h>int main (void){  struct udev *udev;  struct udev_enumerate *enumerate;  struct udev_list_entry *devices, *dev_list_entry;  struct udev_device *dev;  /* Create the udev object */  udev = udev_new();  if (!udev) {    printf("Can't create udev\n");    exit(1);  }  /* Create a list of the devices in the 'hidraw' subsystem. */  enumerate = udev_enumerate_new(udev);  udev_enumerate_add_match_subsystem(enumerate, "hidraw");  udev_enumerate_scan_devices(enumerate);  devices = udev_enumerate_get_list_entry(enumerate);  /* For each item enumerated, print out its information.    udev_list_entry_foreach is a macro which expands to    a loop. The loop will be executed for each member in    devices, setting dev_list_entry to a list entry    which contains the device's path in /sys. */  udev_list_entry_foreach(dev_list_entry, devices) {    const char *path;    /* Get the filename of the /sys entry for the device      and create a udev_device object (dev) representing it */    path = udev_list_entry_get_name(dev_list_entry);    dev = udev_device_new_from_syspath(udev, path);    /* usb_device_get_devnode() returns the path to the device node      itself in /dev. */    printf("Device Node Path: %s\n", udev_device_get_devnode(dev));    /* The device pointed to by dev contains information about      the hidraw device. In order to get information about the      USB device, get the parent device with the      subsystem/devtype pair of "usb"/"usb_device". This will      be several levels up the tree, but the function will find      it.*/    dev = udev_device_get_parent_with_subsystem_devtype(         dev,         "usb",         "usb_device");    if (!dev) {      printf("Unable to find parent usb device.");      exit(1);    }    /* From here, we can call get_sysattr_value() for each file      in the device's /sys entry. The strings passed into these      functions (idProduct, idVendor, serial, etc.) correspond      directly to the files in the directory which represents      the USB device. Note that USB strings are Unicode, UCS2      encoded, but the strings returned from      udev_device_get_sysattr_value() are UTF-8 encoded. */    printf(" VID/PID: %s %s\n",        udev_device_get_sysattr_value(dev,"idVendor"),        udev_device_get_sysattr_value(dev, "idProduct"));    printf(" %s\n %s\n",        udev_device_get_sysattr_value(dev,"manufacturer"),        udev_device_get_sysattr_value(dev,"product"));    printf(" serial: %s\n",        udev_device_get_sysattr_value(dev, "serial"));    udev_device_unref(dev);  }  /* Free the enumerator object */  udev_enumerate_unref(enumerate);  udev_unref(udev);  return 0;}

编译程序:

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

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

(责任编辑:admin)






帮助中心
会员注册
找回密码
新闻中心
快捷通道
域名登录面板
虚机登录面板
云主机登录面板
关于我们
关于我们
联系我们
联系方式

售前咨询:17830004266(重庆移动)

企业QQ:383546523

《中华人民共和国工业和信息化部》 编号:ICP备00012341号

Copyright © 2002 -2018 香港云主机 版权所有
声明:香港云主机品牌标志、品牌吉祥物均已注册商标,版权所有,窃用必究

云官方微信

在线客服

  • 企业QQ: 点击这里给我发消息
  • 技术支持:383546523

  • 公司总台电话:17830004266(重庆移动)
  • 售前咨询热线:17830004266(重庆移动)