]> mj.ucw.cz Git - home-hw.git/commitdiff
BSB logger: Different way to use libmosquitto
authorMartin Mares <mj@ucw.cz>
Sat, 1 Jan 2022 19:23:35 +0000 (20:23 +0100)
committerMartin Mares <mj@ucw.cz>
Sat, 1 Jan 2022 19:23:35 +0000 (20:23 +0100)
Even this does not recover from errors well :(

bsb/logger/burrow-bsb-logger.c

index b7a914fbc765369cba166431b21a0d7c1ae67d83..dbcc1545b85861b13f95ba3bc882464ea58294c0 100644 (file)
 /*** 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;
 }