Identification des périphériques USB

15

J'ai cinq caméras USB, même marque, même modèle (Canyon CNR-FWC120H). Ils sont utilisés pour surveiller différentes scènes 24/7. Je dois en quelque sorte identifier quelle caméra est la console Linux (Debian) ou par programme (n'importe quelle langue).

J'ai essayé de regarder la sortie de lsusb -vvv, il y a un champ iSerialqui devrait être différent pour chaque caméra mais malheureusement ce fabricant a décidé de ne pas déranger et toutes les caméras ont la même série à cet endroit:200901010001

Existe-t-il un autre moyen d'identifier quel appareil photo est indépendamment des ports USB auxquels ils sont connectés, car malheureusement dans mon scénario spécifique, je ne peux pas compter sur le fait que le même appareil photo sera toujours connecté au même port.

MISE À JOUR Après quelques discussions dans les commentaires, je me rends compte que c'est mission impossible. Alors oubliez le dernier paragraphe ou si vous avez une idée ingénieuse, n'hésitez pas à le présenter. Je suis maintenant intéressé si je pouvais identifier le port USB auquel l'appareil est connecté; J'utilise les ports USB intégrés sur la carte mère et les cartes contrôleur PCI USB supplémentaires pour accueillir les caméras avec une bande passante suffisante. J'aurais besoin d'identifier le port de manière unique, et le numéro / l'identification du port ne devrait pas changer si, par exemple, la machine redémarre et pour une raison quelconque, les contrôleurs USB sont initialisés dans un ordre différent. Est-ce possible?

MISE À JOUR 2 Je vois dans mes journaux pour l'une des caméras les informations suivantes:

[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

En utilisant cela, j'ai appelé cette commande:

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

Et j'ai ceci:

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

Les choses qui diffèrent entre les caméras DEVPATH, ID_PATH, ID_PATH_TAG, PHYSet ( le plus intéressant) USEC_INITIALIZED. Maintenant, les quatre premiers éléments sont probablement liés au port USB, mais le dernier USEC_INITIALIZEDressemble à une sorte de numéro de série. Je ne trouve aucune information sur ce que cela représente réellement. Est-ce que quelqu'un sait quelque chose à propos de ça? Je pensais que c'était peut-être le temps en micro secondes où la caméra s'est initialisée mais la caméra qui s'est initialisée après celle-ci a USEC_INITIALIZED=17919751, et puis celle après ça USEC_INITIALIZED=25609278donc ça semble plutôt aléatoire. J'essaierai de redémarrer le système et de voir, mais je dois attendre un moment opportun pour le faire.

Et si quelqu'un se demande pourquoi je n'essaye pas simplement de reconnecter un appareil photo et de voir si cela reste le même. La réponse est que j'utilise ce PC à distance et j'étudie tout cela pour préparer le système à être entièrement autonome pour tout événement potentiel à l'avenir. Ce qui pourrait par exemple inclure la déconnexion des caméras des ports USB.

Ivan Kovacevic
la source
Peut-il aussi être non programmatique / non logiciel? par exemple en marquant la vitre avant de la caméra avec un marqueur (différentes couleurs)? S'il n'y a pas de différences dans le matériel et / ou les publications en série, je doute que cela soit possible sans reprogrammation personnalisée, vous pouvez cependant connecter la caméra via des relais / concentrateurs qui SONT différents?
Gizmo
Malheureusement non pour l'idée de marqueur, car je ne dois rien introduire dans l'image elle-même. Je me demandais s'il y avait une possibilité d'écraser le numéro de série des caméras? Ou tout autre paramètre / info de la caméra ... Existe-t-il quelque chose comme ça? Mémoire inscriptible et persistante?
Ivan Kovacevic
Cela va être très difficile, surtout lorsqu'aucune information unique pour le périphérique n'est fournie, voir ceci: stackoverflow.com/questions/14053764/… . En ce qui concerne l'écrasement de la mémoire, vous pouvez essayer de trouver un utilitaire de mise à jour du firmware, identifier la série dans le firmware et HEX-EDIT à quelque chose que vous aimez? Cependant, je ne trouve aucun outil pour cela. Si vous pouvez trouver un moyen de changer le descripteur de périphérique USB, ce serait facile à partir de là.
Gizmo
Vous pouvez essayer l'outil HID Descriptor ici - usb.org/developers/hidpage - Bien sûr, seulement si votre caméra est HID
Gizmo
putain, ouais je suppose que c'est impossible, il n'y a pas non plus de firmware pour ce modèle donc cette idée est également sortie. Je suppose que la seule chose que je puisse faire est de faire en sorte que chaque caméra reste connectée au même port sur le PC tout le temps ... Je vais modifier ma question.
Ivan Kovacevic

Réponses:

2

Les caméras sont-elles dans une position fixe? Les scènes sont-elles plus ou moins constantes? Si c'est le cas, vous pouvez utiliser la reconnaissance d'image pour identifier les caméras par ce qu'elles voient à la place.

Il existe des outils python décents pour ce faire, cette réponse contient de bonnes informations sur le sujet: /programming/1927660/compare-two-images-the-python-linux-way

walli
la source
J'avais cette solution en tête, mais j'espérais quelque chose de plus simple. Et j'aurais un problème parce que peu de caméras surplombent un port très fréquenté, les navires bougent, la surface de la mer n'est pas constante à cause des vagues, etc.
Ivan Kovacevic
2

Comme vous l'avez découvert, le problème ne peut pas être résolu si vous ne pouvez pas obtenir une identification unique de l'appareil lui-même. La chose la plus proche d'une solution est de dépendre de la connexion physique de l'unité. (Cela ne changera pas au redémarrage. Seulement si vous changez physiquement la position du connecteur)

Par programme, vous pouvez utiliser sysfs pour obtenir les informations du noyau sur le périphérique. Sysfs est une représentation des périphériques de type système de fichiers telle que le noyau les voit. (Ce ne sont pas de vrais fichiers sur le disque)

Avec lui, vous pouvez: - identifier le type d'appareil avec l'ID produit et fournisseur - lire le numéro de série de l'appareil, s'il en a un. - lire le numéro de connexion physique sur le hub USB

Vous pouvez commencer par trouver votre type de périphériques dans / sys / class. Dans cet exemple, j'utilise un port USB → LPT. Mais le principe est le même.

$ 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

Saisissez le nom du périphérique à partir du fichier uevent:

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

ajoutez / dev pour ouvrir le nom du périphérique: / dev / usb / lp1

Utilisez le vrai chemin: $ cd -P / sys / class / usbmisc / lp1

Reculez de 3 branches:

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

Ce répertoire contient de nombreuses informations sur l'appareil:

idProduct et idVendor peuvent être utilisés pour identifier de manière unique le type de périphérique.

S'il existe un fichier série et qu'il contient un numéro de série unique, vous avez terminé.

Sinon, votre option consiste à utiliser la connexion physique comme identification, qui est ce nom de répertoire « 4-1.5 ». Il est unique pour la connexion physique et, comme vous l'avez déjà mentionné, changera si vous branchez l'appareil sur un autre port.

Simon Rigét
la source
Je suppose que c'est la meilleure solution, ou compromis dans mon cas ... Fixez les caméras sur le même port USB dédié. Je dis compromis parce que dans mon cas, j'avais également l'obligation d'identifier les caméras si, par exemple, après une maintenance matérielle, les caméras étaient connectées à différents ports par la personne qui effectuait la maintenance.
Ivan Kovacevic
Je suis d'accord. C'est loin d'être parfait. Je souhaite qu'il soit courant pour les fournisseurs d'ajouter un f ... simple numéro de série à l'appareil, comme le protocole le spécifie. J'espère que vous trouverez une meilleure solution!
Simon Rigét
1

Débranchez simplement l'appareil photo, branchez-en 1 et effectuez une connexion lsusb. Identifiez la caméra et notez le port USB utilisé. Peut-être mettre une petite étiquette sur la came. Ensuite, répétez pour les autres caméras et vous y arriverez. Rien n'est mission impossible;)

Jakke
la source
C'est logique. Branchez simplement une caméra à la fois et notez le port physique auquel elle est connectée. Il semble que vous puissiez même activer et désactiver les ports individuels si vous ne pouvez pas différencier votre logiciel, de sorte qu'un seul apparaît à la fois. Voir askubuntu.com/questions/342061/…
Ryan Griggs
J'avoue que je n'ai pas expliqué complètement clairement le but de ma configuration. Il s'agit d'un PC sur un emplacement distant utilisé pour enregistrer des laps de temps de longue durée (mois). Je souhaitais une solution permettant d'identifier automatiquement les caméras sans mon intervention. Maintenant, après toute panne de courant, je dois réellement me connecter et reconfigurer manuellement les numéros de caméra.
Ivan Kovacevic
0

Il est possible d'identifier toutes les caméras. La commande

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

renvoie le numéro de série de ma caméra (une webcam Logitech HD Pro, utilisée comme exemple avec le bon fournisseur: codes de produit obtenus lors d'une utilisation précédente de lsusb). Veuillez noter qu'il est absolument nécessaire d'effectuer cette opération en tant qu'utilisateur privilégié: un utilisateur non privilégié n'a pas accès à toutes les informations disponibles via la commande.

Le numéro de série est souvent, mais pas toujours, unique. S'il n'est pas unique (il suffit de comparer la sortie des commandes ci-dessus pour deux appareils avec le même fournisseur: codes de produit), vous pouvez les définir de sorte qu'ils soient distincts. Il y a des guides partout sur Google pour le faire, je vais simplement en mentionner quelques-uns, par souci de rigueur: ici et ici .

Maintenant, la commande

$ 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

renvoie les codes appropriés pour cet appareil photo particulier. Les essais et les erreurs avec tous les /dev/videoXappareils permettent à tous de percer les pigeons.

MariusMatutiae
la source
Il me semble que vous n'avez peut-être pas lu mon message de question initiale jusqu'à la fin. J'ai déjà mentionné dans mon article comment utiliser udevadm ... Le problème est que toutes les caméras ont le même numéro de série, vous ne pouvez donc pas les différencier de ces informations. Vous avez mentionné "vous pouvez les définir pour qu'ils soient distincts". Existe-t-il un moyen de "définir" / modifier le numéro de série?
Ivan Kovacevic
-1

J'ai entendu parler de quelqu'un retardant la mise sous tension séquentielle des appareils lors d'un démarrage, ce qui vous permettrait de les identifier en fonction de l'ordre dans lequel ils s'allument. Cela nécessiterait un matériel supplémentaire qui pourrait contrôler l'alimentation des ports USB individuels dans l'ordre.

Vous pouvez pirater un concentrateur USB doté de commutateurs d'alimentation individuels pour chaque port, le raccorder à un Arduino et déclencher l'ordre dans lequel ils sont activés.

zimmer62
la source