Regra do Udev para discernir duas webcams idênticas no Linux

0

Eu tenho 2 webcams idênticas conectadas ao meu Raspberry Pi. Eu quero discernir qual câmera é baseada na porta USB em que eles estão conectados.

Este é o objetivo do udev, então eu escrevi a seguinte regra:

SUBSYSTEM=="usb", KERNEL=="1-1.3", ATTR{idVendor}=="05a3", ATTR{idProduct}=="9422", SYMLINK+="klastle/vlvid"
SUBSYSTEM=="usb", KERNEL=="1-1.5", ATTR{idVendor}=="05a3", ATTR{idProduct}=="9422", SYMLINK+="klastle/irvid"

Que em uma reinicialização mostra esses dispositivos:

root@raspberrypi:~# ls -rlt /dev/klastle/
total 0
lrwxrwxrwx 1 root root 18 Feb 18 01:24 irvid -> ../bus/usb/001/007
lrwxrwxrwx 1 root root 18 Feb 18 01:24 vlvid -> ../bus/usb/001/005

O problema é que estes não são vídeos para dispositivos Linux (V4L2) e meu aplicativo não pode abri-los.

Como eu posso escrever minha regra corretamente para link simbolicamente o / dev / video0 e / dev / video1 para / dev / klastle / irvid e / dev / klastle / vlvid?

Obrigado.

UPDATE: aqui está a saída da consulta do udevadm para os dois dispositivos:

root@raspberrypi:~# udevadm info --query=all --name=/dev/video3
P: /devices/platform/soc/3f980000.usb/usb1/1-1/1-1.5/1-1.5:1.0/video4linux/video3
N: video3
S: v4l/by-id/usb-Sonix_Technology_Co.__Ltd._USB_2.0_Camera_SN0001-video-index1
S: v4l/by-path/platform-3f980000.usb-usb-0:1.5:1.0-video-index1
E: DEVLINKS=/dev/v4l/by-path/platform-3f980000.usb-usb-0:1.5:1.0-video-index1 /dev/v4l/by-id/usb-Sonix_Technology_Co.__Ltd._USB_2.0_Camera_SN0001-video-index1
E: DEVNAME=/dev/video3
E: DEVPATH=/devices/platform/soc/3f980000.usb/usb1/1-1/1-1.5/1-1.5:1.0/video4linux/video3
E: ID_BUS=usb
E: ID_FOR_SEAT=video4linux-platform-3f980000_usb-usb-0_1_5_1_0
E: ID_MODEL=USB_2.0_Camera
E: ID_MODEL_ENC=USB\x202.0\x20Camera
E: ID_MODEL_ID=9422
E: ID_PATH=platform-3f980000.usb-usb-0:1.5:1.0
E: ID_PATH_TAG=platform-3f980000_usb-usb-0_1_5_1_0
E: ID_REVISION=0100
E: ID_SERIAL=Sonix_Technology_Co.__Ltd._USB_2.0_Camera_SN0001
E: ID_SERIAL_SHORT=SN0001
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_V4L_CAPABILITIES=:capture:
E: ID_V4L_PRODUCT=USB 2.0 Camera: H264 USB Camera
E: ID_V4L_VERSION=2
E: ID_VENDOR=Sonix_Technology_Co.__Ltd.
E: ID_VENDOR_ENC=Sonix\x20Technology\x20Co.\x2c\x20Ltd.
E: ID_VENDOR_ID=05a3
E: MAJOR=81
E: MINOR=3
E: SUBSYSTEM=video4linux
E: TAGS=:uaccess:seat:
E: USEC_INITIALIZED=3298533

root@raspberrypi:~# udevadm info --query=all --name=/dev/video0
P: /devices/platform/soc/3f980000.usb/usb1/1-1/1-1.3/1-1.3:1.0/video4linux/video0
N: video0
S: v4l/by-id/usb-Sonix_Technology_Co.__Ltd._USB_2.0_Camera_SN0001-video-index0
S: v4l/by-path/platform-3f980000.usb-usb-0:1.3:1.0-video-index0
E: DEVLINKS=/dev/v4l/by-path/platform-3f980000.usb-usb-0:1.3:1.0-video-index0 /dev/v4l/by-id/usb-Sonix_Technology_Co.__Ltd._USB_2.0_Camera_SN0001-video-index0
E: DEVNAME=/dev/video0
E: DEVPATH=/devices/platform/soc/3f980000.usb/usb1/1-1/1-1.3/1-1.3:1.0/video4linux/video0
E: ID_BUS=usb
E: ID_FOR_SEAT=video4linux-platform-3f980000_usb-usb-0_1_3_1_0
E: ID_MODEL=USB_2.0_Camera
E: ID_MODEL_ENC=USB\x202.0\x20Camera
E: ID_MODEL_ID=9422
E: ID_PATH=platform-3f980000.usb-usb-0:1.3:1.0
E: ID_PATH_TAG=platform-3f980000_usb-usb-0_1_3_1_0
E: ID_REVISION=0100
E: ID_SERIAL=Sonix_Technology_Co.__Ltd._USB_2.0_Camera_SN0001
E: ID_SERIAL_SHORT=SN0001
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_V4L_CAPABILITIES=:capture:
E: ID_V4L_PRODUCT=USB 2.0 Camera: H264 USB Camera
E: ID_V4L_VERSION=2
E: ID_VENDOR=Sonix_Technology_Co.__Ltd.
E: ID_VENDOR_ENC=Sonix\x20Technology\x20Co.\x2c\x20Ltd.
E: ID_VENDOR_ID=05a3
E: MAJOR=81
E: MINOR=0
E: SUBSYSTEM=video4linux
E: TAGS=:seat:uaccess:
E: USEC_INITIALIZED=3289947
    
por PhilBot 18.02.2018 / 02:28

2 respostas

1

Suas regras estão combinando no nível errado na árvore de dispositivos: SUBSYSTEM=="usb" diz que você quer um symlink para algo que represente o dispositivo USB completo, e não a camada video4linux. Então você precisa de SUBSYSTEM=video4linux . Você também precisa de ATTRS e KERNELS (com S extra) em vez de ATTR e KERNEL , porque você quer muito aqueles mais acima na árvore. Veja man udev para detalhes.

A maneira de obter essas informações é obter udevadm para cuspir todo o caminho até a raiz da árvore com atributos etc., com algo como

udevadm info -a -p  $(udevadm info -q path -n /dev/video3)

(você já fez a parte interna para a edição da sua pergunta).

Então a regra deve se tornar algo como

SUBSYSTEM=="video4linux", KERNELS=="1-1.3", ATTRS{idVendor}=="05a3", ATTRS{idProduct}=="9422", SYMLINK+="klastle/vlvid"

ou similar, possivelmente dependendo do que você vê no caminho do dispositivo.

    
por 18.02.2018 / 10:31
0

Eu tive um problema semelhante. 4 câmeras idênticas sem números de série. Na reinicialização, houve uma realocação aleatória. Eu precisava legendar as fotos, então isso não funcionou.

A solução envolve regras do udev e algum código python. Você endereça as câmeras como mycam1..4 em vez de video0.3. Então mycam1 é sempre a mesma câmera, independentemente do número de vídeo que foi alocado na inicialização.

Demasiado muito tempo para postar aqui. Envie-me um e-mail para [email protected] e eu indicarei em um link do google doc para o código.

    
por 25.04.2019 / 08:14