कई-समान-यूएसबी-डिवाइस समस्या
मैं चार कैमरों के साथ एक Rasperry पाई है। मैं के साथ pix ले fswebcam
जो के रूप में पहचान करता कैमरों /dev/video0
.. video3
। कभी कभी कैमरा है video0
, vide02
, video4
और video6
, लेकिन हम अब के लिए उस के बारे में भूल सकता है।
मुझे एक कैमरा नंबर की पहचान करने के लिए एक निरंतर आईडी की आवश्यकता है ताकि, उदाहरण video0
हमेशा एक ही कैमरा हो क्योंकि मैं चित्रों को कैप्शन देता हूं। दुर्भाग्य से यह मज़बूती से नहीं होता है - बूट पर, कैमरे उतने ही उन्नत होते हैं video0
.. video3
लेकिन हमेशा एक ही तरह से नहीं।
सभी कैमरों में एक ही आईडी और सीरियल नंबर होता है।
इस समस्या के समाधान में udev नियम शामिल हैं, लेकिन साथ ही साथ बहुत सारे फिशहुक भी हैं।
यदि आप कमांड जारी करते हैं
udevadm info –attribute-walk –path=/dev/video0
आपको आउटपुट का एक पेंच मिलता है लेकिन नमकीन बिट्स होते हैं
KERNEL=”video0”, SUBSYSTEM=”video4linux” and KERNELS=”1:1.2.4:1.0”.
KERNELS बिट एक USB हब पोर्ट है। चार कैमरों के साथ इनमें से चार हैं - वे रिबूट पर नहीं बदलते हैं, लेकिन video{x}
एक पोर्ट के साथ जुड़ा हो सकता है।
तो हमें USB हब पोर्ट पर एक वीडियो नंबर टाई करने के लिए एक udv नियम की आवश्यकता है - कुछ इस तरह:
KERNEL==”video0”,SUBSYSTEM=”video4linux”,KERNELS==”1:1.2.4:1.0”,SYMLINK+=”camera0”
सरल दिखता है - कैमरे तक पहुंचें
fswebcam –d $realpath /dev/camera0
सिवाय यह काम नहीं करता है - यदि आप इसे एक udv नियम में रखते हैं और सिस्टम ने एक अलग पोर्ट पर video0 (बूट पर) आवंटित किया है, तो udv नियम की अनदेखी की जाती है। /dev/camera0
मूल रूप से सिमलिंक कहता है no such device
। वर्ग एक।
हम जो चाहते हैं, वह सिंबल को USB हब पते पर बाँधना है, न कि किसी video{x}
नंबर पर। इसने पायथन कार्यक्रम लिया।
पहला कदम चलाना था
fswebcam –d /dev/video${x} tst.jpg
x
1 से 8 के बीच। tst.jpg
प्रत्येक कॉल के बाद के अस्तित्व की पहचान होती है कि इस वीडियो नंबर पर कोई कैमरा है या नहीं। इससे सक्रिय वीडियो नंबरों की एक सूची बनाएं। मेरा अनुभव रहा है कि यह 0,1,2,3
या तो 0,2,4,6
मेरे द्वारा उपयोग किए गए कैमरों के लिए है।
अन्य लोग निश्चित रूप से एक अलग प्रक्रिया का उपयोग करके इस सूची का निर्माण कर सकते हैं।
फिर सूची में प्रत्येक वीडियो नंबर के लिए चलाएं
udevadm info –attribute-walk –path=/dev/videox > dd
और निकालने KERNELS= line
से dd
। इस प्रक्रिया से आप कैमरों के लिए USB पोर्ट पतों की एक सूची के साथ समाप्त होते हैं। इस सूची को क्रमबद्ध करें ताकि अगले चरण पर, आप इसे हमेशा उसी क्रम में संसाधित करें। इसे "पता सूची" कहें।
udevadm … > dd
फिर से बात चलाएं और एक सूची बनाएं जो दिखता है
KERNEL==”video0”, SUBSYSTEM=”video4linux”,KERNELS==”1:1.2.4:1.0 ”,SYMLINK+=”camerax”. Call this the “video list”.
अब पता सूची के माध्यम से कदम - प्रत्येक प्रविष्टि के लिए वीडियो सूची से संबंधित प्रविष्टि का पता लगाएं। एक नई सूची बनाएं जो लाइनों के संग्रह की तरह दिखती है
KERNEL==”video0”, SUBSYSTEM=”video4linux”,KERNELS==”1:1.2.4:1.0 ”,SYMLINK+=”camera2”
पता सूची में अनुक्रम संख्या द्वारा x (सिमलिंक संख्या) को बदल दिया जाता है।
अब आपके पास एक udv नियम है जो काम करता है। USB हब से बंधे एक सिम्लिंक को कोई फर्क नहीं पड़ता कि बूट पर उस पोर्ट को कौन सा वीडियो नंबर आवंटित किया गया है।
फ़ाइल में अंतिम सूची लिखें /etc/udev/rules.d/cam.rules
। udevadm trigger
इसे सक्रिय करने के लिए चलाएं और काम पूरा हो गया है। /dev/camera2
अपने वीडियो नंबर की परवाह किए बिना एक ही कैमरा (USB पोर्ट) होगा।