Commit 9421324bbad2b582bdb55f44f8cae91453189b69
1 parent
750b542a
First fix on connection
Showing
12 changed files
with
139 additions
and
23 deletions
CMakeLists.txt
| @@ -8,6 +8,7 @@ include(projectheader) | @@ -8,6 +8,7 @@ include(projectheader) | ||
| 8 | project_header(osdev_mqtt) | 8 | project_header(osdev_mqtt) |
| 9 | 9 | ||
| 10 | add_subdirectory(src) | 10 | add_subdirectory(src) |
| 11 | +add_subdirectory(examples/connect) | ||
| 11 | add_subdirectory(examples/pub) | 12 | add_subdirectory(examples/pub) |
| 12 | add_subdirectory(examples/sub) | 13 | add_subdirectory(examples/sub) |
| 13 | 14 |
examples/connect/CMakeLists.txt
0 → 100644
| 1 | +cmake_minimum_required(VERSION 3.0) | ||
| 2 | +LIST(APPEND CMAKE_MODULE_PATH ${CMAKE_SOURCE_DIR}/submodules/cmake) | ||
| 3 | + | ||
| 4 | +include(projectheader) | ||
| 5 | +project_header(test_connections) | ||
| 6 | + | ||
| 7 | +include_directories( SYSTEM | ||
| 8 | + ${CMAKE_CURRENT_SOURCE_DIR}/../../include | ||
| 9 | +) | ||
| 10 | + | ||
| 11 | +include(compiler) | ||
| 12 | +set(SRC_LIST | ||
| 13 | + ${CMAKE_CURRENT_SOURCE_DIR}/main.cpp | ||
| 14 | +) | ||
| 15 | + | ||
| 16 | +add_executable( ${PROJECT_NAME} | ||
| 17 | + ${SRC_LIST} | ||
| 18 | +) | ||
| 19 | + | ||
| 20 | +target_link_libraries( | ||
| 21 | + ${PROJECT_NAME} | ||
| 22 | + mqtt-cpp | ||
| 23 | +) | ||
| 24 | + | ||
| 25 | +set_target_properties( ${PROJECT_NAME} PROPERTIES | ||
| 26 | + RUNTIME_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/bin | ||
| 27 | + LIBRARY_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/lib | ||
| 28 | + ARCHIVE_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/lib | ||
| 29 | +) | ||
| 30 | + | ||
| 31 | +include(installation) | ||
| 32 | +install_application() |
examples/connect/main.cpp
0 → 100644
| 1 | + | ||
| 2 | +#include <iostream> | ||
| 3 | +#include <unistd.h> | ||
| 4 | + | ||
| 5 | +#include "mqttclient.h" | ||
| 6 | + | ||
| 7 | +using namespace osdev::components::mqtt; | ||
| 8 | + | ||
| 9 | +int main( int argc, char* argv[] ) | ||
| 10 | +{ | ||
| 11 | + (void)argc; | ||
| 12 | + (void)argv; | ||
| 13 | + | ||
| 14 | + MqttClient oClient( "ConnectionTest" ); | ||
| 15 | + oClient.connect( "localhost", 1883, Credentials() ); | ||
| 16 | + | ||
| 17 | + unsigned int nCount = 0; | ||
| 18 | + | ||
| 19 | + while(1) | ||
| 20 | + { | ||
| 21 | + std::cout << "[" << std::to_string(nCount++) << "] MQTT Client status : " << oClient.state() << std::endl; | ||
| 22 | + sleep( 1 ); | ||
| 23 | + } | ||
| 24 | + | ||
| 25 | + return 0; | ||
| 26 | +} |
examples/pub/main.cpp
examples/sub/main.cpp
| @@ -83,7 +83,7 @@ int main( int argc, char* argv[] ) | @@ -83,7 +83,7 @@ int main( int argc, char* argv[] ) | ||
| 83 | // Start a loop to give the subscriber the possibility to do its work. | 83 | // Start a loop to give the subscriber the possibility to do its work. |
| 84 | while( 1 ) | 84 | while( 1 ) |
| 85 | { | 85 | { |
| 86 | - sleepcp( 1, T_MICRO ); // Sleep 1 Sec to give the scheduler the change to interfene. | 86 | + sleepcp( 1, T_SECONDS ); // Sleep 1 Sec to give the scheduler the change to interfene. |
| 87 | } | 87 | } |
| 88 | } | 88 | } |
| 89 | else | 89 | else |
include/clientpaho.h
| @@ -204,6 +204,12 @@ private: | @@ -204,6 +204,12 @@ private: | ||
| 204 | void callbackEventHandler(); | 204 | void callbackEventHandler(); |
| 205 | 205 | ||
| 206 | /** | 206 | /** |
| 207 | + * @brief Callback method that is called when a first connect succeeds. | ||
| 208 | + * @param reason Som extra information if there is any. | ||
| 209 | + */ | ||
| 210 | + void onFirstConnectInstance(const std::string &reason); | ||
| 211 | + | ||
| 212 | + /** | ||
| 207 | * @brief Callback method that is called when a reconnect succeeds. | 213 | * @brief Callback method that is called when a reconnect succeeds. |
| 208 | * @param cause The cause of the original disconnect. | 214 | * @param cause The cause of the original disconnect. |
| 209 | */ | 215 | */ |
| @@ -298,6 +304,7 @@ private: | @@ -298,6 +304,7 @@ private: | ||
| 298 | void onConnectionLostOnInstance(const std::string& cause); | 304 | void onConnectionLostOnInstance(const std::string& cause); |
| 299 | 305 | ||
| 300 | // Static callback functions that are registered on the paho library. Functions call their *OnInstance() counterparts. | 306 | // Static callback functions that are registered on the paho library. Functions call their *OnInstance() counterparts. |
| 307 | + static void onFirstConnect(void* context, char* cause); | ||
| 301 | static void onConnect(void* context, char* cause); | 308 | static void onConnect(void* context, char* cause); |
| 302 | static void onConnectSuccess(void* context, MQTTAsync_successData* response); | 309 | static void onConnectSuccess(void* context, MQTTAsync_successData* response); |
| 303 | static void onConnectFailure(void* context, MQTTAsync_failureData* response); | 310 | static void onConnectFailure(void* context, MQTTAsync_failureData* response); |
include/imqttclient.h
| @@ -60,13 +60,13 @@ public: | @@ -60,13 +60,13 @@ public: | ||
| 60 | * @param port The port to use. | 60 | * @param port The port to use. |
| 61 | * @param credentials The credentials to use. | 61 | * @param credentials The credentials to use. |
| 62 | */ | 62 | */ |
| 63 | - virtual void connect(const std::string& host, int port, const Credentials& credentials, const mqtt_LWT &lwt = mqtt_LWT() ) = 0; | 63 | + virtual void connect(const std::string& host, int port, const Credentials& credentials, const mqtt_LWT &lwt = mqtt_LWT(), bool blocking = false ) = 0; |
| 64 | 64 | ||
| 65 | /** | 65 | /** |
| 66 | * @brief Connect to the endpoint | 66 | * @brief Connect to the endpoint |
| 67 | * @param endpoint an uri endpoint description. | 67 | * @param endpoint an uri endpoint description. |
| 68 | */ | 68 | */ |
| 69 | - virtual void connect(const std::string& endpoint, const mqtt_LWT &lwt = mqtt_LWT() ) = 0; | 69 | + virtual void connect(const std::string& endpoint, const mqtt_LWT &lwt = mqtt_LWT(), bool blocking = false ) = 0; |
| 70 | 70 | ||
| 71 | /** | 71 | /** |
| 72 | * @brief Disconnect the client from the broker | 72 | * @brief Disconnect the client from the broker |
include/mqttclient.h
| @@ -92,12 +92,12 @@ public: | @@ -92,12 +92,12 @@ public: | ||
| 92 | /** | 92 | /** |
| 93 | * @see IMqttClient | 93 | * @see IMqttClient |
| 94 | */ | 94 | */ |
| 95 | - virtual void connect( const std::string& host, int port, const Credentials &credentials, const mqtt_LWT &lwt = mqtt_LWT() ) override; | 95 | + virtual void connect( const std::string& host, int port, const Credentials &credentials, const mqtt_LWT &lwt = mqtt_LWT(), bool blocking = false ) override; |
| 96 | 96 | ||
| 97 | /** | 97 | /** |
| 98 | * @see IMqttClient | 98 | * @see IMqttClient |
| 99 | */ | 99 | */ |
| 100 | - virtual void connect( const std::string &endpoint, const mqtt_LWT &lwt = mqtt_LWT() ) override; | 100 | + virtual void connect( const std::string &endpoint, const mqtt_LWT &lwt = mqtt_LWT(), bool blocking = false ) override; |
| 101 | 101 | ||
| 102 | /** | 102 | /** |
| 103 | * @see IMqttClient | 103 | * @see IMqttClient |
src/clientpaho.cpp
| @@ -24,6 +24,7 @@ | @@ -24,6 +24,7 @@ | ||
| 24 | #include "errorcode.h" | 24 | #include "errorcode.h" |
| 25 | #include "mqttutil.h" | 25 | #include "mqttutil.h" |
| 26 | #include "lockguard.h" | 26 | #include "lockguard.h" |
| 27 | +#include "log.h" | ||
| 27 | #include "metaprogrammingdefs.h" | 28 | #include "metaprogrammingdefs.h" |
| 28 | #include "mqttstream.h" | 29 | #include "mqttstream.h" |
| 29 | #include "scopeguard.h" | 30 | #include "scopeguard.h" |
| @@ -131,6 +132,18 @@ ClientPaho::ClientPaho(const std::string& _endpoint, | @@ -131,6 +132,18 @@ ClientPaho::ClientPaho(const std::string& _endpoint, | ||
| 131 | if (MQTTASYNC_SUCCESS == rc) | 132 | if (MQTTASYNC_SUCCESS == rc) |
| 132 | { | 133 | { |
| 133 | MQTTAsync_setCallbacks(m_client, reinterpret_cast<void*>(this), ClientPaho::onConnectionLost, ClientPaho::onMessageArrived, ClientPaho::onDeliveryComplete); | 134 | MQTTAsync_setCallbacks(m_client, reinterpret_cast<void*>(this), ClientPaho::onConnectionLost, ClientPaho::onMessageArrived, ClientPaho::onDeliveryComplete); |
| 135 | + LogDebug( "[ClientPaho]", std::string( m_clientId + " - Setting the extra onConnected callback.") ); | ||
| 136 | + /* | ||
| 137 | + auto ccb = MQTTAsync_setConnected( m_client, reinterpret_cast<void*>(this), ClientPaho::onConnect ); | ||
| 138 | + if( MQTTASYNC_SUCCESS == ccb ) | ||
| 139 | + { | ||
| 140 | + LogDebug( "[ClientPaho]", std::string( m_clientId + " - Setting the extra onConnected callback SUCCEEDED.") ); | ||
| 141 | + } | ||
| 142 | + else | ||
| 143 | + { | ||
| 144 | + LogDebug( "[ClientPaho]", std::string( m_clientId + " - Setting the extra onConnected callback FAILED.") ); | ||
| 145 | + } | ||
| 146 | + */ | ||
| 134 | m_workerThread = std::thread(&ClientPaho::callbackEventHandler, this); | 147 | m_workerThread = std::thread(&ClientPaho::callbackEventHandler, this); |
| 135 | } | 148 | } |
| 136 | else | 149 | else |
| @@ -194,7 +207,7 @@ std::int32_t ClientPaho::connect( bool wait, const mqtt_LWT &lwt ) | @@ -194,7 +207,7 @@ std::int32_t ClientPaho::connect( bool wait, const mqtt_LWT &lwt ) | ||
| 194 | } | 207 | } |
| 195 | 208 | ||
| 196 | MQTTAsync_connectOptions conn_opts = MQTTAsync_connectOptions_initializer; | 209 | MQTTAsync_connectOptions conn_opts = MQTTAsync_connectOptions_initializer; |
| 197 | - conn_opts.keepAliveInterval = 20; | 210 | + conn_opts.keepAliveInterval = 5; |
| 198 | conn_opts.cleansession = 1; | 211 | conn_opts.cleansession = 1; |
| 199 | conn_opts.onSuccess = &ClientPaho::onConnectSuccess; | 212 | conn_opts.onSuccess = &ClientPaho::onConnectSuccess; |
| 200 | conn_opts.onFailure = &ClientPaho::onConnectFailure; | 213 | conn_opts.onFailure = &ClientPaho::onConnectFailure; |
| @@ -739,6 +752,22 @@ void ClientPaho::callbackEventHandler() | @@ -739,6 +752,22 @@ void ClientPaho::callbackEventHandler() | ||
| 739 | // ("ClientPaho", "%1 - leaving callback event handler", m_clientId); | 752 | // ("ClientPaho", "%1 - leaving callback event handler", m_clientId); |
| 740 | } | 753 | } |
| 741 | 754 | ||
| 755 | +void ClientPaho::onFirstConnectInstance(const std::string &reason) | ||
| 756 | +{ | ||
| 757 | + (void)reason; | ||
| 758 | + { | ||
| 759 | + OSDEV_COMPONENTS_LOCKGUARD(m_mutex); | ||
| 760 | + // Register the connect callback that is used in reconnect scenarios. | ||
| 761 | + auto rc = MQTTAsync_setConnected(m_client, this, &ClientPaho::onConnect); | ||
| 762 | + if (MQTTASYNC_SUCCESS != rc) | ||
| 763 | + { | ||
| 764 | + LogError( "[ClientPaho]", std::string( "onFirstConnectInstance " + m_clientId + " - registering the connected callback failed with code : " + pahoAsyncErrorCodeToString(rc) ) ); | ||
| 765 | + } | ||
| 766 | + } | ||
| 767 | + | ||
| 768 | + setConnectionStatus(ConnectionStatus::Connected); | ||
| 769 | +} | ||
| 770 | + | ||
| 742 | void ClientPaho::onConnectOnInstance(const std::string& cause) | 771 | void ClientPaho::onConnectOnInstance(const std::string& cause) |
| 743 | { | 772 | { |
| 744 | (void)cause; | 773 | (void)cause; |
| @@ -756,15 +785,15 @@ void ClientPaho::onConnectOnInstance(const std::string& cause) | @@ -756,15 +785,15 @@ void ClientPaho::onConnectOnInstance(const std::string& cause) | ||
| 756 | void ClientPaho::onConnectSuccessOnInstance(const MqttSuccess& response) | 785 | void ClientPaho::onConnectSuccessOnInstance(const MqttSuccess& response) |
| 757 | { | 786 | { |
| 758 | auto connectData = response.connectionData(); | 787 | auto connectData = response.connectionData(); |
| 759 | - // ("ClientPaho", "onConnectSuccessOnInstance %1 - connected to endpoint %2 (mqtt version %3, session present %4)", | ||
| 760 | - // m_clientId, connectData.serverUri(), connectData.mqttVersion(), connectData.sessionPresent()); | 788 | + LogDebug( "[ClientPaho]", std::string( "onConnectSuccessOnInstance " + m_clientId + " - connected to endpoint " + connectData.serverUri() + |
| 789 | + " (mqtt version " + std::to_string( connectData.mqttVersion() ) + ", session present " + ( connectData.sessionPresent() ? "TRUE" : "FALSE" ) + " )" ) ); | ||
| 761 | { | 790 | { |
| 762 | OSDEV_COMPONENTS_LOCKGUARD(m_mutex); | 791 | OSDEV_COMPONENTS_LOCKGUARD(m_mutex); |
| 763 | // Register the connect callback that is used in reconnect scenarios. | 792 | // Register the connect callback that is used in reconnect scenarios. |
| 764 | auto rc = MQTTAsync_setConnected(m_client, this, &ClientPaho::onConnect); | 793 | auto rc = MQTTAsync_setConnected(m_client, this, &ClientPaho::onConnect); |
| 765 | if (MQTTASYNC_SUCCESS != rc) | 794 | if (MQTTASYNC_SUCCESS != rc) |
| 766 | { | 795 | { |
| 767 | - // ("ClientPaho", "onConnectSuccessOnInstance %1 - registering the connected callback failed with code %2", m_clientId, pahoAsyncErrorCodeToString(rc)); | 796 | + LogError( "[ClientPaho]", std::string( "onConnectSuccesOnInstance " + m_clientId + " - registering the connected callback failed with code : " + pahoAsyncErrorCodeToString(rc) ) ); |
| 768 | } | 797 | } |
| 769 | // For MQTTV5 | 798 | // For MQTTV5 |
| 770 | //rc = MQTTAsync_setDisconnected(m_client, this, &ClientPaho::onDisconnect); | 799 | //rc = MQTTAsync_setDisconnected(m_client, this, &ClientPaho::onDisconnect); |
| @@ -775,9 +804,11 @@ void ClientPaho::onConnectSuccessOnInstance(const MqttSuccess& response) | @@ -775,9 +804,11 @@ void ClientPaho::onConnectSuccessOnInstance(const MqttSuccess& response) | ||
| 775 | m_operationResult[-100] = true; | 804 | m_operationResult[-100] = true; |
| 776 | m_pendingOperations.erase(-100); | 805 | m_pendingOperations.erase(-100); |
| 777 | } | 806 | } |
| 807 | + | ||
| 778 | setConnectionStatus(ConnectionStatus::Connected); | 808 | setConnectionStatus(ConnectionStatus::Connected); |
| 779 | - if (m_connectPromise) | 809 | + if(m_connectPromise) |
| 780 | { | 810 | { |
| 811 | + LogDebug( "[ClientPaho]", std::string("connectPromise still present. Resetting!") ); | ||
| 781 | m_connectPromise->set_value(); | 812 | m_connectPromise->set_value(); |
| 782 | } | 813 | } |
| 783 | m_operationsCompleteCV.notify_all(); | 814 | m_operationsCompleteCV.notify_all(); |
| @@ -786,7 +817,7 @@ void ClientPaho::onConnectSuccessOnInstance(const MqttSuccess& response) | @@ -786,7 +817,7 @@ void ClientPaho::onConnectSuccessOnInstance(const MqttSuccess& response) | ||
| 786 | void ClientPaho::onConnectFailureOnInstance(const MqttFailure& response) | 817 | void ClientPaho::onConnectFailureOnInstance(const MqttFailure& response) |
| 787 | { | 818 | { |
| 788 | (void)response; | 819 | (void)response; |
| 789 | - // ("ClientPaho", "onConnectFailureOnInstance %1 - connection failed with code %2 (%3)", m_clientId, response.codeToString(), response.message()); | 820 | + LogDebug("ClientPaho", std::string( "onConnectFailureOnInstance" + m_clientId + " - connection failed with code " + response.codeToString() + " (" + response.message() + ")")); |
| 790 | { | 821 | { |
| 791 | OSDEV_COMPONENTS_LOCKGUARD(m_mutex); | 822 | OSDEV_COMPONENTS_LOCKGUARD(m_mutex); |
| 792 | // ("ClientPaho", "onConnectFailureOnInstance %1 - pending operations : %2, removing operation -100", m_clientId, m_pendingOperations); | 823 | // ("ClientPaho", "onConnectFailureOnInstance %1 - pending operations : %2, removing operation -100", m_clientId, m_pendingOperations); |
| @@ -1077,8 +1108,20 @@ void ClientPaho::onConnectionLostOnInstance(const std::string& cause) | @@ -1077,8 +1108,20 @@ void ClientPaho::onConnectionLostOnInstance(const std::string& cause) | ||
| 1077 | } | 1108 | } |
| 1078 | 1109 | ||
| 1079 | // static | 1110 | // static |
| 1111 | +void ClientPaho::onFirstConnect(void* context, char* cause) | ||
| 1112 | +{ | ||
| 1113 | + LogInfo( "[ClientPaho::onFirstConnect]", "onFirstConnect triggered.." ); | ||
| 1114 | + if(context) | ||
| 1115 | + { | ||
| 1116 | + auto *cl = reinterpret_cast<ClientPaho*>(context); | ||
| 1117 | + std::string reason(nullptr == cause ? "Unknown cause" : cause); | ||
| 1118 | + cl->pushIncomingEvent([cl, reason]() { cl->onFirstConnectInstance(reason); }); | ||
| 1119 | + } | ||
| 1120 | +} | ||
| 1121 | + | ||
| 1080 | void ClientPaho::onConnect(void* context, char* cause) | 1122 | void ClientPaho::onConnect(void* context, char* cause) |
| 1081 | { | 1123 | { |
| 1124 | + LogInfo( "[ClientPaho::onConnect]", "onConnect triggered.." ); | ||
| 1082 | if (context) | 1125 | if (context) |
| 1083 | { | 1126 | { |
| 1084 | auto* cl = reinterpret_cast<ClientPaho*>(context); | 1127 | auto* cl = reinterpret_cast<ClientPaho*>(context); |
| @@ -1090,6 +1133,7 @@ void ClientPaho::onConnect(void* context, char* cause) | @@ -1090,6 +1133,7 @@ void ClientPaho::onConnect(void* context, char* cause) | ||
| 1090 | // static | 1133 | // static |
| 1091 | void ClientPaho::onConnectSuccess(void* context, MQTTAsync_successData* response) | 1134 | void ClientPaho::onConnectSuccess(void* context, MQTTAsync_successData* response) |
| 1092 | { | 1135 | { |
| 1136 | + LogInfo( "[ClientPaho::onConnectSuccess]", "onConnectSucces triggered.." ); | ||
| 1093 | if (context) | 1137 | if (context) |
| 1094 | { | 1138 | { |
| 1095 | auto* cl = reinterpret_cast<ClientPaho*>(context); | 1139 | auto* cl = reinterpret_cast<ClientPaho*>(context); |
| @@ -1147,6 +1191,7 @@ void ClientPaho::onDisconnectSuccess(void* context, MQTTAsync_successData* respo | @@ -1147,6 +1191,7 @@ void ClientPaho::onDisconnectSuccess(void* context, MQTTAsync_successData* respo | ||
| 1147 | // static | 1191 | // static |
| 1148 | void ClientPaho::onDisconnectFailure(void* context, MQTTAsync_failureData* response) | 1192 | void ClientPaho::onDisconnectFailure(void* context, MQTTAsync_failureData* response) |
| 1149 | { | 1193 | { |
| 1194 | + LogInfo( "[ClientPaho::onDisconnectFailure]", "onDisconnectFailure triggered.." ); | ||
| 1150 | if (context) | 1195 | if (context) |
| 1151 | { | 1196 | { |
| 1152 | auto* cl = reinterpret_cast<ClientPaho*>(context); | 1197 | auto* cl = reinterpret_cast<ClientPaho*>(context); |
src/connectionstatus.cpp
| @@ -38,5 +38,5 @@ std::ostream& operator<<(std::ostream &os, ConnectionStatus rhs) | @@ -38,5 +38,5 @@ std::ostream& operator<<(std::ostream &os, ConnectionStatus rhs) | ||
| 38 | case ConnectionStatus::Connected: | 38 | case ConnectionStatus::Connected: |
| 39 | return os << "Connected"; | 39 | return os << "Connected"; |
| 40 | } | 40 | } |
| 41 | - return os << "Unknown"; // Should never be reached. | 41 | + return os << "Unknown"; // "Should" never be reached. ( But guess what? ) |
| 42 | } | 42 | } |
src/log.cpp
| @@ -53,7 +53,7 @@ int toInt( LogLevel level ) | @@ -53,7 +53,7 @@ int toInt( LogLevel level ) | ||
| 53 | 53 | ||
| 54 | std::string Log::s_context = std::string(); | 54 | std::string Log::s_context = std::string(); |
| 55 | std::string Log::s_fileName = std::string(); | 55 | std::string Log::s_fileName = std::string(); |
| 56 | -LogLevel Log::s_logLevel = LogLevel::Error; | 56 | +LogLevel Log::s_logLevel = LogLevel::Debug; |
| 57 | LogMask Log::s_logMask = LogMask::None; | 57 | LogMask Log::s_logMask = LogMask::None; |
| 58 | 58 | ||
| 59 | void Log::init( const std::string& context, const std::string& logFile, LogLevel logDepth ) | 59 | void Log::init( const std::string& context, const std::string& logFile, LogLevel logDepth ) |
src/mqttclient.cpp
| @@ -125,7 +125,7 @@ StateEnum MqttClient::state() const | @@ -125,7 +125,7 @@ StateEnum MqttClient::state() const | ||
| 125 | return m_serverState.state(); | 125 | return m_serverState.state(); |
| 126 | } | 126 | } |
| 127 | 127 | ||
| 128 | -void MqttClient::connect(const std::string& host, int port, const Credentials &credentials, const mqtt_LWT &lwt ) | 128 | +void MqttClient::connect(const std::string& host, int port, const Credentials &credentials, const mqtt_LWT &lwt, bool blocking ) |
| 129 | { | 129 | { |
| 130 | osdev::components::mqtt::ParsedUri _endpoint = { | 130 | osdev::components::mqtt::ParsedUri _endpoint = { |
| 131 | { "scheme", "tcp" }, | 131 | { "scheme", "tcp" }, |
| @@ -135,10 +135,10 @@ void MqttClient::connect(const std::string& host, int port, const Credentials &c | @@ -135,10 +135,10 @@ void MqttClient::connect(const std::string& host, int port, const Credentials &c | ||
| 135 | { "port", std::to_string(port) } | 135 | { "port", std::to_string(port) } |
| 136 | }; | 136 | }; |
| 137 | 137 | ||
| 138 | - this->connect( UriParser::toString( _endpoint ), lwt ); | 138 | + this->connect( UriParser::toString( _endpoint ), lwt, blocking ); |
| 139 | } | 139 | } |
| 140 | 140 | ||
| 141 | -void MqttClient::connect( const std::string &_endpoint, const mqtt_LWT &lwt ) | 141 | +void MqttClient::connect( const std::string &_endpoint, const mqtt_LWT &lwt, bool blocking ) |
| 142 | { | 142 | { |
| 143 | LogInfo( "MqttClient", std::string( m_clientId + " - Request connect" ) ); | 143 | LogInfo( "MqttClient", std::string( m_clientId + " - Request connect" ) ); |
| 144 | 144 | ||
| @@ -171,7 +171,7 @@ void MqttClient::connect( const std::string &_endpoint, const mqtt_LWT &lwt ) | @@ -171,7 +171,7 @@ void MqttClient::connect( const std::string &_endpoint, const mqtt_LWT &lwt ) | ||
| 171 | client = m_principalClient.get(); | 171 | client = m_principalClient.get(); |
| 172 | } | 172 | } |
| 173 | 173 | ||
| 174 | - client->connect( true, lwt ); | 174 | + client->connect( blocking, lwt ); |
| 175 | } | 175 | } |
| 176 | 176 | ||
| 177 | void MqttClient::disconnect() | 177 | void MqttClient::disconnect() |
| @@ -254,12 +254,15 @@ Token MqttClient::subscribe(const std::string& topic, int qos, const std::functi | @@ -254,12 +254,15 @@ Token MqttClient::subscribe(const std::string& topic, int qos, const std::functi | ||
| 254 | // throw (?)(MqttException, "Not connected"); | 254 | // throw (?)(MqttException, "Not connected"); |
| 255 | return Token(m_clientId, -1); | 255 | return Token(m_clientId, -1); |
| 256 | } | 256 | } |
| 257 | - if (!m_principalClient->isOverlapping(topic)) { | 257 | + if (!m_principalClient->isOverlapping(topic)) |
| 258 | + { | ||
| 258 | client = m_principalClient.get(); | 259 | client = m_principalClient.get(); |
| 259 | clientFound = true; | 260 | clientFound = true; |
| 260 | } | 261 | } |
| 261 | - else { | ||
| 262 | - for (const auto& c : m_additionalClients) { | 262 | + else |
| 263 | + { | ||
| 264 | + for (const auto& c : m_additionalClients) | ||
| 265 | + { | ||
| 263 | if (!c->isOverlapping(topic)) { | 266 | if (!c->isOverlapping(topic)) { |
| 264 | client = c.get(); | 267 | client = c.get(); |
| 265 | clientFound = true; | 268 | clientFound = true; |
| @@ -267,7 +270,8 @@ Token MqttClient::subscribe(const std::string& topic, int qos, const std::functi | @@ -267,7 +270,8 @@ Token MqttClient::subscribe(const std::string& topic, int qos, const std::functi | ||
| 267 | } | 270 | } |
| 268 | } | 271 | } |
| 269 | } | 272 | } |
| 270 | - if (!clientFound) { | 273 | + if (!clientFound) |
| 274 | + { | ||
| 271 | LogDebug("[MqttClient::subscribe]", std::string( m_clientId + " - Creating new ClientPaho instance for subscription on topic " + topic ) ); | 275 | LogDebug("[MqttClient::subscribe]", std::string( m_clientId + " - Creating new ClientPaho instance for subscription on topic " + topic ) ); |
| 272 | std::string derivedClientId(generateUniqueClientId(m_clientId, m_additionalClients.size() + 2)); // principal client is nr 1. | 276 | std::string derivedClientId(generateUniqueClientId(m_clientId, m_additionalClients.size() + 2)); // principal client is nr 1. |
| 273 | m_additionalClients.emplace_back(std::make_unique<ClientPaho>( | 277 | m_additionalClients.emplace_back(std::make_unique<ClientPaho>( |
| @@ -278,7 +282,8 @@ Token MqttClient::subscribe(const std::string& topic, int qos, const std::functi | @@ -278,7 +282,8 @@ Token MqttClient::subscribe(const std::string& topic, int qos, const std::functi | ||
| 278 | client = m_additionalClients.back().get(); | 282 | client = m_additionalClients.back().get(); |
| 279 | } | 283 | } |
| 280 | } | 284 | } |
| 281 | - if (!clientFound) { | 285 | + if (!clientFound) |
| 286 | + { | ||
| 282 | client->connect(true); | 287 | client->connect(true); |
| 283 | } | 288 | } |
| 284 | return Token{ client->clientId(), client->subscribe(topic, qos, cb) }; | 289 | return Token{ client->clientId(), client->subscribe(topic, qos, cb) }; |