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 iSerial
qui 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
, PHYS
et ( le plus intéressant) USEC_INITIALIZED
. Maintenant, les quatre premiers éléments sont probablement liés au port USB, mais le dernier USEC_INITIALIZED
ressemble à 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=25609278
donc ç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.
Réponses:
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
la source
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.
Saisissez le nom du périphérique à partir du fichier uevent:
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:
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.
la source
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;)
la source
Il est possible d'identifier toutes les caméras. La commande
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
renvoie les codes appropriés pour cet appareil photo particulier. Les essais et les erreurs avec tous les
/dev/videoX
appareils permettent à tous de percer les pigeons.la source
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.
la source