This commit is contained in:
2018-11-15 12:50:59 +01:00
parent 4c27a0fe7b
commit 99d72b06a0
3 changed files with 119 additions and 103 deletions

View File

@@ -1,121 +1,84 @@
#ifndef __MQTT_PLUGIN__
#define __MQTT_PLUGIN__
#include "MqttPlugin.h"
#define _TASK_SLEEP_ON_IDLE_RUN
#define _TASK_STD_FUNCTION
#include <WiFiClient.h>
#include <PubSubClient.h>
#include <Plugin.h>
#include "utils_print.h"
using namespace std;
using namespace std::placeholders;
struct MqttConfig
MqttPlugin::MqttPlugin(MqttConfig cfg)
{
const char *clientName;
const char *brokerHost;
int brokerPort;
const char *inTopicRoot;
const char *outTopicRoot;
};
mqttConfig = cfg;
}
class MqttPlugin : public Plugin
void MqttPlugin::activate(Scheduler *scheduler)
{
public:
PubSubClient *client;
WiFiClient wifiClient;
Task connectTask;
Task processTask;
MqttConfig mqttConfig;
vector<String> topics;
client = new PubSubClient(mqttConfig.brokerHost, mqttConfig.brokerPort, bind(&MqttPlugin::downstreamHandler, this, _1, _2, _3), wifiClient);
enableConnectTask(scheduler);
enableProcessTask(scheduler);
PRINT_MSG(Serial, "MQTT", "plugin activated");
}
MqttPlugin(MqttConfig cfg)
{
mqttConfig = cfg;
//subscribe("mqtt/out", bind(&MqttPlugin::mqttPublish, this, _1));
}
void MqttPlugin::enableConnectTask(Scheduler *scheduler)
{
connectTask.set(TASK_SECOND * 5, TASK_FOREVER, bind(&MqttPlugin::connect, this));
scheduler->addTask(connectTask);
connectTask.enable();
}
void activate(Scheduler *scheduler)
{
client = new PubSubClient(mqttConfig.brokerHost, mqttConfig.brokerPort, bind(&MqttPlugin::downstreamHandler, this, _1, _2, _3), wifiClient);
enableConnectTask(scheduler);
enableProcessTask(scheduler);
PRINT_MSG(Serial, "MQTT", "plugin activated");
}
void MqttPlugin::enableProcessTask(Scheduler *scheduler)
{
processTask.set(TASK_MILLISECOND * 5, TASK_FOREVER, bind(&MqttPlugin::process, this));
scheduler->addTask(processTask);
processTask.enable();
}
private:
void enableConnectTask(Scheduler *scheduler)
{
connectTask.set(TASK_SECOND * 5, TASK_FOREVER, bind(&MqttPlugin::connect, this));
scheduler->addTask(connectTask);
connectTask.enable();
}
void MqttPlugin::process()
{
client->loop();
}
void enableProcessTask(Scheduler *scheduler)
void MqttPlugin::connect()
{
if (!client->connected())
{
processTask.set(TASK_MILLISECOND * 5, TASK_FOREVER, bind(&MqttPlugin::process, this));
scheduler->addTask(processTask);
processTask.enable();
}
void process()
{
client->loop();
}
void connect()
{
if (!client->connected())
PRINT_MSG(Serial, "MQTT", "try connect");
if (client->connect(mqttConfig.clientName))
{
PRINT_MSG(Serial, "MQTT", "try connect");
if (client->connect(mqttConfig.clientName))
// bind handlers to all local subscriptions
for (auto const &localSub : mediator->subscriptions)
{
// bind handlers to all local subscriptions
for (auto const &localSub : mediator->subscriptions)
{
// bind all local topics to the MQTT upstream
subscribe(localSub.first.c_str(), bind(&MqttPlugin::upstreamHandler, this, localSub.first.c_str(), _1));
// subscribe topic on remote queue to dispatch messages to local subscriptions
client->subscribe(
(String(mqttConfig.inTopicRoot) + String(localSub.first.c_str()))
.c_str());
}
PRINT_MSG(Serial, "MQTT", "connected");
// bind all local topics to the MQTT upstream
subscribe(localSub.first.c_str(), bind(&MqttPlugin::upstreamHandler, this, localSub.first.c_str(), _1));
// subscribe topic on remote queue to dispatch messages to local subscriptions
client->subscribe(
(String(mqttConfig.inTopicRoot) + String(localSub.first.c_str()))
.c_str());
}
PRINT_MSG(Serial, "MQTT", "connected");
}
}
}
void mqttPublish(String msg)
{
client->publish(mqttConfig.outTopicRoot, msg.c_str());
}
void MqttPlugin::mqttPublish(String msg)
{
client->publish(mqttConfig.outTopicRoot, msg.c_str());
}
void upstreamHandler(String topic, String msg)
{
// publish message on remote queue
PRINT_MSG(Serial, "MQTT", String("upstream: " + msg).c_str());
client->publish((String(mqttConfig.outTopicRoot) + topic).c_str(), msg.c_str());
}
void MqttPlugin::upstreamHandler(String topic, String msg)
{
// publish message on remote queue
PRINT_MSG(Serial, "MQTT", String("upstream: " + msg).c_str());
client->publish((String(mqttConfig.outTopicRoot) + topic).c_str(), msg.c_str());
}
void downstreamHandler(char *topic, uint8_t *payload, unsigned int length)
{
char *cleanPayload = (char *)malloc(length + 1);
payload[length] = '\0';
memcpy(cleanPayload, payload, length + 1);
String msg = String(cleanPayload);
free(cleanPayload);
void MqttPlugin::downstreamHandler(char *topic, uint8_t *payload, unsigned int length)
{
char *cleanPayload = (char *)malloc(length + 1);
payload[length] = '\0';
memcpy(cleanPayload, payload, length + 1);
String msg = String(cleanPayload);
free(cleanPayload);
// substract the topic root and publish msg on local topic
int topicRootLength = String(mqttConfig.inTopicRoot).length();
String localTopic = String(topic).substring(topicRootLength);
publish(localTopic, msg);
// substract the topic root and publish msg on local topic
int topicRootLength = String(mqttConfig.inTopicRoot).length();
String localTopic = String(topic).substring(topicRootLength);
publish(localTopic, msg);
PRINT_MSG(Serial, "MQTT", (String(topic) + " " + msg).c_str());
PRINT_MSG(Serial, "MQTT", (String("publish local: ") + localTopic).c_str());
}
};
#endif
PRINT_MSG(Serial, "MQTT", (String(topic) + " " + msg).c_str());
PRINT_MSG(Serial, "MQTT", (String("publish local: ") + localTopic).c_str());
}

53
src/MqttPlugin.h Normal file
View File

@@ -0,0 +1,53 @@
#ifndef __MQTT_PLUGIN__
#define __MQTT_PLUGIN__
#define _TASK_SLEEP_ON_IDLE_RUN
#define _TASK_STD_FUNCTION
#include <WiFiClient.h>
#include <PubSubClient.h>
#include <Plugin.h>
#include "utils_print.h"
using namespace std;
using namespace std::placeholders;
struct MqttConfig
{
const char *clientName;
const char *brokerHost;
int brokerPort;
const char *inTopicRoot;
const char *outTopicRoot;
};
class MqttPlugin : public Plugin
{
public:
PubSubClient *client;
WiFiClient wifiClient;
Task connectTask;
Task processTask;
MqttConfig mqttConfig;
vector<String> topics;
MqttPlugin(MqttConfig cfg);
void activate(Scheduler *scheduler);
private:
void enableConnectTask(Scheduler *scheduler);
void enableProcessTask(Scheduler *scheduler);
void process();
void connect();
void mqttPublish(String msg);
void upstreamHandler(String topic, String msg);
void downstreamHandler(char *topic, uint8_t *payload, unsigned int length);
};
#endif

View File

@@ -1,7 +1,7 @@
#include "config.h"
#include "WiFiNet.h"
#include "Sprocket.h"
#include "MqttPlugin.cpp"
#include "MqttPlugin.h"
WiFiNet *network;
Sprocket *sprocket;