USB Port "Sniffen"

  • Hallo liebes Forum,


    nachdem nun meine USV in Python endlich funktioniert möchte ich mich meinem nächsten Projekt widmen.


    Ich habe vor, in ferner Zukunft einen Alarmmonitor im Feuerwehrhaus anzubringen. Mit dem Raspi möchte ich dann bei Alarmeingang mehrere Automatismen einleiten. Z.B. möchte ich das Hallenlicht anschalten. Dazu kommt eine Transponderanlage, die nach Alarm auf bestimmte Zeit geschaltet ist um Kameraden den schlüssellosen Zugang über öffnen der Hallentore zu ermöglichen. Zu guter letzt möchte ich damit ein Magnetventil schalten, dass bei Alarm die Druckluftanlage, sprich einen Kompressor, öffnet um die Feuerwehrautos mit genügend Druckluft zu versorgen.


    Das Ganze habe ich bereits gelöst. Und zwar über eine Relaissteuerung. Die Ladeschale unserer Funkalarmempfänger (Swissphone LGRA) kann ein internes Relais für 10 Min schalten und öffnet eine Flanke über einen Gpio. Mein Python Script funktioniert damit ganz gut.


    Jetzt mein Problem und mal wieder abtauchen in totales Neuland:


    Ich habe die besagte Ladeschale als Programmierstation umgebaut, um über USB die Meldungen auf den Raspi zu kriegen. Damit möchte ich später den Alarmmonitor füttern. Durch den umbau musste ich RX TX von der Ladeschalenplatine trennen (damit der eingesteckte Melder Strom bekommt). Nun funktioniert das interne Relais nicht mehr.


    Jetzt möchte ich den USB Eingang überwachen und wenn dort ein Alarm eingeht, die GPIOS für die Ausgangsrelais schalten. Nur habe ich von dieser Art keine Ahnung.


    Habe schonmal mit dem Scripten angefangen (siehe unten) leider kommt da im sekundentakt die Ausführung der If schleife. Das sollte wie eine Art Flanke warten auf den Eingang der Nachricht.

    Hat jemand eine Idee?


  • Jetzt möchte ich den USB Eingang überwachen ---

    Evtl. mit usbmon. Z. B.:

    Code
    modinfo usbmon
    sudo modprobe -v usbmon
    sudo ls /sys/kernel/debug/usb/usbmon
    sudo tcpdump -D
    lsusb
    sudo tcpdump -c 20 -vvveni usbmon1

    The most popular websites without IPv6 in Germany.  IPv6-Ausreden

  • Ich denke, dein USB-Port wird durch folgendes Konstrukt "geblockt": timeout=1


    Hast du mal versucht `timeout=None` zu setzen?


    Die readline()-Funktion wartet auf einen Newline-Charakter "\n" am USB-Port, da dein timeout auf 1 gesetzt ist, blockiert diesen also.


    Vielleicht schaust du dir auch nochmal in einem ersten Schritt an, wie der Aufbau der Daten ist die am USB-Port empfangen werden.

    “Don’t comment bad code - rewrite it.”

  • Es kann auc sein, dass fuer das Device faelchlicherweise schon ein Treiber vom Kernel geladen wird (Das wird anhand der PID und VID entschieden). Diesen Treiber muesstest Du dann erst finden (lsmod) und deaktivieren (rmmod). Danach kannst Du das USB-Device vom userspace aus öffnen, und dann IOCTL, bulk-transfer und control-transfer machen.


    Aber was nützt es, den Datenverkehr zu belauschen, wenn, auf der einen Seite gar keine Software ist, die mit dem Device redet?

  • Danke für die Antworten. Da es elles neuland ist die ich geschrieben habe, wird es etwas dauern bis ich alles testen kann... ist ja nur ein Hobby

    Evtl. mit usbmon. Z. B.:

    Werde ich mal probieren...


    Mit Wireshark unter Linux sollte es ebenfalls möglich sein, den Datenverkehr der USB Ports zu sniffen bzw. zu analysieren.

    Ist ähnlich mit usbmon. mache ich mal parallel...

    Danke SLS. So stelle ich mir Tipps vor :)


    Was bitte ist das für ein Konstrukt? Python 2 oder 3? Zwei newlines? Lies dich bitte mal zu print ein...

    Man versteht wie man ließt. Das ist bei Menschen leider nicht immer so klar wie mit 0 und 1. Da stell ich mir die Frage, ob es nicht gewollt ist, dass Anfänger hier fragen rein stellen. Klar kann man sich alle Bibliotheken und Bücher vorher durchlesen und alles lernen... Nur hat man dann keine Fragen mehr.


    Erhoffe mir durch Fragen meistens Lösungsvorschläge. Tipps wie "lies dich ein" aus Sicht des Schreibers gut, bringen aber dem Leser nix. Eine Lehrende Auskunft, was falsch ist und wie es richtig ist hilft da mehr. Mit dem Tip wo es nachzulesen ist, damit man es beim nächsten mal besser machen kann ist dann perfekt.


    Trotzdem danke für eure Antworten. Leider Muss ich da noch viel dran arbeiten um es zu verstehen. Bin aber dran :)

  • Man versteht wie man ließt. Das ist bei Menschen leider nicht immer so klar wie mit 0 und 1. Da stell ich mir die Frage, ob es nicht gewollt ist, dass Anfänger hier fragen rein stellen. Klar kann man sich alle Bibliotheken und Bücher vorher durchlesen und alles lernen... Nur hat man dann keine Fragen mehr.

    Ich denke @linusg's Antwort ist hart, aber herzlich. Ich glaube durch diese Schule sind alle Python-Anfänger gegangen. Python ist eine Sprache deren Syntax sich stark an PEP orientiert (quasi eine Art Lehre zum guten Programmierstil in Python) und die Programmierer dazu ermutigen, stellenweise auch zwingen soll, ordentlich zu Programmieren.


    Es gibt in der Welt zu viel beschi''enen Code, und gerade Anfänger neigen hart dazu irgendwas zusammen zu frickeln und dann Foren zu fluten mit übelsten Codes die nur sehr schwer zu lesen sind. Häufig werden Dinge gar nicht benötigt, vertauscht, verwechselt oder Code wiederholt. Wenn man sich von Beginn an angewöhnt sauber zu Programmieren, fällt das zum großen Teil einfach weg.


    Hier nochmal ein paar Dinge in die du dich einlesen solltest, damit auch dir selbst das Programmieren schneller und zugänglicher wird:


    PEP8

    Python3 Kurs

    “Don’t comment bad code - rewrite it.”

  • So jetzt schonmal feedback.


    Das timeout=None hat soweit funktioniert, dass beim Auslösen des Melders 4x die Textausgabe erfolgte. Beim 2. mal wieder 4. Das sollte sich auf 1x beschränken. Habt ihr da noch einen Tip?


    Danke schonmal

  • Ok, dann möchte ich moch für den etwas grantigen Post entschuldigen. Ein Link, in dem es ziemlich gut erklärt ist: https://www.python-kurs.eu/print.php


    Wenn es aber funktioniert wie es ist (wie ich es sehe sollte es das) und es für Dich unwichtig ist, kannst du es natürlich auch so lassen :S

    Nehme das nicht übel... Dafür bin ich zu alt. lese ja auch nicht negativ. Es demotiviert nur, wenn man solche Lösungsvorschläge bekommt und dafür ist das Forum ja nun nicht da...

    Lerne jeden Tag gerade mehr und es macht einen riesen Spaß. Dieses Forum ist (war bis zum update) eine riesen Hilfe. Danke Dafür

  • Das timeout=None hat soweit funktioniert, dass beim Auslösen des Melders 4x die Textausgabe erfolgte. Beim 2. mal wieder 4. Das sollte sich auf 1x beschränken. Habt ihr da noch einen Tip?


    Da ich immer noch nicht weiß, wie die Daten an deinem USB-Port angezeigt werden, kann ich nur raten. Ich gehe davon aus, du meinst dass bei einem einzigen Alarm vier Mal die Ausgabe "Feuer" erscheint? Das könnte man als erste Übung mit einem Counter einfach abfangen. Gibt sicher noch elegantere Lösungen.



    Ich persönlich würde den GPIO.cleanup() übrigens vom ersten try/except-Block lösen, da ein Programm nicht durch Fehler sondern auch regulär zu beenden sein sollte. Man könnte auch über ein finally nachdenken, der GPIO.cleanup() könnte aber auch fehlschlagen.

    “Don’t comment bad code - rewrite it.”

  • Ja genau das ist das Problem. Es erscheint 4x Feuer pro alarm.


    Diene Lösung ist gut. Nur verstehe ich das jetzt so, dass der counter nach dem ersten alarm auf 4 bleibt. beim 2. alarm würde dann nix passieren oder?

  • Hallo JanR,


    ich bin gerade beim gleichen "Basteln" wie du es bereits gemacht hast.


    Aktuell schaffe ich es nicht den Text aufs Raspberry zu bekommen.


    Hast du noch was in irgendwelchen Dateien des Rasperry's einstellen müssen?


    wenn ich dmesg aufrufe, wird mir der USB Adapter als ttyUSB0 angezeigt, auch mit stty mit einer Baudrate von 9600.


    Viele Grüße Markus!