2022-02-23 18:40:31 +00:00
|
|
|
#include <logger.h>
|
|
|
|
|
|
|
|
#include "Task.h"
|
|
|
|
#include "TaskMQTT.h"
|
|
|
|
#include "project_configuration.h"
|
|
|
|
|
|
|
|
#include <ArduinoJson.h>
|
|
|
|
|
2022-02-24 15:02:02 +00:00
|
|
|
MQTTTask::MQTTTask(TaskQueue<std::shared_ptr<APRSMessage>> &toMQTT) : Task(TASK_MQTT, TaskMQTT), _toMQTT(toMQTT), _MQTT(_client) {
|
2022-02-23 18:40:31 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
MQTTTask::~MQTTTask() {
|
|
|
|
}
|
|
|
|
|
2022-02-24 15:02:02 +00:00
|
|
|
bool MQTTTask::setup(System &system) {
|
2022-02-23 18:40:31 +00:00
|
|
|
_MQTT.setServer(system.getUserConfig()->mqtt.server.c_str(), system.getUserConfig()->mqtt.port);
|
|
|
|
return true;
|
|
|
|
}
|
|
|
|
|
|
|
|
bool MQTTTask::loop(System &system) {
|
|
|
|
if (!system.isWifiEthConnected()) {
|
|
|
|
return false;
|
|
|
|
}
|
2022-02-24 15:02:02 +00:00
|
|
|
|
2022-02-23 18:40:31 +00:00
|
|
|
if (!_MQTT.connected()) {
|
|
|
|
connect(system);
|
|
|
|
}
|
|
|
|
|
|
|
|
if (!_toMQTT.empty()) {
|
|
|
|
std::shared_ptr<APRSMessage> msg = _toMQTT.getElement();
|
|
|
|
|
2022-02-24 15:02:02 +00:00
|
|
|
DynamicJsonDocument data(1024);
|
2022-02-24 15:52:52 +00:00
|
|
|
data["source"] = msg->getSource();
|
|
|
|
data["destination"] = msg->getDestination();
|
|
|
|
data["path"] = msg->getPath();
|
|
|
|
data["type"] = msg->getType().toString();
|
2022-02-24 15:02:02 +00:00
|
|
|
String body = msg->getBody()->encode();
|
|
|
|
body.replace("\n", "");
|
2022-02-24 15:52:52 +00:00
|
|
|
data["data"] = body;
|
2022-02-24 15:02:02 +00:00
|
|
|
|
|
|
|
String r;
|
|
|
|
serializeJson(data, r);
|
|
|
|
|
|
|
|
String topic = String(system.getUserConfig()->mqtt.topic);
|
|
|
|
if (!topic.endsWith("/")) {
|
|
|
|
topic = topic + "/";
|
2022-02-23 18:40:31 +00:00
|
|
|
}
|
2022-02-24 15:02:02 +00:00
|
|
|
topic = topic + system.getUserConfig()->callsign;
|
|
|
|
|
|
|
|
logPrintD("Send MQTT with topic: \"");
|
|
|
|
logPrintD(topic);
|
|
|
|
logPrintD("\", data: ");
|
|
|
|
logPrintlnD(r);
|
2022-02-23 18:40:31 +00:00
|
|
|
|
2022-02-24 15:02:02 +00:00
|
|
|
_MQTT.publish(topic.c_str(), r.c_str());
|
2022-02-23 18:40:31 +00:00
|
|
|
}
|
|
|
|
_MQTT.loop();
|
|
|
|
return true;
|
|
|
|
}
|
|
|
|
|
|
|
|
bool MQTTTask::connect(const System &system) {
|
2022-02-24 15:02:02 +00:00
|
|
|
logPrintI("Connecting to MQTT broker: ");
|
2022-02-23 18:40:31 +00:00
|
|
|
logPrintI(system.getUserConfig()->mqtt.server);
|
2022-02-24 15:02:02 +00:00
|
|
|
logPrintI(" on port ");
|
2022-02-23 18:40:31 +00:00
|
|
|
logPrintlnI(String(system.getUserConfig()->mqtt.port));
|
|
|
|
|
2022-02-24 15:02:02 +00:00
|
|
|
if (_MQTT.connect(system.getUserConfig()->callsign.c_str(), system.getUserConfig()->mqtt.name.c_str(), system.getUserConfig()->mqtt.password.c_str())) {
|
|
|
|
logPrintI("Connected to MQTT broker as: ");
|
|
|
|
logPrintlnI(system.getUserConfig()->callsign);
|
2022-02-23 18:40:31 +00:00
|
|
|
return true;
|
2022-02-24 15:02:02 +00:00
|
|
|
}
|
|
|
|
logPrintlnI("Connecting to MQTT broker faild. Try again later.");
|
2022-02-23 18:40:31 +00:00
|
|
|
return false;
|
|
|
|
}
|