Veröffentlichtung der Sensordaten über das MQTT-Protokoll

Nach bestehender Internetverbindung sollen nun die Daten in die Cloud gesendet werden. Dazu wird das Protokoll MQTT verwendet.

Mit Hilfe des MQTT Protokolls können z. B. Daten an einen sogenannten „Broker“ (= ein Server im Internet, der das MQTT Protokoll beherrscht) verschickt werden.

Für erste Tests können frei im Internet zugängliche Broker genutzt werden. Zu beachten ist dabei jedoch, dass die dorthin gesendeten Daten für jedermann einseh- und manipulierbar sind. Es sollten daher keine sicherheitsrelevante oder personenbezogenen Daten verschickt werden.

Die Daten werden unter eindeutigen Bezeichnungen, den sogenannten „Topics“ an den Server gesendet. Die Topics werden als Zeichenketten (Strings) mit durch Slashes getrennten Bereichen notiert, um die Abbildung von Hierarchien zu ermöglichen. Sollen z.B. die Temperaturen jedes Raums eines Hauses erfasst werden, wären folgende Bezeichnung für die Topics denkbar:

  • /MeinHaus/Küche/Temperatur
  • /MeinHaus/Wohnzimmer/Temperatur
  • ….

Sind die Daten an den Server gesendet worden, können sie mit einer App, die die Daten vom Broker über das MQTT Protokoll abruft, angezeigt werden.

#include <ESP8266WiFi.h>
#include <PubSubClient.h>
#include <DHT.h>

// MQTT Connection
String HOST_NAME="Klasse.Schüler";
const char* mqttServer = "iot.eclipse.org";
PubSubClient mqttClient(espClient);
long lastMessageTime = 0;

[...]

void setup() { 
 [...]
 setupMQTT();
}

[...]

void setupMQTT() {
 mqttClient.setServer(mqttServer, 1883);
}

void connectMQTT() {
 // Loop until connection is established
 while (!mqttClient.connected())
 {
   Serial.print("Try to connect MQTT ...");
   // random or unique mqttClient ID
   String mqttClientId = String("CRBK_")+String(HOST_NAME);
 
   // for authentification use username and password like: mqttClient.connect(mqttClientId,userName,passWord))
   if (mqttClient.connect(mqttClientId.c_str()))
   {
      Serial.println("connected");
   } else {
     Serial.print("failed, errorcode=");
     Serial.print(mqttClient.state());
     Serial.println(" try again in 5 seconds");
     delay(5000);
   }
 }
} //end connectMQTT()

void processMQTT() {
 if (!mqttClient.connected()) {
   connectMQTT();
 }
 mqttClient.loop();
 long now = millis();
 if (now - lastMessageTime > 6000 && lastSensorTime!=lastMessageTime) {
   lastMessageTime = lastSensorTime;

   //publish sensor data to MQTT broker
   Serial.println("publish on server");
   mqttClient.publish(("CRBK/"+HOST_NAME+"/Temperature").c_str(), String(lastTemperature).c_str());
   mqttClient.publish(("CRBK/"+HOST_NAME+"/Humidity").c_str(), String(lastHumidity).c_str());
 } 
}

void loop() { 
 processInputs();
 processMQTT();
 processOutputs();
}

Auftrag 1

Übernehmen Sie die oben aufgeführten Ergänzungen des Quellcodes in Ihr Programm. Nach erfolgreicher Übertragung an den Mikrocontroller sollten die Sensordaten an den Broker gesendet werden.

Auftrag 2

Überprüfen Sie Ihr Verständnis für das abgebildeten Programm, indem Sie die folgenden Fragen beantworten:

  • Wie oft werden die Sensordaten an den Broker verschickt?
  • Welche Topics wurden für die Sensordaten gewählt?

Auftrag 3

Installieren Sie sich eine MQTT App (z.B. MQTT Dash) zur Anzeige der veröffentlichten Daten.

Schreibe einen Kommentar