#include "mqtt.h" #include #include #include "log.h" #include "PubSubClient.h" #include "console.h" #define CONNECT_TIMEOUT_MILLISECONDS 5000 unsigned long mqttLastConnectTry = 0; WiFiClient espClient; PubSubClient mqtt(espClient); char logTopic[32] = "log/UNSET"; char cmdTopic[64] = "cmd/UNSET"; void mqttSetup() { snprintf(logTopic, sizeof logTopic, "%s/%s", "log", HOSTNAME); snprintf(cmdTopic, sizeof cmdTopic, "%s/%s", "cmd", HOSTNAME); } void mqttLog(const size_t len, const char *separator, const char *datetime, const char *module, const char *level, const char *message) { if (mqtt.beginPublish(logTopic, len, false)) { mqtt.print(datetime); mqtt.print(separator); mqtt.print(module); mqtt.print(separator); mqtt.print(level); mqtt.print(separator); mqtt.print(message); mqtt.endPublish(); } } void mqttDisconnect() { mqtt.disconnect(); } void mqttLoop() { if (WiFi.localIP() != 0 && !mqtt.connected() && (mqttLastConnectTry == 0 || millis() - mqttLastConnectTry > CONNECT_TIMEOUT_MILLISECONDS)) { mqttLastConnectTry = millis(); mqtt.setServer("10.0.0.50", 1883); if (!mqtt.connect(HOSTNAME, logTopic, 0, false, "disconnected")) { Serial.printf("failed to connect\n"); return; } info("MQTT", "connected"); mqtt.setBufferSize(512); mqtt.subscribe(cmdTopic); mqtt.setCallback([](const char *topic, const uint8_t *bytes, const unsigned int length) { char content[64]; if (length > sizeof content - 1) { error("MQTT", "RECEIVE BUFFER OVERFLOW"); return; } memcpy(content, bytes, length); content[length] = 0; if (strcmp(topic, cmdTopic) == 0) { info("MQTT", "CMD > %s", content); consoleHandle(content); } }); } mqtt.loop(); } bool mqttPublish(const char *topic, const JsonDocument &doc) { if (!mqtt.connected()) { return false; } char buffer[512]; const size_t size = serializeJson(doc, buffer); return mqtt.publish(topic, buffer, size); }