识别USB设备


15

我有五个USB相机,相同品牌,相同型号(Canyon CNR-FWC120H)。它们用于监视24/7的不同场景。我需要以某种方式从Linux(Debian)控制台或以编程方式(任何语言)确定哪个摄像机。

我尝试查看的输出lsusb -vvviSerial每个摄像机的字段应该有所不同,但是很遗憾,该制造商决定不打扰,并且所有摄像机在该位置都具有相同的序列号:200901010001

是否有其他方法可以独立于所连接的USB端口来确定哪个摄像机是哪个摄像机,因为不幸的是,在我的特定情况下,我不能依靠同一摄像机始终连接到同一端口这一事实。

更新经过评论中的讨论,我意识到这是不可能完成的任务。因此,请不要忘记最后一段,或者,如果您有一些巧妙的想法,欢迎您提出。我现在很想知道是否可以将设备连接到哪个USB端口;我使用主板上的内置USB端口和其他PCI USB控制器卡来容纳具有足够带宽的相机。我将需要唯一地标识端口,并且例如在计算机重新启动并且由于某种原因USB控制器以不同的顺序初始化时,端口号/标识不应更改。那可能吗?

更新2我在其中一台摄像机的日志中看到以下信息:

[Wed Apr 30 18:35:02 2014] uvcvideo: Found UVC 1.00 device FULL HD 1080P Webcam (0bda:58b0)
[Wed Apr 30 18:35:02 2014] input: FULL HD 1080P Webcam as /devices/pci0000:00/0000:00:01.0/0000:01:00.0/usb3/3-2/3-2:1.0/input/input4

使用该命令,我调用了以下命令:

udevadm info --query=all --path=/devices/pci0000:00/0000:00:01.0/0000:01:00.0/usb3/3-2/3-2:1.0/input/input4

并得到了:

P: /devices/pci0000:00/0000:00:01.0/0000:01:00.0/usb3/3-2/3-2:1.0/input/input4
E: DEVPATH=/devices/pci0000:00/0000:00:01.0/0000:01:00.0/usb3/3-2/3-2:1.0/input/input4
E: EV=3
E: ID_BUS=usb
E: ID_INPUT=1
E: ID_INPUT_KEY=1
E: ID_MODEL=FULL_HD_1080P_Webcam
E: ID_MODEL_ENC=FULL\x20HD\x201080P\x20Webcam
E: ID_MODEL_ID=58b0
E: ID_PATH=pci-0000:01:00.0-usb-0:2:1.0
E: ID_PATH_TAG=pci-0000_01_00_0-usb-0_2_1_0
E: ID_REVISION=5801
E: ID_SERIAL=Generic_FULL_HD_1080P_Webcam_200901010001
E: ID_SERIAL_SHORT=200901010001
E: ID_TYPE=video
E: ID_USB_DRIVER=uvcvideo
E: ID_USB_INTERFACES=:0e0100:0e0200:010100:010200:
E: ID_USB_INTERFACE_NUM=00
E: ID_VENDOR=Generic
E: ID_VENDOR_ENC=Generic
E: ID_VENDOR_ID=0bda
E: KEY=100000 0 0 0
E: MODALIAS=input:b0003v0BDAp58B0e5801-e0,1,kD4,ramlsfw
E: NAME="FULL HD 1080P Webcam"
E: PHYS="usb-0000:01:00.0-2/button"
E: PRODUCT=3/bda/58b0/5801
E: PROP=0
E: SUBSYSTEM=input
E: UDEV_LOG=3
E: USEC_INITIALIZED=41090223

该相机之间不同的事情是DEVPATHID_PATHID_PATH_TAGPHYS和(最有趣的)USEC_INITIALIZED。现在,前四个元素可能与USB端口有关,但最后一个USEC_INITIALIZED看起来像某种序列号。我找不到任何有关其实际代表的信息。有人知道吗?我认为这可能是相机初始化的时间(以微秒为单位),但是在此之后初始化的相机具有USEC_INITIALIZED=17919751,然后是之后的那一秒,USEC_INITIALIZED=25609278因此似乎相当随机。我将尝试重新启动系统,然后查看,但是我需要等待方便的时间才能这样做。

而且,如果有人想知道为什么我不只是尝试重新连接相机,看看是否仍然如此。答案是,我正在远程操作这台PC,并且正在调查所有这些信息,以使系统在将来可能发生的任何潜在事件中实现完全自治。例如,这可能包括从USB端口断开相机的连接。


也可以是非编程/非软件的吗?例如通过用记号笔标记相机前玻璃(不同颜色)?如果硬件和/或序列没有差异,那么我怀疑是否可以在不进行自定义重新编程的情况下实现这一点,但是您可以通过不同的继电器/集线器连接摄像机的吗?
Gizmo

不幸的是,对于标记创意来说不,因为我不能在图片本身上介绍任何内容。我想知道是否有可能覆盖相机序列号?或其他任何相机设置/信息...是否存在类似的内容?可写的持久性内存?
伊万·科瓦切维奇

这将真的很难,尤其是当没有提供该设备的唯一信息时,请参见:stackoverflow.com/questions/14053764/…。至于覆盖内存,您可以尝试找到固件刷新实用程序,识别固件中的序列,然后对其进行十六进制编辑以达到所需的目的?但是我找不到任何工具。如果您找到更改USB设备描述符的方法,那么从那里开始将很容易。
Gizmo

您可以在此处尝试使用HID描述符工具-usb.org/developers/hidpage-当然,只有当您的凸轮是HID时
Gizmo

该死,是的,我想这是不可能的,这种型号也没有固件,所以想法也没有。我想我唯一能做的就是强制每个摄像机一直保持与PC上相同端口的连接...我将修改我的问题。
伊万·科瓦切维奇

Answers:


2

摄像机是否固定在位?场景或多或少是恒定的吗?如果是这样,您可以使用图像识别来代替摄像机所看到的内容。

有一些不错的python工具可以执行此操作,此答案提供了有关以下主题的一些不错的信息:https : //stackoverflow.com/questions/1927660/compare-two-images-the-python-linux-way


我想到了这个解决方案,但是我希望有一些简单的方法。而且我有一个问题,因为几台摄像机实际上俯瞰一个繁忙的港口,船舶动态,海面不是恒定的,因为波等的
伊万·科瓦切维奇

2

如您所见,如果无法从设备本身获得唯一标识,则无法解决该问题。与解决方案最接近的是依赖于单元的物理连接。(这不会在重新启动时更改。仅当您实际更改连接器的位置时)

您可以通过编程方式使用sysfs来获取内核具有的有关设备的信息。Sysfs是内核看到设备时类似文件系统的表示形式。(它不是磁盘上的真实文件)

使用它,您可以:-使用产品和供应商ID标识设备类型-读取设备的序列号(如果有)。-读取USB集线器上的物理连接号

您可以从/ sys / class中找到设备的类型开始。在此示例中,我使用USB→LPT端口。但是原理是一样的。

$ ls -l /sys/class/usbmisc
lp1 -> ../../devices/pci0000:00/0000:00:1d.0/usb4/4-1/4-1.5/4-1.5:1.0/usbmisc/lp1
lp2 -> ../../devices/pci0000:00/0000:00:1d.0/usb4/4-1/4-1.6/4-1.6:1.0/usbmisc/lp2

从uevent文件中获取设备名称:

cat /sys/class/usbmisc/lp1/uevent
MAJOR=180
MINOR=1
DEVNAME=__usb/lp1__

添加/ dev,以便获得要打开的设备名称:/ dev / usb / lp1

使用真实路径:$ cd -P / sys / class / usbmisc / lp1

向后退3个分支:

$ cd ../../../
/sys/devices/pci0000:00/0000:00:1d.0/usb4/4-1/4-1.5

此目录包含有关设备的许多信息:

idProductidVendor可以用于唯一地识别设备类型。

如果有一个序列文件,并且包含唯一的序列号,则操作完成。

否则,您的选择是使用物理连接作为标识,这是该目录名称“ 4-1.5 ”。它对于物理连接是唯一的,并且如您已经提到的,如果将设备插入另一个端口,它将更改。


我想这是最好的解决方案,或者就我而言是折衷方案...将相机固定在相同的专用USB端口上。我说妥协是因为在我的情况下,我还要求识别摄像机,例如,在进行硬件维护之后,如果摄像机的维护人员将摄像机连接到不同的端口。
伊万·科瓦切维奇

我同意。这远非完美。我希望对供应商来说很常见,如协议所指定的那样向设备添加一个简单的序列号。希望您找到更好的解决方案!
西蒙·里杰特16-3-5

1

只需拔下相机的插头,将其插入1并做一个lsusb。确定相机并记下使用哪个USB端口。也许在凸轮上贴了一个小标签。然后重复其他摄像机的操作,您将到达那里。没有什么是不可能完成的;)


这是有道理的。一次只插入一台摄像机,并记下它连接到的物理端口。如果您无法在软件中进行区分,您甚至可以打开或关闭各个端口,因此一次只能出现一个。参见askubuntu.com/questions/342061/…–
瑞安·格里格斯

我承认我没有完全解释我的配置目的。它是一台位于远程位置的PC,用于记录长时间(数月)的时间流逝。我希望有一个解决方案,无需我干预即可自动识别摄像机。现在,在断电之后,我实际上必须登录并手动重新配置摄像机编号。
伊万·科瓦切维奇

0

可以识别所有摄像机。命令

 $ sudo lsusb -v -d 046d:082d | grep -i serial
   iSerial                 1 05C6D16F

返回我的相机的序列号(一个Logitech HD Pro网络摄像头,作为示例,使用从先前使用中获得的正确的Vendor:Product代码lsusb)。请注意,以特权用户的身份执行此操作是绝对必要的:非特权用户无法通过命令访问所有可用信息。

序列号通常(但并非总是)唯一。如果不是唯一的(只需比较两个具有相同Vendor:Product代码的设备的上述命令的输出),就可以对其进行设置,以使其与众不同。Google上有很多这样做的指南,为了详尽起见,我仅会指出其中的一些:此处此处

现在的命令

$ sudo udevadm info --query=all /dev/video1 | grep 'VENDOR_ID\|MODEL_ID\|SERIAL_SHORT'
  E: ID_MODEL_ID=082d
  E: ID_SERIAL_SHORT=05C6D16F
  E: ID_VENDOR_ID=046d

返回此特定摄像机的适当代码。通过对所有/dev/videoX设备进行反复试验,可以对所有设备进行打孔。


在我看来,您好像没有读完我最初的问题。我已经在我的帖子中提到过使用udevadm ...问题是所有的相机都有相同的序列号,所以除了这些信息您别无选择。您提到“您可以设置它们以使其与众不同”是否可以“设置” /更改序列号?
伊万·科瓦切维奇

-1

我听说有人在启动过程中延迟了设备的开机时间,这将使您可以根据设备的打开顺序对其进行识别。它将需要一些附加硬件,这些硬件可以按顺序控制各个USB端口的电源。

您可以破解一个USB集线器,该集线器的每个端口都有单独的电源开关,将其挂接到arduino并触发打开它们的顺序。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.