Identificando dispositivos USB

15

Eu tenho cinco câmeras USB, mesma marca, 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 esse fabricante decidiu não se incomodar e todas as câmeras têm a mesma serial naquele local: 200901010001

Existe alguma outra maneira que eu poderia identificar qual câmera é que, independentemente das portas USB para as quais eles estão conectados, porque infelizmente no meu cenário específico eu não posso confiar no fato de que a mesma câmera sempre estará conectada à mesma porta.

UPDATE Depois de alguma discussão nos comentários, percebo que essa é uma missão impossível. Então esqueça o último parágrafo ou se tiver alguma ideia genial, por favor, seja bem-vindo para apresentá-lo. Agora estou interessado em identificar qual porta USB o dispositivo está conectado; Eu uso as portas USB embutidas na placa-mãe e placas de controlador 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 for reinicializada e, por algum motivo, os controladores USB forem inicializados em ordem diferente. Isso é possível?

UPDATE 2 vejo em 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 isso:

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 primeiros quatro elementos provavelmente estão relacionados à porta USB, mas o último USEC_INITIALIZED parece com algum tipo de número de série. Não consigo encontrar informações sobre o que isso realmente representa. Alguém sabe alguma coisa sobre isso? Eu pensei que talvez seja o tempo em micro segundos quando a câmera inicializou, mas a câmera que inicializou depois desta tem USEC_INITIALIZED=17919751 , e depois a que depois disso USEC_INITIALIZED=25609278 , então parece bastante aleatória. Vou tentar reiniciar o sistema e ver, mas preciso aguardar uma hora conveniente para fazer isso.

E se alguém estiver se perguntando por que não tente reconectar uma câmera e ver se ela continua a mesma. A resposta é que 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.

    
por Ivan Kovacevic 30.04.2014 / 17:16

5 respostas

2

As câmeras estão em uma posição fixa? As cenas são mais ou menos constantes? Nesse caso, você poderia usar o reconhecimento de imagem para identificar as câmeras pelo que elas estão vendo.

Existem algumas ferramentas decentes de python para fazer isso, essa resposta tem boas informações sobre o tópico: link

    
por 28.05.2014 / 04:18
2

Como você descobriu, o problema não pode ser resolvido se você não conseguir uma identificação única do próprio dispositivo. O mais próximo de uma solução é depender da conexão física da unidade. (Isso não mudará 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. O Sysfs é uma representação de dispositivos semelhante ao sistema de arquivos, conforme o kernel os vê. (Não é arquivos reais no disco)

Com isso, você pode: - identificar o tipo de dispositivo com o produto e o ID do fornecedor - leia o número de série do dispositivo, se tiver um. - leia o número de 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.

$ 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

Grap o nome do dispositivo do arquivo uevent:

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

adicione / dev para que o nome do dispositivo seja aberto: / dev / usb / lp1

Use o caminho real:     $ cd -P / sys / class / usbmisc / lp1

Recue 3 filiais:

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

Este diretório contém muitas informações sobre o dispositivo:

idProduct e idVendor podem ser usados para identificar de forma exclusiva o tipo de dispositivo.

Se houver um arquivo serial e ele contiver um número de série exclusivo, está pronto.

Caso contrário, sua opção é usar a conexão física como identificação, que é o nome do diretório “ 4-1.5 ”. Ele é exclusivo para a conexão física e, como você já mencionou, mudará se você conectar o dispositivo em outra porta.

    
por 17.09.2015 / 23:17
1

Simplesmente desconecte a câmera, conecte 1 e faça um lsusb. Identifique a câmera e anote qual porta USB está sendo usada. Talvez coloque um pequeno rótulo na cam. Em seguida, repita para a outra câmera e você chegará lá. Nada é missão impossível;)

    
por 24.05.2014 / 12:01
0

É possível identificar todas as câmeras. O comando

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

retorna o número de série da minha câmera (um Logitech HD Pro Webcam, usado como um exemplo com o fornecedor correto: códigos de produto obtidos de um uso anterior de lsusb ). Por favor note que é absolutamente necessário executar esta operação como um usuário privilegiado: um usuário não privilegiado 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, exclusivo. Se não for exclusivo (basta comparar a saída dos comandos acima para dois dispositivos com o mesmo fornecedor: códigos de produto), você pode definir para que eles sejam distintos. Existem guias em todo o Google para fazer isso, vou apenas apontar para alguns deles, por uma questão de meticulosidade: aqui e aqui .

Agora o 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

retorna os códigos apropriados para essa câmera específica. A tentativa e o erro com todos os dispositivos /dev/videoX permitem que todos sejam agrupados por pombo.

    
por 04.03.2016 / 11:39
-1

Ouvi falar de alguém atrasando a ativação em sequência dos dispositivos durante a inicialização, o que permitiria identificá-los com base na ordem em que eles são ligados. Isso exigiria algum hardware adicional que pudesse controlar a energia de portas usb individuais em ordem.

Você pode hackear um hub USB com interruptores individuais para cada porta, ligá-lo a um arduino e acionar a ordem em que eles estão ligados.

    
por 02.05.2014 / 15:26