web-dev-qa-db-fra.com

Attribuer une webcam à un / dev / video # spécifique

J'ai trois webcams sur mon serveur Ubuntu 14.04. La sortie de lsusb:

Bus 006 Device 002: ID 0bda:8153 Realtek Semiconductor Corp.
Bus 006 Device 001: ID 1d6b:0003 Linux Foundation 3.0 root hub
Bus 005 Device 001: ID 1d6b:0002 Linux Foundation 2.0 root hub
Bus 004 Device 003: ID 2537:1066
Bus 004 Device 002: ID 05e3:0616 Genesys Logic, Inc.
Bus 004 Device 001: ID 1d6b:0003 Linux Foundation 3.0 root hub
Bus 003 Device 005: ID 1871:0101 Aveo Technology Corp. UVC camera (Bresser microscope)
Bus 003 Device 004: ID 1a40:0101 Terminus Technology Inc. 4-Port HUB
Bus 003 Device 003: ID 1a40:0101 Terminus Technology Inc. 4-Port HUB
Bus 003 Device 002: ID 05e3:0610 Genesys Logic, Inc. 4-port hub
Bus 003 Device 001: ID 1d6b:0002 Linux Foundation 2.0 root hub
Bus 002 Device 001: ID 1d6b:0001 Linux Foundation 1.1 root hub
Bus 001 Device 005: ID 046d:0807 Logitech, Inc. Webcam B500
Bus 001 Device 004: ID 1871:0101 Aveo Technology Corp. UVC camera (Bresser microscope)
Bus 001 Device 003: ID 1a40:0101 Terminus Technology Inc. 4-Port HUB
Bus 001 Device 002: ID 1a40:0101 Terminus Technology Inc. 4-Port HUB
Bus 001 Device 001: ID 1d6b:0002 Linux Foundation 2.0 root hub

Je veux assigner un/dev/video # spécifique à chacun. J'ai lu que je devais créer une règle udev dans /etc/udev/rules.d/, mais la plupart de ce que j'ai lu semble obsolète et je ne veux pas causer de problèmes à mon serveur. Je pensais créer une règle de 25 appareils vidéo vidéo contenant les éléments suivants:

SUBSYSTEM=="video4linux", BUS=="usb", SYSFS{idVendor}=="1871", SYSFS{idProduct}=="0101", NAME="video10"
SUBSYSTEM=="video4linux", BUS=="usb", SYSFS{idVendor}=="1871", SYSFS{idProduct}=="0101", NAME="video11"
SUBSYSTEM=="video4linux", BUS=="usb", SYSFS{idVendor}=="046d", SYSFS{idProduct}=="0807", NAME="video12"

Le problème supplémentaire que j’ai, c’est que 2 des 3 webcams semblent identiques (bien qu’elles ne le soient pas, elles sont achetées sur eBay et sont utilisées pour surveiller une zone différente). Alors, quelles seraient les règles pour mon cas? Merci

7
bomberb17

Solution sans règles Udev

Il est possible que video4linux vous ait déjà fourni des noms de périphérique stables. Vous voudrez peut-être vérifier les répertoires /dev/v4l/by-id/ et /dev/v4l/by-path/ pour cela. Connectez vos périphériques à différents ports USB et comparez les noms de périphériques créés pour vous assurer qu'ils sont vraiment stables.

Solution avec les règles Udev

Sinon, cela dépend si vos deux périphériques apparemment identiques ont au moins un numéro de série différent, accessible par udev. Vous pouvez le trouver en utilisant les numéros corrects "Bus" et "Device" de votre lsusbdans la commande suivante:

udevadm info --attribute-walk /dev/bus/usb/003/005

S'il existe une sorte de sortie comme celle-ci dans le premier bloc de paires clé/valeur et que la série est différente entre les deux périphériques, vous pouvez l'utiliser dans vos règles udev:

ATTR {serial} == "68974689267119892"

Vos règles udev pourraient alors ressembler à ceci:

SUBSYSTEM=="usb", ATTR{serial}=="68974689267119892", ATTR{idVendor}=="1871", ATTR{idProduct}=="0101", NAME="video10"
SUBSYSTEM=="usb", ATTR{serial}=="12345698798725654", ATTR{idVendor}=="1871", ATTR{idProduct}=="0101", NAME="video11"
SUBSYSTEM=="usb", ATTR{idVendor}=="046d", ATTR{idProduct}=="0807", NAME="video12"

S'il existe non numéro de série (ou unique unique similaire), la possibilité suivante s'offre à vous: vous devez vous assurer que vos périphériques restent toujours connectés aux mêmes ports USB. Dans ce cas, vous pouvez utiliser des règles comme celles-ci:

SUBSYSTEM=="usb", KERNEL=="2-3", ATTR{idVendor}=="1871", ATTR{idProduct}=="0101", NAME="video10"
SUBSYSTEM=="usb", KERNEL=="2-4", ATTR{idVendor}=="1871", ATTR{idProduct}=="0101", NAME="video11"
SUBSYSTEM=="usb", KERNEL=="2-2", ATTR{idVendor}=="046d", ATTR{idProduct}=="0807", NAME="video12"

Vous devez rechercher les ID KERNELà utiliser en exécutant à nouveau la commande udevadmmentionnée ci-dessus et en recherchant la paire clé_volution KERNEL___.

Notes mineures

Il peut être préférable de ne créer que de nouveaux liens symboliques au lieu de nouveaux noms de périphériques, voire de les regrouper dans un répertoire commun:

SUBSYSTEM=="usb", KERNEL=="2-3", ATTR{idVendor}=="1871", ATTR{idProduct}=="0101", SYMLINK+="foo/video10"

La règle précédente, par exemple, créerait un lien symbolique vers /dev/foo/video10.

Je voudrais probablement aussi simplement nommer le fichier de règles name-video-devices.rules, c’est-à-dire en laissant le nombre d’en-têtes de sortie. Cela n’a probablement aucune importance lorsque les règles sont exécutées, il n’est donc pas nécessaire d’utiliser une priorité (plutôt élevée) de 25.

7
Chriki