From 868d0a1ecbfbcd1f04b5c03403d6cffb439ce8fe Mon Sep 17 00:00:00 2001 From: Thomas Schmucker Date: Tue, 29 Oct 2024 22:34:23 +0100 Subject: Verschiebe MQTT Code in ein eigenes Modul --- src/mqtt.c | 69 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 69 insertions(+) create mode 100644 src/mqtt.c (limited to 'src/mqtt.c') diff --git a/src/mqtt.c b/src/mqtt.c new file mode 100644 index 0000000..50cfa6a --- /dev/null +++ b/src/mqtt.c @@ -0,0 +1,69 @@ +// Standard C +#include + +// System +#include + +// Project +#include "config.h" +#include "mqtt.h" + +struct mosquitto * +connect(const char *clientid, // NOLINT + const char *username, // NOLINT + const char *password, // NOLINT + const char *hostname, // NOLINT + int port, + void callback(struct mosquitto *, void *, const struct mosquitto_message *), + void *userdata) +{ + struct mosquitto *client = mosquitto_new(clientid, true, userdata); + if ( client == NULL ) { + (void) fprintf(stderr, "error on new client...\n"); + return NULL; + } + + int err = mosquitto_username_pw_set(client, username, password); + if ( err != MOSQ_ERR_SUCCESS ) { + (void) fprintf(stderr, "error: %s\n", mosquitto_strerror(err)); + mosquitto_destroy(client); + return NULL; + } + + mosquitto_message_callback_set(client, callback); + + err = mosquitto_connect(client, hostname, port, KEEPALIVE); + if ( err != MOSQ_ERR_SUCCESS ) { + (void) fprintf(stderr, "error: %s\n", mosquitto_strerror(err)); + mosquitto_destroy(client); + return NULL; + } + + return client; +} + +void +run(struct mosquitto *client, const char *topics[], const volatile bool *quit) +{ + for ( size_t idx = 0; topics[idx] != NULL; ++idx ) { + mosquitto_subscribe(client, NULL, topics[idx], 0); + } + + while ( !*quit ) { + static const int defaultTimeout = -1; // 1000ms + + int err = mosquitto_loop(client, defaultTimeout, 1); + if ( !*quit && err ) { + (void) fprintf(stderr, "connection error: %s\n", mosquitto_strerror(err)); + sleep(WAIT_UNTIL_RECONNECT); // NOLINT + mosquitto_reconnect(client); + } + } +} + +void +shutdown(struct mosquitto *client) +{ + mosquitto_disconnect(client); + mosquitto_destroy(client); +} -- cgit v1.3