Fragen zu MQTT

OP #7548507
Lesenswert?

Moin,

Ich frag' mal hier, obwohls nicht direkt mit Smart Behausung zu tun hat, aber ich geh' mal davon aus, dass hier doch eher Leute Bescheid wissen. Grad guck' ich mir zum 1. Mal so ein bisschen MQTT an - und schon stolper ich ueber ein paar Dinge, die wahrscheinlich jedem, der das schon laenger/oefter gemacht hat, voellig klar sind. Nur mir halt noch nicht. Alzont: Ich hab' hier kein echtes MQTT-Equipment rumfliegen, sondern das ist nur eine Trockenschwimmuebung unter Linux; Netzwerk ist nur der lokale Horst. Da hab' ich mir mosquitto installiert und folgendes Setup: mit "mosquitto" den Broker gestartet in einem Terminal lausch' ich so:

1
mosquitto_sub -h 127.0.0.1 -t bla/blupp

im anderen quake ich so:

1
mosquitto_pub -h 127.0.0.1 -t bla/blupp  -m dfgghf

So weit so gut. Laeuft erstmal. Jetzt frage ich mich/euch:

  • Gibt's bei MQTT irgendein genormtes Verfahren, wie man von einem Geraet mitbekommt, auf was fuer topics es was publiziert? und was das dann bedeutet (Scheint ja auch "gerne" mal JSON als Payload genommen zu werden)? Oder auf welchen topics es selbst subscribed ist? Also so aehnlich wie evtl. eine MIB bei SNMP? Oder muss das stumpf alles im Datenblatt des Geraets stehen, sonst hab' ich keine Chance - ausser mit wireshark mir einen Wolf zu lauschen und auf Nachrichten zu hoffen?

  • Gibts ein genormtes Verfahren, bei einem Geraet eine "Publikation" per MQTT zu triggern? Also z.b. hab' ich ein Thermometer. Das kann jetzt z.b. alle Sekunde die Temperatur per MQTT ins Netz troeten, obwohl es keinen interessiert. Da waer's doch evtl. gscheider, das Thermometer im Bedarfsfall einfach zu fragen: "Wieviel Grad hats denn bei dir"...Ist da was bei MQTT vorgesehen?

Gruss WK

#7548541
Lesenswert?

MQTT ist ein Protokoll zur Nachrichtenübermittlung, wie Mail. Da gibt es auch keine Info wem jemand eine Mail zu schreiben gedenkt, oder ein Verfahren eine Mail anzufordern.

Also

  • Nur der Broker weiß, was jemand abonniert hat. Vielleicht teilt er dir das sogar mit.
  • Was ein Gerät schickt, wann und an welches Topic weiß allein der Programmierer des Geräts. Wenn er dir nix erzählt: Pech.
  • Was ein Gerät belauscht, kann dir der Broker sagen, das ist der einzige der das weiß. Was man da hin schicken kann und was dann passiert weiß auch hier wieder nur der Gerätekonstrukteur. Keine Info? Keine Kekse.
#7548798
Lesenswert?

Jens M. schrieb:

MQTT ist ein Protokoll zur Nachrichtenübermittlung, wie Mail. Da gibt es auch keine Info wem jemand eine Mail zu schreiben gedenkt, oder ein Verfahren eine Mail anzufordern.

Genau, nicht einmal die Sprache ist standardisiert. Tatsächlich ist die Payload kein String sondern binärdaten, d.h. da kann wie bei TCP oder UDP alles als Payload drinstehen. MQTT selbst regelt nur den Transport, nicht den Inhalt.

  • Nur der Broker weiß, was jemand abonniert hat. Vielleicht teilt er dir das sogar mit.

Bei MQTT Version 3 ging das noch nicht, ab Version 5 kann man das abfragen. Hier ein paar Infos, was bei MQTT 5 anders ist: https://www.heise.de/hintergrund/Evolution-der-IoT-Kommunikation-MQTT-5-3941656.html

  • Was ein Gerät schickt, wann und an welches Topic weiß allein der Programmierer des Geräts. Wenn er dir nix erzählt: Pech.

Es gibt mehrere "Standards" wie der Namensraum der Topics aufgeteilt ist und auch der Inhalt definiert ist. Sparkplug hört man ab und zu mal als Beispiel. Wir haben unsere eigene Definition gemacht.

Wenn du nur eine Seite (Client oder Server) in der Hand hast, dann musst du mit dem leben, was die entsprechenden Geräte liefern. Ggf. kannst du wenigstens die Namen und Pfade der Topics definieren und damit den Clients das Leben erleichtern.

Mit wildcard wie '#' kannst du dann z.B. alles von einem Gerät oder einer Gruppe von Geräten subscriben, hier ein paar Beispiele

  • 'home/#'
  • 'home/kitchen/#'
  • 'home/kitchen/heating/#'
  • 'home/kitchen/heating/current_temperatur'
  • '#' Michael
#7548844
Lesenswert?

MQTT ist halt ein Transportprotokoll. Alle höheren Schichten muss man entweder selber basteln oder einen Standard für die höheren Schichten finden an dem man sich dann hält.

Wenn du insgesamt ein System, nicht nur ein Transportprotokoll haben möchtest, in dem auch höhere Schichtens standardisiert sind, dann wäre das LwM2M mit CoAP und IPSO Smart Objects, statt MQTT.

Der Stack ist aber vielen Bastlern zu kompliziert - obwohl er es praktisch gar nicht ist. So sind IPSO Smart Objects weder Smart noch wirkliche Objects, sondern einfach Datenstrukturen. Jede standardisierte Datenstruktur hat eine Nummer, die Object ID.

Für dein Thermometer-Beispiel wäre die standardisierte Object ID 3303 und ein Sensor würde z.B. als /3303/0/5700 adressiert werden. Dabei sind

0: Erste Instanz eines Temperatursensors, also der erste Sensor im Client 5700: die Resource ID, auch standardisiert, 5700 adressiert die aktuelle oder zuletzt gemessene Temperatur.

Der Server würde vom Client einfach dann /3303/0/5700 auslesen wenn er es braucht. Oder der Server fordert eine Observation vom Client an. In der Observation-Anforderungen würde der Server Bedingungen angeben unter denen er vom Client hören möchte. Wie sofort, ein Zeitintervall, nur wenn sich die Temperatur um einen gewissen Wert geändert hat oder Minimal- oder Maximalwerte unter- oder überschritten werden.

Sind die Bedingungen erfüllt sendet der Client ein Notify.

(Firma: Funkenflug Industries) #7550578
Lesenswert?

Ich hatte mir MQTT angeschaut, als ich angefangen habe, mit den Shelly-Strommessgeräten und Zwischensteckern (Pro 3EM und Plus Plug S) herumzubasteln. Die Dinger haben einen ESP32, verbinden sich mit dem WLAN und ich habe keinen Mehrwert mehr zu HTTP-basierten Varianten gefunden - außer, daß diese MQTT-Nachrichten sehr umständlich zu basteln und zu dekodieren sind. Variable Länge einzelner Werte, höchstes Bit gibt an, ob weitere Bytes folgen - für unterdimensionerte µCs mit zu wenig Speicher und kaum messbarer Bandbreite des Übertragungskanals evtl. brauchbar, dazu hat man keine Kontrolle darüber, wann aktuelle Daten zum Broker gesendet werden - bei meinen Steckdosen führte das dazu, daß diese Daten bei Ankunft bereits schon wieder veraltet waren und geringfügige Änderungen in den Messwerten (die ich aber durchaus sehen wollte) überhaupt nicht übertragen wurden. Also das sind für mich keine Mehrwerte, sondern Krücken, die MQTT zumindest bei meinen Versuchen unbrauchbar machen.

Es geht doch nichts über ein selbst geschriebenes Script und eine eigene Datenbank, das funktioniert selbst mit WLAN sekundengenau und die Shellys bieten eine super Schnittstelle dafür, wo man sich die Messwerte einfach via HTTP ziehen kann.

#7550627
Lesenswert?

Ben B. schrieb:

dazu hat man keine Kontrolle darüber, wann aktuelle Daten zum Broker gesendet werden - bei meinen Steckdosen führte das dazu, daß diese Daten bei Ankunft bereits schon wieder veraltet waren und geringfügige Änderungen in den Messwerten (die ich aber durchaus sehen wollte) überhaupt nicht übertragen wurden.

Na das liegt aber an den Krücken von Shellies, die die Messwerte nur in einem festgelegten Zeitraster senden, nicht an MQTT. Und wenn du bei MQTT QoS 1 oder 2 einstellst, kommen alle Nachrichten auch kontrolliert an. MQTT-Parser gibts auch für den ESP32 (und ESP8266) fertig als Lib. Und mit CayenneLPP bekommst du auch höhere Protokollschichten ausreichend gut hin.

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren