Masalah multi-identik-USB-perangkat
Saya memiliki Rasperry Pi dengan empat kamera. Aku mengambil pix dengan fswebcam
yang mengidentifikasi kamera sebagai /dev/video0
.. video3
. Kadang-kadang kamera video0
, vide02
, video4
dan video6
tapi kami bisa melupakan bahwa untuk saat ini.
Saya memerlukan ID gigih untuk mengidentifikasi nomor kamera sehingga, mis. video0
Selalu kamera yang sama karena saya caption gambar. Sayangnya ini tidak terjadi secara andal - saat boot, kamera-kamera tersebut disebutkan sebagai video0
.. video3
tetapi tidak selalu dengan cara yang sama.
Semua kamera memiliki ID dan nomor seri yang sama.
Solusi untuk masalah ini melibatkan aturan udev, tetapi ada banyak pancing di sana juga.
Jika Anda mengeluarkan perintah
udevadm info –attribute-walk –path=/dev/video0
Anda mendapatkan screed dari output tetapi bit yang menonjol adalah
KERNEL=”video0”, SUBSYSTEM=”video4linux” and KERNELS=”1:1.2.4:1.0”.
Bit KERNELS adalah port hub USB. Dengan empat kamera ada empat ini - mereka tidak berubah saat reboot, tetapi yang video{x}
terkait dengan port mungkin berubah.
Jadi kita memerlukan aturan udev untuk mengikat nomor video ke port hub USB - sesuatu seperti:
KERNEL==”video0”,SUBSYSTEM=”video4linux”,KERNELS==”1:1.2.4:1.0”,SYMLINK+=”camera0”
Terlihat sederhana - akses kamera dengan
fswebcam –d $realpath /dev/camera0
Kecuali itu tidak berfungsi - jika Anda meletakkan ini dalam aturan udev dan sistem telah mengalokasikan video0 (saat boot) ke port yang berbeda, aturan udev diabaikan. Symlink pada /dev/camera0
dasarnya mengatakan no such device
. Satu persegi.
Yang kami inginkan adalah mengikat symlink ke alamat hub USB, bukan video{x}
nomor. Butuh program Python.
Langkah pertama adalah berlari
fswebcam –d /dev/video${x} tst.jpg
untuk x
antara 1 dan 8. Keberadaan tst.jpg
setelah setiap panggilan mengidentifikasi apakah ada kamera pada nomor video ini. Dari ini buat daftar nomor video aktif. Pengalaman saya telah bahwa itu adalah baik 0,1,2,3
atau 0,2,4,6
untuk kamera saya telah digunakan.
Orang lain tentu saja membangun daftar ini menggunakan proses yang berbeda.
Kemudian untuk setiap nomor video dalam daftar jalankan
udevadm info –attribute-walk –path=/dev/videox > dd
dan ekstrak KERNELS= line
dari dd
. Dari proses ini Anda berakhir dengan daftar alamat port USB untuk kamera. Urutkan daftar ini sehingga pada langkah berikutnya, Anda selalu memprosesnya dalam urutan yang sama. Sebut ini "daftar alamat".
Jalankan udevadm … > dd
hal itu lagi dan buat daftar yang terlihat seperti
KERNEL==”video0”, SUBSYSTEM=”video4linux”,KERNELS==”1:1.2.4:1.0 ”,SYMLINK+=”camerax”. Call this the “video list”.
Sekarang lewati daftar alamat - untuk setiap entri temukan entri yang sesuai dari daftar video. Buat daftar baru yang terlihat seperti kumpulan garis
KERNEL==”video0”, SUBSYSTEM=”video4linux”,KERNELS==”1:1.2.4:1.0 ”,SYMLINK+=”camera2”
X (nomor symlink) diganti dengan nomor urut dalam daftar alamat.
Sekarang Anda memiliki aturan udev yang berfungsi. Symlink yang terikat ke alamat hub USB tidak peduli berapa nomor video yang dialokasikan ke port tersebut saat boot.
Tulis daftar akhir ke dalam file /etc/udev/rules.d/cam.rules
. Jalankan udevadm trigger
untuk mengaktifkannya dan pekerjaan selesai. /dev/camera2
akan menjadi kamera yang sama (port USB) terlepas dari nomor videonya.