Day 20: MQTT (Message Queue Telemetry Transport)

For the last days of this Advent, you’ll now become familiar with a subject that plays a large role in the realm of the IoT. We’re dealing with the messaging protocol MQTT, which was specially developed for the communication from machine to machine (M2M). The protocol is thus so brilliant because e.g. control data, measurement data or texts can be exchanged very easily and compactly. The overhead (data that’s transferred alongside the actual user data) is much lower than with HTTP and can be processed readily even by embedded devices, meaning microcontrollers like our NanoESP. At the same time, the controller doesn’t constantly have to establish a connection and query whether there’s been a change; instead, the connection is continually maintained and the client automatically gives information about changes.

A so-called broker forms the basis for the communication. A broker is a server application that processes all data. A device can now connect to the broker and “publish” messages, i.e. send them to the broker. Another device can “subscribe” to specific topics and then immediately receives a new message published to this topic delivered by the broker. So that you don’t have to set up your own broker, a public broker has been set up for you at the address broker.fkainka.de.

Der MQTT Broker stellt die Nachrichten zu

The MQTT broker delivers the messages

The topics are structured hierarchically, where subtopics are each separated with a slash. There are also so-called wild cards. With a “+” or “#” you can subscribe to multiple topics at the same time. Publishing with the wild cards “#” or “+” isn’t possible, however. For example, the topics

MyHome/Kitchen/Temperature

MyHome/Bathroom/Temperature

can thus be received at the same time by subscribing to the topic

MyHome/+/Temperature

– The plus thereby always replaces only one topic level. The # replaces all at once. With the topic

MyHome/#

you thus receive all messages that are published in all subtopics of MyHome. The data that are published to a topic can be virtually anything, from pure texts to measurement values or simple 1/0 commands for switching a light.

Behind today’s door is a button. In the test, we primarily want to make a couple of dry runs on the subject of MQTT. So load today’s programme to the board and open the serial monitor. After a short time, you’ll see more or less the following messages:

Die Meldungen im Seriellen Monitor

The messages on the serial monitor

The board has thus connected first to the WLAN and then to the online broker. So that the many different users don’t fall into the queue, a special structure must be maintained. You can therefore write only in subtopics of the form NanoESP/MyMQTTiD/… , where you have to replace MyMQTTiD with the ID that you receive from the board, displayed on the serial monitor. For today, that means that everything is written to the individually adapted topic NanoESP/MyMQTTiD/test.

So that you can also see what you’re writing in a topic, we use an online tool from the company HiveMQ on the computer. With this tool, you can likewise connect to the broker and subscribe to your personal topics or write to them. Now go to the page www.hivemq.com/try-out/ and click there on “Try the websocket client”. Now you first have to establish a connection to the broker by entering the address broker.fkainka.de in the menu option “Connection” under “Host.” The port and the ClientID can remain the same, and the other parameters are also correct. Click “Connect.” If everything worked, the text “connected” appears next to a green dot at the top right and you have the option in other areas to publish in a topic or to subscribe to a topic.

First click on “Add New Topic Subscription” and enter NanoESP/MyMQTTiD/test in the topic field, where you replace MyMQTTiD with the ID from the serial monitor. Now reset the NanoESP by pressing the Reset button on the board. After a short time, you should receive the message “Hello from my NanoESP” in the browser under the “Messages” item. You can also send a message to the board by going into the topic field NanoESP/MyMQTTiD/test under “Publish” and entering any message you choose, like “Hello from my Browser,” under “Message”. Now you receive the message displayed on the serial monitor. So the communication is up.

The Websocket Client

The Websocket Client

27 Comments

  1. Steffen

    Hallo,

    ich versuche dieses Projekt und das vom Tag 23 zu mischen.
    Explizit würde ich gern 1:1 dieses hier nehmen und gern in der Loop einen Analogwert einlesen und auf einen anderen Topic publishen.
    Im Prinzip läuft es. der Analogwert kommt sauber durch. Aber dann kann der ESP nicht mehr auf die Message vom Websocket reagieren.

    Jetzt hab ich folgendes probiert: An dem Punkt in der Loop wo das “Value” der Message seriell ausgegeben wird, da hänge ich mich hinter und publishe 1x den Analogwert. Dann läuft es.
    2ter Versuch: ich setze an dem Punkt wo der “Value” ausgegeben wird einen Zähler auf z.B. 10. weiter unten im Loop schaue ich ob der Zähler >0 ist, publishe den Analogwert und dekrementiere den Zähler. dann spuckt er mir 10x meinen Analogwert aus, innerhalb der 10x (im Loop mache ich 500ms pause) geht der Nano absolut nicht in die if(mqtt.recvMQTT(id, len, topic, value)…
    sind die 10 gesendet, dann geht er dort sofort wieder rein… ich finde den Fehler leider nicht.
    Ich möchte gern den Analogwert dauerhaft senden und parallel einen Ausgang steuern können. Ich habe es über das Projekt von Taf 21 probiert, aber auch dort bekomme ich den Alarm nicht per Websocket deaktivert….

    über Tips wäre ich dankbar

    Reply
  2. AnFi

    Hallo Gemeinde
    ich hoffe, dass noch einige aktiv sind auf dem Gebiet MQTT. Ich habe nämlich folgendes Problem:
    Ich betreibe einen CO2-Sensor mit einem IR-Sensor am NanoESP. Das funktioniert problemlos auch mit einer OLED-Ausgabe I2C, solange ich nicht mit MQTT kutschiere.
    Bei MQTT funktioniert die Erfassung der Daten und die Ausgabe an MQTT auch problemlos (A16, P20) NICHT aber die OLED-Ausgabe. Kennt jemand dieses Phänomen?

    Ich vermute einen Konflikt Wire/I2C mit der Library NanoESP_MQTT.h.

    Reply
  3. forget me not

    Dieser Tag(20) ist die Bestätigung das der Kalender sein Geld nicht wert wahr bzw. ist.

    Es gibt keine Erklärungen zu irgendwas, seit Tag eins.
    Aber diese “Anleitung” ist einfach nur mehr Lächerlich.
    Es gibt keine Erklärung zum Code, vor allem die Änderungen die noch zu machen sind, es sind auch sonst keine Erklärungen enthalten die auf das eigentliche Projekt eingehen.
    Es sind einfach nur ein paar punkte die zum Projekt gehören quer aufgelistet, die zum Teil nicht Funktionieren z.B. der
    “hivemq.com/try-out/”- Link Leitet mich zu MS-OneDrive.

    Unter anderem sind die “fritzing” Schaltpläne Fehlerhaft!!!(solltet ihr echt mal überprüfen(z.B. Tag 18 oder die Widerstände an den Verbraucher anpassen))

    Bei solchen Produkten erwartet man eigentlich ein brauchbares
    Tutorial.
    Die Bauteile Rechtfertigen den Preis Jedenfalls nicht.

    Reply
  4. Michael

    Hallo,

    wer – wie nun einmal ich – nicht das Gerät mit dem Internet verbinden möchte und trotzdem den Versuch durchführen will, kann es mit Mosquitto (https://mosquitto.org/), einem alten RaspiPi und einem Client-Rechner probieren.

    Die Software ist im Rasbian-Repository vorhanden, so dass ein einfaches “apt install mosquitto” reicht. Auf einem Client-Rechner muss dann noch die Client-Software (Ubuntu: apt install mosqitto-client) installiert werden.

    Die Arduino-Software muss nur in der Zeile ” if (mqtt.connect(0, “IP-Adresse-RasPI”, 1883, mqttId)) {” entsprechend geändert werden.

    Aus dem Seriellen Monitor muss noch der Topic gelesen werden

    Dann kann man – weniger komfortabel – mit der Zeile

    mosquitto_pub -h IP-Adresse-RasPi -m “Hallo” -t “”

    eine Nachricht auf dem Client absetzen, die im seriellen Monitor erscheint.

    Reply
    1. Michael

      Ups… da sind wohl ein paar Größer-/Kleiner-Zeichen dem Filter in die Arme gelaufen. Besonders in der Zeile könnte es zu Missverständnissen führen:

      mosquitto_pub -h IP-Adresse-RasPi -m „Hallo“ -t „“

      Hinter dem -t muss in Anführungsstrichen das Topic eingetragen werden – wo wies in in dem seriellen Monitor erscheint.

      Ansonsten ist aber die Anleitung von Mosquitto recht hilfreich…

      Reply
    2. HGR73

      DANKE für den Hinweis/Vorschlag und den näheren Infos dazu!

      Reply
  5. Trilo

    Lustige Nachrichten, wenn viele die selbe ID haben… aber es funktioniert.

    Messages

    2016-12-20 23:05:25
    Topic: NanoESP/18fe34cfb569/test
    Qos: 0
    hehe yeah

    2016-12-20 23:05:16
    Topic: NanoESP/18fe34cfb569/test
    Qos: 0
    maybe we hear each other tomorrow again ;-)

    2016-12-20 23:05:06
    Topic: NanoESP/18fe34cfb569/test
    Qos: 0
    We’re back to IRC

    2016-12-20 23:05:01
    Topic: NanoESP/18fe34cfb569/test
    Qos: 0
    yeah, i got that one as well (i’m not the swedish guy)

    2016-12-20 23:04:47
    Topic: NanoESP/18fe34cfb569/test
    Qos: 0
    and opening door 20 leads me to this ;-)

    2016-12-20 23:03:58
    Topic: NanoESP/18fe34cfb569/test
    Qos: 0
    in germany Conrad sells christmas Calender….

    2016-12-20 23:03:31
    Topic: NanoESP/18fe34cfb569/test
    Qos: 0
    this is really finny to share the same 18fe34cfb569

    2016-12-20 23:03:20
    Topic: NanoESP/18fe34cfb569/test
    Qos: 0
    I see i haven’t been the only one who had the idea to subscribe to NanoESP/# ^^

    2016-12-20 23:01:52
    Topic: NanoESP/18fe34cfb569/test
    Qos: 0
    It becomes a little like 4chan, you don’t know how anybody is

    2016-12-20 23:01:18
    Topic: NanoESP/18fe34cfb569/test
    Qos: 0
    funny

    2016-12-20 23:00:59
    Topic: NanoESP/18fe34cfb569/test
    Qos: 0
    Swedish

    2016-12-20 23:00:56
    Topic: NanoESP/18fe34cfb569/test
    Qos: 0
    yes… but my ESB Board has generated this ID ;-)

    2016-12-20 23:00:48
    Topic: NanoESP/18fe34cfb569/test
    Qos: 0
    subscribe to NanoESP/+/test

    2016-12-20 23:00:37
    Topic: NanoESP/18fe34cfb569/test
    Qos: 0
    german?

    2016-12-20 23:00:23
    Topic: NanoESP/18fe34cfb569/test
    Qos: 0
    You can subscribe and publish to anyones id

    2016-12-20 23:00:03
    Topic: NanoESP/18fe34cfb569/test
    Qos: 0
    ;-) same ID?

    2016-12-20 22:59:44
    Topic: NanoESP/18fe34cfb569/test
    Qos: 0
    No I’m Tomas

    2016-12-20 22:59:32
    Topic: NanoESP/18fe34cfb569/test
    Qos: 0
    Hi Stephan (2)

    2016-12-20 22:59:16
    Topic: NanoESP/18fe34cfb569/test
    Qos: 0
    Hello from my NanoESP

    2016-12-20 22:58:59
    Topic: NanoESP/18fe34cfb569/test
    Qos: 0
    Hi Stephan

    Reply
  6. Michel2016

    boh… die Anleitung ist so ungenau… Wo soll ich jetzt genau die ID eintragen die im Monitor angezeigt wird?
    Denn NanoESP/MyMQTTiD/test kann ich nicht finden. Ne Zeilenangabe wäre ganz hilfreich.

    Reply
  7. DS2072

    Funktioniert. Ich bekomme die Meldung bei HiveMQ und kann darüber auch an meinen seriellen Monitor senden. Als weiteren Test habe ich meinem Schwager die Site HiveMQ gegeben, er hat meine MQTT-ID einegtragen und sich connected mit der Subscription und ich habe den Reset hier durchgeführt, auch er bekam die Meldung angezeigt und konnte mir etwas an meinen seriellen Monitor schicken.

    Reply
  8. Cubiator

    Hast Du den bei “Subscriptions” auch das Topic mit deiner ID angegeben? Ansonsten weis die Website ja nicht was sie empfangen soll, dort senden wir ja alle hin und mit der ID wird die Message gefiltert.

    Reply
    1. Leon

      Irgendwie habe ich das Problem das ich mich nicht verbinden kann, da immer wenn ich auf Connect clicke eine Fehlermeldung erscheint….

      Reply
  9. Leon

    Leider kommt bei mir immer nachdem ich Broker.fkainka.de
    bei Host eingegeben habe und auf Connect klicke :

    Reply
    1. casesensitive

      Versuche doch einmal Dich mit broker.fkainka.de zu verbinden anstatt mit Broker.fkainka.de.

      Reply
  10. Mormox82

    Bei mir kommt:

    Error WLAN Connect
    My IP: 0.0.0.0
    My MQTT ID:

    error connecting

    Reply
    1. Mormox82

      Hab Tag4 wiederholt und ging alles.
      war aber eine schwere Geburt.

      Reply
  11. prisma01

    Beim ersten Versuch bekam ich eine Meldung vom NanoESP, danach niht wieder, aber vom Browser zum Nano klappts…

    Reply
    1. Cubiator

      Ich habe eben noch einmal getestet, wenn ich die Resettaste auf dem NanoESP drücke bekomme ich nach ca. 5 Sekunden eine Rückmeldung auf der Website.

      Die eingegangenen Meldungen auf Neinem NanoESP sehe ich aber keine Resets. Drückst Du ach zwischendurch mal den Reset? Die Meldung kommt nur einmal kurz nach einem Start des NanoESP sobald er sich mit dem Broker verbunden hat.

      Reply
  12. anna

    hi, ich kann die seite “broker.fkainka.de”weder mit Safari, noch mit Mozilla öffnen… Jemand eine Idee woran es liegen kann?

    Reply
    1. Cubiator

      Hallo Anna,

      das sollst Du auch gar nicht können. Das ist keine Website sondern ein MQTT Broker. Du sollst DIESE Seite öffnen–> http://www.hivemq.com/try-out/ dort klickst Du “try the websocked client” an, dort werden dann die Daten des Brokers(broker.fkainka.de) eingetragen.

      Reply
  13. bernd

    Wieder mal nur halbwegs,
    es gelingt mir zwar eine message von HIVMQ zu senden (taucht im arduino monitor auf) aber die message vom Nano taucht nicht auf (in MQ).

    Reply
    1. Cubiator

      Hallo Bernd,

      hast Du denn auch den NanoESP nach Eingabe der Daten resetet? Dann kommt bei mir nach einer erfolgreichen Verbindung die Message im Browser an.

      Reply
      1. Bernd

        ja, mehrmals

        Reply
        1. Cubiator

          Hmm,

          hier klappt es reproduzierbar.

          Reply
          1. Bernd

            Ich habs nochmal von scratch probiert, gleiches resultat (nur von MQT zum board, kein hello) .topic muss ich von hand eingeben, kommt nicht automatisch und mit testtopic/1 tut sich überhaupt nichts.
            Auch wenn ich was in com 3 schreibe und schicke tut sich nichts.
            anbei Bild mit serial print nach reset.

    2. fk (Post author)

      Hi, in welches topic sendest du die Nachricht?

      Reply
      1. Bernd

        Subscribed to:
        NanoESP/18fe34cfa972/test

        Published to:
        NanoESP/18fe34cfa972/test

        Reply
      2. Bernd

        I’ll be damned – jetzt geht es plötzlich in beide Richtungen. Irgendwas gemacht?

        Reply

Leave a Comment

Your email address will not be published. Required fields are marked *

This site uses Akismet to reduce spam. Learn how your comment data is processed.