การระบุอุปกรณ์ USB


15

ฉันมีกล้อง USB ห้าตัวยี่ห้อเดียวกันรุ่นเดียวกัน (Canyon CNR-FWC120H) พวกเขาจะใช้ในการตรวจสอบฉากที่แตกต่างกัน 24/7 ฉันต้องระบุว่ากล้องตัวไหนเป็นแบบไหนจากคอนโซล Linux (Debian) หรือโดยทางโปรแกรม (ทุกภาษา)

ฉันได้ลองดูที่ผลลัพธ์ของlsusb -vvvมันมีช่องiSerialที่ควรจะแตกต่างกันไปสำหรับกล้องแต่ละตัว แต่น่าเสียดายที่ผู้ผลิตรายนี้ตัดสินใจที่จะไม่รบกวนและกล้องทั้งหมดมีซีเรียลเดียวกันในสถานที่นั้น:200901010001

มีวิธีอื่นที่ฉันสามารถระบุได้ว่ากล้องตัวไหนเป็นอิสระจากพอร์ต USB ที่เชื่อมต่อเพราะโชคไม่ดีที่ในสถานการณ์เฉพาะของฉันฉันไม่สามารถวางใจได้ว่ากล้องเดียวกันจะเชื่อมต่อกับพอร์ตเดียวกันเสมอ

อัพเดทหลังจากการสนทนาในความคิดเห็นฉันรู้ว่านี่เป็นภารกิจที่เป็นไปไม่ได้ ดังนั้นลืมวรรคสุดท้ายหรือถ้าคุณมีความคิดที่แยบยลโปรดช่วยนำเสนอ ตอนนี้ฉันสนใจถ้าฉันสามารถระบุพอร์ต USB ที่อุปกรณ์เชื่อมต่ออยู่ ฉันใช้พอร์ต USB ในตัวบนเมนบอร์ดและการ์ดคอนโทรลเลอร์ PCI USB เพิ่มเติมเพื่อรองรับกล้องที่มีแบนด์วิดท์เพียงพอ ฉันจะต้องระบุพอร์ตโดยไม่ซ้ำกันและหมายเลขพอร์ต / รหัสไม่ควรเปลี่ยนแปลงหากเช่นรีบูตเครื่องและด้วยเหตุผลบางอย่างที่คอนโทรลเลอร์ USB ได้รับการเริ่มต้นในลำดับที่แตกต่างกัน เป็นไปได้ไหม

อัปเดต 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


มันเป็นแบบไม่มีโปรแกรม / ไม่ใช่ซอฟต์แวร์ด้วยหรือไม่ เช่นโดยการทำเครื่องหมายด้านหน้ากระจกของกล้องด้วยเครื่องหมาย (สีต่างกัน)? หากไม่มีความแตกต่างในฮาร์ดแวร์และ / หรือ serials ฉันสงสัยว่าสิ่งนี้จะเกิดขึ้นได้หากไม่ทำการตั้งโปรแกรมใหม่คุณสามารถเชื่อมต่อกล้องผ่านรีเลย์ / ฮับซึ่งแตกต่างกันได้หรือไม่?
Gizmo

น่าเสียดายที่ไม่มีความคิดเกี่ยวกับเครื่องหมายเพราะฉันจะต้องไม่แนะนำอะไรให้กับภาพเอง ฉันสงสัยว่ามีความเป็นไปได้ที่จะเขียนทับหมายเลขกล้องหรือไม่ หรือการตั้งค่า / ข้อมูลอื่น ๆ ของกล้อง ... หน่วยความจำที่เขียนได้ขัดขืน?
Ivan Kovacevic

นี้เป็นไปได้ยากจริงๆโดยเฉพาะอย่างยิ่งเมื่อไม่มีข้อมูลที่ไม่ซ้ำกันสำหรับอุปกรณ์ที่มีให้เห็นนี้: stackoverflow.com/questions/14053764/... สำหรับการเขียนทับหน่วยความจำคุณสามารถลองหายูทิลิตี้กระพริบเฟิร์มแวร์ระบุซีเรียลในเฟิร์มแวร์และ HEX-EDIT ไปยังสิ่งที่คุณชอบ? อย่างไรก็ตามฉันไม่พบเครื่องมือใด ๆ สำหรับมัน หากคุณสามารถหาวิธีในการเปลี่ยน descriptor ของอุปกรณ์ usb ได้มันก็จะง่ายจากที่นั่น
Gizmo

คุณสามารถลองใช้เครื่องมือ HID Descriptor ได้ที่นี่ - usb.org/developers/hidpage - Ofcourse เฉพาะในกรณีที่กล้องของคุณเป็น HID
Gizmo

ห่าอ่าฉันเดาว่ามันเป็นไปไม่ได้ไม่มีเฟิร์มแวร์สำหรับรุ่นนี้ด้วยดังนั้นความคิดนั้นก็เช่นกัน ฉันเดาว่าสิ่งเดียวที่ฉันทำได้คือบังคับให้กล้องแต่ละตัวเชื่อมต่อกับพอร์ตเดียวกันบนพีซีตลอดเวลา ... ฉันจะแก้ไขคำถามของฉัน
Ivan Kovacevic

คำตอบ:


2

กล้องอยู่ในตำแหน่งที่กำหนดหรือไม่? ฉากมีค่าคงที่มากหรือน้อย ถ้าเป็นเช่นนั้นคุณสามารถใช้การจดจำภาพเพื่อระบุกล้องตามสิ่งที่พวกเขาเห็นแทน

มีเครื่องมือหลามที่เหมาะสมในการทำเช่นนี้คำตอบนี้มีข้อมูลที่ดีเกี่ยวกับหัวข้อ: /programming/1927660/compare-two-images-the-python-linux-way


ฉันมีวิธีแก้ปัญหานี้ในใจ แต่ฉันหวังว่าจะมีอะไรที่ง่ายกว่านี้ และฉันก็จะมีปัญหาเพราะกล้องไม่กี่ตัวกำลังมองเห็นท่าเรือที่พลุกพล่าน, เรือกำลังแล่น, พื้นผิวทะเลไม่คงที่เนื่องจากคลื่น ฯลฯ
Ivan Kovacevic

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 เพื่อให้คุณได้รับชื่ออุปกรณ์เพื่อเปิด: / 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 ” มันไม่เหมือนใครสำหรับการเชื่อมต่อแบบฟิสิคัลและตามที่คุณพูดถึงการเปลี่ยนแปลงแล้วหากคุณเสียบอุปกรณ์เข้ากับพอร์ตอื่น


ฉันเดาว่านี่เป็นทางออกที่ดีที่สุดหรือประนีประนอมในกรณีของฉัน ... แก้ไขกล้องเข้ากับพอร์ต USB เฉพาะ ฉันบอกว่าประนีประนอมเพราะในกรณีของฉันฉันก็มีความต้องการที่จะระบุกล้องถ้าเช่นหลังจากการบำรุงรักษาฮาร์ดแวร์กล้องจะเชื่อมต่อกับพอร์ตที่แตกต่างกันโดยคนที่ทำการบำรุงรักษา
Ivan Kovacevic

ฉันเห็นด้วย. สิ่งนี้อยู่ไกลจากความสมบูรณ์แบบ ฉันหวังว่ามันเป็นเรื่องธรรมดาสำหรับผู้ขายในการเพิ่มหมายเลขซีเรียลง่ายๆ ... ไปยังอุปกรณ์ตามที่โปรโตคอลระบุ ฉันหวังว่าคุณจะพบทางออกที่ดีกว่า!
Simon Rigét

1

เพียงถอดปลั๊กของกล้องเสียบ 1 แล้วทำ lsusb ระบุกล้องและจดบันทึกว่าใช้พอร์ต USB ใด อาจติดป้ายเล็ก ๆ ไว้บนลูกเบี้ยว จากนั้นทำซ้ำสำหรับกล้องอีกตัวหนึ่งแล้วคุณจะไปถึงที่นั่น ไม่มีภารกิจใดที่เป็นไปไม่ได้;)


มันสมเหตุสมผลแล้ว เพียงเสียบกล้องครั้งละหนึ่งตัวและจดบันทึกพอร์ตที่ติดตั้งไว้จริง ดูเหมือนว่าคุณสามารถเปิดและปิดพอร์ตแต่ละพอร์ตได้หากคุณไม่สามารถแยกความแตกต่างภายในซอฟต์แวร์ของคุณได้ดังนั้นจะมีเพียงหนึ่งพอร์ตเท่านั้นที่ปรากฏขึ้นในแต่ละครั้ง ดูaskubuntu.com/questions/342061/…
Ryan Griggs

ฉันยอมรับว่าฉันไม่ได้อธิบายอย่างชัดเจนถึงวัตถุประสงค์ของการกำหนดค่าของฉัน มันเป็นพีซีในสถานที่ห่างไกลที่ใช้สำหรับการบันทึกระยะเวลานาน (เดือน) รอบเวลา ฉันต้องการวิธีแก้ปัญหาซึ่งสามารถระบุกล้องโดยอัตโนมัติโดยที่ฉันไม่ต้องทำอะไรเลย หลังจากไฟฟ้าดับฉันต้องเข้าสู่ระบบและกำหนดค่าหมายเลขกล้องใหม่ด้วยตนเอง
Ivan Kovacevic

0

สามารถระบุกล้องทั้งหมดได้ คำสั่ง

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

ส่งคืนหมายเลขซีเรียลของกล้องของฉัน (เว็บแคม Logitech HD Pro ซึ่งใช้เป็นตัวอย่างกับผู้จำหน่ายที่ถูกต้อง: รหัสผลิตภัณฑ์ที่ได้รับจากการใช้งานก่อนหน้านี้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อุปกรณ์ทั้งหมดช่วยให้นกพิราบ -Hinging พวกเขาทั้งหมด


ดูเหมือนว่าฉันราวกับว่าคุณอาจไม่ได้อ่านโพสต์คำถามเริ่มต้นของฉันจนจบ ฉันได้กล่าวถึงแล้วในโพสต์ของฉันเกี่ยวกับการใช้ udevadm ... ปัญหาคือกล้องทุกตัวมีหมายเลขซีเรียลเดียวกันดังนั้นคุณจึงไม่สามารถแยกพวกเขาออกจากข้อมูลนั้นได้ คุณพูดถึง "คุณสามารถตั้งค่าเพื่อให้พวกเขาแตกต่าง" มีวิธี "ตั้ง" / เปลี่ยนหมายเลขหรือไม่
Ivan Kovacevic

-1

ฉันได้ยินมาว่ามีคนรอการเปิดเครื่องตามลำดับอุปกรณ์ระหว่างการบู๊ตซึ่งจะช่วยให้คุณสามารถระบุได้ตามลำดับที่เปิด มันจะต้องมีฮาร์ดแวร์เพิ่มเติมที่สามารถควบคุมพลังงานให้กับพอร์ต usb แต่ละพอร์ตตามลำดับ

คุณสามารถแฮ็คฮับ USB ที่มีสวิตช์เปิดปิดสำหรับแต่ละพอร์ตเชื่อมต่อเข้ากับ Arduino และทริกเกอร์ลำดับที่เปิดอยู่

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.