Sensor4/src/patrix/mqtt.cpp

52 lines
1.2 KiB
C++

#include "mqtt.h"
#include <PubSubClient.h>
#include <WiFi.h>
#include "log.h"
#include "wifi.h"
#define MQTT_RETRY_DELAY_MILLIS 3000
WiFiClient wifiClient;
PubSubClient mqtt(wifiClient);
auto mqttHost = "10.0.0.50";
auto mqttPort = 1883;
auto mqttLastConnectMillis = 0UL;
char mqttWillTopic[128];
void mqttLoop() {
if (mqtt.loop()) {
return;
}
if (!isWiFiConnected()) {
mqttLastConnectMillis = 0;
return;
}
if (mqttLastConnectMillis == 0 || millis() - mqttLastConnectMillis > MQTT_RETRY_DELAY_MILLIS) {
snprintf(mqttWillTopic, sizeof(mqttWillTopic), "%s/online", WiFiClass::getHostname());
mqtt.setServer(mqttHost, mqttPort);
mqtt.setKeepAlive(10);
mqtt.setBufferSize(512);
mqttLastConnectMillis = millis();
info("mqtt connecting: host=%s, port=%d", mqttHost, mqttPort);
if (mqtt.connect(WiFiClass::getHostname(), mqttWillTopic, 1, true, "false")) {
info("mqtt connected");
yield();
mqtt.publish(mqttWillTopic, "true", true);
yield();
} else {
error("mqtt failed to connect");
}
}
}
bool mqttPublish(const String& topic, const String& payload, const Retain retain) {
return mqtt.publish(topic.c_str(), payload.c_str(), retain == RETAIN);
}