Ich habe fünf USB-Kameras der gleichen Marke und des gleichen Modells (Canyon CNR-FWC120H). Sie werden verwendet, um verschiedene Szenen rund um die Uhr zu überwachen. Ich muss irgendwie identifizieren, welche Kamera welche von der Linux (Debian) -Konsole oder programmgesteuert (in einer beliebigen Sprache) ist.
Ich habe versucht, auf die Ausgabe von zu schauen lsusb -vvv
, es gibt ein Feld, iSerial
das für jede Kamera unterschiedlich sein sollte, aber leider hat dieser Hersteller beschlossen, sich nicht darum zu kümmern, und alle Kameras haben an dieser Stelle die gleiche Seriennummer:200901010001
Gibt es eine andere Möglichkeit, die Kamera zu identifizieren, unabhängig von den USB-Anschlüssen, an die sie angeschlossen sind? In meinem speziellen Szenario kann ich mich leider nicht darauf verlassen, dass immer dieselbe Kamera an denselben Anschluss angeschlossen ist.
UPDATE Nach einigen Diskussionen in den Kommentaren ist mir klar, dass dies keine Mission ist. Vergiss also den letzten Absatz oder wenn du eine geniale Idee hast, kannst du sie gerne präsentieren. Ich bin jetzt interessiert, ob ich herausfinden kann, an welchen USB-Anschluss das Gerät angeschlossen ist. Ich verwende die eingebauten USB-Anschlüsse des Motherboards und zusätzliche PCI-USB-Controller-Karten, um die Kameras mit ausreichender Bandbreite unterzubringen. Ich müsste den Port eindeutig identifizieren, und die Portnummer / -identifikation sollte sich nicht ändern, wenn zum Beispiel der Computer neu startet und aus irgendeinem Grund die USB-Controller in einer anderen Reihenfolge initialisiert werden. Ist das möglich?
UPDATE 2 Ich sehe in meinen Protokollen für eine der Kameras die folgenden Informationen:
[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
Damit habe ich diesen Befehl aufgerufen:
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
Und bekam das:
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
Die Dinge, die sich zwischen den Kameras unterscheiden DEVPATH
, ID_PATH
sind ID_PATH_TAG
, PHYS
und (am interessantesten) USEC_INITIALIZED
. Jetzt hängen die ersten vier Elemente wahrscheinlich mit dem USB-Anschluss zusammen, aber der letzte USEC_INITIALIZED
sieht aus wie eine Art Seriennummer. Ich kann keine Informationen darüber finden, was es tatsächlich darstellt. Weiß jemand etwas darüber? Ich dachte, dass es vielleicht die Zeit in Mikrosekunden ist, in der die Kamera initialisiert wurde, aber die Kamera, die danach initialisiert wurde USEC_INITIALIZED=17919751
, und dann die danach, USEC_INITIALIZED=25609278
so dass es eher zufällig erscheint. Ich werde versuchen, das System neu zu starten und zu sehen, aber ich muss auf eine angemessene Zeit warten, um das zu tun.
Und wenn sich jemand fragt, warum ich nicht einfach versuche, eine Kamera wieder anzuschließen und zu sehen, ob das gleich bleibt. Die Antwort ist, dass ich diesen PC von einem entfernten Standort aus bediene und dies alles untersuche, um das System darauf vorzubereiten, für alle möglichen zukünftigen Ereignisse völlig autonom zu sein. Dazu gehört beispielsweise das Trennen der Kameras von den USB-Anschlüssen.
Antworten:
Befinden sich die Kameras in einer festen Position? Sind die Szenen mehr oder weniger konstant? In diesem Fall können Sie die Bilderkennung verwenden, um die Kameras anhand ihrer Sichtbarkeit zu identifizieren.
Hierfür gibt es einige anständige Python-Tools. Diese Antwort enthält einige nützliche Informationen zum Thema: /programming/1927660/compare-two-images-the-python-linux-way
quelle
Wie Sie festgestellt haben, kann das Problem nicht gelöst werden, wenn Sie keine eindeutige Identifikation vom Gerät selbst erhalten. Am nächsten an einer Lösung ist der physikalische Anschluss des Geräts. (Dies ändert sich beim Neustart nicht. Nur wenn Sie die Position des Anschlusses physisch ändern.)
Programmatisch können Sie sysfs verwenden, um die Informationen des Kernels über das Gerät abzurufen. Sysfs ist eine dateisystemähnliche Darstellung von Geräten, wie sie vom Kernel gesehen werden. (Es sind keine echten Dateien auf der Festplatte)
Damit können Sie: - den Gerätetyp mit Produkt- und Lieferanten-ID identifizieren - die Seriennummer des Geräts lesen, falls vorhanden. - Lesen Sie die physikalische Verbindungsnummer auf dem USB-Hub
Sie könnten damit beginnen, Ihren Gerätetyp in / sys / class zu finden. In diesem Beispiel verwende ich einen USB → LPT-Port. Das Prinzip ist jedoch dasselbe.
Ermitteln Sie den Gerätenamen aus der Ereignisdatei:
Fügen Sie / dev hinzu, damit der Gerätename geöffnet wird: / dev / usb / lp1
Verwenden Sie den tatsächlichen Pfad: $ cd -P / sys / class / usbmisc / lp1
3 Äste zurücktreten:
Dieses Verzeichnis enthält viele Informationen zum Gerät:
Mit idProduct und idVendor kann der Gerätetyp eindeutig identifiziert werden.
Wenn es eine serielle Datei gibt, die eine eindeutige Seriennummer enthält, sind Sie fertig.
Andernfalls können Sie die physische Verbindung als Identifikation verwenden. Dies ist der Verzeichnisname „ 4-1.5 “. Er ist für die physische Verbindung eindeutig und ändert sich, wie Sie bereits erwähnt haben,, wenn Sie das Gerät an einen anderen Port anschließen.
quelle
Ziehen Sie einfach den Stecker der Kamera heraus, schließen Sie 1 an und führen Sie einen lsusb durch. Identifizieren Sie die Kamera und notieren Sie, welcher USB-Anschluss verwendet wird. Vielleicht ein kleines Etikett auf die Cam kleben. Wiederholen Sie dies für die anderen Kameras, und Sie werden dorthin gelangen. Nichts ist Mission unmöglich;)
quelle
Es ist möglich, alle Kameras zu identifizieren. Der Befehl
gibt die Seriennummer meiner Kamera zurück (eine Logitech HD Pro-Webcam, die als Beispiel mit dem korrekten Hersteller verwendet wird: Produktcodes, die bei einer früheren Verwendung von verwendet wurden)
lsusb
). Bitte beachten Sie, dass es unbedingt erforderlich ist, diesen Vorgang als privilegierter Benutzer auszuführen: Ein nicht privilegierter Benutzer erhält nicht über den Befehl Zugriff auf alle verfügbaren Informationen.Die Seriennummer ist häufig, aber nicht immer eindeutig. Wenn dies nicht eindeutig ist (vergleichen Sie einfach die Ausgabe der obigen Befehle für zwei Geräte mit demselben Hersteller: Produktcode), können Sie sie so einstellen , dass sie sich unterscheiden. Dafür gibt es in ganz Google Anleitungen. Ich werde der Gründlichkeit halber nur auf ein paar davon verweisen: hier und hier .
Nun der Befehl
Gibt die entsprechenden Codes für diese bestimmte Kamera zurück. Das Ausprobieren aller
/dev/videoX
Geräte ermöglicht das Einstecken aller Geräte.quelle
Ich habe von jemandem gehört, der das Einschalten von Geräten während des Startvorgangs nacheinander verzögert, sodass Sie sie anhand der Reihenfolge des Einschaltens identifizieren können. Es würde einige zusätzliche Hardware erfordern, die die Stromversorgung für einzelne USB-Ports in der angegebenen Reihenfolge steuern könnte.
Sie könnten einen USB-Hub hacken, der für jeden Port einen eigenen Netzschalter hat, diesen an einen Arduino anschließen und die Reihenfolge der Aktivierung auslösen.
quelle