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 <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

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

(0)

相关推荐

  • 详解linux usb host驱动编写入门

    usb协议是一个复杂的协议,目前涉及到的版本就有usb1.0, usb2.0, usb3.0.大家如果打开kernel usb host目录,就会发现下面包含了ohci,uhci,ehci,xhci,whci等多种形式的控制器驱动.那么,对于我们这些不是很了解usb的开发人员,如何了解usb的代码结构呢? 1.代码分布 drivers/usb目录下面,host目录包括了host驱动代码,core目录包含了主要的api接口代码,而其他目录则主要是device驱动代码. 2.device驱动怎么看

  • 在linux下实现 python 监控usb设备信号

    1. linux下消息记录 关于系统的各种消息一般都会记录在/var/log/messages文件中,有些主机在中默认情况下有可能没有启用,具体配置方法可参考下面这篇博客: 系统日志配置 /var/log/messages 2. python 代码实现 原理其实很简单,就是读/var/log/messages文件,找到有关usb的信息就可以了. #!/usr/bin/env python usbmsg = open("/var/log/messages", "r")

  • IntelliJ IDEA远程Debug Linux的Java程序,找问题不要只会看日志了(推荐)

    1 前言 我们习惯于在本地开发的时候debug,能快速定位与解决问题,那部署在服务器上是不是就没有办法了呢?只能通过查看日志来定位? 不是的,在远端的服务器上,我们一样可以debug. 2 IDEA的debug 我们先来看一下在IntelliJ IDEA直接debug是怎样的. 先准备一个简单的Java程序: package com.pkslow.basic; import java.util.Map; public class RemoteDebug { public static void

  • Linux bzip2 命令的使用

    1.命令简介 bzip2 用来压缩和解压缩文件,是在 Linux 系统中经常使用的一个对文件进行压缩和解压缩的命令,采用 Burrow-Wheeler 块排序文本压缩算法和 Huffman 编码将文件压缩为后缀为 .bz2 的 bzip2 文件.压缩率一般比基于 LZ77/LZ78 的压缩软件好得多,其性能接近 PPM 族统计类压缩软件. bzip2 不仅可以用来压缩大的.较少使用的文件以节省磁盘空间,还可以和 tar 命令一起使用完成对文件的打包和压缩.减少文件大小有两个明显的好处,一是可以减

  • 在Linux环境中使用USB存储器

    如何在Linux环境中使用USB接口的存储设备?这是各大电脑论坛上出现得比较多的一个问题,同此可见这也是摆在许多电脑玩家面前的一道难题.本文就为您提供一套完美的解决方案,通过下面的方法,您仅可以在Linux环境中方便地使用U盘.USB硬盘盒,而且还能将数码相机作为USB大容量存储器.这里就以Red Hat Linux 7.2为例,来一步一步地介绍如何在Linux环境中使用USB存储器. 1.在X-Windows环境中打开"控制中心",展开"信息→USB设备"控制台树

  • Linux NFS机制工作原理及实例解析

    什么是NFS? network file system 网络文件系统 通过网络存储和组织文件的一种方法或机制. 为什么要用NFS? 前端所有的应用服务器接收到用户上传的图片.文件.视频,都会统一放到后端的存储上. 共享存储的好处:方便数据的查找与取出,缺点:存储服务器压力大,坏了丢失全部数据. NFS工作原理 NFS功能,有很多服务,每个服务都有自己的端口,并且经常变换. 客户端查找这些端口,就需要一个中间人---RPC服务(默认端口号111). 工作流程: 1.启动RPC服务 2.启动NFS服

  • Linux中轻松使用USB移动存储器

    USB移动存储器越来越普及,但是各个不同Linux发行版本中它的使用方法都不一样,有些需要相应的工具软件.不过大家经常使用的RedHat Linux9对USB移动存储器支持较好,在它上面使用USB移动存储器你要做的只是如下几步: 1.插上你的USB移动存储器. 2.进入终端命令行模式,用以下命令为外挂点新建一个子目录: mkdir /mnt/usb 3.挂上你的USB移动存储: USB移动存储通常被识别为sda1,具体可通过fdisk -l命令查询.需要注意的是你的USB移动存储器文件系统,若是

  • 通过案例深入解析linux NFS机制

    接上篇,创建web02服务器,将web01.web02服务器的/data目录挂载到nfs01服务器的共享目录/data上,并以不同方式实现开机自启动. web01篇: 在/etc/rc.local中添加如下一行: 重启并检查: web02篇: 克隆模板机,创建web02虚拟机,更改主机名,ip地址 安装rpc服务:yum install rpcbind 开启并设置开机启动 在最后添加一行: 因为磁盘挂载在系统启动的顺序中要快于网卡加载,而rpc又需要联网,所以我们需要开启延迟挂载: 重启,并检查

  • arm linux利用alsa驱动并使用usb音频设备

    一.背景: arm linux的内核版本是3.13.0 二.准备工作 添加alsa驱动到内核中,也就是在编译内核的时候加入以下选项: 接下来就重新编译内核即可 三.交叉编译alsa-lib和alsa-utils (alsa-utils是一系列的音频设备控制工具,而alsa-lib是alsa-utils依赖的库,所以先将alsa-lib编译好) 3.1交叉编译alsa-lib 3.2交叉编译alsa-utils 四.将三编译好的库及工具都拷贝至arm开发板(笔者通常直接将编译好的都压缩好之后再复制

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

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

  • Android 获取 usb 权限的两种方法

    前言: 最近工作上遇到几个USB模块在android平台上适配使用的情况,所以要用到USB权限获取问题 ##USB权限获取有以下2种方式: 一.直接在AndroidManifest.xml文件中进行如下配置: <activity android:name=".DemoCustomAndroidUSBActivity" android:label="@string/app_name"> <intent-filter> <action an

  • c#使用wmi查询usb设备信息示例

    开发环境:Visual Studio V2010 .NET Framework 4 Client Profile 复制代码 代码如下: using System;using System.Management;using System.Text.RegularExpressions;using System.Collections.Generic; namespace Splash.IO.PORTS{/// <summary>/// 即插即用设备信息结构/// </summary>

  • 使用Python在Windows下获取USB PID&VID的方法

    在Linux系统下获取USB PID&VID是件十分容易的事情,只需要"lsusb"命令就可以了. 不过,对于Windows,就没有那么容易了. 之前,有尝试过通过注册表来获得目前连接device的USB PID&VID,不过注册表里存放的是之前有插入这台Windows系统的USB设备的历史记录,也就是说,并不是目前连接到Windows的USB设备的信息. 这个问题,可以用pyusb这个库解决,但是pyusb需要依赖库,不同的Windows可能需要不同的库,所以如果程序

  • Android usb设备权限查询及自动获取详解流程

    看到当上面的对话框弹出时,可以使用命令查看顶层的活动窗口 adb shell dumpsys window | findstr mCurrentFocus mCurrentFocus=Window{41ab0ee0 u0 com.android.systemui/com.android.systemui.usb.UsbPermissionActivity} 这就是应用的位置,当然我们也可以是用grep命令来查找这个对话框的.xml文件,进入android源码然后输入命令: grep '默认情况下

  • Android Usb设备的监听(Dev)外设端口的判定以及耳机的插拔

    最近在公司用到外设,需要判断接入的外设的VendorId和ProductId,然后给大家说一下自己的学习成果把 ,首先我门可以通过android.hardware.usb.action.USB_STATE监听自己的Usb连接的设备,只针对Usb设备.而想要监听外部设备的时候却需要另外的两个广播进行监听"android.hardware.usb.action.USB_DEVICE_ATTACHED"和"android.hardware.usb.action.USB_DEVICE

  • 详解Linux中几个获取硬件详细信息的命令

    在Linux系统特别是服务器系统中常常会需要查看设备的硬件信息,这时候使用命令查看就显得非常方便.本文介绍几个在Linux系统中查看硬件信息的命令,它们是lspci.lsblk.lscpu 和 lsusb. lspci 命令 从命令的名称ls+pci的组合上大致也能看出来,lspci用于显示有关系统中的PCI总线以及与其连接的设备的信息.默认情况下,它显示设备的简短列表,如果配合指定的选项使用可以显示输出更详细的信息. 语法格式: lspci [参数] 常用参数: 选项 描述 -n 以数字方式显

  • iOS获取当前设备型号等信息(全)包含iPhone7和iPhone7P

    #include <sys/types.h> #include <sys/sysctl.h> //获得设备型号 + (NSString *)getCurrentDeviceModel { int mib[2]; size_t len; charchar *machine; mib[0] = CTL_HW; mib[1] = HW_MACHINE; sysctl(mib, 2, NULL, &len, NULL, 0); machine = malloc(len); sysc

  • PHP获取访问设备信息的方法示例

    本文实例讲述了PHP获取访问设备信息的方法.分享给大家供大家参考,具体如下: <?php header("Content:Content-type:text/html;charset=utf-8"); // // 作用取得客户端的ip.地理位置.浏览器.以及访问设备 class get_equipment_info{ ////获得访客浏览器类型 function GetBrowser(){ if(!empty($_SERVER['HTTP_USER_AGENT'])) { $br

随机推荐