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 iSerial
que 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
, PHYS
y (lo más interesante) USEC_INITIALIZED
. Ahora los primeros cuatro elementos probablemente estén relacionados con el puerto USB, pero el último USEC_INITIALIZED
parece 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=25609278
por 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.
Respuestas:
¿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
fuente
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.
Obtenga el nombre del dispositivo del archivo uevent:
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:
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.
fuente
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;)
fuente
Es posible identificar todas las cámaras. El comando
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
devuelve los códigos apropiados para esta cámara en particular. La prueba y error con todos los
/dev/videoX
dispositivos les permite a todos hacerlos.fuente
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.
fuente