105 lines
3.0 KiB
C++
105 lines
3.0 KiB
C++
#include "mqtt.h"
|
|
|
|
#include <ESP8266WiFi.h>
|
|
|
|
#include "wifi.h"
|
|
|
|
#include <PubSubClient.h>
|
|
#include <WiFiClient.h>
|
|
|
|
WiFiClient client;
|
|
|
|
PubSubClient mqtt(client);
|
|
|
|
LogClass Log(mqtt);
|
|
|
|
unsigned long mqttFailureMillis = 0;
|
|
|
|
// ReSharper disable once CppUseAuto
|
|
const String logTopic = String("log/") + HOSTNAME;
|
|
|
|
// ReSharper disable once CppUseAuto
|
|
const String cmdTopic = String("cmd/") + HOSTNAME;
|
|
|
|
void mqttCallback(char *topic, const uint8_t *payload, unsigned int length) {
|
|
char message[500];
|
|
length = min(sizeof message - 1, length);
|
|
memcpy(message, payload, length);
|
|
*(message + length) = 0;
|
|
Log.printf("MQTT received: topic=\"%s\", message=\"%s\"\n", topic, message);
|
|
if (strcmp(message, "help") == 0) {
|
|
Log.printf("HELP\n");
|
|
Log.printf(" %s\n", "help");
|
|
Log.printf(" %s\n", "info");
|
|
Log.printf(" %s\n", "reboot");
|
|
} else if (strcmp(message, "info") == 0) {
|
|
Log.printf("INFO\n");
|
|
Log.printf(" %-10s %s\n", "SSID:", WiFi.SSID().c_str());
|
|
Log.printf(" %-10s %s\n", "IP:", WiFi.localIP().toString().c_str());
|
|
Log.printf(" %-10s %d\n", "RSSI:", WiFi.RSSI());
|
|
Log.printf(" %-10s %s\n", "uptime:", uptimeString().c_str());
|
|
} else if (strcmp(message, "reboot") == 0) {
|
|
Log.printf("rebooting...\n");
|
|
delay(500);
|
|
mqtt.disconnect();
|
|
delay(500);
|
|
EspClass::restart();
|
|
}
|
|
}
|
|
|
|
void mqttLoop() {
|
|
if (!mqtt.loop() && isWifiConnected() && (mqttFailureMillis == 0 || millis() - mqttFailureMillis >= 3000)) {
|
|
mqtt.setServer("10.0.0.50", 1883);
|
|
if (mqtt.connect(HOSTNAME, logTopic.c_str(), 0, false, "disconnected\n")) {
|
|
yield();
|
|
mqttPublish(logTopic.c_str(), "connected\n");
|
|
mqtt.setCallback(mqttCallback);
|
|
mqtt.subscribe(cmdTopic.c_str());
|
|
Log.printf("MQTT connected as \"%s\"\n", HOSTNAME);
|
|
mqttFailureMillis = 0;
|
|
} else {
|
|
Log.printf("Failed to connect MQTT.\n");
|
|
mqttFailureMillis = max(1UL, millis());
|
|
}
|
|
}
|
|
}
|
|
|
|
void mqttPublish(const char *topic, const int32_t value, const char *unit) {
|
|
mqttPublish(topic, String(value), unit);
|
|
}
|
|
|
|
void mqttPublish(const char *topic, const int64_t value, const char *unit) {
|
|
mqttPublish(topic, String(value), unit);
|
|
}
|
|
|
|
void mqttPublish(const char *topic, const uint32_t value, const char *unit) {
|
|
mqttPublish(topic, String(value), unit);
|
|
}
|
|
|
|
void mqttPublish(const char *topic, const uint64_t value, const char *unit) {
|
|
mqttPublish(topic, String(value), unit);
|
|
}
|
|
|
|
void mqttPublish(const char *topic, const float value, const char *unit) {
|
|
mqttPublish(topic, String(value), unit);
|
|
}
|
|
|
|
void mqttPublish(const char *topic, const double value, const char *unit) {
|
|
mqttPublish(topic, String(value), unit);
|
|
}
|
|
|
|
bool mqttPublish(const char *topic, const String& value, const char *unit) {
|
|
if (!isTimeSet()) {
|
|
return true;
|
|
}
|
|
char buffer[200];
|
|
snprintf(buffer, sizeof buffer, R"({"timestamp": %lld, "value": %s, "unit": "%s"})", time(nullptr), value.c_str(), unit);
|
|
mqttPublish(topic, buffer);
|
|
return false;
|
|
}
|
|
|
|
void mqttPublish(const char *topic, const char *payload) {
|
|
mqtt.publish(topic, payload);
|
|
yield();
|
|
}
|