Mein Weg in das IoT (14): Rückmeldungen vom MQTT-Server
09. Februar 2017
über
über
In der letzten Folge habe ich ein kleines Sensorboard realisiert. An das im Elektor-Shop erhältliche Pretzel-Board (bestückt mit einem ATmega und dem WLAN-Chip ESP8266) hatte ich hierfür einen Phototransistor, einen Taster zum Auslösen von Aktionen und eine RGB-LED für Rückmeldungen angeschlossen. Beim Anlegen der Betriebsspannung loggt sich der ESP8266 in ein WLAN-Netzwerk ein; nachdem das geklappt hat, leuchtet die RGB-LED grün. Mit einem Druck auf den Taster kann man den ATmega dann in den Sensor-Mode versetzen. Periodisch sampelt dieser Messwerte des Phototransistors und weist den ESP8266 mit AT-Kommandos an, sich mit dem HiveMQ-Testserver im Internet zu verbinden; zuerst über TCP/IP, dann folgt das Heraussenden der MQTT-Connect-Anfrage und danach das MQTT-Publish-Kommando (mit dem Messwert als Payload).
Realisiert hatte ich schon eine rudimentäre Fehlerbehandlung: Der ESP8266 gibt ja zum Beispiel „ERROR“ zurück, wenn das Aufnehmen der TCP/IP-Verbindung nicht klappt. Noch nicht ausgewertet wurden über TCP/IP hereinkommende Antworten des Servers. Auf die Connect-Anfrage antwortet der MQTT-Server zum Beispiel mit den Bytes „32 2 0 0“, wenn der Verbindungsversuch angenommen wurde und man Nachrichten veröffentlichen kann.
Ich erweiterte meine kleine TCP/IP-Bibliothek um die Funktion
TCPClient_Receive(byte TCPBytesReceivedBuffer[])
die über den ESP8266 abfragt, ob Bytes vom Server empfangen wurden und diese dann in dem als Parameter übergebenen Speicherbereich ablegt. In der Funktion
MQTTClient_Connect(String clientid)
der MQTT-Bibliothek konnte ich nun die empfangenen Bytes auswerten. Im Erfolgsfall gibt die Funktion dann eine 1 zurück, sonst 0. In der aufrufenden Funktion (die wie oben gesagt periodisch durchlaufen wird) benutzte ich diesen Rückgabewert und ließ die rote LED leuchten, wenn der Verbindungsversuch nicht angenommen wurde, was tatsächlich von Zeit zu Zeit passiert.
Nachdem ich nun Bytes vom Server empfangen und auswerten konnte, wollte ich natürlich mehr und programmierte weiter. Ich erweiterte die MQTT-Bibliothek um eine Funktion, die eine Subscribe-Anfrage zum Abonnieren von Nachrichten stellen kann, und wertete hier natürlich ebenfalls die Antwort vom Server aus. Nach kurzer Zeit gelang es mir dann auch, Nachrichten, die von einem anderen MQTT-Client ins Internet geschickt wurden, mit dem Pretzel-Board zu empfangen. Periodisch muss hierzu die neue Funktion
MQTTClient_Get(byte MQTTBytesPayloadBuffer[])
aufgerufen werden. Was mir bis dahin nicht bewusst war: Der Broker leitet die vom sendenden MQTT-Client herausgeschickten Bytes des MQTT-Publish-Kommandos einfach 1:1 weiter an alle Clients, die sich auf den Topic abonniert haben (inklusive Topic, natürlich den eigentlichen Daten und auch der Längenbytes). Etwas ausführlicher werde ich das Empfangen von MQTT-Nachrichten mit dem Pretzel-Board in der nächsten Folge vorstellen, selbstverständlich begleitet von einer kleinen Demo-Anwendung.
In dieser Folge gibt es erst einmal die erweiterte Software für mein kleines Sensorboard zum Download. Neben der verbesserten Fehlerbehandlung habe ich auch den Code etwas aufgeräumt und besser abstrahiert. Für die Rückmeldungen der RGB-LED und der blauen LED auf dem Board sind jetzt zum Beispiel eigene Funktionen zuständig, was eine Portierung auf andere Hardware einfacher macht. Der Code ist kommentiert. Wenn Sie tiefer einsteigen wollen, können Sie auch den Arduino-Sketch aus der letzten Folge noch einmal downloaden und mit der aktuellen Version vergleichen.
Realisiert hatte ich schon eine rudimentäre Fehlerbehandlung: Der ESP8266 gibt ja zum Beispiel „ERROR“ zurück, wenn das Aufnehmen der TCP/IP-Verbindung nicht klappt. Noch nicht ausgewertet wurden über TCP/IP hereinkommende Antworten des Servers. Auf die Connect-Anfrage antwortet der MQTT-Server zum Beispiel mit den Bytes „32 2 0 0“, wenn der Verbindungsversuch angenommen wurde und man Nachrichten veröffentlichen kann.
Ich erweiterte meine kleine TCP/IP-Bibliothek um die Funktion
TCPClient_Receive(byte TCPBytesReceivedBuffer[])
die über den ESP8266 abfragt, ob Bytes vom Server empfangen wurden und diese dann in dem als Parameter übergebenen Speicherbereich ablegt. In der Funktion
MQTTClient_Connect(String clientid)
der MQTT-Bibliothek konnte ich nun die empfangenen Bytes auswerten. Im Erfolgsfall gibt die Funktion dann eine 1 zurück, sonst 0. In der aufrufenden Funktion (die wie oben gesagt periodisch durchlaufen wird) benutzte ich diesen Rückgabewert und ließ die rote LED leuchten, wenn der Verbindungsversuch nicht angenommen wurde, was tatsächlich von Zeit zu Zeit passiert.
Nachdem ich nun Bytes vom Server empfangen und auswerten konnte, wollte ich natürlich mehr und programmierte weiter. Ich erweiterte die MQTT-Bibliothek um eine Funktion, die eine Subscribe-Anfrage zum Abonnieren von Nachrichten stellen kann, und wertete hier natürlich ebenfalls die Antwort vom Server aus. Nach kurzer Zeit gelang es mir dann auch, Nachrichten, die von einem anderen MQTT-Client ins Internet geschickt wurden, mit dem Pretzel-Board zu empfangen. Periodisch muss hierzu die neue Funktion
MQTTClient_Get(byte MQTTBytesPayloadBuffer[])
aufgerufen werden. Was mir bis dahin nicht bewusst war: Der Broker leitet die vom sendenden MQTT-Client herausgeschickten Bytes des MQTT-Publish-Kommandos einfach 1:1 weiter an alle Clients, die sich auf den Topic abonniert haben (inklusive Topic, natürlich den eigentlichen Daten und auch der Längenbytes). Etwas ausführlicher werde ich das Empfangen von MQTT-Nachrichten mit dem Pretzel-Board in der nächsten Folge vorstellen, selbstverständlich begleitet von einer kleinen Demo-Anwendung.
In dieser Folge gibt es erst einmal die erweiterte Software für mein kleines Sensorboard zum Download. Neben der verbesserten Fehlerbehandlung habe ich auch den Code etwas aufgeräumt und besser abstrahiert. Für die Rückmeldungen der RGB-LED und der blauen LED auf dem Board sind jetzt zum Beispiel eigene Funktionen zuständig, was eine Portierung auf andere Hardware einfacher macht. Der Code ist kommentiert. Wenn Sie tiefer einsteigen wollen, können Sie auch den Arduino-Sketch aus der letzten Folge noch einmal downloaden und mit der aktuellen Version vergleichen.
Mehr anzeigen
Weniger anzeigen
Mehr zu Jens Nickel
Jens Nickel studierte Physik in Stuttgart. Schon in seiner frühen Jugend begeisterte er sich für das Schreiben von technischen Artikeln; als ausgewiesener Fan von technischen und naturwissenschaftlichen Zeitschriften nutzte er die Chance, mit einer Weiterbildu... >>
Diskussion (0 Kommentare)