Eu tenho cinco câmeras USB, da mesma marca, do mesmo modelo (Canyon CNR-FWC120H). Eles são usados para monitorar cenas diferentes 24/7. Eu preciso de alguma forma identificar qual câmera é qual do console Linux (Debian) ou programaticamente (qualquer idioma).
Eu tentei olhar para a saída de lsusb -vvv
, existe um campo iSerial
que deve ser diferente para cada câmera, mas infelizmente este fabricante decidiu não se incomodar e todas as câmeras têm a mesma série naquele local:200901010001
Existe alguma outra maneira de identificar qual câmera é qual, independentemente das portas USB às quais elas estão conectadas, porque, infelizmente, no meu cenário específico, não posso confiar no fato de que a mesma câmera sempre estará conectada à mesma porta.
ATUALIZAÇÃO Após algumas discussões nos comentários, percebo que essa é uma missão impossível. Portanto, esqueça o último parágrafo ou, se você tem alguma idéia engenhosa, por favor, seja bem-vindo a apresentá-lo. Agora, estou interessado em identificar a qual porta USB o dispositivo está conectado; Eu uso as portas USB integradas na placa-mãe e placas controladoras PCI USB adicionais para acomodar as câmeras com largura de banda suficiente. Eu precisaria identificar exclusivamente a porta, e o número / identificação da porta não deve mudar se, por exemplo, a máquina reiniciar e, por algum motivo, os controladores USB forem inicializados em ordem diferente. Isso é possível?
ATUALIZAÇÃO 2 Vejo nos meus registros de uma das câmeras as seguintes informações:
[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 isso, chamei 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
E entendi:
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
As coisas que diferem entre as câmeras são DEVPATH
, ID_PATH
, ID_PATH_TAG
, PHYS
e (mais interessante) USEC_INITIALIZED
. Agora, os quatro primeiros elementos provavelmente estão relacionados à porta USB, mas o último USEC_INITIALIZED
parece algum tipo de número de série. Não consigo encontrar nenhuma informação sobre o que realmente representa. Alguém sabe alguma coisa sobre isso? Eu pensei que talvez seja o tempo em microssegundos em que a câmera foi inicializada, mas a câmera que foi inicializada após esta USEC_INITIALIZED=17919751
, e depois a seguinte, USEC_INITIALIZED=25609278
para que pareça bastante aleatória. Vou tentar reiniciar o sistema e ver, mas preciso aguardar um momento conveniente para fazer isso.
E se alguém está se perguntando por que eu não apenas tento reconectar uma câmera e ver se isso permanece o mesmo. A resposta é que eu estou operando este PC remotamente e estou investigando tudo isso para preparar o sistema para ser totalmente autônomo para qualquer evento potencial no futuro. Que, por exemplo, pode incluir desconectar as câmeras das portas USB.
Respostas:
As câmeras estão em uma posição fixa? As cenas são mais ou menos constantes? Nesse caso, você pode usar o reconhecimento de imagem para identificar as câmeras pelo que elas estão vendo.
Existem algumas ferramentas python decentes para fazer isso, esta resposta tem algumas informações boas sobre o tópico: /programming/1927660/compare-two-images-the-python-linux-way
fonte
Como você descobriu, o problema não pode ser resolvido se você não conseguir obter uma identificação exclusiva do próprio dispositivo. O mais próximo de uma solução é depender da conexão física da unidade. (Isso não será alterado na reinicialização. Somente se você alterar fisicamente a posição do conector)
Programaticamente, você pode usar o sysfs para obter as informações que o kernel possui sobre o dispositivo. Sysfs é uma representação de dispositivos do tipo sistema de arquivos, conforme o kernel os vê. (Não são arquivos reais no disco)
Com ele, você pode: - identificar o tipo de dispositivo com o ID do produto e do fornecedor - ler o número de série do dispositivo, se houver um. - leia o número da conexão física no hub USB
Você pode começar encontrando seu tipo de dispositivo em / sys / class. Neste exemplo, eu uso uma porta USB → LPT. Mas o princípio é o mesmo.
Grap o nome do dispositivo do arquivo uevent:
adicione / dev para abrir o nome do dispositivo: / dev / usb / lp1
Use o caminho real: $ cd -P / sys / class / usbmisc / lp1
Recue 3 ramos:
Este diretório contém muitas informações no dispositivo:
idProduct e idVendor podem ser usados para identificar exclusivamente o tipo de dispositivo.
Se houver um arquivo serial e ele contiver um número de série exclusivo, você estará pronto.
Caso contrário, sua opção é usar a conexão física como identificação, que é o nome deste diretório “ 4-1.5 ”. É exclusivo para a conexão física e, como você já mencionou, será alterado se você conectar o dispositivo a outra porta.
fonte
Simplesmente desconecte a câmera, conecte 1 e faça um LSUSB. Identifique a câmera e anote qual porta USB é usada. Talvez coloque uma pequena etiqueta na câmera. Repita o procedimento para as outras câmeras e você chegará lá. Nada é missão impossível;)
fonte
É possível identificar todas as câmeras. O comando
retorna o número de série da minha câmera (uma webcam Logitech HD Pro, usada como exemplo com o fornecedor correto: códigos de produto obtidos de um uso anterior de
lsusb
). Observe que é absolutamente necessário executar esta operação como um usuário privilegiado: um usuário sem privilégios não obtém acesso a todas as informações disponíveis através do comando.O número de série é frequentemente, mas nem sempre, único. Se não for exclusivo (basta comparar a saída dos comandos acima para dois dispositivos com o mesmo fornecedor: códigos do produto), você pode configurá- los para que sejam distintos. Existem guias em todo o Google para fazer isso, vou apenas apontar para alguns deles, por uma questão de rigor: aqui e aqui .
Agora o comando
retorna os códigos apropriados para esta câmera específica. Tentativa e erro com todos os
/dev/videoX
dispositivos permitem a instalação de todos eles.fonte
Ouvi falar de alguém atrasando a ligação em sequência de dispositivos durante uma inicialização, o que permitiria identificá-los com base na ordem em que eles são ativados. Seria necessário algum hardware adicional que pudesse controlar a energia de portas USB individuais em ordem.
Você pode invadir um hub USB que possua switches individuais para cada porta, conectá-lo a um arduino e acionar a ordem em que eles estão ligados.
fonte