uatools 1.0.0-pre2
 
Loading...
Searching...
No Matches
open62541.hpp
Go to the documentation of this file.
1
6
7#ifndef ESO_UATOOLS_PROTOCOL_OPEN62541_OPEN62541_HPP_
8#define ESO_UATOOLS_PROTOCOL_OPEN62541_OPEN62541_HPP_
9
10// System header files
11#include <chrono>
12#include <string>
13#include <thread>
14#include <mutex>
15#include <atomic>
16#include <optional>
17
18// Third party headers
19#include <fmt/format.h>
20
21// #ifdef UA_ENABLE_AMALGAMATION
22// # include <open62541.h>
23// #else
24// # include <open62541/client.h>
25// # include <open62541/common.h>
26// #endif
27
28#if __has_include(<open62541.h>)
29#include <open62541.h>
30#else
31#include <open62541/server.h>
32#include <open62541/plugin/log_stdout.h>
33#endif
34
35
41
42
43using namespace std::literals::chrono_literals;
44
47
56 UA_Client *m_client;
57 std::atomic<bool> m_connected {false};
58 std::atomic<bool> m_lost_connection {false};
59
60 UA_UserNameIdentityToken* m_user_identity{nullptr};
61 UA_ExtensionObject m_user_identity_ext_obj;
62
63 UA_StatusCode m_last_error{0};
64 UA_SecureChannelState m_last_channel_state{UA_SECURECHANNELSTATE_CLOSED};
65 UA_SecureChannelState m_channel_state{UA_SECURECHANNELSTATE_CLOSED};
66 UA_SessionState m_last_session_state{UA_SESSIONSTATE_CLOSED};
67 UA_SessionState m_session_state{UA_SESSIONSTATE_CLOSED};
68 UA_StatusCode m_last_connect_status{UA_STATUSCODE_BADCONNECTIONCLOSED};
69 UA_StatusCode m_connect_status{UA_STATUSCODE_GOOD};
70 std::mutex m_mutex;
71};
72
73
75
76 // TBD: std::string transport_protocol{"opc.tcp"};
77 // TBD: std::string application_name{""};
78 // TBD: std::string application_uri{""};
79
81 std::string username{""};
82 std::string password{""};
83
84 // Possible values: "None", "Basic256", "Basic256Sha256", etc.
85 // TBD: std::string security_policy{"None"};
86 // Possible values: "None", "Sign", "SignAndEncrypt"
87 // TBD: std::string message_security_mode{"None"};
89
90 std::string certificate_file{""};
91 std::string private_key_file{""};
93
94 int timeout{30000};
95
96 int session_timeout{30000}; // in ms
97 // TBD: int watchdog_interval{5000}; // in ms
98 int connectivity_check_interval{5000}; // in ms
99
101
102 // TBD: int reconnect_attempts{5};
103 // TBD: int reconnect_interval{2000}; // in ms
104
105 // TBD: int subscription_lifetime{60000}; // in ms
106 // TBD: int max_keep_alive_count{10};
107 // TBD: int publishing_interval{1000}; // in ms
108 // TBD: int priority{0};
109
110 // TBD: bool auto_create_subscription{true};
111 // TBD: bool auto_recover_subscription{true};
112
113 // TBD: int max_response_message_size{65536};
114
115 // ClientConfig& operator=(const protocol::base::ClientConfig& config) {
116 // return *this;
117 // }
118
119 virtual std::string ToString() const {
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={}",
127 }
128};
129
130
140
141 static constexpr std::chrono::milliseconds NETWORK_TIMEOUT = 2000ms;
142
143 public:
150 Open62541(const std::optional<std::string> opcua_config_file = std::nullopt);
151 virtual ~Open62541();
152
159 virtual void Connect(const std::string& device,
160 const std::string& address);
161
169 virtual void Read(protocol::base::VectorVariant& params) override;
170
178 virtual void Write(const protocol::base::VectorVariant& params) override;
179
190 virtual void Rpc(const std::string& obj,
191 const std::string& proc,
192 const protocol::base::VectorVariant& params,
193 protocol::base::Variant& result) override;
194
201 UA_StatusCode ResumeSubscriptions();
202
214 virtual void StartMonitorItem(const std::string& item) override;
215
228 virtual void StartMonitorItems(const std::vector<std::string>& item_vector) override;
229
237 virtual void StopMonitorItem(const std::string& item) override;
238
245 virtual void Disconnect();
246
255 virtual void
259
263 void SetEndpoint(const std::string& endpoint);
264
268 std::string GetEndpoint() const;
269
275 virtual void HandleDataChange(const std::shared_ptr<MonitoredItem> monitor_item,
276 UA_DataValue* value);
277
282 virtual void HandleSessionChanges(bool status);
283
287 void UpdateState(UA_SecureChannelState channel_state,
288 UA_SessionState session_state,
289 UA_StatusCode recovery_status);
290
294 bool IsServerReady(UA_Client* client);
295
299 inline static std::map<std::string, std::shared_ptr<OpcuaConnection>> m_connection_map;
300
301 private:
302
306 bool IsConnected(const std::string& address);
307
311 void InactivityAcions();
312
322 UA_StatusCode CreateSubscription(bool renew_monitor_items = false);
323
327 void RemoveSubscription();
328
335 void GetNodeId(std::string value, int& ns, std::string& name);
336
343 static void InactivityCallback(UA_Client* client);
344
350 static void StateCallback(UA_Client* client,
351 UA_SecureChannelState channelState,
352 UA_SessionState sessionState,
353 UA_StatusCode recoveryStatus);
354
355 void LoadOpcuaConfig();
356
358 SubscriptionPtr m_subscription;
359
361 std::string m_endpoint;
362
363 bool m_monitoring;
364
367 inline static std::map<std::string, std::pair<std::string, Open62541*>> m_registration_map;
368
370 std::string m_device;
371
373 std::map<std::string, MonitoredItemPtr> m_map_monitor_items;
374
377
380
383
385 std::string m_opcua_config_file;
386 ClientConfig m_opua_config;
387
389 inline static std::mutex m_connection_map_mutex;
390
391 static std::shared_ptr<OpcuaConnection> GetConnection(const std::string& address);
392};
393
394} // namespace eso::uatools::protocol::opcua
395
396#endif // ESO_UATOOLS_PROTOCOL_OPEN62541_OPEN62541_HPP_
Definition dispatcher.hpp:16
Definition icomm_adapter_min_v1.hpp:183
virtual bool IsConnected() const noexcept=0
The IDataChangeHandler class Defines an entry point for data change notifications.
Definition iDataChangeHandler.hpp:36
virtual void StopMonitorItem(const std::string &item) override
Stop monitoring an attribute.
Definition open62541.cpp:704
virtual void Connect(const std::string &device, const std::string &address)
Establish the connection to the OPCUA server.
Definition open62541.cpp:88
void UpdateState(UA_SecureChannelState channel_state, UA_SessionState session_state, UA_StatusCode recovery_status)
Update connection state.
Definition open62541.cpp:908
UA_StatusCode ResumeSubscriptions()
Resume subscriptions for all connections.
Definition open62541.cpp:67
bool IsServerReady(UA_Client *client)
Check if server reports ready/running state.
Definition open62541.cpp:924
virtual void RegisterCB(protocol::base::Dispatcher< protocol::base::VectorVariant & > &dispatcher, protocol::base::Dispatcher<> &failure, protocol::base::Dispatcher<> &normal)
Registers internal and external callbacks.
Definition open62541.cpp:768
std::string GetEndpoint() const
Get endpoint of the connection.
Definition open62541.cpp:784
virtual void Write(const protocol::base::VectorVariant &params) override
Performs a Write operation.
Definition open62541.cpp:296
virtual void Read(protocol::base::VectorVariant &params) override
Performs a Read operation.
Definition open62541.cpp:215
virtual void Rpc(const std::string &obj, const std::string &proc, const protocol::base::VectorVariant &params, protocol::base::Variant &result) override
Executes a RPC.
Definition open62541.cpp:375
Open62541(const std::optional< std::string > opcua_config_file=std::nullopt)
Constructor.
Definition open62541.cpp:52
virtual void StartMonitorItems(const std::vector< std::string > &item_vector) override
Start monitoring a vector of attributes.
Definition open62541.cpp:635
virtual ~Open62541()
Definition open62541.cpp:57
virtual void Disconnect()
Disconnects from the server.
Definition open62541.cpp:708
virtual void HandleSessionChanges(bool status)
Handle changes in the OPCUA session.
Definition open62541.cpp:808
void SetEndpoint(const std::string &endpoint)
Set endpoint to the connection.
Definition open62541.cpp:778
virtual void StartMonitorItem(const std::string &item) override
Start monitoring an attribute.
Definition open62541.cpp:574
virtual void HandleDataChange(const std::shared_ptr< MonitoredItem > monitor_item, UA_DataValue *value)
Handle data changes.
Definition open62541.cpp:790
static std::map< std::string, std::shared_ptr< OpcuaConnection > > m_connection_map
Definition open62541.hpp:299
std::vector< PairVariant > VectorVariant
Definition iComm.hpp:45
std::variant< bool, std::int8_t, std::uint8_t, short, unsigned short, int, unsigned int, float, double, std::string, std::vector< bool >, std::vector< short >, std::vector< int >, std::vector< unsigned int >, std::vector< float >, std::vector< double >, std::vector< std::string > > Variant
Definition icomm_adapter_min_v1.hpp:53
Definition iDataChangeHandler.hpp:27
std::shared_ptr< Subscription > SubscriptionPtr
Definition subscription.hpp:33
std::string private_key_file
Definition open62541.hpp:91
bool use_anonymous_login
Definition open62541.hpp:80
std::string certificate_file
Definition open62541.hpp:90
int timeout
Definition open62541.hpp:94
int connectivity_check_interval
Definition open62541.hpp:98
bool validate_server_certificate
Definition open62541.hpp:92
virtual std::string ToString() const
Definition open62541.hpp:119
int session_timeout
Definition open62541.hpp:96
int outstanding_publish_requests
Definition open62541.hpp:100
int secure_channel_lifetime
Definition open62541.hpp:88
std::string username
Definition open62541.hpp:81
std::string password
Definition open62541.hpp:82
Connection Struct.
Definition open62541.hpp:55
std::atomic< bool > m_connected
Definition open62541.hpp:57
UA_SessionState m_last_session_state
Definition open62541.hpp:66
UA_SecureChannelState m_last_channel_state
Definition open62541.hpp:64
UA_StatusCode m_last_error
Definition open62541.hpp:63
UA_StatusCode m_connect_status
Definition open62541.hpp:69
UA_UserNameIdentityToken * m_user_identity
Definition open62541.hpp:60
UA_SessionState m_session_state
Definition open62541.hpp:67
std::atomic< bool > m_lost_connection
Definition open62541.hpp:58
UA_StatusCode m_last_connect_status
Definition open62541.hpp:68
UA_Client * m_client
Definition open62541.hpp:56
UA_SecureChannelState m_channel_state
Definition open62541.hpp:65
UA_ExtensionObject m_user_identity_ext_obj
Definition open62541.hpp:61
std::mutex m_mutex
Definition open62541.hpp:70