MQTT-Server client bricht bei Internet Unterbrechung ab

  • Hallo, ich habe das Modul "paho-mqtt" installiert, wo ich Daten verschicken kann, der Empfänger ist ein MQTT Broker, wenn ich am Server diesen Code habe:

    Code
    import paho.mqtt.client as mqtt
    
    
    string = "hallo"
    client = mqtt.Client()                
    client.connect("localhost", 1111, 60)
    client.publish("topic", string)
    client.disconnect()

    und beim Client:

    habe, dann bricht die Verbindung immer ab, wenn der Server - auch kurzzeitig - vom Internet getrennt wird.

    auch wenn ich client.loop() oder client.loop_forever() nehme.

    Kann man das mittels mqtt regeln, oder muss man im Code etwas bauen (try, etc.)?

  • Wenn ich die Doku richtig verstanden habe muss der Loop in eine while-schleife gepackt werden oder mqtt.loop_start() vor oder nachdem mqtt.connect() dann aber ohne while-schleife.

  • Ich habe das ganze nochmal durchgearbeitet, aber bei den client der die Nachrichten empfangen soll, habe ich keine while-Schleife gesehen in den ganzen Dokus, sondern nur bei den Sender (publish).


    Oder gibt es für mqtt noch eine Alternative?

  • Das Publisher Script meldet sich doch auch nur 1x beim Broker an, verschickt das "Hallo" und disconnectet danach. Das braucht doch auch ein:

    Code
    client.loop_start()

    Richtig?


    Edit:

    Das disconnect() müsste raus.


    Wie startest du die beiden Scripte?

  • Ja als Server habe ich nur (laienhaft) beschrieben, das ich am "Server" Raspi eine Nachricht zum Broker schicke, daher habe ich es als "Server" beschrieben.


    Es gibt keine Fehlermeldung aus, das Programm wird einfach beendet.

  • Das Programm soll auf weitere Nachrichten warten.

    Wenn das Internet am "Server" nicht unterbrochen wird, wird auch das client Programm, der die Nachrichten empfängt, nicht unterbrochen.

    Weder mit der "time" Variante noch mit loop_forever().

    Wenn aber am "Server" das Internet unterbricht, beendet sich das Programm am Clienten.

    Ich kann z.B. 1000 mal das Wort "hallo" schicken, es wird am client immer angezeigt wenn das Internet am "Server" steht.

  • Verwende doch bitte erstmal die richtigen Begriffe.

    Wenn aber am "Server" das Internet unterbricht, beendet sich das Programm am Clienten.

    Ja, weil die Verbindung zu deinem echten Server dem MQTT Broker (vermutlich) mosquitto verloren geht.


    EDIT:

    Fang hier nochmals an und versuche die Skripte nach diesem Schema aufzubauen.

    https://pypi.org/project/paho-mqtt/#usage-and-api

  • Du installierst den MQTT Broker auf dem RPi oder was auch immer. Der Broker läuft im Hintergrund. Dein RPi kann auch gleichzeitig Client sein.

    Jeder Client kann entweder Publisher oder subscriber oder beides sein.


    Du musst aber auch sagen wie das von statten geht. Wie oft soll der Publisher etwas veröffentlichen bzw. Wie oft empfängt der subscriber etwas.


    Wenn der Publisher nur 1x etwas veröffentlicht und danach das Script beendet wird, wie soll der subscriber dann noch etwas Empfangen?


    Du musst auch den Publisher wie auch subscriber sagen daß sie sich bei Verbindungsabbruch wieder mit dem Broker verbinden sollen.


    Das tut dein Publisher Script aber nicht.

  • 3x die Stunde soll es publishen.

    Der Puplischer wird 3x die Stunde gestartet (cronjob) das ist klar.

    Der Subscriper weiß ja nicht wann die Daten kommen, also setze ich ihn in Dauerschleife.

  • So mein Programmcode sieh jetzt folgendermaßen aus.

    Ich habe das ganze in ein try -Block gebracht, wenn der Broker nicht mehr erreichbar ist, wird das mqtt neu gestartet.