ifw-core 6.0.0
Loading...
Searching...
No Matches
open62541.hpp
Go to the documentation of this file.
1
8#ifndef CORE_PROTOCOL_OPEN62541_OPEN62541_HPP_
9#define CORE_PROTOCOL_OPEN62541_OPEN62541_HPP_
10
11// System header files
12#include <chrono>
13#include <string>
14#include <thread>
15#include <mutex>
16#include <atomic>
17#include <optional>
18
19// Third party headers
20#include <log4cplus/logger.h>
21#include <fmt/format.h>
22
23// #ifdef UA_ENABLE_AMALGAMATION
24// # include <open62541.h>
25// #else
26// # include <open62541/client.h>
27// # include <open62541/common.h>
28// #endif
29
30#if __has_include(<open62541.h>)
31#include <open62541.h>
32#else
33#include <open62541/server.h>
34#include <open62541/plugin/log_stdout.h>
35#endif
36
37
43
44
45using namespace std::literals::chrono_literals;
46
48class IDataChangeHandler;
49
58 UA_Client *m_client;
59 std::atomic<bool> m_connected {false};
60 std::atomic<bool> m_lost_connection {false};
61
62 UA_UserNameIdentityToken* m_user_identity{nullptr};
63 UA_ExtensionObject m_user_identity_ext_obj;
64
65 UA_StatusCode m_last_error{0};
66 UA_SecureChannelState m_last_channel_state{UA_SECURECHANNELSTATE_CLOSED};
67 UA_SecureChannelState m_channel_state{UA_SECURECHANNELSTATE_CLOSED};
68 UA_SessionState m_last_session_state{UA_SESSIONSTATE_CLOSED};
69 UA_SessionState m_session_state{UA_SESSIONSTATE_CLOSED};
70 UA_StatusCode m_last_connect_status{UA_STATUSCODE_BADCONNECTIONCLOSED};
71 UA_StatusCode m_connect_status{UA_STATUSCODE_GOOD};
72 std::mutex m_mutex;
73};
74
75
77
78 // TBD: std::string transport_protocol{"opc.tcp"};
79 // TBD: std::string application_name{""};
80 // TBD: std::string application_uri{""};
81
83 std::string username{""};
84 std::string password{""};
85
86 // Possible values: "None", "Basic256", "Basic256Sha256", etc.
87 // TBD: std::string security_policy{"None"};
88 // Possible values: "None", "Sign", "SignAndEncrypt"
89 // TBD: std::string message_security_mode{"None"};
91
92 std::string certificate_file{""};
93 std::string private_key_file{""};
95
96 int timeout{30000};
97
98 int session_timeout{30000}; // in ms
99 // TBD: int watchdog_interval{5000}; // in ms
100 int connectivity_check_interval{5000}; // in ms
101
103
104 // TBD: int reconnect_attempts{5};
105 // TBD: int reconnect_interval{2000}; // in ms
106
107 // TBD: int subscription_lifetime{60000}; // in ms
108 // TBD: int max_keep_alive_count{10};
109 // TBD: int publishing_interval{1000}; // in ms
110 // TBD: int priority{0};
111
112 // TBD: bool auto_create_subscription{true};
113 // TBD: bool auto_recover_subscription{true};
114
115 // TBD: int max_response_message_size{65536};
116
117 // ClientConfig& operator=(const protocol::base::ClientConfig& config) {
118 // return *this;
119 // }
120
121 virtual std::string ToString() const {
122 return fmt::format("OPC UA config: use_anonymous_login={}, username={}, "
123 "secure_channel_lifetime={}, certificate_file={}, private_key_file={}, "
124 "validate_server_certificate={}, timeout={}, session_timeout={}, "
125 "connectivity_check_interval={}, outstanding_publish_requests={}",
129 }
130};
131
132
142
143 static constexpr std::chrono::milliseconds NETWORK_TIMEOUT = 2000ms;
144
145 public:
152 Open62541(const std::optional<std::string> opcua_config_file = std::nullopt);
153 virtual ~Open62541();
154
161 virtual void Connect(const std::string& device,
162 const std::string& address);
163
171 virtual void Read(protocol::base::VectorVariant& params) override;
172
180 virtual void Write(const protocol::base::VectorVariant& params) override;
181
192 virtual void Rpc(const std::string& obj,
193 const std::string& proc,
194 const protocol::base::VectorVariant& params,
195 protocol::base::Variant& result) override;
196
203 UA_StatusCode ResumeSubscriptions();
204
216 virtual void StartMonitorItem(const std::string& item) override;
217
230 virtual void StartMonitorItems(const std::vector<std::string>& item_vector) override;
231
239 virtual void StopMonitorItem(const std::string& item) override;
240
247 virtual void Disconnect();
248
257 virtual void
261
265 void SetEndpoint(const std::string& endpoint);
266
270 std::string GetEndpoint() const;
271
277 virtual void HandleDataChange(const std::shared_ptr<MonitoredItem> monitor_item,
278 UA_DataValue* value);
279
284 virtual void HandleSessionChanges(bool status);
285
289 void UpdateState(UA_SecureChannelState channel_state,
290 UA_SessionState session_state,
291 UA_StatusCode recovery_status);
292
296 inline static std::map<std::string, std::shared_ptr<OpcuaConnection>> m_connection_map;
297
298 private:
299
303 bool IsConnected(const std::string& address);
304
308 void InactivityAcions();
309
319 UA_StatusCode CreateSubscription(bool renew_monitor_items = false);
320
324 void RemoveSubscription();
325
332 void GetNodeId(std::string value, int& ns, std::string& name);
333
340 static void InactivityCallback(UA_Client* client);
341
347 static void StateCallback(UA_Client* client,
348 UA_SecureChannelState channelState,
349 UA_SessionState sessionState,
350 UA_StatusCode recoveryStatus);
351
352 void LoadOpcuaConfig();
353
355 SubscriptionPtr m_subscription;
356
358 std::string m_endpoint;
359
360 bool m_monitoring;
361
364 inline static std::map<std::string, std::pair<std::string, Open62541*>> m_registration_map;
365
367 std::string m_device;
368
370 std::map<std::string, MonitoredItemPtr> m_map_monitor_items;
371
374
377
380
382 std::string m_opcua_config_file;
383 ClientConfig m_opua_config;
384
386 log4cplus::Logger m_logger;
387};
388
389} // namespace ifw::core::protocol::opcua
390
391#endif // CORE_PROTOCOL_OPEN62541_OPEN62541_HPP_
Definition dispatcher.hpp:17
Definition iComm.hpp:58
The IDataChangeHandler class Defines an entry point for data change notifications.
Definition iDataChangeHandler.hpp:37
The Open62541 class.
Definition open62541.hpp:141
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:915
virtual void StopMonitorItem(const std::string &item) override
Stop monitoring an attribute.
Definition open62541.cpp:849
void SetEndpoint(const std::string &endpoint)
Set endpoint to the connection.
Definition open62541.cpp:925
virtual void HandleDataChange(const std::shared_ptr< MonitoredItem > monitor_item, UA_DataValue *value)
Handle data changes.
Definition open62541.cpp:937
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:517
virtual void Connect(const std::string &device, const std::string &address)
Establish the connection to the OPCUA server.
Definition open62541.cpp:235
std::string GetEndpoint() const
Get endpoint of the connection.
Definition open62541.cpp:931
virtual void HandleSessionChanges(bool status)
Handle changes in the OPCUA session.
Definition open62541.cpp:955
virtual ~Open62541()
Definition open62541.cpp:197
virtual void Write(const protocol::base::VectorVariant &params) override
Performs a Write operation.
Definition open62541.cpp:438
void UpdateState(UA_SecureChannelState channel_state, UA_SessionState session_state, UA_StatusCode recovery_status)
Update connection state.
Definition open62541.cpp:1064
Open62541(const std::optional< std::string > opcua_config_file=std::nullopt)
Constructor.
Definition open62541.cpp:191
virtual void StartMonitorItems(const std::vector< std::string > &item_vector) override
Start monitoring a vector of attributes.
Definition open62541.cpp:780
virtual void Read(protocol::base::VectorVariant &params) override
Performs a Read operation.
Definition open62541.cpp:357
UA_StatusCode ResumeSubscriptions()
Resume subscriptions for all connections.
Definition open62541.cpp:210
virtual void StartMonitorItem(const std::string &item) override
Start monitoring an attribute.
Definition open62541.cpp:719
static std::map< std::string, std::shared_ptr< OpcuaConnection > > m_connection_map
Definition open62541.hpp:296
virtual void Disconnect()
Disconnects from the server.
Definition open62541.cpp:853
boost::variant< bool, int, unsigned int, short, double, std::string, unsigned short, float, int8_t, uint8_t > Variant
Definition iComm.hpp:24
std::vector< PairVariant > VectorVariant
Definition iComm.hpp:56
taskPoll class header file.
Definition iDataChangeHandler.hpp:28
std::shared_ptr< Subscription > SubscriptionPtr
Definition subscription.hpp:34
Definition open62541.hpp:76
std::string private_key_file
Definition open62541.hpp:93
int session_timeout
Definition open62541.hpp:98
std::string certificate_file
Definition open62541.hpp:92
bool validate_server_certificate
Definition open62541.hpp:94
int outstanding_publish_requests
Definition open62541.hpp:102
int secure_channel_lifetime
Definition open62541.hpp:90
virtual std::string ToString() const
Definition open62541.hpp:121
std::string username
Definition open62541.hpp:83
std::string password
Definition open62541.hpp:84
int timeout
Definition open62541.hpp:96
bool use_anonymous_login
Definition open62541.hpp:82
int connectivity_check_interval
Definition open62541.hpp:100
Connection Struct.
Definition open62541.hpp:57
std::atomic< bool > m_connected
Definition open62541.hpp:59
UA_SecureChannelState m_last_channel_state
Definition open62541.hpp:66
std::atomic< bool > m_lost_connection
Definition open62541.hpp:60
UA_SessionState m_session_state
Definition open62541.hpp:69
UA_Client * m_client
Definition open62541.hpp:58
UA_StatusCode m_last_connect_status
Definition open62541.hpp:70
UA_ExtensionObject m_user_identity_ext_obj
Definition open62541.hpp:63
UA_UserNameIdentityToken * m_user_identity
Definition open62541.hpp:62
UA_SessionState m_last_session_state
Definition open62541.hpp:68
std::mutex m_mutex
Definition open62541.hpp:72
UA_SecureChannelState m_channel_state
Definition open62541.hpp:67
UA_StatusCode m_connect_status
Definition open62541.hpp:71
UA_StatusCode m_last_error
Definition open62541.hpp:65