濮阳杆衣贸易有限公司

主頁 > 知識庫 > Linux如何使用libudev獲取USB設(shè)備VID及PID

Linux如何使用libudev獲取USB設(shè)備VID及PID

熱門標簽:江蘇自動外呼系統(tǒng)一般多少錢 信貸電銷機器人系統(tǒng) 400 電話 申請費用 鸚鵡螺號航海地圖標注時間 山東電信外呼系統(tǒng)靠譜嗎 ai電話機器人營銷 比較穩(wěn)定的外呼系統(tǒng) 長沙回撥外呼系統(tǒng) 云南云電銷機器人招商

在本文將使用libudev庫來訪問hidraw的設(shè)備。通過libudev庫,我們可以查詢設(shè)備的廠家ID(Vendor ID, VID),產(chǎn)品ID(Product ID, PID),序列號和設(shè)備字符串等而不需要打開設(shè)備。進一步,libudev可以告訴我們在/dev目錄下設(shè)備節(jié)點的具體位置路徑,為應(yīng)用程序提供一種具有足夠魯棒性而又和系統(tǒng)廠家獨立的訪問設(shè)備的方式。使用libudev庫,需要包含libudev.h頭文件,并且在編譯時加上-ludev告訴編譯器去鏈接udev庫。

將列出當前連接在系統(tǒng)中的所有hidraw設(shè)備,并且輸出它們的設(shè)備節(jié)點路徑、生產(chǎn)商、序列號等信息。

為了獲取這些信息,需要創(chuàng)建一個udev_enumerate對象,其中“hidraw”字符串作為過濾條件,

libudev將返回所有匹配這個過濾字符串的udev_device對象。

這個列子的步驟如下:

1、 初始化庫,獲取一個struct udev句柄

2、枚舉設(shè)備

3、對找到的匹配設(shè)備輸出它的節(jié)點名稱,找到實際USB設(shè)備的起始節(jié)點,打印出USB設(shè)備的IDs和序列號等,最后解引用設(shè)備對象

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

以上就是本文的全部內(nèi)容,希望對大家的學習有所幫助,也希望大家多多支持腳本之家。

標簽:衡陽 運城 烏海 澳門 嘉興 齊齊哈爾 拉薩 亳州

巨人網(wǎng)絡(luò)通訊聲明:本文標題《Linux如何使用libudev獲取USB設(shè)備VID及PID》,本文關(guān)鍵詞  Linux,如何,使用,libudev,獲取,;如發(fā)現(xiàn)本文內(nèi)容存在版權(quán)問題,煩請?zhí)峁┫嚓P(guān)信息告之我們,我們將及時溝通與處理。本站內(nèi)容系統(tǒng)采集于網(wǎng)絡(luò),涉及言論、版權(quán)與本站無關(guān)。
  • 相關(guān)文章
  • 下面列出與本文章《Linux如何使用libudev獲取USB設(shè)備VID及PID》相關(guān)的同類信息!
  • 本頁收集關(guān)于Linux如何使用libudev獲取USB設(shè)備VID及PID的相關(guān)信息資訊供網(wǎng)民參考!
  • 推薦文章
    宽甸| 抚远县| 波密县| 阜新| 南雄市| 台东县| 蒙山县| 岳阳县| 浙江省| 冀州市| 纳雍县| 嘉禾县| 和平县| 方山县| 安岳县| 甘洛县| 巩义市| 白山市| 青铜峡市| 海原县| 利辛县| 中阳县| 嘉鱼县| 绥棱县| 子长县| 繁昌县| 沈阳市| 鄂托克前旗| 韩城市| 茂名市| 集安市| 黔西县| 抚州市| 拜城县| 阿巴嘎旗| 文山县| 子洲县| 卫辉市| 武邑县| 什邡市| 监利县|