Webcams werden immer wieder falsch zugewiesen

Moin,
das Bandbreitenproblem von USB hab ich nun gelöst, jetzt hab ich allerdings das Problem das die Cams immer wieder falsch zugewiesen werden. 

Hab momentan 2 Drucker dran mit 2 Webcams. USB-Camera 1 an Drucker 1 und USB-Camera 2 and Drucker 2. Je nach laune des Servers stimmt das nach dem hochfahren, oder eben auch nicht. Manchmal ist USB-Camera 1 dann an Drucker 2 und umgekehrt. Geh ich allerdings in die Settings steht es dort richtig rum. Es scheint als würde er die USB-Cameras nach jedem booten wieder neuzuweisen an den jeweiligen USB-Port, was absolut sinnfrei ist weil ich ja nicht jedesmal die Cams wieder neu einstellen möchte. Erst recht wenn ich dann 5 Drucker dran habe.

Comments

  • Das ist mehr ein linux Problem. Die erste webcam ist under /dev/video0 erreichbar und die zweite unter /dev/video1. mjpg mit unserem system mappt immer video0 auf 8080 und video1 auf 8081, aber wenn dass dann andere Geräte sind sehen die das nicht. Vielleicht gibt es ja eine Möglichkeit Linux beizubringen das anders zu regeln, aber ich kenne sie leider nicht.
  • Das müsste doch mit UDEV Rules gehen oder? 
    siehe beispielsweise : https://unix.stackexchange.com/questions/66901/how-to-bind-usb-device-under-a-static-name

    Wenn du jetzt die beiden Webcams unter einem Statischen Namen bindest, dann müsste die Zuweisung auch immer funktionieren.
  • Ja sollte gehen. Man müsste dan nur noch das webcam script anpassen um nach den neuen Namen zu suchen und nicht video0.
  • Wenn ich das richtig sehe geht das über die VendorID und ProductID. Das könnte problematisch werden da alle Webcams identisch sind... Werd mir die Cams ma mit lsusb angucken ob ich da noch irgendwo ne eindeutige ID finde die ich verwenden kann.
  • Vielleicht kann man es com usb port abhängig machen wo sie drin stecken. Muss ja nur eine Regel her die eindeutig ist.

  • So man kann statt /dev/video0 zu verwenden auch /dev/v4l/by-id/usb-XY verwenden. Weiß wer wo ich bei mjpg-streamer die config dafür finde?

  • So ich habe so gut wie keine Ahnung von Bash-Scripting habs aber hinbekommen (Scripte liegen unter /usr/local/Repetier-Setup/bin). Hab in der startAllCams die Schleife angepasst:
    for DEV in "usb-046d_0825_20A1C0F0-video-index0" "usb-046d_0825_5C66C7E0-video-index0" "usb-046d_0825_86AD87A0-video-index0" "usb-046d_0825_A86D6B10-video-index0"
    do
        if [ -e "/dev/v4l/by-id/${DEV}" ]; then
          ./mjpgStart $DEV
        fi
    done

    Und in der mjpgStart ne neue Variable angelegt als Counter für die Ports und alle anderen variablen die auf /dev/video verwiesen durch /dev/v4l/by-id/${DEV} getauscht.
    if [ "$DEV" == "usb-046d_0825_20A1C0F0-video-index0" ]; then
      COUNT="0"
    elif [ "$DEV" == "usb-046d_0825_5C66C7E0-video-index0" ]; then
      COUNT="1"
    elif [ "$DEV" == "usb-046d_0825_86AD87A0-video-index0" ]; then
      COUNT="2"
    elif [ "$DEV" == "usb-046d_0825_A86D6B10-video-index0" ]; then
      COUNT="3"
    fi


    Konnte auf die schnelle nicht rausfinden wie ich zusätzlich zum Array noch nen Counter in die Schleife packe und den mit übergebe dann hätte ich mir das getrickse mit der if abfrage gespart. So funktioniert es jetzt aber zumindest. Muss zwar händisch dann immer mal anpassen aber das ist okay, so oft steck ich nicht neue Cams.

  • Interessante alternative Lösung zu dem was ich sagte. Hierfür sind aber die notwendigen werte (Geräte Ids) nicht allgemein vorprogrammierbar. Man müsste das Mapping also schon bei der Konfiguration irgendwie machen. Aber die Lösung an sich finde ich gut, insbesonder den hinweis /dev/v4l/ zum unterscheiden. Muss ich mal in mich gehen ob man das für andere verallgemeinern kann, damit die Zuordnungen immer bleiben auch wenn mal eine webcam fehlt, was ja bei deiner Lösung auch kein Problem ist.
  • Man könnte beim ersten starten des Scripts einmal den Inhalt von /dev/v4l/by-id/ auslesen und in ein array schreiben. Zusätzlich dann ein schleifen zähler übergeben. Wird ne Kamera gezogen wird diese übersprungen weil der Abgleich fehlschlägt. Dadurch bleibt auch der Port frei. Bei jedem Neustart des Streamers wird /dev/v4l/by-id/ wieder ausgelesen und der inhalt mit dem Array abgeglichen. Steht eine der IDs noch nicht im Array wird die hinten rangepackt.

    Dann gibt es nurnoch die limitierung auf 10 Webcams, hier müsste man eventuell nen Button im Interface machen mit dem man das Array leeren kann. Alternativ nen Counter für die Aufrufe des Startscripts, das z.B. jede ID die 10 Starts nicht vorhanden war automatisch gelöscht wird.

    Würde gerne bei der Umsetzung helfen aber dafür hab ich zu wenig Erfahrung mit Bash-Scripten ;)
  • Bash ist auch nicht meine lieblingssprache und eher eine Qual. Lösung müsste sein die einmal gefundene ID permanent einem Port zuzuweisen. Ich denke da über ein Verzeichnis mit ID als name und Portnummer als inhalt. Dann noch last port in einer Datei ablegen und immer erhöhen. Bis 65535 gibts ja genug ports:-)

    Werd das morgen mal versuchen fürs nächste Image. Das Problem hat ja jeder mit mehr als einer Webcam wenn er die mal absteckt und wieder ansteckt.
  • Oder wenn er auch nur den Server komplett neustartet ^^ Alles klar 
Sign In or Register to comment.