From: Martin Mares Date: Sat, 1 Jan 2022 19:23:35 +0000 (+0100) Subject: BSB logger: Different way to use libmosquitto X-Git-Url: http://mj.ucw.cz/gitweb/?a=commitdiff_plain;h=49a8282cffb580cbbe0170cfd6d28cfcb2ec27b8;p=home-hw.git BSB logger: Different way to use libmosquitto Even this does not recover from errors well :( --- diff --git a/bsb/logger/burrow-bsb-logger.c b/bsb/logger/burrow-bsb-logger.c index b7a914f..dbcc154 100644 --- a/bsb/logger/burrow-bsb-logger.c +++ b/bsb/logger/burrow-bsb-logger.c @@ -23,19 +23,10 @@ /*** MQTT ***/ static struct mosquitto *mosq; -static bool mqtt_connected; static void mqtt_error(const char *operation, int err, bool teardown) { msg(L_ERROR, "Mosquitto: %s failed: error %d", operation, err); - - if (teardown) { - mosquitto_destroy(mosq); - mosq = NULL; - mqtt_connected = false; - } else if (err == MOSQ_ERR_NO_CONN || err == MOSQ_ERR_CONN_REFUSED || err == MOSQ_ERR_CONN_LOST) { - mqtt_connected = false; - } } static void mqtt_publish(const char *topic, const char *fmt, ...) @@ -43,7 +34,7 @@ static void mqtt_publish(const char *topic, const char *fmt, ...) va_list args; va_start(args, fmt); - if (mqtt_connected) { + if (1) { char m[256]; int l = vsnprintf(m, sizeof(m), fmt, args); int err = mosquitto_publish(mosq, NULL, topic, l, m, 0, true); @@ -56,56 +47,48 @@ static void mqtt_publish(const char *topic, const char *fmt, ...) static void mqtt_log_callback(struct mosquitto *mosq UNUSED, void *obj UNUSED, int level, const char *message) { - // msg(L_INFO, "MQTT(%d): %s", level, message); + msg(L_INFO, "MQTT(%d): %s", level, message); +} + +static void mqtt_conn_callback(struct mosquitto *mosq UNUSED, void *obj UNUSED, int status) +{ + if (!status) { + msg(L_DEBUG, "MQTT: Connection established, subscribing"); + int err = mosquitto_subscribe(mosq, NULL, "bsb/#", 1); + if (err != MOSQ_ERR_SUCCESS) { + mqtt_error("subscribe", err, false); + return; + } + mqtt_publish("status/bsb-logger", "ok"); + } else { + msg(L_DEBUG, "MQTT: Cannot connect"); + } } static void mqtt_msg_callback(struct mosquitto *mosq UNUSED, void *obj UNUSED, const struct mosquitto_message *m); -static bool mqtt_connect(void) +static void mqtt_connect(void) { int err; - if (mqtt_connected) - return true; - - if (!mosq) { - mosq = mosquitto_new("bsb-logger", 1, NULL); - if (!mosq) - die("Mosquitto: initialization failed"); - - mosquitto_log_callback_set(mosq, mqtt_log_callback); - mosquitto_message_callback_set(mosq, mqtt_msg_callback); - - err = mosquitto_will_set(mosq, "status/bsb-logger", 4, "dead", 0, true); - if (err != MOSQ_ERR_SUCCESS) { - mqtt_error("will_set", err, true); - return false; - } + mosquitto_lib_init(); - err = mosquitto_connect(mosq, "10.32.184.5", 1883, 60); - if (err != MOSQ_ERR_SUCCESS) { - mqtt_error("connect", err, true); - return false; - } - } else { - err = mosquitto_reconnect(mosq); - if (err != MOSQ_ERR_SUCCESS) { - mqtt_error("reconnect", err, false); - return false; - } - } + mosq = mosquitto_new("bsb-logger", 1, NULL); + if (!mosq) + die("Mosquitto: initialization failed"); - err = mosquitto_subscribe(mosq, NULL, "bsb/#", 1); - if (err != MOSQ_ERR_SUCCESS) { - mqtt_error("subscribe", err, false); - return false; - } + mosquitto_connect_callback_set(mosq, mqtt_conn_callback); + mosquitto_log_callback_set(mosq, mqtt_log_callback); + mosquitto_message_callback_set(mosq, mqtt_msg_callback); - mqtt_connected = true; + if (mosquitto_will_set(mosq, "status/bsb-logger", 4, "dead", 0, true) != MOSQ_ERR_SUCCESS) + die("Mosquitto: unable to set will"); - mqtt_publish("status/bsb-logger", "ok"); + if (mosquitto_tls_set(mosq, "/etc/burrow-mqtt/ca.crt", NULL, "/etc/burrow-mqtt/client.crt", "/etc/burrow-mqtt/client.key", NULL) != MOSQ_ERR_SUCCESS) + die("Mosquitto: unable to set TLS parameters"); - return mqtt_connected; + if (mosquitto_connect_async(mosq, "burrow-mqtt", 8883, 60) != MOSQ_ERR_SUCCESS) + die("Mosquitto: connect failed"); } static void mqtt_msg_callback(struct mosquitto *mosq UNUSED, void *obj UNUSED, const struct mosquitto_message *m) @@ -162,16 +145,11 @@ int main(int argc UNUSED, char **argv) if (!use_debug) log_default_stream()->levels &= ~(1U << L_DEBUG); - mosquitto_lib_init(); + mqtt_connect(); - for (;;) { - if (!mqtt_connect()) { - sleep(5); - continue; - } + int err = mosquitto_loop_forever(mosq, 10000, 1); + if (err != MOSQ_ERR_SUCCESS) + mqtt_error("loop", err, false); - int err = mosquitto_loop(mosq, 1000000, 1); - if (err != MOSQ_ERR_SUCCESS) - mqtt_error("loop", err, false); - } + return 1; }