Identificar dispositivos USB

15

Tengo cinco cámaras USB, la misma marca, el mismo modelo (Canyon CNR-FWC120H). Se utilizan para monitorear diferentes escenas 24/7. Necesito identificar de alguna manera qué cámara es cuál desde la consola de Linux (Debian) o mediante programación (cualquier idioma).

Intenté mirar la salida de lsusb -vvv, hay un campo iSerialque debería ser diferente para cada cámara, pero desafortunadamente este fabricante decidió no molestarse y todas las cámaras tienen la misma serie en ese lugar:200901010001

¿Hay alguna otra manera de identificar qué cámara es independiente de los puertos USB a los que están conectados porque, lamentablemente, en mi situación específica no puedo confiar en el hecho de que la misma cámara siempre estará conectada al mismo puerto?

ACTUALIZACIÓN Después de algunas discusiones en los comentarios, me doy cuenta de que esta es una misión imposible. Así que olvídate del último párrafo o si tienes alguna idea ingeniosa, por favor, puedes presentarla. Ahora estoy interesado si pudiera identificar a qué puerto USB está conectado el dispositivo; Utilizo los puertos USB integrados en la placa base y tarjetas controladoras USB PCI adicionales para acomodar las cámaras con suficiente ancho de banda. Necesitaría identificar de forma exclusiva el puerto, y el número / identificación del puerto no debería cambiar si, por ejemplo, la máquina se reinicia y, por alguna razón, los controladores USB se inicializan en un orden diferente. ¿Es eso posible?

ACTUALIZACIÓN 2 Veo en mis registros para una de las cámaras la siguiente información:

[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

Usando eso, he llamado a este comando:

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

Y tengo esto:

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

Las cosas que difieren entre las cámaras son DEVPATH, ID_PATH, ID_PATH_TAG, PHYSy (lo más interesante) USEC_INITIALIZED. Ahora los primeros cuatro elementos probablemente estén relacionados con el puerto USB, pero el último USEC_INITIALIZEDparece una especie de número de serie. No puedo encontrar ninguna información sobre lo que realmente representa. ¿Alguien sabe algo al respecto? Pensé que tal vez sea el tiempo en microsegundos cuando la cámara se inicializó, pero la cámara que se inicializó después de esta USEC_INITIALIZED=17919751, y luego la siguiente, USEC_INITIALIZED=25609278por lo que parece bastante aleatorio. Trataré de reiniciar el sistema y veré, pero necesito esperar un momento conveniente para hacerlo.

Y si alguien se pregunta por qué no trato de volver a conectar una cámara y ver si sigue igual. La respuesta es que estoy operando esta PC de forma remota, y estoy investigando todo esto para preparar el sistema para que sea completamente autónomo para cualquier evento potencial en el futuro. Lo que, por ejemplo, podría incluir desconectar las cámaras de los puertos USB.

Ivan Kovacevic
fuente
¿Puede ser no programático / no software también? por ejemplo, marcando el cristal frontal de la cámara con un marcador (diferentes colores)? Si no hay diferencias en el hardware y / o las publicaciones en serie, dudo que esto sea posible sin una reprogramación personalizada, ¿podría conectar la cámara a través de relés / hub que SON diferentes?
Gizmo
Desafortunadamente no para la idea del marcador, porque no debo introducir nada en la imagen en sí. Me preguntaba si existe la posibilidad de sobrescribir el número de serie de la cámara. O cualquier otra configuración / información de la cámara ... ¿Existe algo así? Escritura, memoria persistente?
Ivan Kovacevic
Esto va a ser realmente difícil, especialmente cuando no se proporciona información única para el dispositivo, consulte esto: stackoverflow.com/questions/14053764/… . En cuanto a la sobrescritura de la memoria, ¿podría intentar encontrar una utilidad de actualización de firmware, identificar la serie en el firmware y HEX-EDITARla a algo que le guste? Sin embargo, no puedo encontrar ninguna herramienta para ello. Si puede encontrar una manera de cambiar el descriptor del dispositivo usb, entonces sería fácil a partir de ahí.
Gizmo
Puede probar la herramienta Descriptor HID aquí - usb.org/developers/hidpage - Por supuesto, solo si su cámara está HID
Gizmo
maldición, sí, supongo que esto es imposible, tampoco hay firmware para este modelo, por lo que esa idea también está fuera. Supongo que lo único que podría hacer es asegurar que cada cámara permanezca conectada al mismo puerto en la PC todo el tiempo ... Modificaré mi pregunta.
Ivan Kovacevic

Respuestas:

2

¿Están las cámaras en una posición fija? ¿Son las escenas más o menos constantes? Si es así, podría usar el reconocimiento de imágenes para identificar las cámaras por lo que están viendo.

Hay algunas herramientas de Python decentes para hacer esto, esta respuesta tiene buena información sobre el tema: /programming/1927660/compare-two-images-the-python-linux-way

Walli
fuente
Tenía esta solución en mente, sin embargo, esperaba algo más simple. Y tendría un problema porque pocas cámaras están mirando a un puerto ocupado, los barcos se mueven, la superficie del mar no es constante debido a las olas, etc.
Ivan Kovacevic
2

Como descubrió, el problema no puede resolverse si no puede obtener una identificación única del propio dispositivo. Lo más parecido a una solución es depender de la conexión física de la unidad. (Esto no cambiará al reiniciar. Solo si cambia físicamente la posición del conector)

Mediante programación, puede usar sysfs para obtener la información que tiene el núcleo sobre el dispositivo. Sysfs es una representación de dispositivos similar a un sistema de archivos tal como los ve el núcleo. (No son archivos reales en el disco)

Con él, puede: - identificar el tipo de dispositivo con la identificación del producto y del proveedor - leer el número de serie del dispositivo, si tiene uno. - lea el número de conexión física en el concentrador USB

Puede comenzar por encontrar su tipo de dispositivos en / sys / class. En este ejemplo, uso un puerto USB → LPT. Pero el principio es el mismo.

$ 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

Obtenga el nombre del dispositivo del archivo uevent:

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

agregue / dev para que se abra el nombre del dispositivo: / dev / usb / lp1

Use la ruta real: $ cd -P / sys / class / usbmisc / lp1

Retroceda 3 ramas:

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

Este directorio contiene mucha información sobre el dispositivo:

idProduct e idVendor se pueden usar para identificar de forma exclusiva el tipo de dispositivo.

Si hay un archivo de serie y contiene un número de serie único, ya está.

De lo contrario, su opción es utilizar la conexión física como identificación, que es el nombre de este directorio " 4-1.5 ". Es único para la conexión física y, como ya mencionó, cambiará si conecta el dispositivo a otro puerto.

Simon Rigét
fuente
Supongo que esta es la mejor solución, o compromiso en mi caso ... Fijar las cámaras al mismo puerto USB dedicado. Digo compromiso porque en mi caso también tuve el requisito de identificar las cámaras si, por ejemplo, después de un mantenimiento de hardware, la persona que realiza el mantenimiento las conecta a diferentes puertos.
Ivan Kovacevic
Estoy de acuerdo. Esto está lejos de ser perfecto. Desearía que fuera común para los proveedores, agregar un número de serie f ... simple al dispositivo, como lo especifica el protocolo. ¡Espero que encuentres una mejor solución!
Simon Rigét
1

Simplemente desconecte la cámara, conecte 1 y realice una lsusb. Identifique la cámara y anote qué puerto USB se utiliza. Tal vez poner una pequeña etiqueta en la cámara. Luego repite para las otras cámaras y llegarás allí. Nada es misión imposible;)

Jakke
fuente
Esto tiene sentido. Simplemente conecte una cámara a la vez y observe a qué puerto físico está conectado. Parece que incluso podría activar y desactivar los puertos individuales si no puede diferenciar dentro de su software, por lo que solo aparecería uno a la vez. Ver askubuntu.com/questions/342061/…
Ryan Griggs
Admito que no expliqué completamente claro el propósito de mi configuración. Es una PC en una ubicación remota utilizada para grabar lapsos de tiempo de larga duración (meses). Deseaba una solución que pudiera identificar automáticamente las cámaras sin mi intervención. Ahora, después de cualquier corte de energía, tengo que iniciar sesión y volver a configurar manualmente los números de cámara.
Ivan Kovacevic
0

Es posible identificar todas las cámaras. El comando

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

devuelve el número de serie de mi cámara (una cámara web Logitech HD Pro, utilizada como ejemplo con el proveedor correcto: códigos de producto obtenidos de un uso anterior de lsusb). Tenga en cuenta que es absolutamente necesario realizar esta operación como un usuario privilegiado: un usuario no privilegiado no obtiene acceso a toda la información disponible a través del comando.

El número de serie es a menudo, pero no siempre, único. Si no es único (solo compare la salida de los comandos anteriores para dos dispositivos con el mismo proveedor: códigos de producto), puede configurarlos para que sean distintos. Hay guías en todo Google para hacer eso, simplemente señalaré un par de ellas, en aras de la minuciosidad: aquí y aquí .

Ahora el comando

$ 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

devuelve los códigos apropiados para esta cámara en particular. La prueba y error con todos los /dev/videoXdispositivos les permite a todos hacerlos.

MariusMatutiae
fuente
Me parece que tal vez no leyó mi publicación inicial de preguntas hasta el final. Ya he mencionado en mi publicación sobre el uso de udevadm ... El problema es que todas las cámaras tienen el mismo número de serie, por lo que no puedes distinguirlas de esa información. Usted mencionó "puede configurarlos para que sean distintos" ¿hay alguna manera de "configurar" / cambiar el número de serie?
Ivan Kovacevic
-1

He oído que alguien retrasa el encendido en secuencia de los dispositivos durante un arranque, lo que le permitiría identificarlos según el orden en que se encienden. Requeriría algún hardware adicional que pudiera controlar la energía de los puertos usb individuales en orden.

Podría hackear un concentrador USB que tiene interruptores de alimentación individuales para cada puerto, conectarlo a un arduino y activar el orden en que se encienden.

zimmer62
fuente