簡體   English   中英

獲取安裝到 /dev 文件夾的 USB 設備的唯一序列號

[英]Get unique serial number of USB device mounted to /dev folder

我將 2 個網絡攝像頭連接到計算機,它列在 /dev 文件夾中:/dev/video0; /開發/視頻1。

你能幫我寫 C 代碼來獲取網絡攝像頭的序列號嗎?輸入:/dev/video[0;1]

剛遇到同樣的問題,需要一點時間才能找到解決方案。 任何以“只使用lsusb”開頭的解決方案都是錯誤的。 您可以找出設備串行,但它提供的任何額外信息都無法幫助您確定鏈接到哪個/ dev / video。

解:

/bin/udevadm info --name=/dev/video1 | grep SERIAL_SHORT

輸出:

E: ID_SERIAL_SHORT=256DEC57

基於使用udevadm和http://www.signal11.us/oss/udev/教程的提示,我得到了下面的代碼來獲取我的網絡攝像頭的序列信息。

#include "stdio.h"
#include <libudev.h>

int main(int argc, char **argv)
{
  struct udev *udev;
  struct udev_device *dev;
  struct udev_enumerate *enumerate;
  struct udev_list_entry *list, *node;
  const char *path;

  udev = udev_new();
  if (!udev) {
    printf("can not create udev");
    return 0;
  }

  enumerate = udev_enumerate_new(udev);
  udev_enumerate_add_match_subsystem(enumerate, "video4linux");
  udev_enumerate_scan_devices(enumerate);

  list = udev_enumerate_get_list_entry(enumerate);
  udev_list_entry_foreach(node, list) {
    path = udev_list_entry_get_name(node);
    dev = udev_device_new_from_syspath(udev, path);

    printf("Printing serial for %s\n", path);
    printf("ID_SERIAL=%s\n",
        udev_device_get_property_value(dev, "ID_SERIAL"));
    printf("ID_SERIAL_SHORT=%s\n",
        udev_device_get_property_value(dev, "ID_SERIAL_SHORT"));

    udev_device_unref(dev);
  }
  return 0;
}

您可以使用lsusb ,但您需要添加詳細標志並確保您使用sudo ,否則序列號將不正確。

sudo lsusb -v

如果這太冗長,則運行lsusb以獲取設備 ID:

$ lsusb
Bus 002 Device 001: ID 1d6b:0003 Linux Foundation 3.0 root hub
Bus 001 Device 012: ID 1ab1:0e11 Rigol Technologies
Bus 001 Device 001: ID 1d6b:0002 Linux Foundation 2.0 root hub

然后使用設備標志和序列號 grep 運行lsusb

所以對於Rigol設備的序列號:

$ sudo lsusb -s 012 -v|grep -i iserial
  iSerial                 3 DP8C221100000

使用libusb ,看起來有一個標准的getSerialNumber()方法。 不幸的是,並非所有USB設備都實現了這一 我有幾個便宜的4美元的網絡攝像頭,它們返回None。 這些接口公開了其他元數據,例如VendorID和ProductID,我已經看到一些代碼嘗試並用作唯一標識符,但它不能保證是唯一的,特別是如果你有多個相同品牌和型號的設備。

但假設您獲得了設備的序列號,下一個問題是確定它對應的/ dev / videoN文件。 我安裝了舊版本的libusb,所以我無法獲得返回USB設備的完整sysfs路徑的方法,所以我廢棄了hwinfo的輸出。 我提取了與攝像機相對應的所有塊,然后從那些我提取的塊看起來像:

SysFS BusID: 1-1.2:1.0

USB設備實際上形成一個復雜的樹,並且BusID 編碼設備在該樹中的位置。

然后,您可以使用該BusID查找設備在文件系統中的位置以及視頻路徑,該路徑應位於:

/sys/bus/usb/devices/<BusID>/video4linux/

這是一個目錄,在其中你會發現一個與/ dev匹配的videoN文件。

看看lsusb你發現它使用了libusb ,它有很多功能,特別是對於usb設備處理和枚舉 libudev也可能是相關的。

或者, popen lsusb命令...

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM