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, iSerial
któ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
, PHYS
i (najbardziej interesujące) USEC_INITIALIZED
. Teraz pierwsze cztery elementy są prawdopodobnie związane z portem USB, ale ostatni USEC_INITIALIZED
wyglą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=25609278
wię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.
Odpowiedzi:
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
źródło
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.
Chwyć nazwę urządzenia z nieistniejącego pliku:
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:
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.
źródło
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;)
źródło
Możliwe jest zidentyfikowanie wszystkich kamer. Komenda
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
zwraca odpowiednie kody dla tego konkretnego aparatu. Próba i błąd we wszystkich
/dev/videoX
urządzeniach pozwala zaszywać gołębie wszystkie.źródło
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.
źródło