Initial Commit
This commit is contained in:
@@ -0,0 +1,6 @@
|
||||
*.o.*
|
||||
*.d.*
|
||||
*.a.*
|
||||
.*.swp
|
||||
.AppleDouble
|
||||
lib
|
||||
@@ -0,0 +1,3 @@
|
||||
[submodule "Makefiles"]
|
||||
path = Makefiles
|
||||
url = https://gogs.dierkse.nl/JDierkse/Makefiles
|
||||
Symlink
+1
@@ -0,0 +1 @@
|
||||
../../Logging
|
||||
Symlink
+1
@@ -0,0 +1 @@
|
||||
../../SimpleSignal
|
||||
@@ -0,0 +1,41 @@
|
||||
#include "MQTT.h"
|
||||
#include "MQTTImpl.h"
|
||||
|
||||
|
||||
namespace MQTT {
|
||||
|
||||
MQTT::MQTT(const std::string& hostname, int port) :
|
||||
m_pMQTTImpl(new MQTTImpl(hostname, port))
|
||||
{
|
||||
}
|
||||
|
||||
MQTT::~MQTT()
|
||||
{
|
||||
}
|
||||
|
||||
bool MQTT::Send(const Message& message)
|
||||
{
|
||||
return m_pMQTTImpl->Send(message);
|
||||
}
|
||||
|
||||
bool MQTT::Subscribe(const std::string& topic)
|
||||
{
|
||||
return m_pMQTTImpl->Subscribe(topic);
|
||||
}
|
||||
|
||||
void MQTT::Unsubscribe(const std::string& topic)
|
||||
{
|
||||
m_pMQTTImpl->Unsubscribe(topic);
|
||||
}
|
||||
|
||||
size_t MQTT::Connect(CallbackMethod function)
|
||||
{
|
||||
return m_pMQTTImpl->Connect(function);
|
||||
}
|
||||
|
||||
void MQTT::Disconnect(size_t connection)
|
||||
{
|
||||
m_pMQTTImpl->Disconnect(connection);
|
||||
}
|
||||
|
||||
} // namespace MQTT
|
||||
@@ -0,0 +1,164 @@
|
||||
#include "MQTTImpl.h"
|
||||
#include <Logging.h>
|
||||
#include <mosquitto.h>
|
||||
#include <sstream>
|
||||
#include <unistd.h>
|
||||
|
||||
|
||||
namespace MQTT {
|
||||
|
||||
MQTTImpl::MQTTImpl(const std::string& hostname, int port) :
|
||||
m_hostname(hostname),
|
||||
m_port(port),
|
||||
m_connected(false),
|
||||
m_loop(false)
|
||||
{
|
||||
std::stringstream clientId;
|
||||
clientId << "MQTT_" << getpid();
|
||||
m_clientId = clientId.str();
|
||||
|
||||
mosquitto_lib_init();
|
||||
m_pMosquitto = mosquitto_new(m_clientId.c_str(), true, this);
|
||||
|
||||
m_connected = Connect();
|
||||
StartLoop();
|
||||
}
|
||||
|
||||
MQTTImpl::~MQTTImpl()
|
||||
{
|
||||
StopLoop();
|
||||
Disconnect();
|
||||
mosquitto_destroy(m_pMosquitto);
|
||||
mosquitto_lib_cleanup();
|
||||
}
|
||||
|
||||
bool MQTTImpl::Send(const Message& message)
|
||||
{
|
||||
if (m_connected)
|
||||
return (MOSQ_ERR_SUCCESS == mosquitto_publish(m_pMosquitto, NULL, message.topic.c_str(), message.payload.length(), message.payload.c_str(), 0, 0));
|
||||
return false;
|
||||
}
|
||||
|
||||
size_t MQTTImpl::Connect(MQTT::CallbackMethod function)
|
||||
{
|
||||
return m_signal.connect(function);
|
||||
}
|
||||
|
||||
void MQTTImpl::Disconnect(size_t connection)
|
||||
{
|
||||
m_signal.disconnect(connection);
|
||||
}
|
||||
|
||||
bool MQTTImpl::Subscribe(const std::string& topic)
|
||||
{
|
||||
if (m_pMosquitto && m_connected)
|
||||
{
|
||||
if (MOSQ_ERR_SUCCESS != mosquitto_subscribe(m_pMosquitto, NULL, topic.c_str(), 0))
|
||||
return false;
|
||||
return true;
|
||||
}
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
void MQTTImpl::Unsubscribe(const std::string& topic)
|
||||
{
|
||||
if (m_pMosquitto && m_connected)
|
||||
mosquitto_unsubscribe(m_pMosquitto, NULL, topic.c_str());
|
||||
}
|
||||
|
||||
void MQTTImpl::ConnectCallback(mosquitto* pMosquitto, void* pObject, int result)
|
||||
{
|
||||
auto pMQTTImpl = static_cast<MQTTImpl*>(pObject);
|
||||
pMQTTImpl->ConnectCallback(result);
|
||||
}
|
||||
|
||||
void MQTTImpl::MessageCallback(mosquitto* pMosquitto, void* pObject, const mosquitto_message* pMessage)
|
||||
{
|
||||
auto pMQTTImpl = static_cast<MQTTImpl*>(pObject);
|
||||
pMQTTImpl->MessageCallback(pMessage);
|
||||
}
|
||||
|
||||
bool MQTTImpl::Connect()
|
||||
{
|
||||
if (m_pMosquitto)
|
||||
{
|
||||
mosquitto_connect_callback_set(m_pMosquitto, MQTTImpl::ConnectCallback);
|
||||
mosquitto_message_callback_set(m_pMosquitto, MQTTImpl::MessageCallback);
|
||||
|
||||
if (MOSQ_ERR_SUCCESS != mosquitto_connect(m_pMosquitto, m_hostname.c_str(), m_port, 60))
|
||||
return false;
|
||||
|
||||
Logging::Log(Logging::Severity::Info, "MQTT::Connect() - Connected");
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
void MQTTImpl::Disconnect()
|
||||
{
|
||||
if (m_pMosquitto && m_connected)
|
||||
{
|
||||
if (MOSQ_ERR_SUCCESS != mosquitto_disconnect(m_pMosquitto))
|
||||
return;
|
||||
m_connected = false;
|
||||
}
|
||||
}
|
||||
|
||||
void MQTTImpl::StartLoop()
|
||||
{
|
||||
std::unique_lock<std::mutex> lock(m_mutex);
|
||||
m_loop = true;
|
||||
m_thread = std::thread([&] { Loop(); });
|
||||
}
|
||||
|
||||
bool MQTTImpl::RunLoop() const
|
||||
{
|
||||
std::unique_lock<std::mutex> lock(m_mutex);
|
||||
return m_loop;
|
||||
}
|
||||
|
||||
void MQTTImpl::Loop()
|
||||
{
|
||||
while (RunLoop())
|
||||
{
|
||||
bool success = (MOSQ_ERR_SUCCESS == mosquitto_loop(m_pMosquitto, -1, 1));
|
||||
|
||||
if (m_loop && !success)
|
||||
{
|
||||
Logging::Log(Logging::Severity::Info, "MQTT::Loop() - Disconnected");
|
||||
Disconnect();
|
||||
sleep(3);
|
||||
while (RunLoop() && !success)
|
||||
success = Connect();
|
||||
}
|
||||
}
|
||||
|
||||
Logging::Log(Logging::Severity::Info, "MQTT::Loop() - End");
|
||||
}
|
||||
|
||||
void MQTTImpl::StopLoop()
|
||||
{
|
||||
{
|
||||
std::unique_lock<std::mutex> lock(m_mutex);
|
||||
m_loop = false;
|
||||
}
|
||||
m_thread.join();
|
||||
}
|
||||
|
||||
void MQTTImpl::ConnectCallback(int result)
|
||||
{
|
||||
}
|
||||
|
||||
void MQTTImpl::MessageCallback(const mosquitto_message* pMessage)
|
||||
{
|
||||
Message message;
|
||||
message.topic = std::string(pMessage->topic);
|
||||
message.payload = std::string(static_cast<char*>(pMessage->payload), pMessage->payloadlen);
|
||||
|
||||
m_signal.emit(message);
|
||||
}
|
||||
|
||||
} // namespace MQTT
|
||||
@@ -0,0 +1,64 @@
|
||||
#ifndef MQTT_MQTTIMPL_H
|
||||
#define MQTT_MQTTIMPL_H
|
||||
|
||||
#include "Message.h"
|
||||
#include "MQTT.h"
|
||||
#include <SimpleSignal.h>
|
||||
#include <mutex>
|
||||
#include <string>
|
||||
#include <thread>
|
||||
|
||||
|
||||
struct mosquitto;
|
||||
struct mosquitto_message;
|
||||
|
||||
namespace MQTT {
|
||||
|
||||
class MQTTImpl
|
||||
{
|
||||
public:
|
||||
MQTTImpl(const std::string& hostname, int port);
|
||||
~MQTTImpl();
|
||||
|
||||
bool Send(const Message& message);
|
||||
bool Subscribe(const std::string& topic);
|
||||
void Unsubscribe(const std::string& topic);
|
||||
size_t Connect(MQTT::CallbackMethod function);
|
||||
void Disconnect(size_t connection);
|
||||
|
||||
private:
|
||||
typedef Simple::Signal<void(const Message&)> MessageSignal;
|
||||
|
||||
private:
|
||||
static void ConnectCallback(mosquitto* pMosquitto, void* pObject, int result);
|
||||
static void MessageCallback(mosquitto* pMosquitto, void* pObject, const mosquitto_message* pMessage);
|
||||
|
||||
private:
|
||||
bool Connect();
|
||||
void Disconnect();
|
||||
|
||||
void StartLoop();
|
||||
bool RunLoop() const;
|
||||
void Loop();
|
||||
void StopLoop();
|
||||
|
||||
void ConnectCallback(int result);
|
||||
void MessageCallback(const mosquitto_message* pMessage);
|
||||
|
||||
private:
|
||||
std::thread m_thread;
|
||||
mutable std::mutex m_mutex;
|
||||
|
||||
std::string m_hostname;
|
||||
int m_port;
|
||||
bool m_connected;
|
||||
bool m_loop;
|
||||
std::string m_clientId;
|
||||
mosquitto* m_pMosquitto;
|
||||
|
||||
MessageSignal m_signal;
|
||||
};
|
||||
|
||||
} // namespace MQTT
|
||||
|
||||
#endif // MQTTIMPL_H
|
||||
Symlink
+1
@@ -0,0 +1 @@
|
||||
../Makefile
|
||||
@@ -0,0 +1,17 @@
|
||||
#
|
||||
# Makefile.conf
|
||||
#
|
||||
|
||||
LFLAGS += -lLogging
|
||||
LFLAGS += -L$(ROOTPATH)/Libraries/Logging/lib/$(ARCH)
|
||||
CFLAGS += -I$(ROOTPATH)/Libraries/Logging/include
|
||||
|
||||
CFLAGS += -I$(ROOTPATH)/Libraries/SimpleSignal
|
||||
|
||||
LFLAGS += -lmosquitto
|
||||
|
||||
LFLAGS += -lMQTT
|
||||
LFLAGS += -L$(ROOTPATH)/lib/$(ARCH)
|
||||
CFLAGS += -I$(ROOTPATH) -I$(ROOTPATH)/include
|
||||
|
||||
DEBUGDIR := .debug
|
||||
@@ -0,0 +1,12 @@
|
||||
#
|
||||
# Makefile.target
|
||||
#
|
||||
|
||||
MQTT.a.$(ARCH) : $(OBJECTS)
|
||||
$(call build_target_library_arch,$@,$^)
|
||||
MQTT.a:
|
||||
$(call build_target,$@)
|
||||
|
||||
.DEFAULT_GOAL := MQTT.a
|
||||
|
||||
TARGETS += MQTT.a
|
||||
Submodule
+1
Submodule Makefiles added at cd9ef1a1b0
@@ -0,0 +1,36 @@
|
||||
#ifndef MQTT_H
|
||||
#define MQTT_H
|
||||
|
||||
#include "Message.h"
|
||||
#include <functional>
|
||||
#include <memory>
|
||||
#include <string>
|
||||
|
||||
|
||||
namespace MQTT {
|
||||
|
||||
class MQTTImpl;
|
||||
|
||||
class MQTT
|
||||
{
|
||||
public:
|
||||
MQTT(const std::string& hostname, int port);
|
||||
~MQTT();
|
||||
|
||||
public:
|
||||
typedef std::function<void(const Message&)> CallbackMethod;
|
||||
|
||||
public:
|
||||
bool Send(const Message& message);
|
||||
bool Subscribe(const std::string& topic);
|
||||
void Unsubscribe(const std::string& topic);
|
||||
size_t Connect(CallbackMethod function);
|
||||
void Disconnect(size_t connection);
|
||||
|
||||
private:
|
||||
std::unique_ptr<MQTTImpl> m_pMQTTImpl;
|
||||
};
|
||||
|
||||
} // namespace MQTT
|
||||
|
||||
#endif // MQTT_H
|
||||
@@ -0,0 +1,17 @@
|
||||
#ifndef MESSAGE_H
|
||||
#define MESSAGE_H
|
||||
|
||||
#include <string>
|
||||
|
||||
|
||||
namespace MQTT {
|
||||
|
||||
struct Message
|
||||
{
|
||||
std::string topic;
|
||||
std::string payload;
|
||||
};
|
||||
|
||||
} // namespace MQTT
|
||||
|
||||
#endif // MESSAGE_H
|
||||
Reference in New Issue
Block a user