Mengidentifikasi perangkat USB


15

Saya memiliki lima kamera USB, merek yang sama, model yang sama (Canyon CNR-FWC120H). Mereka digunakan untuk memantau pemandangan yang berbeda 24/7. Saya perlu mengidentifikasi kamera mana yang berasal dari konsol Linux (Debian) atau secara terprogram (bahasa apa pun).

Saya sudah mencoba melihat output lsusb -vvv, ada bidang iSerialyang harus berbeda untuk setiap kamera tetapi sayangnya pabrikan ini memutuskan untuk tidak repot dan semua kamera memiliki serial yang sama di tempat itu:200901010001

Apakah ada cara lain saya bisa mengidentifikasi kamera mana yang independen dari port USB yang terhubung karena sayangnya dalam skenario khusus saya, saya tidak dapat mengandalkan kenyataan bahwa kamera yang sama akan selalu terhubung ke port yang sama.

PEMBARUAN Setelah beberapa diskusi dalam komentar saya menyadari bahwa ini adalah misi yang mustahil. Jadi, lupakan paragraf terakhir atau jika Anda memiliki ide yang cerdik, mohon, Anda dipersilakan untuk mempresentasikannya. Saya sekarang tertarik jika saya bisa mengidentifikasi port USB yang terhubung dengan perangkat; Saya menggunakan port USB bawaan pada motherboard dan kartu pengontrol USB PCI tambahan untuk mengakomodasi kamera dengan bandwidth yang cukup. Saya perlu mengidentifikasi port secara unik, dan nomor port / identifikasi tidak boleh berubah jika misalnya mesin reboot dan untuk beberapa alasan pengendali USB diinisialisasi dalam urutan yang berbeda. Apakah itu mungkin?

UPDATE 2 saya lihat di log saya untuk salah satu kamera info berikut:

[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

Dengan menggunakan itu, saya telah memanggil perintah ini:

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

Dan mendapatkan ini:

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

Hal-hal yang berbeda antara kamera yang DEVPATH, ID_PATH, ID_PATH_TAG, PHYSdan (paling menarik) USEC_INITIALIZED. Sekarang empat elemen pertama mungkin terkait dengan port USB, tetapi yang terakhir USEC_INITIALIZEDterlihat seperti semacam nomor seri. Saya tidak dapat menemukan info tentang apa yang sebenarnya diwakilinya. Adakah yang tahu tentang itu? Saya pikir mungkin ini adalah waktu dalam mikro detik ketika kamera diinisialisasi tetapi kamera yang diinisialisasi setelah ini USEC_INITIALIZED=17919751, dan kemudian setelah itu USEC_INITIALIZED=25609278jadi sepertinya agak acak. Saya akan mencoba untuk reboot sistem dan lihat, tapi saya harus menunggu waktu yang tepat untuk melakukan itu.

Dan jika ada yang bertanya-tanya mengapa saya tidak hanya mencoba menghubungkan kembali kamera dan melihat apakah itu tetap sama. Jawabannya adalah saya mengoperasikan PC ini dari jarak jauh, dan saya sedang menyelidiki semua ini untuk mempersiapkan sistem agar sepenuhnya otonom untuk setiap peristiwa potensial di masa depan. Misalnya yang mungkin termasuk melepas kamera dari port USB.


Apakah bisa juga non-programatic / non-software? misalnya dengan menandai kaca depan kamera dengan spidol (warna berbeda)? Jika tidak ada perbedaan pada perangkat keras dan / atau serial maka saya ragu ini akan mungkin tanpa pemrograman ulang kustom, namun Anda dapat menghubungkan kamera melalui relay / hub yang berbeda?
Gizmo

Sayangnya tidak untuk ide marker, karena saya tidak boleh memperkenalkan apapun pada gambar itu sendiri. Saya bertanya-tanya apakah ada kemungkinan untuk menimpa nomor seri kamera? Atau pengaturan / info kamera lainnya ... Apakah ada yang seperti itu? Memori yang dapat ditulis dan terus-menerus?
Ivan Kovacevic

Ini akan sangat sulit, terutama ketika tidak ada informasi unik untuk perangkat ini, lihat ini: stackoverflow.com/questions/14053764/… . Sedangkan untuk menimpa memori, Anda dapat mencoba menemukan utilitas flashing firmware, mengidentifikasi serial di firmware dan HEX-EDIT ke sesuatu yang Anda sukai? Namun saya tidak dapat menemukan alat untuk itu. Jika Anda dapat menemukan cara untuk mengubah deskriptor perangkat usb maka akan mudah dari sana.
Gizmo

Anda dapat mencoba alat Descriptor HID di sini - usb.org/developers/hidpage - Ofcourse, hanya jika kamera Anda HID
Gizmo

sial, yup kurasa ini tidak mungkin, ada juga tidak ada firmware untuk model ini sehingga ide itu keluar juga. Saya kira satu-satunya hal yang bisa saya lakukan adalah memastikan bahwa setiap kamera tetap terhubung ke port yang sama pada PC setiap saat ... Saya akan mengubah pertanyaan saya.
Ivan Kovacevic

Jawaban:


2

Apakah kamera dalam posisi tetap? Apakah adegan kurang lebih konstan? Jika demikian, Anda dapat menggunakan pengenalan gambar untuk mengidentifikasi kamera berdasarkan apa yang mereka lihat.

Ada beberapa alat python yang layak untuk melakukan ini, jawaban ini memiliki beberapa info bagus tentang topik ini: /programming/1927660/compare-two-images-the-python-linux-way


Saya memiliki solusi ini dalam pikiran, namun saya berharap sesuatu yang lebih sederhana. Dan saya akan mendapat masalah karena hanya sedikit kamera yang benar-benar menghadap ke pelabuhan yang sibuk, kapal bergerak, permukaan laut tidak konstan karena ombak, dll.
Ivan Kovacevic

2

Ketika Anda menemukan, masalahnya tidak dapat diselesaikan, jika Anda tidak bisa mendapatkan identifikasi unik dari perangkat itu sendiri. Hal yang paling dekat dengan solusi adalah bergantung pada koneksi fisik unit. (Ini tidak akan berubah saat reboot. Hanya jika Anda secara fisik mengubah posisi konektor)

Secara terprogram Anda dapat menggunakan sysfs untuk mendapatkan informasi yang dimiliki kernel, tentang perangkat. Sysfs adalah representasi perangkat yang menyerupai sistem file seperti yang dilihat oleh kernel. (Ini bukan file nyata pada disk)

Dengannya, Anda dapat: - mengidentifikasi jenis perangkat dengan ID produk dan vendor - membaca nomor seri perangkat, jika ada. - baca nomor koneksi fisik pada hub USB

Anda bisa mulai dengan menemukan tipe perangkat Anda di / sys / class. Dalam contoh ini saya menggunakan port USB → LPT. Tetapi prinsipnya sama.

$ 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

Grap nama perangkat dari file uevent:

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

tambahkan / dev sehingga Anda mendapatkan nama perangkat untuk dibuka: / dev / usb / lp1

Gunakan path asli: $ cd -P / sys / class / usbmisc / lp1

Mundur 3 cabang:

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

Direktori ini berisi banyak informasi di perangkat:

idProduct dan idVendor dapat digunakan untuk mengidentifikasi secara unik jenis perangkat.

Jika ada file seri dan berisi nomor seri unik, Anda selesai.

Jika tidak, pilihan Anda adalah menggunakan koneksi fisik sebagai identifikasi, yang merupakan nama direktori ini " 4-1.5 " Ini unik untuk koneksi fisik, dan akan seperti yang Anda sebutkan berubah jika Anda mencolokkan perangkat ke port lain.


Saya kira ini adalah solusi terbaik, atau kompromi dalam kasus saya ... Perbaiki kamera ke port USB khusus yang sama. Saya katakan kompromi karena dalam kasus saya, saya juga memiliki persyaratan untuk mengidentifikasi kamera jika misalnya setelah pemeliharaan perangkat keras kamera akan terhubung ke port yang berbeda oleh orang yang melakukan pemeliharaan.
Ivan Kovacevic

Saya setuju. Ini jauh dari sempurna. Saya berharap itu umum untuk vendor, untuk menambahkan ... nomor seri sederhana ke perangkat, sebagaimana ditentukan protokol. Saya harap Anda menemukan solusi yang lebih baik!
Simon Rigét

1

Cukup cabut kamera, pasang 1 dan lakukan lsusb. Identifikasi kamera dan catat port USB mana yang digunakan. Mungkin menaruh label kecil di kamera. Kemudian ulangi untuk kamera lain dan Anda akan sampai di sana. Tidak ada misi yang mustahil;)


Ini masuk akal. Cukup sambungkan satu kamera pada satu waktu dan catat port fisik mana yang dilampirkan. Sepertinya Anda bahkan dapat menghidupkan dan mematikan port individual jika Anda tidak dapat membedakan dalam perangkat lunak Anda, jadi hanya satu yang akan muncul pada suatu waktu. Lihat askubuntu.com/questions/342061/…
Ryan Griggs

Saya akui saya tidak menjelaskan sepenuhnya tujuan konfigurasi saya. Ini adalah PC di lokasi terpencil yang digunakan untuk merekam selang waktu lama (bulan). Saya menginginkan solusi yang dapat secara otomatis mengidentifikasi kamera tanpa campur tangan saya. Sekarang setelah pemadaman listrik saya benar-benar harus login dan secara manual mengkonfigurasi ulang nomor kamera.
Ivan Kovacevic

0

Dimungkinkan untuk mengidentifikasi semua kamera. Perintah

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

mengembalikan nomor seri kamera saya (Webcam Logitech HD Pro, digunakan sebagai contoh dengan Vendor yang benar: Kode produk yang diperoleh dari penggunaan sebelumnya lsusb). Harap perhatikan bahwa sangat penting untuk melakukan operasi ini sebagai pengguna istimewa: pengguna yang tidak berhak tidak mendapatkan akses ke semua info yang tersedia melalui perintah.

Nomor seri sering, tetapi tidak selalu, unik. Jika tidak unik (cukup bandingkan output dari perintah di atas untuk dua perangkat dengan Vendor yang sama: Kode produk), Anda dapat mengaturnya sehingga berbeda. Ada panduan di seluruh Google untuk melakukan itu, saya hanya akan menunjuk beberapa dari mereka, demi ketelitian: di sini dan di sini .

Sekarang perintahnya

$ 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

mengembalikan kode yang sesuai untuk kamera khusus ini. Trial and error dengan semua /dev/videoXperangkat memungkinkan merpati semuanya.


Sepertinya saya seolah-olah Anda tidak membaca posting pertanyaan awal saya sampai akhir. Saya sudah menyebutkan di posting saya tentang menggunakan udevadm ... Masalahnya adalah bahwa semua kamera memiliki nomor seri yang sama sehingga Anda tidak dapat membedakannya dari info itu. Anda menyebutkan "Anda dapat mengatur mereka sehingga mereka berbeda" apakah ada cara untuk "mengatur" / mengubah nomor seri?
Ivan Kovacevic

-1

Saya pernah mendengar seseorang menunda daya secara berurutan ke perangkat selama boot up, yang akan memungkinkan Anda untuk mengidentifikasi mereka berdasarkan urutan mereka hidup. Dibutuhkan beberapa perangkat tambahan yang dapat mengontrol daya ke masing-masing port usb.

Anda dapat meretas hub USB yang memiliki sakelar daya tersendiri untuk setiap port, menghubungkannya ke arduino dan memicu urutan mana yang dinyalakan.

Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.