7#ifndef ESO_UATOOLS_PROTOCOL_OPEN62541_OPEN62541_HPP_
8#define ESO_UATOOLS_PROTOCOL_OPEN62541_OPEN62541_HPP_
19#include <fmt/format.h>
28#if __has_include(<open62541.h>)
31#include <open62541/server.h>
32#include <open62541/plugin/log_stdout.h>
43using namespace std::literals::chrono_literals;
120 return fmt::format(
"OPC UA config: use_anonymous_login={}, username={}, "
121 "secure_channel_lifetime={}, certificate_file={}, private_key_file={}, "
122 "validate_server_certificate={}, timeout={}, session_timeout={}, "
123 "connectivity_check_interval={}, outstanding_publish_requests={}",
141 static constexpr std::chrono::milliseconds NETWORK_TIMEOUT = 2000ms;
150 Open62541(
const std::optional<std::string> opcua_config_file = std::nullopt);
159 virtual void Connect(
const std::string& device,
160 const std::string& address);
190 virtual void Rpc(
const std::string& obj,
191 const std::string& proc,
228 virtual void StartMonitorItems(
const std::vector<std::string>& item_vector)
override;
275 virtual void HandleDataChange(
const std::shared_ptr<MonitoredItem> monitor_item,
276 UA_DataValue* value);
287 void UpdateState(UA_SecureChannelState channel_state,
288 UA_SessionState session_state,
289 UA_StatusCode recovery_status);
311 void InactivityAcions();
322 UA_StatusCode CreateSubscription(
bool renew_monitor_items =
false);
327 void RemoveSubscription();
335 void GetNodeId(std::string value,
int& ns, std::string& name);
343 static void InactivityCallback(UA_Client* client);
350 static void StateCallback(UA_Client* client,
351 UA_SecureChannelState channelState,
352 UA_SessionState sessionState,
353 UA_StatusCode recoveryStatus);
355 void LoadOpcuaConfig();
361 std::string m_endpoint;
367 inline static std::map<std::string, std::pair<std::string, Open62541*>> m_registration_map;
370 std::string m_device;
373 std::map<std::string, MonitoredItemPtr> m_map_monitor_items;
385 std::string m_opcua_config_file;
389 inline static std::mutex m_connection_map_mutex;
391 static std::shared_ptr<OpcuaConnection> GetConnection(
const std::string& address);