// Standard C #include // System #include // Project #include "config.h" #include "mqtt.h" struct mosquitto * mqtt_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; } if ( callback ) { 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 mqtt_run(struct mosquitto *client, const char *topics[], const volatile bool *quit) { int *mid = NULL; for ( size_t idx = 0; topics[idx] != NULL; ++idx ) { mosquitto_subscribe(client, mid, 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); } } for ( size_t idx = 0; topics[idx] != NULL; ++idx ) { mosquitto_unsubscribe(client, mid, topics[idx]); } } void mqtt_shutdown(struct mosquitto *client) { mosquitto_disconnect(client); mosquitto_destroy(client); }