स्थैतिक नाम के तहत यूएसबी डिवाइस को कैसे बांधें?


43

मेरे पास एक Arduino है जो कभी-कभी /dev/ttyUSB0और अन्य समय के लिए बाध्य हो जाता है /dev/ttyUSB1, जिससे मेरी स्क्रिप्ट विफल हो जाती है।

मैं उन सभी संभावनाओं की गणना नहीं करना चाहता जहां मेरा डिवाइस हो सकता है, लेकिन मैं यह चाहता हूं कि यह कहीं स्थिर हो, जैसे /dev/arduino

मैं इसे कैसे प्राप्त करूं?


4
बस एक साधारण udv- नियम लिखें जो अपने VID और PID द्वारा सही वसीयत करने के लिए सिमलिंक / dev / arduino असाइन करेगा।
Ed__Em

चेक आर्क-विकी: wiki.archlinux.org/index.php/Udev#Writing_udev_rules
uzsolt

जवाबों:


41

जैसा कि सुझाव दिया गया है, आप कुछ udv नियम जोड़ सकते हैं। मैं /etc/udev/rules.d/10-local.rulesइसमें शामिल है:

ACTION=="add", ATTRS{idVendor}=="0403", ATTRS{idProduct}=="6001", SYMLINK+="my_uart"

आप चलाकर अपने डिवाइस के चर की जांच कर सकते हैं

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

अधिक गहराई गाइड में आप http://www.reactinated.net/writing_udev_rules.html पर पढ़ सकते हैं


एक जादू की तरह काम किया। एक सवाल: कैसे बाहर निकलें udevam? और यह ध्यान रखना महत्वपूर्ण है कि my_uartसीमलिंक के तहत बनाता है /dev/my_uart। मैंने पहली बार पहली बार लिखा था /dev/arduinoऔर यह विफल रहा जबकि arduinoपर्याप्त है।
k0pernikus

udevadmजब यह हो जाए तब अपने आप से बाहर निकलना चाहिए।
कोट्टे

फिर किसी अज्ञात कारण से इसने रिपोर्ट बनाते समय मेरे रास्पबेरी पाई को टर्मिनल सत्र को रोक दिया।
k0pernikus

35

ऊपर दिए गए नियम सिंटैक्स कुछ वितरणों पर काम कर सकते हैं, लेकिन मेरा (रास्पियन) पर काम नहीं किया। चूँकि मुझे कभी भी ऐसा कोई दस्तावेज़ नहीं मिला, जो सभी ins और outs की व्याख्या करता हो, मैंने अपना खुद का लिखा, यहाँ पाया जा सकता है । यह वह है जो इसे उबालता है।
1. पता लगाएं कि ttyUSB पर क्या है:

dmesg | grep ttyUSB  

2. डिवाइस की सभी विशेषताओं को सूचीबद्ध करें:

udevadm info --name=/dev/ttyUSBx --attribute-walk

(एक्स के बजाय अपने डिवाइस नंबर के साथ, निश्चित रूप से)। एक अद्वितीय पहचानकर्ता सेट चुनें, जैसे idVendor + idProduct। अगर आपको एक ही idVendor और idProduct के साथ एक से अधिक डिवाइस हैं तो आपको SerialNumber की आवश्यकता हो सकती है। SerialNumbers प्रत्येक डिवाइस के लिए अद्वितीय होना चाहिए।
3. /etc/udev/rules.d/99-usb-serial.rulesइस लाइन में कुछ इस तरह से एक फ़ाइल बनाएँ :

SUBSYSTEM=="tty", ATTRS{idVendor}=="1234", ATTRS{idProduct}=="5678", SYMLINK+="your_device_name" 

(यह मानते हुए कि आपको क्रम संख्या की आवश्यकता नहीं है, और निश्चित रूप से idVendor और idProduct के लिए संख्याओं के साथ जो आपको चरण 2 में मिला है।
4. नया नियम लोड करें:

sudo udevadm trigger

5. सत्यापित करें कि क्या हुआ:

ls -l /dev/your_device_name  

दिखाएगा कि सहानुभूति किस ttyUSB नंबर पर गई थी। यदि यह है /dev/ttyUSB1, तो सत्यापित करें कि वह किसका है और किस समूह का है:

ls -l /dev/ttyUSB1   

तो बस इसके मज़े के लिए:

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

तो क्या इसका कोई हल है idVendorऔर यदि idProductवास्तव में ऐसा ही है? (दो सेंसर समान मॉडल USB से UART मॉड्यूल से जुड़े)
स्टीवन लू

@StevenLu हाँ, चरण 2 देखें, udevadm info --name=/dev/ttyUSB1 --attribute-walkदोनों उपकरणों के लिए करें और सीरियल नंबर देखें, वे प्रत्येक डिवाइस के लिए अद्वितीय होना चाहिए। यदि आपके सेंसर में कोई सीरियल नंबर नहीं है, तो क्या आप बता सकते हैं कि वे क्या हैं?
रॉल्फबली

यह कमाल है, मैं वापस रिपोर्ट करूँगा जब मैं इसे
स्टीवन लू

मेरे $ 2 USB से UART डोंगल में सीरियल नंबर 0001 है। कह नहीं सकता कि मैं हैरान हूं। लगता है कि मुझे उनके आउटपुट प्रोटोकॉल के आधार पर सेंसर की पहचान करनी होगी।
स्टीवन लू

@StevenLu खराब किस्मत। FTDI USB-UART कन्वर्टर्स में एक अद्वितीय सीरियल नंबर AFAIK होता है। कुछ अतिरिक्त रुपये, लेकिन विकसित करने के लिए कम समय।
रॉल्फब्ली

9

कई-समान-यूएसबी-डिवाइस समस्या

मैं चार कैमरों के साथ एक 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

x1 से 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.rulesudevadm triggerइसे सक्रिय करने के लिए चलाएं और काम पूरा हो गया है। /dev/camera2अपने वीडियो नंबर की परवाह किए बिना एक ही कैमरा (USB पोर्ट) होगा।


यूनिक्स स्टैकएक्सचेंज पर आपका स्वागत है। कृपया मार्कडाउन का उपयोग करके अपने उत्तर को प्रारूपित करें। मैंने सिर्फ तुम्हारे लिए किया है। यह भी ध्यान रखें कि हम उत्तर को बिंदु तक चाहते हैं। यह एक ब्लॉग प्रविष्टि (जो पूरी तरह से खराब नहीं है) की तरह अधिक पढ़ता है, फिर भी यह उन तरीकों के बारे में पहले पढ़ने में मददगार नहीं है जो काम नहीं करते थे। आप उस हिस्से को स्क्रैप कर सकते हैं।
k0pernikus

माफ़ करना। मैं यहाँ नया हूँ। मैंने महीनों तक इस समस्या पर शोध किया है। मैंने दूसरों को उसी समस्या से जूझते पाया और मुझे ऐसा जवाब नहीं मिला, जो मेरे लिए काम करता हो। बस मुझे पता है, आप कहां सलाह देंगे कि मैं इस तरह से कुछ पोस्ट करूं? मैंने खुद को संयमित किया और पायथन स्रोत को शामिल नहीं किया :-)
इयान बोग

1

मैं भी एक अद्वितीय उपकरण खोजने में सक्षम था /dev/serial/by-id। मैंने अभी तक एक रिबूट की कोशिश नहीं की है, लेकिन उस निर्देशिका की फाइलें उपयुक्त डिवाइस फ़ाइल ( ttyACM[0-9]) .` से लिंक थीं

मैं रास्पबेरी पाई पर आर्च लिनेक्स चला रहा हूं, लेकिन मैंने find"अर्लिनो" वाले फ़ाइलनाम के लिए काम करके सिर्फ उन्हें ठोकर दी । मेरे पाइथन प्रोग्राम उन फाइलों का उपयोग करके ठीक से चलते हैं, जैसे कि मेरे Arduinos (/ अब तक, एक ही पाई पर दो) से डेटा पढ़ने / लिखने के लिए उपकरणों के रूप में।


0

सिर्फ यह कहने के लिए कि ऊपर वाले ने मेरे लिए काम किया और मेरे लिए डिवाइस को आटोमेटिक कर दिया, जब मैंने / etc / fstab में एंट्री रखी थी (और इसे स्टिक को हटाने के बाद umount भी कहते हैं)

अर्थात

/ Etc / fstab

# See /etc/udev/rules.d/5-usb-disk.rules
/dev/backup     /vol/backup     ext4    defaults,errors=remount-ro 0       1

cat /etc/udev/rules.d/5-usb-stick.rules

#
# the next line creates a symlink to this disk drive called /dev/backup 
# i.e.
#   root:# ls -la /dev/backup 
#   lrwxrwxrwx 1 root root 3 Jul 22 19:33 /dev/backup -> sg0

# Backup usb stick - create /dev/backup
# ATTRS{model}=="Cruzer Blade    "
ACTION=="add", ATTRS{model}=="Cruzer Blade    ", SYMLINK+="backup"

# Clean up after removal  
ACTION=="remove", ATTRS{model}=="Cruzer Blade    ", RUN+="/bin/umount /vol/backup"

इसलिए अपनी usb स्टिक डालने के बाद मुझे:

root:# mount | grep sd
/dev/sda1 on /vol/backup type ext4 (rw,relatime,errors=remount-ro,data=ordered)
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.