USB cihazlarını tanımlama


15

Beş adet USB kamera var, aynı marka, aynı model (Canyon CNR-FWC120H). Farklı sahneleri 7/24 izlemek için kullanılırlar. Bir şekilde hangi kameranın hangisi olduğunu Linux (Debian) konsolundan veya programlı olarak (herhangi bir dil) belirlemeliyim.

Çıktısına bakmayı denedim lsusb -vvv, iSerialher kamera için farklı olması gereken bir alan var ama ne yazık ki bu üretici rahatsız etmemeye karar verdi ve tüm kameralar aynı yerde aynı seriye sahip:200901010001

Hangi kameranın bağlı olduğunu USB bağlantı noktalarından bağımsız olarak tanımlayabileceğim başka bir yol var mı, çünkü ne yazık ki belirli senaryomda aynı kameranın her zaman aynı bağlantı noktasına bağlanacağı gerçeğine güvenemiyorum.

GÜNCELLEME Yorumlardaki bazı tartışmalardan sonra bunun imkansız olduğunu anladım. Bu yüzden, son paragrafı unutun ya da bazı ustaca bir fikriniz varsa, lütfen bunu sunmaya davetlisiniz. Cihazın hangi USB portuna bağlandığını tespit edebilirsem şimdi ilgileniyorum; Kameralara yeteri kadar bant genişliği sağlamak için anakarttaki dahili USB bağlantı noktalarını ve ek PCI USB denetleyici kartlarını kullanıyorum. Bağlantı noktasını benzersiz bir şekilde tanımlamam gerekir ve örneğin makine yeniden başlatılırsa ve USB denetleyicileri farklı sırayla başlatılırsa bağlantı noktası numarası / kimliği değişmemelidir. Mümkün mü?

GÜNCELLEME 2 Kameralarımdan birinin kayıtlarımda aşağıdaki bilgileri görüyorum:

[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

Bunu kullanarak bu komutu çağırdım:

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

Ve şunu anladım:

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

Kameralar arasında farklılık şeylerdir DEVPATH, ID_PATH, ID_PATH_TAG, PHYSve (en ilginç) USEC_INITIALIZED. Şimdi ilk dört element muhtemelen USB portuyla ilişkili, fakat sonuncusu bir USEC_INITIALIZEDseri numaraya benziyor. Gerçekte neyi temsil ettiği hakkında hiçbir bilgi bulamıyorum. Bir şey bilen var mı? Kamera başlatıldığında mikro saniye cinsinden zamanın gelebileceğini düşündüm, ancak bundan sonra ilk başlatılan kameranın USEC_INITIALIZED=17919751, daha sonra bir tanesinin USEC_INITIALIZED=25609278daha rasgele göründüğünü düşündüm . Sistemi yeniden başlatıp görmeye çalışacağım, ancak bunun için uygun bir süre beklemem gerekiyor.

Ve eğer birileri neden merak ediyorsa, neden sadece bir kamerayı tekrar bağlamaya çalışmıyorum ve aynı kaldığını kontrol ediyorum. Cevap şu ki, bu bilgisayarı uzaktan çalıştırıyorum ve tüm bunları sistemi gelecekteki potansiyel bir olay için tamamen özerk olmaya hazırlamak için araştırıyorum. Örneğin, kameraların USB bağlantı noktalarından çıkarılmasını içerebilir.


Programlanabilir / yazılım dışı da olabilir mi? örneğin kamera ön camını bir işaretleyici ile işaretleyerek (farklı renkler)? Donanımda ve / veya dizilerde farklılık yoksa, bunun özel bir yeniden programlama olmadan mümkün olacağından şüpheliyim, ancak kamerayı ARE farklı olan röleler / göbekler ile bağlayabilirsiniz.
Gizmo

Ne yazık ki işaretçi fikri için hayır, çünkü resmin kendisine hiçbir şey eklememeliyim. Kameraların seri numarasının üzerine yazma ihtimalinin olup olmadığını merak ediyordum. Veya başka herhangi bir kamera ayarı / bilgisi ... Bunun gibi bir şey var mı? Yazılabilir, kalıcı hafıza?
Ivan Kovacevic

Bu, özellikle cihaz için benzersiz bir bilgi sağlanmadığında gerçekten zor olacak, şuna bakın: stackoverflow.com/questions/14053764/… . Belleğin üzerine yazmaya gelince, bellenim yanıp sönen bir yardımcı program bulmayı deneyebilir, bellenimdeki seriyi ve HEX-EDIT cihazını istediğiniz gibi tanımlayabilirsiniz. Ancak bunun için hiçbir araç bulamıyorum. USB aygıt tanımlayıcısını değiştirmenin bir yolunu bulabilirseniz, o zaman oradan kolay olurdu.
Gizmo

Burada HID Tanımlayıcı aracını deneyebilirsiniz - usb.org/developers/hidpage - Ofcourse , yalnızca kameranız HID ise
Gizmo

kahretsin, evet, sanırım bu imkansız, bu model için bir ürün yazılımı da yok, bu yüzden bu fikir de ortaya çıktı. Sanırım yapabileceğim tek şey, her bir kameranın PC'deki aynı bağlantı noktasına sürekli bağlı kalmasını sağlamak. Sorumu değiştireceğim.
Ivan Kovacevic

Yanıtlar:


2

Kameralar sabit konumda mı? Sahneler az çok mı sabit? Öyleyse, kameraları gördükleriyle tanımlamak için görüntü tanıma özelliğini kullanabilirsiniz.

Bunu yapmak için bazı iyi python araçları var, bu cevabın konuyla ilgili bazı iyi bilgileri var: https://stackoverflow.com/questions/1927660/compare-two-images-the-python-linux-way


Aklımda bu çözüm vardı, ancak daha basit bir şey için ümit ediyorum. Ve bir sorunum olurdu çünkü birkaç kamera aslında yoğun bir limana bakıyor, gemiler hareket ediyor, deniz yüzeyi dalgalar yüzünden sabit değil.
Ivan Kovacevic

2

Keşfettiğiniz gibi, cihazın kendisinden benzersiz bir tanım alamıyorsanız, problem çözülemez. Bir çözüme en yakın şey, birimin fiziksel bağlantısına bağlı olmaktır. (Bu yeniden başlatma sırasında değişmeyecektir. Yalnızca fiziksel olarak konektörün konumunu değiştirirseniz)

Programlı olarak, çekirdeğin cihaz hakkında sahip olduğu bilgileri almak için sysfs kullanabilirsiniz. Sysfs, çekirdeğin gördüğü gibi aygıtların dosya sistemine benzeyen bir temsilidir. (Diskteki gerçek dosyalar değil)

Bununla beraber, şunları yapabilirsiniz: - cihaz tipini ürün ve satıcı kimliğiyle tanımlayın - varsa, cihazın seri numarasını okuyun. - USB hub'ındaki fiziksel bağlantı numarasını okuyun

/ Sys / class'taki cihaz tipinizi bularak başlayabilirsiniz. Bu örnekte bir USB → LPT bağlantı noktası kullanıyorum. Ancak ilke aynıdır.

$ 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

Aygıt adını uevent dosyasından alın:

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

/ dev ekle böylece cihaz adını açabilirsin: / dev / usb / lp1

Gerçek yolu kullanın: $ cd -P / sys / sınıf / usbmisc / lp1

3 dal geri adım:

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

Bu dizin cihazdaki bilgilerin çoğunu içerir:

idProduct ve idVendor , aygıt türünü benzersiz şekilde tanımlamak için kullanılabilir.

Bir seri dosyası varsa ve benzersiz bir seri numarası içeriyorsa, bitirdiniz.

Aksi halde, seçeneğiniz fiziksel bağlantıyı tanım olarak kullanmaktır, bu “ 4-1.5 ” dizin adıdır . Fiziksel bağlantı için benzersizdir ve cihazı başka bir bağlantı noktasına taktıysanız , daha önce belirttiğiniz gibi değişir.


Sanırım bu en iyi çözüm, ya da benim durumumda uzlaşma ... Kameraları aynı USB bağlantı noktasına sabitleyin. Uzlaşma diyorum, çünkü benim durumumda, örneğin bir donanım bakımından sonra kameraların bakım yapan kişi tarafından farklı bağlantı noktalarına bağlanması durumunda kameraları tanımlama gereksinimim vardı.
Ivan Kovacevic

Katılıyorum. Bu mükemmel olmaktan uzak. Protokolün belirttiği gibi, cihaza bir f ... basit seri numarası eklemek, satıcılar için ortak olsaydı. Umarım daha iyi bir çözüm bulursunuz!
Simon Rigét

1

Sadece fotoğraf makinesinin fişini çekin, 1 takın ve bir lsusb yapın. Kamerayı tanımlayın ve hangi USB portunun kullanıldığını not edin. Belki de kameranın üstüne küçük bir etiket koyabiliriz. Sonra diğer kamera için tekrarla ve oraya ulaş. Hiçbir şey imkansız değildir;)


Bu mantıklı. Sadece bir seferde bir kamera takın ve hangi fiziksel bağlantı noktasına bağlı olduğunu not edin. Yazılımınızdaki farkı ayırt edemezseniz, tek tek bağlantı noktalarını açıp kapatabilirsiniz gibi gözüküyor, böylece bir seferde yalnızca biri görünür. Bkz askubuntu.com/questions/342061/...
Ryan Griggs

Yapılandırmamın amacını tamamen açıklayamadığımı itiraf ediyorum. Uzun süreler (aylar) sürelerini kaydetmek için kullanılan uzak bir konumdaki bir bilgisayardır. Müdahalemem olmadan kameraları otomatik olarak tanıtan bir çözüm diledim. Şimdi herhangi bir elektrik kesintisinden sonra oturum açmak ve kamera numaralarını elle yeniden yapılandırmak zorundayım.
Ivan Kovacevic

0

Tüm kameraları tanımlamak mümkündür. Komuta

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

Kameramın seri numarasını döndürür (doğru Satıcı ile örnek olarak kullanılan bir Logitech HD Pro Webcam, önceki kullanımdan elde edilen ürün kodları lsusb). Lütfen, bu işlemi ayrıcalıklı bir kullanıcı olarak gerçekleştirmenin kesinlikle gerekli olduğunu unutmayın: ayrıcalıklı olmayan bir kullanıcı, komutta bulunan tüm bilgilere erişemez.

Seri numarası genellikle, ancak her zaman benzersiz değildir. Eşsiz değilse (yukarıdaki aynı komutun verisini aynı Satıcıya sahip iki cihaz için karşılaştırmanız yeterlidir: Ürün kodları), farklı olmaları için bunları ayarlayabilirsiniz . Bunu yapmak için Google’ın her yerinde rehberler var, sadece iyilik adına birkaçını işaret edeceğim: burada ve burada .

Şimdi komut

$ 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

bu kamera için uygun kodları döndürür. Tüm /dev/videoXcihazlarla deneme ve yanılma, hepsinin güvercin sallanmasına izin verir.


Sanırım bana sanırım ilk soru yazımı sonuna kadar okumadınız. Udevadm'i kullanmakla ilgili yazımda daha önce bahsetmiştim ... Sorun şu ki, tüm kameraların aynı seri numarasına sahip olması, bu yüzden onları bu bilgilerden ayrı tutamazsınız. "Onları farklı olacak şekilde ayarlayabiliyorsunuz" demiştiniz. Seri numarasını "ayarlamanın" / değiştirmenin bir yolu var mı?
Ivan Kovacevic

-1

Bir açılışta cihazlara sırayla güç vermesini geciktiren birisinin duyulduğunu duydum; Bireysel usb bağlantı noktalarının sırayla gücünü kontrol edebilecek bazı ilave donanımlar gerektirecektir.

Her bağlantı noktası için ayrı güç anahtarlarına sahip bir USB hub'ını kesebilir, bir arduino'ya bağlayabilir ve hangi sırayla açıldığını tetikleyebilirsiniz.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.