... | ... | @@ -99,3 +99,240 @@ void wifiCheckConnection() { |
|
|
Für andere Libraries werden wir eine andere Möglichkeit ausprobieren.
|
|
|
Libraries sind nichts anderes als Code-Module, die wir in unserem Projekt verwenden, um den Aufwand zu verringern.
|
|
|
|
|
|
# JSON
|
|
|
|
|
|
Json ist ein Format um Daten lesbar und einfach verständlich darzustellen. Json nutzt dabei einen objektbasierten Aufbau.
|
|
|
|
|
|
:pushpin: Beispiel:
|
|
|
|
|
|
```JSON
|
|
|
{"Obstkorb":
|
|
|
{
|
|
|
"name" : "Viktor",
|
|
|
"Material" : "PVC",
|
|
|
"Leergewicht" : 200,
|
|
|
"Inhalt" : {
|
|
|
"Apfel" : {
|
|
|
"Gewicht" : 100,
|
|
|
"Farbe" : "hellgrün",
|
|
|
"FarbcodeRGB" : [0, 255, 150],
|
|
|
"Giftig?" : false
|
|
|
}
|
|
|
}
|
|
|
}
|
|
|
}
|
|
|
```
|
|
|
|
|
|
> :bulb: Der Obstkorb mit dem Namen Viktor besteht aus dem Material PVC und hat ein Leergewicht von 200 Gramm. Der Obstkorb Viktor hat den Inhalt "Apfel", welcher wiederum die Attribute Gewicht, Farbe und Giftig?, welche mit den jeweiligen Werten belegt werden können.
|
|
|
|
|
|
Dieses Format erlaubt es dem Nutzer diese eine gewisse Menge an Daten gebündelt und ordentlich Verpackt zu übertragen und übermitteln.
|
|
|
|
|
|
## ArduinoJSON
|
|
|
|
|
|
ArduinoJson ist eine Bibliothek, welche das Json Format auf die Arduino Ebene bringt.
|
|
|
|
|
|
:bookb: Um die Bibliothek in ihr Projekt einzubinden, fügen Sie ``bblanchon/ArduinoJson@^7.0.4`` in die Kategorie ``lib_deps`` in Ihrer ``platformio.ini`` Datei ihrer PlatformIO Projektes hinzu.
|
|
|
|
|
|
:bulb: die Dokumentation der bibliothek finden Sie [hier](https://registry.platformio.org/libraries/bblanchon/ArduinoJson)
|
|
|
|
|
|
:books: Damit Sie die Bibliothek verwenden können, müssen Sie diese mit ``#include <ArduinoJson.h>`` in Ihr Projekt einbinden.
|
|
|
|
|
|
Beispiel zum verwenden der Bibliothek:
|
|
|
```C++
|
|
|
#include <Arduino.h>
|
|
|
#include <ArduinoJson.h>
|
|
|
|
|
|
JsonDocument jsonDoc; //Erstellen von einem JsonDocument Objekt
|
|
|
JsonObject obstKorb = jsonDoc.to<JsonObject>(); //Erstellen eines JsonObject Objektes, welches mit dem JsonDocument verknüpft ist. Oberobjekt der Json Nachricht
|
|
|
JsonObject korbInhalt = obstKorb.createNestedObject("Inhalt"); //Unterobjekt des Objektes ObstKorb
|
|
|
JsonObject apfel = korbInhalt.createNestedObject("Apfel"); //Unterobjekt des Objektes korbinhalt erstellen
|
|
|
|
|
|
void setup(){
|
|
|
Serial.begin(115200);
|
|
|
Serial.println("Entering Setup");
|
|
|
|
|
|
apfel["Farbe"] = "gruen"; //ObjektAttribut mit Wert befüllen
|
|
|
apfel["Gewicht"] = 200;
|
|
|
apfel["Gewichtseinheit"] = "g";
|
|
|
|
|
|
Serial.println("\n\n\nDas JsonObjekt");
|
|
|
serializeJson(jsonDoc, Serial); //Aus dem JsonObjekt einen lesbaren String machen
|
|
|
delay(500);
|
|
|
Serial.println("\n\n\nJetzt noch mal in schön");
|
|
|
serializeJsonPretty(jsonDoc, Serial);
|
|
|
|
|
|
Serial.println("\n\n\nExiting Setup");
|
|
|
}
|
|
|
|
|
|
void loop()
|
|
|
{
|
|
|
yield();
|
|
|
}
|
|
|
```
|
|
|
|
|
|
BSP JsonObjekt:
|
|
|
|
|
|
```
|
|
|
obstKorb : {
|
|
|
korbInhalt : {
|
|
|
apfel : {
|
|
|
"Farbe" : "gruen",
|
|
|
"Gewicht" : 200,
|
|
|
"Gewichtseinheit" : "g"
|
|
|
}
|
|
|
}
|
|
|
}
|
|
|
````
|
|
|
|
|
|
:bulb: Erklärung: Das Objekt ObstKorb beinhaltet ein Objekt Korbinhalt. Im Korbinhalt ist ein Objekt Apfel mit den Parametern Farbe, Gewicht und Gewichtseinheit enthalten. Die Parameter haben die jeweiligen Werte.
|
|
|
|
|
|
---
|
|
|
|
|
|
|
|
|
# MQTT
|
|
|
|
|
|
MQTT ist ein standardisiertes Kommunikationsprotkoll. Dabei arbeitet das Protokoll nach dem *Publisher-Subscriber* Prinzip.
|
|
|
|
|
|
<img src="images/mqtt-overview.webp" width = "700" alt="Overview MQTT">
|
|
|
Quelle: https://www.hivemq.com/blog/how-to-get-started-with-mqtt/
|
|
|
|
|
|
Die Kommunikation verläuft dabei über Topics. Auf diese Topics werden Nachrichten gesendet.
|
|
|
|
|
|
Bsp:
|
|
|
- Ein smartHome Temperatursensor published jede 10 Sekunden auf das Topic ``/bedroomTemp`` die Temperatur, welcher der Sensor gerade gemessen hat.
|
|
|
- Jeder Teilnehmer, welcher im gleichen Netzwerk hängt, kann nun auf dieses Topic ``/bedroomTemp`` subscriben, also sich abbonnieren und somit alle 10 Sekunden die aktuelle Temperatur, welche der Sensor gemessen hat verwerten und benutzen.
|
|
|
|
|
|
## MQTT und ESP32
|
|
|
|
|
|
Für den ESP32 gibt es mehrere Bibliotheken um MQTT Topic zu subscriben und zu publishen.
|
|
|
|
|
|
:exclamation: Damit dies funktioniert muss der ESP32 mit einem WLan Netzwerk verbunden werden, in dem ein MQTT Broker läuft. Befolgen Sie dazu die Schritte in [ESP&WiFi](../WIFI/README.md)
|
|
|
|
|
|
|
|
|
Als MQTT Bibliothek werwenden Sie bitte die AsyncMQTTClient von [marvinroger](https://registry.platformio.org/libraries/marvinroger/AsyncMqttClient/installation)
|
|
|
|
|
|
> :books: Fügen sie ``marvinroger/AsyncMqttClient@^0.9.0`` in die Kategorie ``lib-deps`` Ihrer ``platformio.ini`` ein.
|
|
|
|
|
|
Hier ein Beispiel für die Benutzung der Bibliothek:
|
|
|
```C++
|
|
|
#include <Arduino.h>
|
|
|
#include <AsyncMqttClient.h>
|
|
|
#include <ArduinoJson.h>
|
|
|
#include "WiFi.h"
|
|
|
#include <string.h>
|
|
|
|
|
|
const int PUB_INTERVAL = 1000; // delay until message is published again
|
|
|
|
|
|
#define WIFI_SSID "iaAM_Manualworkstation_1" //<-- Achten Sie auf die Anweisung der Praktikumsleitung
|
|
|
#define WIFI_PASSWORD "iaAM_Manualworkstation_1_pw"
|
|
|
|
|
|
|
|
|
TimerHandle_t wifiReconnectTimer;
|
|
|
|
|
|
|
|
|
#define MQTT_HOST "test.mosquitto.org" //Dies ist der MQTT Broker - hier von Mosquitto als öffentlicher Broker zur Verfügung gestellt.
|
|
|
#define MQTT_PORT 1883
|
|
|
const char* ID = "JonnyESPDemo"; //<-- Name des Publishers!
|
|
|
TimerHandle_t mqttReconnectTimer;
|
|
|
AsyncMqttClient mqttClient; //Objekt welches die MQTT Verbindung regelt
|
|
|
|
|
|
String setIntMsg(byte rgb_G_val) //this function creates the jsonobject
|
|
|
{
|
|
|
JsonDocument jsonDoc;
|
|
|
JsonObject root = jsonDoc.to<JsonObject>();
|
|
|
JsonObject typeObj = root.createNestedObject("ProcessData");
|
|
|
typeObj["GreenValue"] = rgb_G_val;
|
|
|
|
|
|
String jsonString;
|
|
|
serializeJsonPretty(root, jsonString);
|
|
|
Serial.println(jsonString);
|
|
|
|
|
|
return jsonString;
|
|
|
}
|
|
|
|
|
|
|
|
|
void publishGreenValue(byte rgb_G_val) //this function publishes a created json object to a specific topic
|
|
|
{
|
|
|
String msg;
|
|
|
msg = setIntMsg(rgb_G_val);
|
|
|
String topic = "MatriklNr/MaschineSimulator/Data/GreenValue";
|
|
|
|
|
|
mqttClient.publish((char*)topic.c_str(), 0, true, (char*)msg.c_str()); //publish the "msg" Object to the "topic". The msg is retreived by the function ``setIntMsg()``
|
|
|
}
|
|
|
|
|
|
//handle WiFi connection
|
|
|
void connectToWifi() {
|
|
|
WiFi.begin(WIFI_SSID, WIFI_PASSWORD);
|
|
|
Serial.println("");
|
|
|
|
|
|
|
|
|
// Wait for connection
|
|
|
while (WiFi.status() != WL_CONNECTED) {
|
|
|
delay(500);
|
|
|
Serial.print(".");
|
|
|
}
|
|
|
|
|
|
Serial.println("");
|
|
|
Serial.print("Connected to ");
|
|
|
Serial.println(WIFI_SSID);
|
|
|
Serial.print("IP address: ");
|
|
|
Serial.println(WiFi.localIP());
|
|
|
}
|
|
|
|
|
|
//handle MQTT Connection
|
|
|
void connectToMqtt(){
|
|
|
mqttClient.connect();
|
|
|
}
|
|
|
void onMqttConnect(bool sessionPresent) {
|
|
|
Serial.println("Connected to MQTT.");
|
|
|
}
|
|
|
void onMqttPublish(uint16_t packetId) {
|
|
|
Serial.println("Publish acknowledged.");
|
|
|
Serial.print(" packetId: ");
|
|
|
Serial.println(packetId);
|
|
|
}
|
|
|
|
|
|
|
|
|
//handle WiFi disruptions and events
|
|
|
void WiFiEvent(WiFiEvent_t event) {
|
|
|
Serial.printf("[WiFi-event] event: %d\n", event);
|
|
|
switch(event) {
|
|
|
case SYSTEM_EVENT_STA_GOT_IP:
|
|
|
Serial.println("WiFi connected");
|
|
|
Serial.println("IP address: ");
|
|
|
Serial.println(WiFi.localIP());
|
|
|
connectToMqtt();
|
|
|
break;
|
|
|
case SYSTEM_EVENT_STA_DISCONNECTED:
|
|
|
Serial.println("WiFi lost connection");
|
|
|
xTimerStop(mqttReconnectTimer, 0); // ensure we don't reconnect to MQTT while reconnecting to Wi-Fi
|
|
|
xTimerStart(wifiReconnectTimer, 0);
|
|
|
break;
|
|
|
}
|
|
|
}
|
|
|
|
|
|
|
|
|
void setup() {
|
|
|
Serial.begin(115200);
|
|
|
Serial.println("Entering Setup");
|
|
|
|
|
|
mqttReconnectTimer = xTimerCreate("mqttTimer", pdMS_TO_TICKS(2000), pdFALSE, (void*)0, reinterpret_cast<TimerCallbackFunction_t>(connectToMqtt));
|
|
|
wifiReconnectTimer = xTimerCreate("wifiTimer", pdMS_TO_TICKS(2000), pdFALSE, (void*)0, reinterpret_cast<TimerCallbackFunction_t>(connectToWifi));
|
|
|
|
|
|
WiFi.onEvent(WiFiEvent);
|
|
|
|
|
|
mqttClient.onConnect(onMqttConnect);
|
|
|
mqttClient.onPublish(onMqttPublish);
|
|
|
mqttClient.setServer(MQTT_HOST, MQTT_PORT);
|
|
|
|
|
|
connectToWifi();
|
|
|
|
|
|
Serial.println("Exiting Setup");
|
|
|
}
|
|
|
|
|
|
void loop(){
|
|
|
publishGreenValue(random(255)); //call the function that publishes the jsonobject, the creation of the jsonobject will be handled internally
|
|
|
delay(2000);
|
|
|
}
|
|
|
|
|
|
``` |
|
|
\ No newline at end of file |