From 95811dbbf5e63131fcbb0b804e080f46dd49afeb Mon Sep 17 00:00:00 2001 From: aleksandr Date: Tue, 29 Nov 2022 19:12:48 +0200 Subject: [PATCH] add ability to specify MqttClientId as its necessary for authentication --- src/configuration/config_options.hpp | 1 + src/mqtt/mqtt_client_impl.hpp | 29 +++++++++++++++++++--------- src/sink/mqtt_sink/mqtt_service.cpp | 3 ++- 3 files changed, 23 insertions(+), 10 deletions(-) diff --git a/src/configuration/config_options.hpp b/src/configuration/config_options.hpp index e8b491137..a0f471ac1 100644 --- a/src/configuration/config_options.hpp +++ b/src/configuration/config_options.hpp @@ -63,6 +63,7 @@ namespace mtconnect { DECLARE_CONFIGURATION(MqttCaCert); DECLARE_CONFIGURATION(MqttCert); DECLARE_CONFIGURATION(MqttPrivateKey); + DECLARE_CONFIGURATION(MqttClientId); DECLARE_CONFIGURATION(MqttTls); DECLARE_CONFIGURATION(MqttPort); DECLARE_CONFIGURATION(MqttHost); diff --git a/src/mqtt/mqtt_client_impl.hpp b/src/mqtt/mqtt_client_impl.hpp index a882ebbd9..d11d01054 100644 --- a/src/mqtt/mqtt_client_impl.hpp +++ b/src/mqtt/mqtt_client_impl.hpp @@ -67,17 +67,28 @@ namespace mtconnect { url << "mqtt://" << m_host << ':' << m_port; m_url = url.str(); - std::stringstream identity; - identity << '_' << m_host << '_' << m_port; + // Some brokers require specific ClientID provided. + // If not specified in configuration then generate random one. + auto client_id = GetOption(options, configuration::MqttClientId); + if (client_id) { + m_identity = *client_id; + } + else + { + std::stringstream identity; + identity << '_' << m_host << '_' << m_port; - boost::uuids::detail::sha1 sha1; - sha1.process_bytes(identity.str().c_str(), identity.str().length()); - boost::uuids::detail::sha1::digest_type digest; - sha1.get_digest(digest); + boost::uuids::detail::sha1 sha1; + sha1.process_bytes(identity.str().c_str(), identity.str().length()); + boost::uuids::detail::sha1::digest_type digest; + sha1.get_digest(digest); + + identity.str(""); + identity << std::hex << digest[0] << digest[1] << digest[2]; + m_identity = std::string("_") + (identity.str()).substr(0, 10); + } - identity.str(""); - identity << std::hex << digest[0] << digest[1] << digest[2]; - m_identity = std::string("_") + (identity.str()).substr(0, 10); + LOG(debug) << "Using ClientID " << m_identity; auto ci = GetOption(options, configuration::MqttConnectInterval); if (ci) diff --git a/src/sink/mqtt_sink/mqtt_service.cpp b/src/sink/mqtt_sink/mqtt_service.cpp index 47c499473..e008f4a16 100644 --- a/src/sink/mqtt_sink/mqtt_service.cpp +++ b/src/sink/mqtt_sink/mqtt_service.cpp @@ -51,7 +51,8 @@ namespace mtconnect { AddOptions(config, m_options, {{configuration::MqttCaCert, string()}, {configuration::MqttPrivateKey, string()}, - {configuration::MqttCert, string()}}); + {configuration::MqttCert, string()}, + {configuration::MqttClientId, string()}}); AddDefaultedOptions(config, m_options, {{configuration::MqttHost, "127.0.0.1"s}, {configuration::DeviceTopic, "MTConnect/Device/"s},