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.
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:
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.
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
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.
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.
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.
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…
DANKE für den Hinweis/Vorschlag und den näheren Infos dazu!
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
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.
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.
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.
Irgendwie habe ich das Problem das ich mich nicht verbinden kann, da immer wenn ich auf Connect clicke eine Fehlermeldung erscheint….
Leider kommt bei mir immer nachdem ich Broker.fkainka.de
bei Host eingegeben habe und auf Connect klicke :
Versuche doch einmal Dich mit broker.fkainka.de zu verbinden anstatt mit Broker.fkainka.de.
Bei mir kommt:
Error WLAN Connect
My IP: 0.0.0.0
My MQTT ID:
error connecting
Hab Tag4 wiederholt und ging alles.
war aber eine schwere Geburt.
Beim ersten Versuch bekam ich eine Meldung vom NanoESP, danach niht wieder, aber vom Browser zum Nano klappts…
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.
hi, ich kann die seite “broker.fkainka.de”weder mit Safari, noch mit Mozilla öffnen… Jemand eine Idee woran es liegen kann?
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.
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).
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.
ja, mehrmals
Hmm,
hier klappt es reproduzierbar.
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.
Hi, in welches topic sendest du die Nachricht?
Subscribed to:
NanoESP/18fe34cfa972/test
Published to:
NanoESP/18fe34cfa972/test
I’ll be damned – jetzt geht es plötzlich in beide Richtungen. Irgendwas gemacht?