Skip to content

Datenversender MQTT Documentation

bollefreshavocado edited this page Jun 23, 2017 · 3 revisions

Anforderung

Implementierung des MQTT-Protokolls als Versender.

Lösung

Der Datenversender arbeitet mit dem MQTT-Protokoll und implementiert dieses, um eine Möglichkeit bereitzustellen, Daten zu versenden. Dies geschieht unter Anderem unter der Verwendung von Threads.

Umsetzung

Benutzen der Queue und der Konfiguration, um Mittels MQTT Daten versenden zu können.

Initialisieren des Datenversenders:

initsender

Ablauf der Threadloop:

Threadloop

IG_Datenversender

typedef struct{
    IG_Config * config;
    IG_Queue * queue;
    IG_Bool running;
    pthread_t th_loop;
} IG_Datenversender;
  • config: Pointer auf IG_Config, stellt die Konfiguration dar, um die es sich handelt.
  • queue: Pointer auf IG_Queue, stellt die Queue bereit.
  • running: Boolscher Ausdruck, um festzuhalten, ob die Thread-Schleife laufen soll oder nicht
  • th_loop: Thread-Variable für den Thread aus Struct

Erstellen von IG_Datenversender

IG_Datenversender * IG_Datenversender_create(IG_Config * config);

Die Funktion sucht nach der Konfiguration mit dem Namen im Parameter und liest diese ein.

Parameter:

  • config: Beschreibt welche Art von Config eingelesen werden soll.

Rückgabewert: Gibt einen Pointer auf die auf dem Heap erstellte Datenstruktur zurück

Löschen von IG_Datenversender

void IG_Datenversender_delete(IG_Datenversender * sender);

Die Funktion löscht ein Datenversender-Struct und gibt den benötigten Speicher wieder frei.

Parameter:

  • sender: Pointer auf das Datenversender-Struct welches gelöscht werden soll

Rückgabewert: Keiner

Senden von Daten

IG_Status sendData(IG_Datenversender * sender, IG_Data * data);

Gibt IG_Status zurück je nach Erfolg der sendData-Funktion. Übergibt das IG_Data an den Datenversender bzw. an den Thread, welcher diese dann an die Queue pusht.

Parameter:

  • sender: Das Datenversender-Struct welches benutzt werden soll
  • data: Das Daten-Struct welches benutzt werden soll

Rückgabewert: Es wird der Status zurückgegeben ob alles richtig funktioniert hat.

Threadloop

void* doSomeThing(void *arg);

Stellt die Callback-Funktion für den Thread bei seiner Erstellung dar. Gibt einen void-Pointer zurück. Im Zusammenhang dazu wird ein Struct verwendet, welches als Zusatz zum IG_Datenversender-Struct noch das MQTT-Stack-Struct als Pointer bereitstellt. Diese dosomething-Funktion ist der Kern der noch folgenden init_versender-Funktion. In ihr wird dann tatsächlich die Nachricht auf einem Topic gepublished und die zuvor dokumentierten Funktionen verwendet

Parameter:

  • arg: void-Pointer der benutzt wird, um die Thread-Parameter verwenden zu können

Rückgabewert: Es wird ein void-Pointer zurückgegeben.

Initialisieren des Datenversenders

IG_Status init_versender(IG_Datenversender * sender);

Initialisiert die Verbindung zum MQTT-Broker und startet den Thread mit einer Schleife, die sich um die eingehenden Nachrichten kümmert.

Parameter:

  • sender: Das Datenversender-Struct welches benutzt werden soll

Rückgabewert: Es wird der Status zurückgegeben ob alles richtig funktioniert hat.

Stoppen des Datenversenders

void IG_Datenversender_stop(IG_Datenversender * sender);

Stoppt die Thread-Schleife

Parameter:

  • sender: Das Datenversender-Struct welches benutzt werden soll

Rückgabewert: Keiner

IG_Mqtt

typedef struct{
        // MQTT init
    MQTTClient client;
    IG_UInt32 qos_level;
}IG_Mqtt;
  • client: Variable, die den Client darstellt, wird zum Erstellen des Clients und zur Verbindung benötigt
  • qos_level: Unsigned Int, für die Definition der Quality of Service bei der Verwendung von MQTT#

Initialisieren des IG_Mqtt-structs

IG_Mqtt * IG_Mqtt_create();

Die Funktion stellt den Mqtt-Stack als Struct bereit und gibt diesen zurück, um damit den Clienten zu erstellen und um sich auf ihn zu verbinden.

Parameter: Keiner

Rückgabewert: Gibt einen Pointer auf die auf dem Heap erstellte Datenstruktur zurück

Publishen der Nachricht

void pubmsg(IG_Mqtt * stack, char * payload, int len, char * topic, int timeout);

Hier wird die Pflicht des Nachrichtenversendens erfüllt. Die Nachricht und das zugehörige Delivery-Token werden initialisiert. Außerdem wird das Level der Quality of Service initialisiert. Die Nachricht wird versendet und es wird auch auf das Acknowledgment bzw. das Beenden des Sendevorgangs gewartet.

Parameter:

  • stack: Das Mqtt-Struct, welches benutzt werden soll
  • payload: Stellt die Nachricht (JSON) als char-Array dar
  • len: Entspricht der Länge des Char-Arrays‘ Payload
  • topic: Ist auf das zu publishende Topic
  • timeout: Stellt einen Referenzwert dar, nachdem die Verbindung abgebrochen wird

Rückgabewert: Keiner

Verbindunsabbau MQTT

void disconnect(MQTTClient * client);

Die Verbindung zum Client wird getrennt und der Client wird anschließend zerstört.

Parameter:

  • client: Pointer auf MQTTClient, damit auf die aktuelle Referenz des Clients zugegriffen werden kann

Rückgabewert: Keiner