Ping in µPython

  • Hallo,

    nun habe ich mal wieder etwas Zeit gefunden an meinem Projekt weiter zu arbeiten. nachdem nun auch das Problem mit dem E-mail Versand gelöst ist, bin ich auf ein weiteres Problem gestoßen. Nun habe ich in den weiteren Test festgestellt, dass eine WLAN nicht gleichbedeutend einer Internetverbindung ist. Was ja auch logisch erscheint.

    Nun möchte ich bevor ich den Mail Versand starte, noch eine Abfrage durchführen, ob der eingetragene E-MAil-Provider via Ping erreichbar ist.
    Dazu meine Vorstellung, wenn das System eine WLAN Verbindung zu eienr der gespeicherten, oder angewählten WLANs aufgebaut hat, möchte ich die Visualliseierung dahingehend, und einen Programmfehler vermeiden.
    Dazu soll die Dual LED folgende 3 Zustaände anzeigen:

    - keine WLAN Verbindung - Anzeigefarbe ROT

    - WLAN Verbidung hergestellt, Anzeige GRÜN blinked

    - zusätzlich zum vorhergegenden Punkt wenn ein PING ( oder ähnliches ) an den Provider positiv beantwortet wir, soll das Blinken in ein Dauer-GRÜN übergehen. Zudem ein Merker gesetzt werden, dass der E-MAIl Versand erfolgen kann.

    Wie führe ich nun in µPython einen Ping aus ? Mit dem normalen Python ist das mit GPIOZERO.PingServer() kein Problem. Nur steht diese Funktion bei µPython leider nicht zur Verfügung.

    Steffen.

  • Hallo,

    da du auf einem Mikrocontroller unterwegs bist gibt es keinen `ping` Befehl, wie ihn Linux oder Windows an Bord haben. Also musst du das wohl low-level selber implementieren. Bzw. schauen, ob das schon jemand für MicroPython gemacht hat.

    Eine Suche z.B. nach "python low level ping test" liefert ein paar Treffer - wie gut die sind bzw. wie gut diese auch in MicroPython implmentierbar sind -> keine Ahnung.

    Gruß, noisefloor

    NACHTRAG: https://gist.github.com/shawwwn/91cc89…d99ec34c38195fb

  • Hallo noisefloor,

    Danke für den Hinweis.

    Wäre es da nicht besser, jetzt mal rein so gesprochen, da für diesen meinen Fall keine wirkliche Übertragungszeit notwendig ist, dass man ein über einen Socket oder was auch immer eine Webseite oder ähnliches Aufruft, um dann via try / except diese Abfrage umsetzt. Rein vom Platzbedarf und Programmumfang ist mir dieser so nicht ganz einwandfrei PING so umfänglich ?
    Dazu dann wieder die nächste farge, wie macht man überhaupt eine solchen Webseiten Zugriff ?

    Steffen.

  • Rein vom Platzbedarf und Programmumfang ist mir dieser so nicht ganz einwandfrei PING so umfänglich ?

    Hast du soviel Code auf dem Controller, das es für die 107 Zeilen keinen Platz mehr hast?

    Grundsätzlich ist das meiner Meinung nach nicht sonderlich aufwändig. Du nimmst den Code und speicherst ihm auf deinem Controller unter "uping.py" ab und in deinem Hauptprogramm importierst du uping import uping und rufst dann darauf 'ping' auf:

    uping.pin(IP_ADRESSE)

    Es gibt auch ein Thread dazu:

    https://forum.micropython.org/viewtopic.php?…20487ae44c6ae15

    Grüße

    Dennis

    🎧 With the music execution and the talk of revolution, it bleeds in me and it goes 🎧

  • Einen Fehler beim Mailversand muss man doch sowieso ordentlich behandeln, denn ein erfolgreicher Ping sagt ja nichts darüber aus, dass man danach auch erfolgreich eine Mail versenden kann. Selbst wenn die Internet- oder WLAN-Verbindung nicht zwischen Ping und Versand weggebrochen ist, kann es ja immer noch sein, dass der SMPT-Server keine Verbindung zulässt, nicht läuft, überlastet ist, abbricht, was auch immer.

    Klar kann man auch eine Webseite abrufen, da passiert dann aber mehr als bei dem Ping-Code. Das ist schwergewichtiger, weil da tatsächlich eine TCP-Verbindung aufgebaut und mit einem HTTP-Server kommuniziert wird. Entweder machst Du das selbst, also HTTP über ein Socket ”sprechen”, oder schaust ob es dafür eine Bibliothek gibt. Wovon ich mal ganz stark ausgehen würde.

    “Dawn, n.: The time when men of reason go to bed.” — Ambrose Bierce, “The Devil's Dictionary”

  • Hallo,

    Hast du soviel Code auf dem Controller, das es für die 107 Zeilen keinen Platz mehr hast?

    Ganz ehrlich kann ich das nicht sagen, aber das scheint mir doch etwas viel Code !?
    Ich habe dort schon einen Webserver, den E-Mail Versand, und noch so einige Dinge am laufen, bzw bin noch dabei diese erst richtig zum laufen zu bringen. Und jetzt schon stürzt das teil gelegentlich mal ab, also die Programmausführung wird beendet.
    Deswegen wollte ich jetzt keine unnötzigen Dinge installieren, oder aufspielen, die sehr viele Code, und Bibliothekaufrufe enthalten.

    Steffen.

  • Hallo,

    dann müsstest du den Code mal zeigen, ich bin mir sicher der ein oder andere könnte die Ursache finden.

    Wenn das Programm wegen fehlendem Speicher abstürzt, dann wird eine entsprechende Exeption mit ausgegeben.

    Grüße

    Dennis

    🎧 With the music execution and the talk of revolution, it bleeds in me and it goes 🎧

  • Hallo Dennis89,

    Leider so muss ich dich enttäuschen, wenn ich meine "Stück für Stück" Testläufe über Thonny starte passiert gar nichts. Irgndwann einmal, wenn der Fehler auftritt komt dann mit Minuten Verzögerung die Meldung, dass das Board nicht mehr ereichbar ist.
    Zudem übersetzt die Meldung, dass man den STOPP Button drücken soll, um die Verbindung wieder herzustellen. Auch das hilft nicht. Hier hilft dann nur die USB Verbindung zu unterbrechen, und das Board neu anzustööpseln.
    Leider ist das ganze Konstrukt noch im werden ;) So arbeite ich mich erst einmal Stück für Stück vor, programmiere mehr schlecht als Recht die einzelnen Sachen, und probiere immer mal auch wieder andere Wege aus.
    Wenn das Chaos Konstrukt dann fertig ist, und seinen Zweck erfüllt, stelle ich den Code hier ein damit wahrscheinlich noch 100 Optimierungsvorschläge auf mich einprasseln.
    Oder wüsstet du einen Weg wie man ein ESP32 noch zusätzlich außer über diesen USB Anschluss überwachen kann, damit man zu einer Fehlermeldung kommt ? :helpnew:

    :danke_ATDE:

    Steffen.

  • Hallo,

    hast du eventuell eine Endlosschleife drin, die ohne die kleinste Pause durchrennt?

    Ich gehe immer so vor, das ich mein Programm immer um eine Funktion erweitere und nach jeder Funktion wird diese und das Programm mit ihr getestet. Wenn dann mal ein Fehler auftaucht können nur ein paar Zeilen Code die Ursache sein. Das würde ich dir auch raten. Speichere dein Programm mal irgendwo ab und fang auf dem ESP mal "neu" an. So damit du wirklich immer nur ein paar Zeilen Code (eine Funktion) hinzufügst und dann wieder das Zusammenspiel testest.

    Wichtig wäre hier natürlich dass die Funktionen nicht von irgendwelchen Variablen abhängen die global verfügbar sind. Denn sonst kannst du die Funktionen nie alleine für sich richtig testen.

    Es gibt auch für MicroPython ein Logging-Modul, dazu kann ich aber nichts sagen, das habe ich noch nie verwendet. Für dein Problem fallen mir nur die zwei Möglichkeiten ein: Vorgehensweise wie oben beschrieben oder Code zeigen und hoffen das jemand was findet. Das dabei Optimierungsvorschläge mit kommen ist völlig normal bei uns Hobbyprogrammierer und ist keines Falls schlimm. Ich zeige meinen Code alleine deswegen schon gerne.

    Grüße

    Dennis

    🎧 With the music execution and the talk of revolution, it bleeds in me and it goes 🎧

Jetzt mitmachen!

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