USB उपकरणों की पहचान करना


15

मेरे पास पाँच USB कैमरे, एक ही ब्रांड, एक ही मॉडल (Canyon CNR-FWC120H) है। उनका उपयोग विभिन्न दृश्यों की निगरानी के लिए 24/7 किया जाता है। मुझे किसी भी तरह की पहचान करने की आवश्यकता है कि कौन सा कैमरा लिनक्स (डेबियन) कंसोल या प्रोग्रामेटिक (किसी भी भाषा) से है।

मैंने इसके आउटपुट को देखने की कोशिश की है lsusb -vvv, एक क्षेत्र है iSerialजो प्रत्येक कैमरे के लिए अलग होना चाहिए लेकिन दुर्भाग्य से इस निर्माता ने परेशान नहीं करने का फैसला किया और सभी कैमरों का उस स्थान पर एक ही धारावाहिक है:200901010001

क्या कोई और तरीका है जिससे मैं पहचान सकता हूं कि कौन सा कैमरा है जो स्वतंत्र रूप से यूएसबी पोर्ट से जुड़ा है क्योंकि वे जुड़े हुए हैं क्योंकि दुर्भाग्य से मेरे विशिष्ट परिदृश्य में मैं इस तथ्य पर भरोसा नहीं कर सकता कि एक ही कैमरा हमेशा एक ही पोर्ट से जुड़ा होगा।

अद्यतन टिप्पणी में कुछ चर्चा के बाद मुझे लगता है कि यह मिशन असंभव है। इसलिए अंतिम पैराग्राफ को भूल जाइए या यदि आपके पास कुछ सरल विचार है, तो कृपया, इसे प्रस्तुत करने के लिए आपका स्वागत है। मुझे अब दिलचस्पी है अगर मैं पहचान सकता हूं कि डिवाइस किस यूएसबी पोर्ट से जुड़ा है; मैं पर्याप्त बैंडविड्थ के साथ कैमरों को समायोजित करने के लिए मदरबोर्ड पर अतिरिक्त यूएसबी पोर्ट और अतिरिक्त पीसीआई यूएसबी नियंत्रक कार्ड का उपयोग करता हूं। मुझे विशिष्ट रूप से पोर्ट की पहचान करने की आवश्यकता होगी, और अगर मशीन रिबूट उदाहरण के लिए और किसी कारण से यूएसबी नियंत्रकों को अलग-अलग क्रम में आरंभीकृत किया जाता है, तो पोर्ट नंबर / पहचान को बदलना नहीं चाहिए। क्या यह संभव है?

अद्यतन 2 मैं अपने लॉग इन में से किसी एक कैमरे के लिए निम्न जानकारी देख रहा हूँ:

[Wed Apr 30 18:35:02 2014] uvcvideo: Found UVC 1.00 device FULL HD 1080P Webcam (0bda:58b0)
[Wed Apr 30 18:35:02 2014] input: FULL HD 1080P Webcam as /devices/pci0000:00/0000:00:01.0/0000:01:00.0/usb3/3-2/3-2:1.0/input/input4

उस का उपयोग करते हुए, मैंने इस कमांड को कॉल किया है:

udevadm info --query=all --path=/devices/pci0000:00/0000:00:01.0/0000:01:00.0/usb3/3-2/3-2:1.0/input/input4

और यह मिला:

P: /devices/pci0000:00/0000:00:01.0/0000:01:00.0/usb3/3-2/3-2:1.0/input/input4
E: DEVPATH=/devices/pci0000:00/0000:00:01.0/0000:01:00.0/usb3/3-2/3-2:1.0/input/input4
E: EV=3
E: ID_BUS=usb
E: ID_INPUT=1
E: ID_INPUT_KEY=1
E: ID_MODEL=FULL_HD_1080P_Webcam
E: ID_MODEL_ENC=FULL\x20HD\x201080P\x20Webcam
E: ID_MODEL_ID=58b0
E: ID_PATH=pci-0000:01:00.0-usb-0:2:1.0
E: ID_PATH_TAG=pci-0000_01_00_0-usb-0_2_1_0
E: ID_REVISION=5801
E: ID_SERIAL=Generic_FULL_HD_1080P_Webcam_200901010001
E: ID_SERIAL_SHORT=200901010001
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_VENDOR=Generic
E: ID_VENDOR_ENC=Generic
E: ID_VENDOR_ID=0bda
E: KEY=100000 0 0 0
E: MODALIAS=input:b0003v0BDAp58B0e5801-e0,1,kD4,ramlsfw
E: NAME="FULL HD 1080P Webcam"
E: PHYS="usb-0000:01:00.0-2/button"
E: PRODUCT=3/bda/58b0/5801
E: PROP=0
E: SUBSYSTEM=input
E: UDEV_LOG=3
E: USEC_INITIALIZED=41090223

चीजें हैं जो कैमरों अलग-अलग हैं DEVPATH, ID_PATH, ID_PATH_TAG, PHYSऔर (सबसे दिलचस्प) USEC_INITIALIZED। अब पहले चार तत्व संभवतः USB पोर्ट से संबंधित हैं, लेकिन अंतिम कोई USEC_INITIALIZEDसीरियल नंबर की तरह दिखता है। मुझे इस बारे में कोई जानकारी नहीं मिली कि यह वास्तव में क्या दर्शाता है। क्या कोई इस बारे में कुछ भी जानता है? मैंने सोचा था कि यह शायद माइक्रो सेकंड में समय है जब कैमरा इनिशियलाइज़ हो जाता है लेकिन कैमरा जो इसके बाद इनिशियलाइज़ होता है USEC_INITIALIZED=17919751, और उसके बाद वाला USEC_INITIALIZED=25609278ऐसा होता है, बल्कि यह रैंडम लगता है। मैं सिस्टम को रिबूट करने और देखने की कोशिश करूंगा, लेकिन मुझे ऐसा करने के लिए एक सुविधाजनक समय की प्रतीक्षा करने की आवश्यकता है।

और अगर कोई सोच रहा है कि मैं सिर्फ एक कैमरे को फिर से जोड़ने की कोशिश क्यों नहीं कर रहा हूं और देखें कि क्या यह वही रहता है। इसका उत्तर यह है कि मैं इस पीसी को दूरस्थ रूप से संचालित कर रहा हूं, और भविष्य में किसी भी संभावित घटना के लिए पूरी तरह से स्वायत्त होने के लिए सिस्टम तैयार करने के लिए मैं यह सब जांच कर रहा हूं। उदाहरण के लिए, USB पोर्ट से कैमरों को डिस्कनेक्ट करना शामिल हो सकता है।


क्या यह गैर-प्रोग्रामेटिक / गैर-सॉफ्टवेयर भी हो सकता है? एक मार्कर (अलग-अलग रंगों) के साथ कैमरा फ्रंट ग्लास को चिह्नित करके? यदि हार्डवेयर और / या धारावाहिकों में कोई अंतर नहीं है, तो मुझे संदेह है कि यह कस्टम रीप्रोग्रामिंग के बिना संभव होगा, आप फिर भी रिले / हब के माध्यम से कैमरे को कनेक्ट कर सकते हैं जो अलग हैं?
Gizmo

मार्कर विचार के लिए दुर्भाग्य से नहीं, क्योंकि मुझे स्वयं चित्र के लिए कुछ भी परिचय नहीं देना चाहिए। मैं सोच रहा था कि क्या कैमरों के सीरियल नंबर को ओवरराइट करने की कोई संभावना है? या किसी अन्य कैमरा सेटिंग / जानकारी ... ऐसा कुछ मौजूद है? लिखने योग्य, लगातार स्मृति?
इवान कोवेसेविक

यह वास्तव में कठिन होने जा रहा है, खासकर जब डिवाइस के लिए कोई अनूठी जानकारी प्रदान नहीं की जाती है, तो इसे देखें: stackoverflow.com/questions/14053764/… । स्मृति को अधिलेखित करने के लिए, आप फ़र्मवेयर चमकती उपयोगिता खोजने की कोशिश कर सकते हैं, फ़र्मवेयर में धारावाहिक की पहचान कर सकते हैं और HEX-EDIT यह आपको पसंद है? हालाँकि मुझे इसके लिए कोई टूल नहीं मिल रहा है। अगर आप usb डिवाइस डिस्क्रिप्टर को बदलने का तरीका खोज सकते हैं तो वहां से यह आसान होगा।
Gizmo

आप यहाँ HID Descriptor टूल आज़मा सकते हैं - usb.org/developers/hidpage - tocourse , तभी यदि आपका कैम HID है
Gizmo

अरे, हाँ, मुझे लगता है कि यह असंभव है, इस मॉडल के लिए कोई फर्मवेयर भी नहीं है ताकि विचार भी बाहर हो। मुझे लगता है कि मैं जो कुछ भी कर सकता हूं वह यह है कि प्रत्येक कैमरा हर समय पीसी पर एक ही पोर्ट से जुड़ा रहता है ... मैं अपने प्रश्न को संशोधित करूंगा।
इवान कोवेसेविक

जवाबों:


2

क्या कैमरे एक निश्चित स्थिति में हैं? क्या दृश्य कम या ज्यादा स्थिर हैं? यदि ऐसा है, तो आप कैमरे को पहचानने के लिए छवि पहचान का उपयोग कर सकते हैं कि वे इसके बजाय क्या देख रहे हैं।

ऐसा करने के लिए कुछ सभ्य अजगर उपकरण हैं, इस उत्तर में विषय पर कुछ अच्छी जानकारी है: /programming/1927660/compare-two-images-the-python-linux-way


मेरे मन में यह समाधान था, हालांकि मुझे कुछ सरल होने की उम्मीद थी। और मुझे एक समस्या होगी क्योंकि कुछ कैमरे वास्तव में एक व्यस्त बंदरगाह की देखरेख कर रहे हैं, जहाज हिल रहे हैं, लहरों के कारण समुद्री सतह स्थिर नहीं है, आदि
इवान कोवेसेविक

2

जैसा कि आपने खोजा, समस्या का समाधान नहीं किया जा सकता है, यदि आपको डिवाइस से एक विशिष्ट पहचान नहीं मिल सकती है। समाधान के लिए निकटतम चीज इकाई के भौतिक कनेक्शन पर निर्भर है। (यह रिबूट पर नहीं बदलेगा। केवल तभी यदि आप भौतिक रूप से कनेक्टर की स्थिति को बदलते हैं)

डिवाइस के बारे में जानकारी को कर्नेल द्वारा प्राप्त करने के लिए प्रोग्रामेटिक रूप से आप sysfs का उपयोग कर सकते हैं। Sysfs एक फाइल-सिस्टम-जैसा उपकरणों का प्रतिनिधित्व है जैसा कि कर्नेल उन्हें देखता है। (डिस्क पर इसकी वास्तविक फाइलें नहीं)

इसके साथ, आप कर सकते हैं: - उत्पाद और विक्रेता आईडी के साथ डिवाइस प्रकार की पहचान करें - डिवाइस का सीरियल नंबर पढ़ें, अगर यह एक है। - USB हब पर भौतिक कनेक्शन नंबर पढ़ें

आप अपने प्रकार के उपकरणों को / sys / class में खोजकर शुरू कर सकते हैं। इस उदाहरण में मैं एक USB → LPT पोर्ट का उपयोग करता हूं। लेकिन सिद्धांत एक ही है।

$ ls -l /sys/class/usbmisc
lp1 -> ../../devices/pci0000:00/0000:00:1d.0/usb4/4-1/4-1.5/4-1.5:1.0/usbmisc/lp1
lp2 -> ../../devices/pci0000:00/0000:00:1d.0/usb4/4-1/4-1.6/4-1.6:1.0/usbmisc/lp2

Uevent फ़ाइल से डिवाइस का नाम लिखें:

cat /sys/class/usbmisc/lp1/uevent
MAJOR=180
MINOR=1
DEVNAME=__usb/lp1__

जोड़ने / देव ताकि आप खोलने के लिए डिवाइस का नाम प्राप्त करें: / dev / usb / lp1

वास्तविक पथ का उपयोग करें: $ cd -P / sys / class / usbmisc / lp1

चरण 3 शाखाएँ:

$ cd ../../../
/sys/devices/pci0000:00/0000:00:1d.0/usb4/4-1/4-1.5

इस निर्देशिका में डिवाइस पर बहुत सारी जानकारी शामिल है:

idProduct और idVendor का उपयोग डिवाइस प्रकार को विशिष्ट रूप से पहचानने के लिए किया जा सकता है।

यदि कोई सीरियल फ़ाइल है और इसमें एक अद्वितीय सीरियल नंबर है, तो आप कर रहे हैं।

अन्यथा आपका विकल्प पहचान के रूप में भौतिक कनेक्शन का उपयोग करना है, जो कि इस निर्देशिका का नाम " 4-1.5 " है यह भौतिक कनेक्शन के लिए अद्वितीय है, और जैसा कि आपने पहले ही उल्लेख किया है यदि आप डिवाइस को किसी अन्य पोर्ट में प्लग करते हैं।


मुझे लगता है कि यह सबसे अच्छा समाधान है, या मेरे मामले में समझौता है ... उसी समर्पित यूएसबी पोर्ट पर कैमरों को ठीक करें। मैं कहता हूं कि समझौता करें क्योंकि मेरे मामले में मुझे कैमरों की पहचान करने की भी आवश्यकता थी, उदाहरण के लिए यदि हार्डवेयर रखरखाव के बाद कैमरे रखरखाव करने वाले व्यक्ति द्वारा विभिन्न बंदरगाहों से जुड़े होंगे।
इवान कोवेसेविक

मैं सहमत हूँ। यह एकदम सही है। काश, विक्रेताओं के लिए यह आम बात थी, कि एक एफ ... डिवाइस के लिए सरल सीरियलनंबर, जैसा कि प्रोटोकॉल निर्दिष्ट करता है। मुझे आशा है कि आपको एक बेहतर समाधान मिलेगा!
साइमन रिगेट

1

बस कैमरे को अनप्लग करें, 1 प्लग करें और एक lsusb करें। कैमरे को पहचानें और ध्यान दें कि किस USB पोर्ट का उपयोग किया गया है। हो सकता है कि कैम पर थोड़ा लेबल लगाएं। फिर दूसरे कैमरे के लिए दोहराएं और आप वहां पहुंच जाएंगे। मिशन असंभव कुछ भी नहीं है;)


यह समझ में आता है। बस एक समय में एक कैमरा प्लग करें और ध्यान दें कि यह किस भौतिक पोर्ट से जुड़ा हुआ है। ऐसा लगता है कि यदि आप अपने सॉफ़्टवेयर में अंतर नहीं कर सकते, तो आप अलग-अलग पोर्ट को भी बंद कर सकते हैं, इसलिए एक समय में केवल एक ही दिखाई देगा। देखें askubuntu.com/questions/342061/...
रयान ग्रिग्स

मैं मानता हूं कि मैंने अपने विन्यास के उद्देश्य को पूरी तरह स्पष्ट नहीं किया है। यह एक दूरस्थ स्थान पर एक पीसी है जिसका उपयोग लंबी अवधि (महीनों) के समय-अंतराल की रिकॉर्डिंग के लिए किया जाता है। मैं एक ऐसे समाधान की कामना करता हूं जो मेरे हस्तक्षेप के बिना कैमरों की स्वचालित रूप से पहचान कर सके। अब किसी भी बिजली आउटेज के बाद मुझे वास्तव में लॉग इन करना होगा और मैन्युअल रूप से कैमरा नंबरों को फिर से कॉन्फ़िगर करना होगा।
इवान कोवेसेविक

0

सभी कैमरों की पहचान करना संभव है। आदेश

 $ sudo lsusb -v -d 046d:082d | grep -i serial
   iSerial                 1 05C6D16F

मेरे कैमरे का सीरियल नंबर देता है (एक लॉजिटेक एचडी प्रो वेबकेम, जिसे सही विक्रेता के साथ एक उदाहरण के रूप में उपयोग किया जाता है: उत्पाद कोड पिछले उपयोग से प्राप्त lsusb)। कृपया ध्यान दें कि इस ऑपरेशन को एक विशेषाधिकार प्राप्त उपयोगकर्ता के रूप में करना नितांत आवश्यक है: एक अनपेक्षित उपयोगकर्ता को कमांड के माध्यम से उपलब्ध सभी जानकारी तक पहुँच नहीं मिलती है।

सीरियल नंबर अक्सर होता है, लेकिन हमेशा नहीं, अनोखा। यदि यह अद्वितीय नहीं है (केवल एक ही विक्रेता के साथ दो उपकरणों के लिए उपरोक्त कमांड के आउटपुट की तुलना करें: उत्पाद कोड), आप उन्हें सेट कर सकते हैं ताकि वे अलग-अलग हों। ऐसा करने के लिए पूरे Google में मार्गदर्शिकाएँ हैं, मैं उनमें से केवल कुछ के लिए, पूरी तरह से: यहाँ और यहाँ बात करूँगा ।

अब आज्ञा है

$ sudo udevadm info --query=all /dev/video1 | grep 'VENDOR_ID\|MODEL_ID\|SERIAL_SHORT'
  E: ID_MODEL_ID=082d
  E: ID_SERIAL_SHORT=05C6D16F
  E: ID_VENDOR_ID=046d

इस विशेष कैमरे के लिए उपयुक्त कोड देता है। सभी /dev/videoXउपकरणों के साथ परीक्षण और त्रुटि उन सभी को कबूतर-होलिंग की अनुमति देती है।


यह मुझे ऐसा लगता है जैसे आपने शायद मेरे प्रारंभिक प्रश्न पोस्ट को अंत तक नहीं पढ़ा है। मैंने पहले ही अपने पोस्ट में udvadm का उपयोग करने के बारे में उल्लेख किया है ... समस्या यह है कि सभी कैमरों का सीरियल नंबर समान है, इसलिए आप उन्हें उस जानकारी के अलावा नहीं बता सकते। आपने उल्लेख किया "आप उन्हें सेट कर सकते हैं ताकि वे अलग-अलग हों" क्या सीरियल नंबर को "सेट" / बदलने का एक तरीका है?
इवान कोवेसेविक

-1

मैंने एक बूट अप के दौरान उपकरणों के क्रम में किसी को बिजली की देरी के बारे में सुना है, जो आपको उनके द्वारा चालू किए गए आदेश के आधार पर उन्हें पहचानने की अनुमति देगा। इसके लिए कुछ अतिरिक्त हार्डवेयर की आवश्यकता होती है जो क्रम में अलग-अलग यूएसबी पोर्ट पर बिजली को नियंत्रित कर सकता है।

आप एक यूएसबी हब को हैक कर सकते हैं जिसमें प्रत्येक पोर्ट के लिए अलग-अलग पावर स्विच होते हैं, जो एक अरड्यूनो को हुक करते हैं और ट्रिगर करते हैं जो वे चालू होते हैं।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.