Skip to content
This repository was archived by the owner on Jul 18, 2023. It is now read-only.
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
27 commits
Select commit Hold shift + click to select a range
ddaa296
Mqtt: added dataset and table unittests (skipped at the moment))
rajwork9 Aug 22, 2022
8ed8db8
Merge branch 'master' into CppAgent_MQTT_Sink
rajwork9 Aug 22, 2022
4943824
added few more tests into mqtt_sink unit test
rajwork9 Aug 25, 2022
b7d7b26
Merge branch 'master' into CppAgent_MQTT_Sink
rajwork9 Aug 26, 2022
32b6d06
added Tls connection unit test in MqttIsolatedUnitTest
rajwork9 Aug 30, 2022
46ca43b
added Mqtt Unittest for rotatrymode
rajwork9 Sep 1, 2022
9f2c304
Merge branch 'master' into CppAgent_MQTT_Sink
rajwork9 Sep 1, 2022
cf05806
added some more unittest to check mqtt functionality
rajwork9 Sep 7, 2022
3e2d435
Mqtt unit test to publish table...
rajwork9 Sep 8, 2022
c37c062
Merge branch 'master' into CppAgent_MQTT_Sink
rajwork9 Oct 14, 2022
b53fa48
Merge branch 'master' into CppAgent_MQTT_Sink
rajwork9 Oct 19, 2022
b49a689
Merge branch 'master' into CppAgent_MQTT_Sink
rajwork9 Oct 20, 2022
0227adb
added Mqtt TLS use case...
rajwork9 Oct 20, 2022
c649e42
skipped MQTT TLS Unit test
rajwork9 Oct 20, 2022
57612f6
Merge branch 'master' into CppAgent_MQTT_Sink
rajwork9 Nov 6, 2022
7090c17
modifications with MQTT tls mode...
rajwork9 Nov 6, 2022
13f3b7c
Merge branch 'master' into CppAgent_MQTT_Sink
rajwork9 Nov 7, 2022
930470d
mqtt_tls renamed mqtt_certificates
rajwork9 Nov 8, 2022
04bb491
added mqtt tls with websocket...
rajwork9 Nov 15, 2022
ab7def5
MQTT: TLS support and with tls_ws
rajwork9 Nov 17, 2022
59774aa
Merge branch 'master' into CppAgent_MQTT_Sink
rajwork9 Nov 17, 2022
a837898
modification with MQTT TLS WS
rajwork9 Nov 18, 2022
4d714d8
Fix: #236 MQTT Sink / Source Username and Password Config
rajwork9 Nov 23, 2022
fb1e7ea
added back missing unit tests for mqtt table, dataset, rotatrymode, t…
rajwork9 Nov 23, 2022
391a67f
added unit test for mqtt-sink with username and password
rajwork9 Nov 24, 2022
3289334
skipped mqtt_tls unittest...
rajwork9 Nov 29, 2022
1123105
Merge branch 'master' into CppAgent_MQTT_Sink
wsobel Dec 1, 2022
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 2 additions & 0 deletions src/configuration/config_options.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -68,6 +68,8 @@ namespace mtconnect {
DECLARE_CONFIGURATION(MqttPort);
DECLARE_CONFIGURATION(MqttHost);
DECLARE_CONFIGURATION(MqttConnectInterval);
DECLARE_CONFIGURATION(MqttUserName);
DECLARE_CONFIGURATION(MqttPassword);

// Adapter Configuration
DECLARE_CONFIGURATION(AdapterIdentity);
Expand Down
64 changes: 63 additions & 1 deletion src/mqtt/mqtt_client_impl.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -15,6 +15,7 @@
// limitations under the License.
//

#include <boost/beast/ssl.hpp>
#include <boost/log/trivial.hpp>
#include <boost/uuid/name_generator_sha1.hpp>

Expand Down Expand Up @@ -50,6 +51,8 @@ namespace mtconnect {
mqtt::protocol_version>;
using mqtt_tls_client = mqtt_tls_client_ptr<boost::asio::io_context &, std::string,
std::uint16_t, mqtt::protocol_version>;
using mqtt_tls_client_ws = mqtt_tls_client_ws_ptr<boost::asio::io_context &, std::string, std::uint16_t, std::string,
mqtt::protocol_version>;

template <typename Derived>
class MqttClientImpl : public MqttClient
Expand All @@ -60,9 +63,14 @@ namespace mtconnect {
: MqttClient(ioContext, move(handler)),
m_options(options),
m_host(GetOption<std::string>(options, configuration::MqttHost).value_or("localhost")),
m_port(GetOption<int>(options, configuration::MqttPort).value_or(1883)),
m_port(GetOption<int>(options, configuration::MqttPort).value_or(1883)),
m_reconnectTimer(ioContext)
{
if (auto userName = GetOption<std::string>(options, configuration::MqttUserName))
m_username = *userName;
if (auto pswd = GetOption<std::string>(options, configuration::MqttPassword))
m_password = *pswd;

std::stringstream url;
url << "mqtt://" << m_host << ':' << m_port;
m_url = url.str();
Expand Down Expand Up @@ -320,6 +328,10 @@ namespace mtconnect {

std::uint16_t m_clientId {0};

std::string m_username = "";

std::string m_password = "";

boost::asio::steady_timer m_reconnectTimer;
};

Expand All @@ -334,6 +346,10 @@ namespace mtconnect {
if (!m_client)
{
m_client = mqtt::make_async_client(m_ioContext, m_host, m_port);
if (!m_username.empty())
m_client->set_user_name(m_username);
if (!m_password.empty())
m_client->set_password(m_password);
}

return m_client;
Expand All @@ -354,15 +370,22 @@ namespace mtconnect {
if (!m_client)
{
m_client = mqtt::make_tls_async_client(m_ioContext, m_host, m_port);
if (!m_username.empty())
m_client->set_user_name(m_username);
if (!m_password.empty())
m_client->set_password(m_password);

auto cacert = GetOption<string>(m_options, configuration::MqttCaCert);
if (cacert)
{
m_client->get_ssl_context().load_verify_file(*cacert);
}

auto private_key = GetOption<string>(m_options, configuration::MqttPrivateKey);
auto cert = GetOption<string>(m_options, configuration::MqttCert);
if (private_key && cert)
{
m_client->get_ssl_context().set_verify_mode(boost::asio::ssl::verify_peer);
m_client->get_ssl_context().use_certificate_chain_file(*cert);
m_client->get_ssl_context().use_private_key_file(*private_key,
boost::asio::ssl::context::pem);
Expand All @@ -376,5 +399,44 @@ namespace mtconnect {
mqtt_tls_client m_client;
};

class MqttTlsWSClient : public MqttClientImpl<MqttTlsWSClient>
{
public:
using base = MqttClientImpl<MqttTlsWSClient>;
using base::base;

auto &getClient()
{
if (!m_client)
{
m_client = mqtt::make_tls_async_client_ws(m_ioContext, m_host, m_port);
if (!m_username.empty())
m_client->set_user_name(m_username);
if (!m_password.empty())
m_client->set_password(m_password);

auto cacert = GetOption<string>(m_options, configuration::MqttCaCert);
if (cacert)
{
m_client->get_ssl_context().load_verify_file(*cacert);
}
auto private_key = GetOption<string>(m_options, configuration::MqttPrivateKey);
auto cert = GetOption<string>(m_options, configuration::MqttCert);
if (private_key && cert)
{
m_client->get_ssl_context().set_verify_mode(boost::asio::ssl::verify_peer);
m_client->get_ssl_context().use_certificate_chain_file(*cert);
m_client->get_ssl_context().use_private_key_file(*private_key,
boost::asio::ssl::context::pem);
}
}

return m_client;
}

protected:
mqtt_tls_client_ws m_client;
};

} // namespace mqtt_client
} // namespace mtconnect
67 changes: 67 additions & 0 deletions src/mqtt/mqtt_server_impl.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -288,6 +288,52 @@ namespace mtconnect {
m_port = GetOption<int>(options, configuration::Port).value_or(8883);
}

using base::base;
using server = MQTT_NS::server_tls<>;

auto &getServer() { return m_server; }

auto &createServer()
{
if (!m_server)
{
boost::asio::ssl::context ctx(boost::asio::ssl::context::tlsv12);
ctx.set_options(boost::asio::ssl::context::default_workarounds |
boost::asio::ssl::context::single_dh_use);
auto serverPrivateKey = GetOption<string>(m_options, configuration::TlsPrivateKey);
auto serverCert = GetOption<string>(m_options, configuration::TlsCertificateChain);
ctx.use_certificate_chain_file(*serverCert);
//ctx.use_tmp_dh_file(*GetOption<string>(m_options, configuration::TlsDHKey));
ctx.use_private_key_file(*serverPrivateKey, boost::asio::ssl::context::pem);

if (HasOption(m_options, configuration::TlsCertificatePassword))
{
ctx.set_password_callback(
[this](size_t, boost::asio::ssl::context_base::password_purpose) -> string {
return *GetOption<string>(m_options, configuration::TlsCertificatePassword);
});
}
m_server.emplace(boost::asio::ip::tcp::endpoint(boost::asio::ip::tcp::v4(), m_port),
std::move(ctx), m_ioContext);
}

return *m_server;
}

protected:
std::optional<server> m_server;
};

class MqttTlsWSServer : public MqttServerImpl<MqttTlsWSServer>
{
public:
using base = MqttServerImpl<MqttTlsWSServer>;
MqttTlsWSServer(boost::asio::io_context &ioContext, const ConfigOptions &options)
: base(ioContext, options)
{
m_port = GetOption<int>(options, configuration::Port).value_or(8883);
}

using base::base;
using server = MQTT_NS::server_tls_ws<>;

Expand All @@ -298,6 +344,27 @@ namespace mtconnect {
if (!m_server)
{
boost::asio::ssl::context ctx(boost::asio::ssl::context::tlsv12);
ctx.set_options(boost::asio::ssl::context::default_workarounds |
boost::asio::ssl::context::single_dh_use);
auto serverPrivateKey = GetOption<string>(m_options, configuration::TlsPrivateKey);
auto serverCert = GetOption<string>(m_options, configuration::TlsCertificateChain);
ctx.use_certificate_chain_file(*serverCert);
//ctx.use_tmp_dh_file(*GetOption<string>(m_options, configuration::TlsDHKey));
ctx.use_private_key_file(*serverPrivateKey, boost::asio::ssl::context::pem);

/*if (IsOptionSet(m_options, configuration::TlsVerifyClientCertificate))
{
LOG(info) << "Server: Will only accept client connections with valid certificates";

ctx.set_verify_mode(boost::asio::ssl::verify_peer |
boost::asio::ssl::verify_fail_if_no_peer_cert);
if (HasOption(m_options, configuration::MqttCaCert))
{
LOG(info) << "Server: Adding Client Certificates.";
ctx.load_verify_file(*GetOption<string>(m_options, configuration::MqttCaCert));
}
}*/

m_server.emplace(boost::asio::ip::tcp::endpoint(boost::asio::ip::tcp::v4(), m_port),
std::move(ctx), m_ioContext);
}
Expand Down
Loading