![](/img/trans.png)
[英]is it possible to do the serial communication with /dev/bus/usb/<bus>/<device>
[英]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.