52 lines
1.2 KiB
C++
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);
|
|
}
|