Identificando dispositivos USB

15

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 iSerialque 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, PHYSe (mais interessante) USEC_INITIALIZED. Agora, os quatro primeiros elementos provavelmente estão relacionados à porta USB, mas o último USEC_INITIALIZEDparece 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=25609278para 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.

Ivan Kovacevic
fonte
Também pode ser não programático / sem software? por exemplo, marcando o vidro frontal da câmera com um marcador (cores diferentes)? Se não houver diferenças no hardware e / ou seriais, duvido que isso seja possível sem reprogramação personalizada. No entanto, você pode conectar a câmera através de relés / cubos Quais são diferentes?
Gizmo
Infelizmente não, para a ideia do marcador, porque não devo introduzir nada na imagem em si. Eu queria saber se existe a possibilidade de substituir o número de série da câmera? Ou qualquer outra configuração / informação da câmera ... Existe algo assim? Memória gravável e persistente?
Ivan Kovacevic
Isso será realmente difícil, especialmente quando nenhuma informação exclusiva para o dispositivo for fornecida, consulte: stackoverflow.com/questions/14053764/… . Quanto à substituição da memória, você pode tentar encontrar um utilitário de firmware piscando, identificar o serial no firmware e editá-lo com HEX-EDIT para algo que você gosta? No entanto, não consigo encontrar nenhuma ferramenta para isso. Se você puder encontrar uma maneira de alterar o descritor do dispositivo usb, seria fácil a partir daí.
Gizmo
Você pode tentar a ferramenta HID descritor aqui - usb.org/developers/hidpage - Claro, apenas se o seu cam é HID
Gizmo
caramba, sim, eu acho que isso é impossível, também não há firmware para este modelo, então essa ideia também foi divulgada. Acho que a única coisa que posso fazer é fazer com que cada câmera permaneça conectada à mesma porta do PC o tempo todo ... Modificarei minha pergunta.
Ivan Kovacevic

Respostas:

2

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

Walli
fonte
Eu tinha essa solução em mente, mas esperava algo mais simples. E eu teria um problema porque algumas câmeras são realmente com vista para um movimentado porto, os navios em movimento, superfície do mar não é constante por causa das ondas, etc.
Ivan Kovacevic
2

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.

$ 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 abrir o nome do dispositivo: / dev / usb / lp1

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

Recue 3 ramos:

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

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.

Simon Rigét
fonte
Eu acho que essa é a melhor solução, ou compromisso no meu caso ... Fixar as câmeras na mesma porta USB dedicada. Digo compromisso, porque no meu caso também tive o requisito de identificar as câmeras se, por exemplo, após uma manutenção de hardware, as câmeras fossem conectadas a portas diferentes pela pessoa que fazia a manutenção.
Ivan Kovacevic
Concordo. Isso está longe de ser perfeito. Eu gostaria que fosse comum para os fornecedores adicionar um número de série f simples ao dispositivo, como o protocolo especifica. Espero que você encontre uma solução melhor!
Simon Rigét 5/03/16
1

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;)

Jakke
fonte
Isso faz sentido. Basta conectar uma câmera de cada vez e anotar a qual porta física está conectada. Parece que você pode ativar e desativar as portas individuais se não conseguir se diferenciar no software, para que apenas uma apareça por vez. Veja askubuntu.com/questions/342061/…
Ryan Griggs
Admito que não expliquei claramente o objetivo da minha configuração. É um PC em um local remoto usado para gravar intervalos de tempo prolongados (meses). Eu desejava uma solução que pudesse identificar automaticamente as câmeras sem a minha intervenção. Agora, após qualquer falta de energia, eu realmente tenho que efetuar login e reconfigurar manualmente os números da câmera.
Ivan Kovacevic
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 (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

$ 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 esta câmera específica. Tentativa e erro com todos os /dev/videoXdispositivos permitem a instalação de todos eles.

MariusMatutiae
fonte
Parece-me que você talvez não tenha lido minha pergunta inicial até o fim. Eu já mencionei no meu post sobre o uso do udevadm ... O problema é que todas as câmeras têm o mesmo número de série, então você não pode diferenciá-las dessa informação. Você mencionou "você pode configurá-los para que sejam distintos". Existe uma maneira de "definir" / alterar o número de série?
Ivan Kovacevic
-1

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.

zimmer62
fonte