Identyfikacja urządzeń USB

15

Mam pięć kamer USB, tej samej marki, tego samego modelu (Canyon CNR-FWC120H). Służą do monitorowania różnych scen przez całą dobę. Muszę jakoś ustalić, która kamera jest z konsoli Linux (Debian) lub programowo (w dowolnym języku).

Próbowałem spojrzeć na wyjście lsusb -vvv, jest pole, iSerialktóre powinno być inne dla każdej kamery, ale niestety ten producent postanowił nie zawracać sobie głowy i wszystkie kamery mają ten sam numer seryjny w tym miejscu:200901010001

Czy jest jakiś inny sposób, w jaki mógłbym określić, która kamera jest niezależnie od portów USB, do których są one podłączone, ponieważ niestety w moim konkretnym scenariuszu nie mogę polegać na tym, że ta sama kamera zawsze będzie podłączona do tego samego portu.

AKTUALIZACJA Po krótkiej dyskusji w komentarzach zdaję sobie sprawę, że misja jest niemożliwa. Zapomnij więc o ostatnim akapicie lub jeśli masz jakiś genialny pomysł, możesz go przedstawić. Jestem teraz zainteresowany, czy mogę zidentyfikować port USB, do którego urządzenie jest podłączone; Używam wbudowanych portów USB na płycie głównej i dodatkowych kart kontrolerów PCI USB, aby pomieścić kamery o wystarczającej przepustowości. Musiałbym jednoznacznie zidentyfikować port, a numer / identyfikator portu nie powinien się zmienić, jeśli na przykład urządzenie uruchomi się ponownie iz jakiegoś powodu kontrolery USB zostaną zainicjowane w innej kolejności. Czy to jest możliwe?

AKTUALIZACJA 2 W moich logach jednej z kamer widzę następujące informacje:

[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

Używając tego, wywołałem to polecenie:

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

I dostałem to:

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

Rzeczy, które różnią się między kamerami są DEVPATH, ID_PATH, ID_PATH_TAG, PHYSi (najbardziej interesujące) USEC_INITIALIZED. Teraz pierwsze cztery elementy są prawdopodobnie związane z portem USB, ale ostatni USEC_INITIALIZEDwygląda jak jakiś numer seryjny. Nie mogę znaleźć żadnych informacji na temat tego, co faktycznie reprezentuje. Czy ktoś coś o tym wie? Pomyślałem, że może jest to czas w mikrosekundach, kiedy kamera się zainicjowała, ale kamera, która się zainicjowała po tym USEC_INITIALIZED=17919751, a potem ta , a potem ta, USEC_INITIALIZED=25609278więc wydaje się raczej przypadkowa. Spróbuję ponownie uruchomić system i zobaczę, ale muszę poczekać na dogodny czas, aby to zrobić.

A jeśli ktoś zastanawia się, dlaczego nie próbuję ponownie podłączyć aparatu i sprawdzić, czy to pozostanie takie samo. Odpowiedź brzmi: obsługuję ten komputer zdalnie i badam to wszystko, aby przygotować system do pełnej autonomii na wszelkie potencjalne zdarzenia w przyszłości. Co może na przykład obejmować odłączenie kamer od portów USB.

Ivan Kovacevic
źródło
Czy może to być także programowanie / nieprogramowanie? np. poprzez oznaczenie przedniej szyby aparatu markerem (różne kolory)? Jeśli nie ma żadnych różnic w sprzęcie i / lub serialach, wątpię, aby było to możliwe bez niestandardowego przeprogramowania, ale czy można podłączyć kamerę za pośrednictwem przekaźników / koncentratora, które SĄ różne?
Gizmo
Niestety nie, pomysł na marker, ponieważ nie mogę niczego wprowadzać do samego obrazu. Zastanawiałem się, czy istnieje możliwość zastąpienia numeru seryjnego aparatu? Lub jakiekolwiek inne ustawienie / informacje o aparacie ... Czy istnieje coś takiego? Zapisywalna, trwała pamięć?
Ivan Kovacevic
To będzie bardzo trudne, zwłaszcza gdy nie ma unikalne informacje dla Device jest pod warunkiem, zobacz to: stackoverflow.com/questions/14053764/... . Jeśli chodzi o nadpisywanie pamięci, możesz spróbować znaleźć narzędzie do flashowania oprogramowania układowego, zidentyfikować numer seryjny w oprogramowaniu wewnętrznym i HEX-EDIT go do czegoś, co lubisz? Nie mogę jednak znaleźć do tego żadnych narzędzi. Jeśli znajdziesz sposób na zmianę deskryptora urządzenia USB, od tej pory będzie to łatwe.
Gizmo
Możesz wypróbować narzędzie HID Descriptor tutaj - usb.org/developers/hidpage - Oczywiście, tylko jeśli twoja kamera jest ukryta
Gizmo
cholera, tak, myślę, że jest to niemożliwe, nie ma również oprogramowania układowego dla tego modelu, więc ten pomysł też nie istnieje. Chyba jedyne, co mogłem zrobić, to wymusić, aby każda kamera pozostawała podłączona do tego samego portu komputera przez cały czas ... Zmodyfikuję moje pytanie.
Ivan Kovacevic

Odpowiedzi:

2

Czy kamery są w stałej pozycji? Czy sceny są mniej więcej stałe? Jeśli tak, możesz użyć rozpoznawania obrazu, aby zidentyfikować kamery według tego, co widzą.

Istnieje kilka przyzwoitych narzędzi Pythona, aby to zrobić, ta odpowiedź zawiera kilka dobrych informacji na ten temat: /programming/1927660/compare-two-images-the-python-linux-way

walli
źródło
Miałem na myśli to rozwiązanie, jednak liczyłem na coś prostszego. I miałbym problem, ponieważ niewiele kamer faktycznie wychodzi na zatłoczony port, statki w ruchu, powierzchnia morza nie jest stała z powodu fal itp.
Ivan Kovacevic
2

Jak odkryłeś, problemu nie można rozwiązać, jeśli nie można uzyskać unikalnej identyfikacji z samego urządzenia. Rozwiązaniem najbliższym jest uzależnienie od fizycznego połączenia urządzenia. (Nie zmieni się to przy ponownym uruchomieniu. Tylko jeśli fizycznie zmienisz pozycję złącza)

Programowo możesz użyć sysfs, aby uzyskać informacje o jądrze na temat urządzenia. Sysfs jest podobną do systemu plików reprezentacją urządzeń, tak jak je widzi jądro. (To nie są prawdziwe pliki na dysku)

Dzięki niemu możesz: - zidentyfikować typ urządzenia za pomocą identyfikatora produktu i dostawcy - odczytać numer seryjny urządzenia, jeśli ono ma. - przeczytaj fizyczny numer połączenia na koncentratorze USB

Możesz zacząć od znalezienia swojego typu urządzenia w / sys / class. W tym przykładzie używam portu USB → LPT. Ale zasada jest taka 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

Chwyć nazwę urządzenia z nieistniejącego pliku:

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

dodaj / dev, aby uzyskać nazwę urządzenia do otwarcia: / dev / usb / lp1

Użyj prawdziwej ścieżki: $ cd -P / sys / class / usbmisc / lp1

Cofnij się o 3 oddziały:

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

Ten katalog zawiera wiele informacji na urządzeniu:

Za pomocą idProduct i idVendor można jednoznacznie zidentyfikować typ urządzenia.

Jeśli istnieje plik szeregowy , który zawiera unikalny numer seryjny, gotowe.

W przeciwnym razie twoją opcją jest użycie połączenia fizycznego jako identyfikatora, czyli tej nazwy katalogu „ 4-1.5 ”. Jest on unikalny dla połączenia fizycznego i zmieni się, jak już wspomniano, jeśli podłączysz urządzenie do innego portu.

Simon Rigét
źródło
Myślę, że to najlepsze rozwiązanie lub kompromis w moim przypadku ... Przymocuj kamery do tego samego dedykowanego portu USB. Mówię o kompromisie, ponieważ w moim przypadku miałem również obowiązek identyfikacji kamer, jeśli na przykład po konserwacji sprzętu kamery zostaną podłączone do różnych portów przez osobę wykonującą konserwację.
Ivan Kovacevic
Zgadzam się. To jest dalekie od ideału. Chciałbym, aby dostawcy często dodawali do urządzenia prosty numer seryjny, jak określa protokół. Mam nadzieję, że znajdziesz lepsze rozwiązanie!
Simon Rigét,
1

Po prostu odłącz aparat, podłącz 1 i zrób lsusb. Zidentyfikuj aparat i zanotuj, który port USB jest używany. Może nakleić małą etykietę na kamerę. Następnie powtórz dla innych aparatów i tam dotrzesz. Nic nie jest niemożliwe;)

Jakke
źródło
To ma sens. Wystarczy podłączyć jedną kamerę na raz i zanotować, do którego fizycznego portu jest podłączony. Wygląda na to, że możesz nawet włączać i wyłączać poszczególne porty, jeśli nie możesz rozróżnić w swoim oprogramowaniu, więc jednocześnie pojawiałby się tylko jeden. Zobacz askubuntu.com/questions/342061/…
Ryan Griggs
Przyznaję, że nie wyjaśniłem całkowicie jasnego celu mojej konfiguracji. Jest to komputer w odległej lokalizacji, służący do rejestrowania upływów czasu (miesięcy). Chciałem znaleźć rozwiązanie, które automatycznie identyfikowałoby kamery bez mojej interwencji. Teraz po każdej awarii zasilania muszę się zalogować i ręcznie ponownie skonfigurować numery kamer.
Ivan Kovacevic
0

Możliwe jest zidentyfikowanie wszystkich kamer. Komenda

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

zwraca numer seryjny mojej kamery (kamera internetowa Logitech HD Pro Webcam, użyta jako przykład z poprawnym dostawcą: Kody produktów uzyskane przy poprzednim użyciu lsusb). Należy pamiętać, że absolutnie konieczne jest wykonanie tej operacji jako użytkownik uprzywilejowany: użytkownik nieuprzywilejowany nie uzyskuje dostępu do wszystkich informacji dostępnych za pomocą polecenia.

Numer seryjny jest często, ale nie zawsze, unikalny. Jeśli nie jest unikalny (wystarczy porównać wyniki powyższych poleceń dla dwóch urządzeń z tym samym dostawcą: Kody produktów), można je ustawić tak, aby były odrębne. W całym Google istnieją przewodniki dotyczące tego, a ja tylko wskazuję kilka z nich, ze względu na dokładność: tu i tutaj .

Teraz polecenie

$ 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

zwraca odpowiednie kody dla tego konkretnego aparatu. Próba i błąd we wszystkich /dev/videoXurządzeniach pozwala zaszywać gołębie wszystkie.

MariusMatutiae
źródło
Wydaje mi się, że do końca nie przeczytałeś mojego pierwszego pytania. Wspomniałem już w swoim poście o używaniu udevadm ... Problem polega na tym, że wszystkie kamery mają ten sam numer seryjny, więc nie można ich odróżnić od tych informacji. Wspomniałeś „możesz ustawić je tak, aby były odrębne”. Czy istnieje sposób na „ustawienie” / zmianę numeru seryjnego?
Ivan Kovacevic
-1

Słyszałem o opóźnieniu włączania zasilania urządzeń podczas uruchamiania, co pozwoliłoby je zidentyfikować na podstawie kolejności włączania. Wymagałoby to dodatkowego sprzętu, który mógłby kontrolować moc poszczególnych portów USB w kolejności.

Możesz zhakować koncentrator USB, który ma indywidualne przełączniki zasilania dla każdego portu, podpiąć go do arduino i ustawić, w jakiej kolejności są włączone.

zimmer62
źródło