From cb45769c2070c58160184404fd4f40e7b6dc83c2 Mon Sep 17 00:00:00 2001 From: JDierkse Date: Thu, 3 Sep 2020 09:06:09 +0200 Subject: [PATCH] Add Reconnection Timer --- Libraries/Timer | 1 + Makefile.conf | 1 + Toon/Bridge.cpp | 51 +++++++++++++++++++++++++++------- Toon/Bridge.h | 10 ++++++- Toon/MessageHandler.cpp | 14 +++++++--- Toon/MessageHandler.h | 6 ++-- Toon/WebSocketSubscription.cpp | 5 ++-- 7 files changed, 68 insertions(+), 20 deletions(-) create mode 120000 Libraries/Timer diff --git a/Libraries/Timer b/Libraries/Timer new file mode 120000 index 0000000..c0ddbc9 --- /dev/null +++ b/Libraries/Timer @@ -0,0 +1 @@ +../../Libraries/Timer \ No newline at end of file diff --git a/Makefile.conf b/Makefile.conf index 0d691ea..000863f 100644 --- a/Makefile.conf +++ b/Makefile.conf @@ -4,6 +4,7 @@ LIBRARIES += Http LIBRARIES += MQTT +LIBRARIES += Timer LIBRARIES += Logging LIBRARIES += Utilities diff --git a/Toon/Bridge.cpp b/Toon/Bridge.cpp index ff09d33..4d59e62 100644 --- a/Toon/Bridge.cpp +++ b/Toon/Bridge.cpp @@ -40,7 +40,8 @@ void Bridge::Start() m_pHttpServer.reset(new Http::HttpServer(m_port, httpCallback)); m_pWebSocketSubscription.reset(new WebSocketSubscription(m_toonSettings)); - m_messageHandler.Connect(std::bind(&Bridge::TimeToLiveCallback, this, m_pWebSocketSubscription.get(), std::placeholders::_1)); + m_messageHandler.Connect(std::bind(&Bridge::ReconnectCallback, this, m_pWebSocketSubscription.get())); + m_messageCheckTimer.StartContinuous(300000, static_cast>(std::bind(&Bridge::CheckMessageReceived, this))); std::stringstream ss; ss << m_mqttSettings.topic << "/BridgeState"; @@ -60,27 +61,57 @@ Http::HttpServer::HttpReply Bridge::HttpCallback(const std::string& uri, const s { if (postData.size() > 0) { - for (auto& data : postData) + for (auto& item : postData) { - if (data.name == "data") - m_messageHandler.HandleMessage(data.value); + if (item.name == "data") + m_messageHandler.HandleMessage(item.value); } } } catch (const std::exception& e) { - std::stringstream ss; - ss << "Bridge::HttpCallback() - Error: " << e.what() << std::endl; - Logging::Log(Logging::Severity::Error, ss.str()); + std::string data; + for (auto& item : postData) + { + if (item.name == "data") + data = (item.value); + } + } + + { + std::unique_lock lock(m_mutex); + m_messageReceived = true; } return reply; } -void Bridge::TimeToLiveCallback(ToonBridge::Toon::WebSocketSubscription* pSubscription, int timeToLive) +void Bridge::ReconnectCallback(ToonBridge::Toon::WebSocketSubscription* pSubscription) { - if (timeToLive < 20) - pSubscription->Reconnect(); + std::stringstream ss; + ss << "Bridge::TimeToLiveCallback() - TTL Expired, reconnecting" << std::endl; + Logging::Log(Logging::Severity::Info, ss.str()); + + pSubscription->Reconnect(); +} + +void Bridge::CheckMessageReceived() +{ + bool messageReceived; + { + std::unique_lock lock(m_mutex); + messageReceived = m_messageReceived; + m_messageReceived = false; + } + + if (!messageReceived) + { + std::stringstream ss; + ss << "Bridge::CheckMessageReceived() - No message received for 5 minutes, reconnecting" << std::endl; + Logging::Log(Logging::Severity::Info, ss.str()); + + m_pWebSocketSubscription->Reconnect(); + } } } // namespace Toon diff --git a/Toon/Bridge.h b/Toon/Bridge.h index cc65c45..9355c63 100644 --- a/Toon/Bridge.h +++ b/Toon/Bridge.h @@ -7,7 +7,9 @@ #include "WebSocketSubscription.h" #include #include +#include #include +#include #include @@ -26,7 +28,8 @@ private: void Start(); Http::HttpServer::HttpReply HttpCallback(const std::string& uri, const std::vector& postData); - void TimeToLiveCallback(WebSocketSubscription* pSubscription, int timeToLive); + void ReconnectCallback(WebSocketSubscription* pSubscription); + void CheckMessageReceived(); private: std::unique_ptr m_pHttpServer; @@ -37,6 +40,11 @@ private: ToonSettings m_toonSettings; MQTTSettings m_mqttSettings; std::unique_ptr m_pWebSocketSubscription; + + Timer::Timer m_messageCheckTimer; + + std::mutex m_mutex; + bool m_messageReceived; }; } // namespace Toon diff --git a/Toon/MessageHandler.cpp b/Toon/MessageHandler.cpp index 3ff375a..66831a0 100644 --- a/Toon/MessageHandler.cpp +++ b/Toon/MessageHandler.cpp @@ -1,4 +1,5 @@ #include "MessageHandler.h" +#include #include @@ -18,8 +19,15 @@ MessageHandler::~MessageHandler() void MessageHandler::HandleMessage(const std::string& message) { nlohmann::json data = nlohmann::json::parse(message); - auto updateDataSet = data["updateDataSet"]; + if (data.contains("code")) + { + if (data["code"] == 510) + m_signal.emit(); + return; + } + + auto updateDataSet = data["updateDataSet"]; if (updateDataSet.contains("powerUsage")) HandlePowerUsageMessage(updateDataSet["powerUsage"]); if (updateDataSet.contains("gasUsage")) @@ -30,11 +38,9 @@ void MessageHandler::HandleMessage(const std::string& message) HandleThermostatInfoMessage(updateDataSet["thermostatInfo"]); if (updateDataSet.contains("thermostatStates")) HandleThermostatStatesMessage(updateDataSet["thermostatStates"]); - - m_signal.emit(data["timeToLiveSeconds"]); } -size_t MessageHandler::Connect(TTLCallbackMethod function) +size_t MessageHandler::Connect(ReconnectCallbackMethod function) { return m_signal.connect(function); } diff --git a/Toon/MessageHandler.h b/Toon/MessageHandler.h index 5b05b73..6d0b6ec 100644 --- a/Toon/MessageHandler.h +++ b/Toon/MessageHandler.h @@ -19,14 +19,14 @@ public: void HandleMessage(const std::string& message); public: - typedef std::function TTLCallbackMethod; + typedef std::function ReconnectCallbackMethod; public: - size_t Connect(TTLCallbackMethod function); + size_t Connect(ReconnectCallbackMethod function); void Disconnect(size_t connection); private: - typedef Simple::Signal TTLMessage; + typedef Simple::Signal TTLMessage; private: void HandlePowerUsageMessage(const nlohmann::json& data); diff --git a/Toon/WebSocketSubscription.cpp b/Toon/WebSocketSubscription.cpp index 62e682b..0f337f8 100644 --- a/Toon/WebSocketSubscription.cpp +++ b/Toon/WebSocketSubscription.cpp @@ -1,5 +1,6 @@ #include "WebSocketSubscription.h" #include +#include #include @@ -45,7 +46,7 @@ void WebSocketSubscription::OpenWebSocket() request.Headers(RequestHeaders()); request.Data(data.dump()); - m_httpClient.Open(request); + std::string returnValue = m_httpClient.Open(request); } void WebSocketSubscription::WebSocketStatus() @@ -73,7 +74,7 @@ void WebSocketSubscription::CloseWebSocket() request.Method(Http::HttpRequest::Method::DELETE); request.Headers(RequestHeaders()); - m_httpClient.Open(request); + std::string returnValue = m_httpClient.Open(request); } std::vector WebSocketSubscription::RequestHeaders()