Nach PING senden funktionieren Interrupts nicht mehr

  • Hallo,

    Ich benötige ein Programm, welches in Abständen einen Ping sendet um das Netz zu kontrollieren und gleichzeitig muss ich 2 GPIOs mittels Interrupt kontrollieren.

    Um mein Problem zu verdeutlichen, habe ich mal dieses Beispiel geschrieben. (Man verzeihe mir die unkonformität der Variablennamen)

    Wenn ich das Beispiel in der Python-Shell laufen lasse, funktioniert alles einwandfrei. So starte ich das Programm zum Test von der Konsole (auch als root), /usr/bin/python /home/pi/test.py

    Sobald die IP abgefragt wird, ist es nicht mehr möglich, den Interrupt auszulösen. Ich habe das Programm auf mehreren verschiedenen Pis getestet. Leider immer mit dem gleichen Ergebnis.

    Vielleicht finde ich ja in diesem Forum jemanden, der mir dieses eigenartige Verhalten erklären kann? Es wäre echt toll, wenn jemand eine Lösung für mich hätte, weil ich das Programm gern mit diesen 2 Funktionen nutzen würde.

    Vielen Dank schon mal im Vorraus für's Lesen.

    MfG LK61

  • Nach PING senden funktionieren Interrupts nicht mehr? Schau mal ob du hier fündig wirst!

  • Hallo LK61,

    sehe ich das richtig?

    Dein Programm ruft einmalig "ping" auf - und macht danach nichts mehr, außer auf Interrupts zu warten? Ich kann mir irgendwie nicht vorstellen, dass da so beabsichtigt sein kann.

    Und mehrere Threads brauchst Du hierfür auch nicht.

    Was passiert denn, wenn Du PruefeNetz() in die while true-Schleife einbaust?

    Beste Grüße

    Andreas

    Ich bin wirklich nicht darauf aus, Microsoft zu zerstören. Das wird nur ein völlig unbeabsichtigter Nebeneffekt sein.
    Linus Torvalds - "Vater" von Linux

    Linux is like a wigwam, no windows, no gates, but with an apache inside dancing samba, very hungry eating a yacc, a gnu and a bison.

  • Und mehrere Threads brauchst Du hierfür auch nicht.

    Also in meinen verlinkten Thread war das wie folgt: Wenn ich im "Pingmodus" war, schaltete bei mir der Sekundenzeiger nicht mehr weiter. Ok dieser wurde bei mir nicht per Interrupt weitergeschaltet sondern per expliziten Befehl. Aber deshalb kam ich auf die Idee dass er eventuell von dem Interrupt nichts mitbekommt wenn er am pingen ist.

    EDIT: Zeile 40/41, diese Schleife kannst du ersetzen mit dem Befehl signal.pause() Modul signal zuvor importieren

    EDIT2: Warum verwendest du denn noch Python2: klick mich

    • Offizieller Beitrag

    Hallo LK61,

    aus Interesse habe ich das mal mit gpiozero grob nachgestellt und das funktioniert gut.

  • Hallo Hyle,

    danke für das Sample. Das Programm, welches ich geschrieben habe, ist sehr komplex. Grob umschrieben: Am Pi sind mehrere Transponertlesegeräte angeschlossen. Je nachdem welcher Transponder gerade Daten liefert, wird noch ein Interrupt ausgelöst. Daher weiß das Programm, welche Tür es öffnen muss. Das Ganze ist mittels WLAN mit dem internen Frimennetz verbunden. Die gelesenen Daten werden an einen SQL-Server gesendet. Es wird aufgezeichnet, wer/wann eine Tür geöffnet hat. Ist nun durch Stromausfall der Server nicht erreichbar, werden die Daten lokal auf dem Pi gespeichert. Ist das Netz wieder bereit, verbindet der Pi erneut mit dem Netz und sendet die lokal gespeicherten Daten an den SQL-Server. Bis jetzt kontrolliert immer ein Pi eine Tür. Das System funktioniert seit 2 Jahren in m einer Fa. absolut perfekt (26 Geräte). Nun habe ich aber Geräte gebaut, welche mehrere Transponder kontrollieren können. Dazu benötige ich den Interrupt.

    Das Ganze mal zum Verständnis.

    Andreas, jetzt vielleicht aller klarer??? :)

    Wenn mir nichts anderes übrig bleibt, muss ich das ganze auf gpizero umstricken. Lieber wäre mir aber, warum der Fehler in der Konsole überhaupt auftritt.

    Ich habe das Problem, wenn ich eine neue Verison ins Netz stelle, updaten sich die Geräte augenblicklich selbst und arbeiten mit der neuen Version. Verheerend wäre ein Update, welches Geräte außer Betrieb setzen würde.

    Vielleicht gibt es ja hier einen Linux-Profi, welcher mir eine Lösung des eigentlichen Problems nennen kann. Linux, Python und Co sind nicht so mein Ding. Ich komme aus anderen Betriebssystemen mit anderen Programmiersprachen - Sorry!

    Wenn ich auch hier keine Lösung finde, werde ich mich wohl nach anderen Möglichkeiten umsehen, das Netz zu überprüfen. Da ich für die Updates sowieso ein Verzeichnes unseres Fileservers mounte, wäre das ein Ansatzpunkt.

    Danke schon mal an alle, die sich des Problems angenommen haben.

    Ciao LK61

  • Das Programm, welches ich geschrieben habe, ist sehr komplex

    Also ist das nicht der Orginalcode in #1 den du gepostet hast?!

    Ich habe das Problem, wenn ich eine neue Verison ins Netz stelle, updaten sich die Geräte augenblicklich selbst und arbeiten mit der neuen Version.

    Dann verwende einen Testpi um den Code zuvor zu prüfen.

    Nutze die Gelegenheit und wechsle von Python2 auf Python3 und nimm dabei im selben Zug auch gleich die Umstellungen mit wie z.B der Wechsel auf gpiozero und außerdem von os.system zu subprocess

  • Hallo,

    Zitat


    Ich komme aus anderen Betriebssystemen mit anderen Programmiersprachen

    Mal so rein Interesse halber: warum kümmerst du dich dann um dass Projekt? Wie du ja völlig richtig sagst, wäre das schon doof, wenn das ganze nicht funktioniert und keine Türe mehr auf geht. Von daher sollte man das schon wissen, was man tut (oder besser nicht).

    Denkanstoss halb außerhalb des eigentlichen Problem: warum nutzt ihr nicht eine Datenbank, die umempfindlich gegen (temporäre) Ausfälle eines Servers ist und sich automatisch replizieren kann, wenn das Netz wieder da ist? CouchDB wäre so eine DB. Dann kannst du dir auch den PING sparen.

    Gruß, noisefloor

    • Offizieller Beitrag

    Hallo LK61,

    von einem Python-Guru bin ich weit entfernt, deshalb nutze ich ja gpiozero, weil das so einfach in der "Endanwendung" ist. Man braucht sich über Threading oder Interrupts kaum Gedanken zu machen und es wird ständig gepflegt/weiterentwickelt.

    Mal was anderes: Wenn in gewissen Abständen gepingt werden soll, warum steht dann die Funktion PruefeNetz() nicht in der while-Schleife? Und diese nicht zwischen einem try: und except ...: ;)

    Ich pinge hiermit auch mal bootsmann an...

  • Hallo hyle,

    so schrub ich einstens in Beitrag #3. Und begann mich zu wundern...

    Beste Grüße

    Andreas

    Ich bin wirklich nicht darauf aus, Microsoft zu zerstören. Das wird nur ein völlig unbeabsichtigter Nebeneffekt sein.
    Linus Torvalds - "Vater" von Linux

    Linux is like a wigwam, no windows, no gates, but with an apache inside dancing samba, very hungry eating a yacc, a gnu and a bison.

  • Hallo hyle,

    ach, egal, lasse uns einfach jeden Tag aufs Neue ganz neue Freunde kennen lernen.

    Beste Grüße

    Andreas

    Ich bin wirklich nicht darauf aus, Microsoft zu zerstören. Das wird nur ein völlig unbeabsichtigter Nebeneffekt sein.
    Linus Torvalds - "Vater" von Linux

    Linux is like a wigwam, no windows, no gates, but with an apache inside dancing samba, very hungry eating a yacc, a gnu and a bison.

  • Zitat

    Mal so rein Interesse halber: warum kümmerst du dich dann um dass Projekt? Wie du ja völlig richtig sagst, wäre das schon doof, wenn das ganze nicht funktioniert und keine Türe mehr auf geht. Von daher sollte man das schon wissen, was man tut (oder besser nicht).

    Denkanstoss halb außerhalb des eigentlichen Problem: warum nutzt ihr nicht eine Datenbank, die umempfindlich gegen (temporäre) Ausfälle eines Servers ist und sich automatisch replizieren kann, wenn das Netz wieder da ist? CouchDB wäre so eine DB. Dann kannst du dir auch den PING sparen.

    Hallo noicefloor,

    Ich habe das Projekt ins Leben gerufen. Hardware, Software, Datenbanktzgriff usw.

    Wir sind ein großer internationaler Konzern mit X GPOs. Da ist es nicht mal eben möglich, eine xbeliebige Datenbank aufzusetzen. Die DCs stehen nicht in Deutschland.

    Ich schrieb extra - ich habe mal ein Beispiel geschrieben. Genau dieses Beispiel sollte das Problem vedeutlichen. Ich habe in diesem kleinen Sample extra auf try verzichtet. Das Problem tritt übrigens auch unter Python3 auf.

    Ich hatte gehofft, eine Antwort auf meine Frage zu erhalten. Nur das war für mich interessant.

    Die Tipps sind gut gemeint und ich bedanke mich auch dafür, aber die Frage war eben eine andere.

    Ich finde es traurig, dass jedes Mal, wenn jemand neues eine Frage stellt, dieser sofort als DAU betrachtet wird. Sicher programmiere ich schon einige Zeit länger als die meisten hier. Seit 1988 verdiene ich mir damit jedenfalls meine Brötchen. Das nur mal so am Rande.

    Bestimmt trete ich jetzt wieder endlose Diskusionen los,

    Es gibt doch hier sicher auch Leser, welche sich mit Linux und der Hardware bestens auskennen. Vielleicht kann mir ja doch noch jemand erklären, warum ein Ping die Interrupts lahm legt?

    Danke noch mal an Hyle für den Code. Ich werde das mal als Ansatz betrachten.

    Ciao und schönen Tag noch.

  • Also ist das nicht der Orginalcode in #1 den du gepostet hast?!

    Übersehen oder ignoriert?!

    Naja was solls, bei mir funktioniert der ping:

  • Hallo LK61,

    einmal probiere ich es noch. Dann bin ich auch hier raus.

    In Beitrag #3 dieses Threads habe ich Dir schon mal einen Tip gegeben. Ich denke, dass es mein gutes Recht ist, denn ich programmiere - wenn zwar nicht in Python, so doch in anderen Programmiersprachen - seit 1980. Daher kann ich wohl Abläufe in Quellcode durchaus sicher erkennen.

    Es gibt doch hier sicher auch Leser, welche sich mit Linux und der Hardware bestens auskennen. Vielleicht kann mir ja doch noch jemand erklären, warum ein Ping die Interrupts lahm legt?

    Das eine, was Du glaubst beobachtet zu haben, hat mit dem anderen nichts zu tun. In Deinem gezeigten Code rufst Du ping nur einmal auf - und dann nicht wieder. Deswegen wird der Ablauf, den Du umsetzen wolltest, nicht erreicht.

    Natürlich kannst Du in einem einzigen Programm ping abfragen und auf GPIO-Ereignisse reagieren. Über Interrupts, über Polling, was immer Du möchtest, wird das funktionieren. Du kannst auch Interrupt-Handler programmieren, die auf Datei-Änderungen reagieren. Linux ist letztlich auch nur ein dateibasiertes Betriebssystem, in dem jegliche Änderungen in Dateien aufgezeichnet werden.

    Sollte es nicht ausreichend sein (was ich basierend auf Erfahrungen aber bestreiten kann), innerhalb einer Endlosschleife eines einzigen Programms das Ergebnis von ping abzufragen und z.B. über GPIO weitere Eingaben zu tätigen, dann besteht die Möglichkeit, zwei Anwendungen z.B. über eine Socket-Verbindung oder über sog. named pipes (FIFO) kommunizieren zu lassen. Wie dies funktioniert, kannst Du in einem Thread zum Thema Interprozess-Kommunikation nachlesen und anhand von mehreren Quellcodes nachvollziehen. In Deinem Fall würde eine Anwendung pingen und das Ergebnis irgendwohin schicken. Eine andere Anwendung würde GPIO-Taster abfragen und das Ergebnis auch irgendwohin schicken. Die dritte Anwendung würde von beiden anderen Anwendungen Informationen erhalten und darauf reagieren.

    Eine weitere Kommunikationsmöglichkeit besteht noch über Umgebungsvariablen. Daran sind aber Voraussetzungen erfüllt, die möglicherweise nicht immer einzuhalten sind. Ist aber ein Thema für sich - aber sehr einfach umsetzbar.

    Dass man innerhalb einer einzigen Anwendung einen ping durchführen und das Ergebnis als Steuerung eines weiteren Programmablaufes nutzen kann, habe ich im Quellcode von HostRepair gezeigt (lässt sich hier im Forum finden, sofern man danach sucht). Ist aber nicht in Python programmiert - sollte aber das Prinzip verdeutlichen.


    Beste Grüße

    Andreas

    Ich bin wirklich nicht darauf aus, Microsoft zu zerstören. Das wird nur ein völlig unbeabsichtigter Nebeneffekt sein.
    Linus Torvalds - "Vater" von Linux

    Linux is like a wigwam, no windows, no gates, but with an apache inside dancing samba, very hungry eating a yacc, a gnu and a bison.

    Einmal editiert, zuletzt von Andreas (23. November 2017 um 09:34)

  • Hallo und danke noch mal an alle die mir geholfen haben.

    Ich habe Hofeis Rat befolgt und die IP-Abfrage in einem separaten Thread laufen. Das funktioniert zum Glück mit geringem Aufwand genau so wie ich es wollte. os.system habe ich zu subprocess umgestellt, aber auf Python3 umzusteigen, da muss ich noch einiges beachten. Ich denke, mein ganzer Zugriff auf den MS-SQL Server wird sich da ändern. So wie ich gelesen habe, soll es da Probleme geben. Aber dazu mache ich mich noch schlau. GPIOZERO kann ich im Moment ebenfalls nicht einsetzen, da ich auf allen Geräten die Bibliothek nachinstallieren muss. Das wäre mit Putty zwar nicht so das Problem, aber die PI's haben keinen Internet-Zugang. Ich muss also erst mal eine Möglichkeit suchen, das offline zu tun.

    Ciao LK61

  • ... die IP-Abfrage in einem separaten Thread laufen. Das funktioniert ...

    Das heißt, anders als Du in deinem 1. Beitrag geschrieben hast:

    Zitat

    Sobald die IP abgefragt wird, ist es nicht mehr möglich, den Interrupt auszulösen.

    hat das _Abfragen der IP-Adresse_ schon gar nicht richtig funktioniert?

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

    Meine PIs

    PI4B/8GB (border device) OpenBSD 7.4 (64bit): SSH-Server, WireGuard-Server, ircd-hybrid-Server, stunnel-Proxy, Mumble-Server

    PI3B+ FreeBSD 14.0-R-p6 (arm64): SSH-Serv., WireGuard-Serv., ircd-hybrid-Serv., stunnel-Proxy, Mumble-Serv., ddclient

    PI4B/4GB Bullseye-lite (64bit; modifiziert): SSH-Server, WireGuard-Server, ircd-hybrid-Server, stunnel-Proxy, Mumble-Server, botamusique, ample

Jetzt mitmachen!

Du hast noch kein Benutzerkonto auf unserer Seite? Registriere dich kostenlos und nimm an unserer Community teil!