Forum: PC-Programmierung Mosquitto letzte Nachricht erhalten


von anna (Gast)


Lesenswert?

Hi,

gibt es eine möglichkeit, dass Mosquitto, wenn ich einen Thread 
subscribe, dass ich die letzte Nachricht bekomme?

Also nehmen wir an, ich habe einen ADC, welcher alle 30 Minuten eine 
Messung vornimmt und diese dann an den Thread home/temp schickt und der 
ADC misst um 10:30 Uhr, ich melde mich jetzt aber mit meinem Client um 
10:36 erst an, dann bekomme ich erst in 24 Minuten mit "wie warm es 
ist".
Wenn der Mosquitto aber die nachricht von 10:30 dem "neuen Zuhörer" 
schicken würde, bräuchte ich keine extra Messung antriggern <- was meine 
Aktuelle Lösung ist!

Vielen Dank

von Wolfgang (Gast)


Lesenswert?

Dafür musst du die Message als "Retained Message" verschicken, also mit 
gesetztem Retain-Flag.
https://www.hivemq.com/blog/mqtt-essentials-part-8-retained-messages

von anna (Gast)


Lesenswert?

sehr sehr geil...

Danke :)

von bert (Gast)


Lesenswert?

Hi,

geht das auch mit einem ESP8266 (ich Programmiere mit der Arduino IDE)

Vielen Dank

von Michael U. (amiga)


Lesenswert?

Hallo,

bert schrieb:
> geht das auch mit einem ESP8266 (ich Programmiere mit der Arduino IDE)

das hat mit dem ESP8266 nichts zu tun, das ist Sache des benutzten 
MQTT-Clients.
Und ja, sowohl PubSubclient als auch AsyncMQTT können es, wobei der 
AsyncMQTT eigentlich alles unterstützt was MQTT kann.

Gruß aus Berlin
Michael

von Marco H. (damarco)


Lesenswert?

Aber aufpassen, nicht alle MQTT Server unterstützen das auch. Wer mit 
google oder dem AWS kommuniziert und das Flag setzt wird hart getrennt.

Das AWS hat dazu die Geräte Schatten...

mein Stack leitet das aus der URI aws:// ab und entfernt das Flag 
wieder, weil sonst das AWS die TCP/IP Verbindung sofort trennt.

Also vorher nachlesen ob das Flag auch unterstützt wird, da hierzu Daten 
gespeichert werden müssen. Nicht alle Anbieter wollen das und ignorieren 
es bzw. schließen die Verbindung.

Mit MQTT 5 gibt es Abhilfe da bekommt man einen Error Code zurück.

: Bearbeitet durch User
von Michael U. (amiga)


Lesenswert?

Hallo,

Marco H. schrieb:
> Aber aufpassen, nicht alle MQTT Server unterstützen das auch. Wer mit
> google oder dem AWS kommuniziert und das Flag setzt wird hart getrennt.

dann ist es kein MQTT-Broker bzw. er ist nicht Standard-konform. Punkt.
Wäre für mich z.B. auch ziemlich sinnlos.
Beispiel? Eine Anzeige bekommt alle 10 Minuten einen Wert per MQTT.
Jetzt ist die Anzeige kurz stromlos o.ä.
Wenn ich die jetzt wieder anmache muß eine Retained Message kommen, weil 
ich ja nicht vielleicht 10 Minuten warten will, bis die nächste reguläre 
Message vom Publisher kommt. Auch ein Aktor möchte nach einem 
Stromausfall per Retained sofort wieder an gehen wenn das die letzte 
Message vom Publisher war.

Das macht ja für mich gerade MQTT aus, daß ich das Verhalten der 
Beteiligten nach den Anforderungen bestimmen kann. Der Broker hat zu 
machen, was der Standard fordert.

Womöglich geht bei obigen auch keepAlive und lastWill nicht richtig...

Gruß aus Berlin
Michael

von Marco H. (damarco)


Lesenswert?

Im AWS wird das über die Geräte Schatten gemacht. Wie gesagt wenn du 
diese Flags setzt wird die Verbindung getrennt.

von Marco H. (damarco)


Lesenswert?

Das mag sein aber...

Wenn man einen öffentlichen Broker betreibt und 30000 Themen hat diese 
jeder auch noch Retain(speichern) setzt hat man 30000 mal Müll auf dem 
System. Der mitunter nie wieder abgeholt wird.

Also jeder Broker muss sich über ein Verfallsdatum Gedanken machen. 
Hierzu sollte man in der Dokumentation nachlesen wie das gehandhabt 
wird.


Beim AWS ist die Lösung mit dem Schatten gar nicht so dumm. Das Gerät 
hat wie gesagt einen Schatten und der wird aktualisiert. Google hat 
glaube ich so etwas ähnliches und beide schränken die MQTT 
Funktionalitäten ein.

Mit dem Schatten kann man auch sehen ab eine Aktion erfolgreich war und 
auch den Ist Zustand wieder einlesen. Der Schatten hat also zwei Seiten. 
Beim Anmelden holt man sich den Schatten und kann den an dem Aktor auch 
die noch ausstehende Aktion auslösen.

Also wenn du wild auf deine Taste drückst bleibt der letzte gültig 
Status erhalten ! Da das Gerät den Schatten nicht aktualisiert hat.

https://docs.aws.amazon.com/de_de/iot/latest/developerguide/using-device-shadows.html

: Bearbeitet durch User
Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.