USB-Geräte identifizieren


15

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, iSerialdas 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_PATHsind ID_PATH_TAG, PHYSund (am interessantesten) USEC_INITIALIZED. Jetzt hängen die ersten vier Elemente wahrscheinlich mit dem USB-Anschluss zusammen, aber der letzte USEC_INITIALIZEDsieht 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=25609278so 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.


Kann es auch nicht programmatisch / nicht software sein? zB durch Markieren des Kamera-Frontglases mit einem Marker (verschiedene Farben)? Wenn es keine Unterschiede in der Hardware und / oder den Serien gibt, bezweifle ich, dass dies ohne kundenspezifische Neuprogrammierung möglich ist. Sie könnten jedoch die Kamera über Relais / Hubs anschließen, die unterschiedlich sind.
Gizmo

Leider nein für die Markierungsidee, da ich dem Bild selbst nichts vorstellen darf. Ich habe mich gefragt, ob es eine Möglichkeit gibt, die Seriennummer der Kamera zu überschreiben. Oder irgendeine andere Kameraeinstellung / Info ... Gibt es so etwas? Beschreibbarer, dauerhafter Speicher?
Ivan Kovacevic

Dies wird sehr schwierig, insbesondere wenn keine eindeutigen Informationen für das Gerät bereitgestellt werden. Siehe hierzu: stackoverflow.com/questions/14053764/… . Was das Überschreiben des Speichers angeht, könnten Sie versuchen, ein Dienstprogramm zum Flashen der Firmware zu finden, die Seriennummer in der Firmware zu identifizieren und sie mit HEX-EDIT zu etwas zu bearbeiten, das Ihnen gefällt? Ich kann jedoch keine Werkzeuge dafür finden. Wenn Sie eine Möglichkeit finden, den USB-Geräte-Deskriptor zu ändern, ist dies von da an problemlos möglich.
Gizmo

Sie können das HID - Descriptor - Tool versuchen hier - usb.org/developers/hidpage - Ofcourse, nur , wenn Ihr Nocken HID
Gizmo

verdammt, yup, ich denke, das ist unmöglich, es gibt auch keine Firmware für dieses Modell, so dass diese Idee auch raus ist. Ich denke, das einzige, was ich tun könnte, ist zu erzwingen, dass jede Kamera die ganze Zeit über mit demselben Port am PC verbunden bleibt ... Ich werde meine Frage ändern.
Ivan Kovacevic

Antworten:


2

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


Ich hatte diese Lösung im Sinn, hoffte jedoch auf etwas Einfacheres. Und ich hätte ein Problem, weil nur wenige Kameras tatsächlich einen geschäftigen Hafen überblicken, Schiffe sich bewegen, die Meeresoberfläche wegen der Wellen nicht konstant ist usw.
Ivan Kovacevic

2

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.

$ 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

Ermitteln Sie den Gerätenamen aus der Ereignisdatei:

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

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:

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

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.


Ich denke, dies ist die beste Lösung oder ein Kompromiss in meinem Fall ... Befestigen Sie die Kameras an demselben dedizierten USB-Anschluss. Ich sage Kompromisse, weil ich in meinem Fall auch die Kameras identifizieren musste, wenn zum Beispiel nach einer Hardware-Wartung die Kameras von der Person, die die Wartung durchführt, an verschiedene Ports angeschlossen wurden.
Ivan Kovacevic

Genau. Das ist alles andere als perfekt. Ich wünschte, es wäre für Anbieter üblich, dem Gerät eine einfache Seriennummer hinzuzufügen, wie im Protokoll angegeben. Ich hoffe du findest eine bessere Lösung!
Simon Rigét

1

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;)


Das macht Sinn. Schließen Sie einfach jeweils eine Kamera an und notieren Sie, an welchen physischen Anschluss sie angeschlossen ist. Sieht so aus, als könnten Sie sogar die einzelnen Ports ein- und ausschalten, wenn Sie in Ihrer Software nicht unterscheiden können, sodass immer nur einer zur gleichen Zeit angezeigt wird. Siehe askubuntu.com/questions/342061/…
Ryan Griggs

Ich gebe zu, dass ich den Zweck meiner Konfiguration nicht ganz klar erklärt habe. Es handelt sich um einen PC an einem entfernten Ort, mit dem lange Zeitabstände (Monate) aufgezeichnet werden. Ich wünschte mir eine Lösung, mit der sich Kameras ohne mein Zutun automatisch identifizieren lassen. Jetzt muss ich mich nach einem Stromausfall anmelden und die Kameranummern manuell neu konfigurieren.
Ivan Kovacevic

0

Es ist möglich, alle Kameras zu identifizieren. Der Befehl

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

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

$ 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

Gibt die entsprechenden Codes für diese bestimmte Kamera zurück. Das Ausprobieren aller /dev/videoXGeräte ermöglicht das Einstecken aller Geräte.


Mir kommt es so vor, als hättest du meinen ersten Fragenbeitrag vielleicht nicht bis zum Ende gelesen. Ich habe bereits in meinem Beitrag über die Verwendung von udevadm erwähnt ... Das Problem ist, dass alle Kameras dieselbe Seriennummer haben, sodass Sie sie nicht von diesen Informationen unterscheiden können. Sie erwähnten "Sie können sie so einstellen, dass sie sich unterscheiden". Gibt es eine Möglichkeit, die Seriennummer einzustellen / zu ändern?
Ivan Kovacevic

-1

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.

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.