ifw-core 7.0.0
 
Loading...
Searching...
No Matches
open62541.hpp
Go to the documentation of this file.
1
6
7#ifndef CORE_PROTOCOL_OPEN62541_OPEN62541_HPP_
8#define CORE_PROTOCOL_OPEN62541_OPEN62541_HPP_
9
10// Deprecation notice for the whole ifw-core/protocol component.
11//
12// The protocol libraries (protocol/base and protocol/open62541) are deprecated:
13// their OPC UA client functionality is now provided by uatools (the ualib
14// library, ifw::fnd::defs::ICommAdapter over open62541). The protocol tree is
15// kept for backwards compatibility only and will be removed in a future
16// release. New code should use uatools/ualib instead.
17//
18// The notice is placed only in this strategic header (the main open62541 client
19// header, included by every protocol consumer) so it fires once per translation
20// unit rather than repeatedly across the many protocol headers. Compile-time
21// message only; it does NOT affect build success or warning counts (safe under
22// -Werror). To retire the component, delete this block along with the tree.
23#pragma message("ifw-core/protocol is deprecated; migrate to uatools (ualib). " \
24 "The protocol/base and protocol/open62541 libraries are kept " \
25 "for compatibility only and will be removed in a future release.")
26
27// System header files
28#include <chrono>
29#include <string>
30#include <thread>
31#include <mutex>
32#include <atomic>
33#include <optional>
34
35// Third party headers
36#include <log4cplus/logger.h>
37#include <fmt/format.h>
38
39// #ifdef UA_ENABLE_AMALGAMATION
40// # include <open62541.h>
41// #else
42// # include <open62541/client.h>
43// # include <open62541/common.h>
44// #endif
45
46#if __has_include(<open62541.h>)
47#include <open62541.h>
48#else
49#include <open62541/server.h>
50#include <open62541/plugin/log_stdout.h>
51#endif
52
53
59
60
61using namespace std::literals::chrono_literals;
62
65
74 UA_Client *m_client;
75 std::atomic<bool> m_connected {false};
76 std::atomic<bool> m_lost_connection {false};
77
78 UA_UserNameIdentityToken* m_user_identity{nullptr};
79 UA_ExtensionObject m_user_identity_ext_obj;
80
81 UA_StatusCode m_last_error{0};
82 UA_SecureChannelState m_last_channel_state{UA_SECURECHANNELSTATE_CLOSED};
83 UA_SecureChannelState m_channel_state{UA_SECURECHANNELSTATE_CLOSED};
84 UA_SessionState m_last_session_state{UA_SESSIONSTATE_CLOSED};
85 UA_SessionState m_session_state{UA_SESSIONSTATE_CLOSED};
86 UA_StatusCode m_last_connect_status{UA_STATUSCODE_BADCONNECTIONCLOSED};
87 UA_StatusCode m_connect_status{UA_STATUSCODE_GOOD};
88 std::mutex m_mutex;
89};
90
91
93
94 // TBD: std::string transport_protocol{"opc.tcp"};
95 // TBD: std::string application_name{""};
96 // TBD: std::string application_uri{""};
97
99 std::string username{""};
100 std::string password{""};
101
102 // Possible values: "None", "Basic256", "Basic256Sha256", etc.
103 // TBD: std::string security_policy{"None"};
104 // Possible values: "None", "Sign", "SignAndEncrypt"
105 // TBD: std::string message_security_mode{"None"};
107
108 std::string certificate_file{""};
109 std::string private_key_file{""};
111
112 int timeout{30000};
113
114 int session_timeout{30000}; // in ms
115 // TBD: int watchdog_interval{5000}; // in ms
116 int connectivity_check_interval{5000}; // in ms
117
119
120 // TBD: int reconnect_attempts{5};
121 // TBD: int reconnect_interval{2000}; // in ms
122
123 // TBD: int subscription_lifetime{60000}; // in ms
124 // TBD: int max_keep_alive_count{10};
125 // TBD: int publishing_interval{1000}; // in ms
126 // TBD: int priority{0};
127
128 // TBD: bool auto_create_subscription{true};
129 // TBD: bool auto_recover_subscription{true};
130
131 // TBD: int max_response_message_size{65536};
132
133 // ClientConfig& operator=(const protocol::base::ClientConfig& config) {
134 // return *this;
135 // }
136
137 virtual std::string ToString() const {
138 return fmt::format("OPC UA config: use_anonymous_login={}, username={}, "
139 "secure_channel_lifetime={}, certificate_file={}, private_key_file={}, "
140 "validate_server_certificate={}, timeout={}, session_timeout={}, "
141 "connectivity_check_interval={}, outstanding_publish_requests={}",
145 }
146};
147
148
158
159 static constexpr std::chrono::milliseconds NETWORK_TIMEOUT = 2000ms;
160
161 public:
168 Open62541(const std::optional<std::string> opcua_config_file = std::nullopt);
169 virtual ~Open62541();
170
177 virtual void Connect(const std::string& device,
178 const std::string& address);
179
187 virtual void Read(protocol::base::VectorVariant& params) override;
188
196 virtual void Write(const protocol::base::VectorVariant& params) override;
197
208 virtual void Rpc(const std::string& obj,
209 const std::string& proc,
210 const protocol::base::VectorVariant& params,
211 protocol::base::Variant& result) override;
212
219 UA_StatusCode ResumeSubscriptions();
220
232 virtual void StartMonitorItem(const std::string& item) override;
233
246 virtual void StartMonitorItems(const std::vector<std::string>& item_vector) override;
247
255 virtual void StopMonitorItem(const std::string& item) override;
256
263 virtual void Disconnect();
264
273 virtual void
277
281 void SetEndpoint(const std::string& endpoint);
282
286 std::string GetEndpoint() const;
287
293 virtual void HandleDataChange(const std::shared_ptr<MonitoredItem> monitor_item,
294 UA_DataValue* value);
295
300 virtual void HandleSessionChanges(bool status);
301
305 void UpdateState(UA_SecureChannelState channel_state,
306 UA_SessionState session_state,
307 UA_StatusCode recovery_status);
308
312 bool IsServerReady(UA_Client* client);
313
317 inline static std::map<std::string, std::shared_ptr<OpcuaConnection>> m_connection_map;
318
319 private:
320
324 bool IsConnected(const std::string& address);
325
329 void InactivityAcions();
330
340 UA_StatusCode CreateSubscription(bool renew_monitor_items = false);
341
345 void RemoveSubscription();
346
353 void GetNodeId(std::string value, int& ns, std::string& name);
354
361 static void InactivityCallback(UA_Client* client);
362
368 static void StateCallback(UA_Client* client,
369 UA_SecureChannelState channelState,
370 UA_SessionState sessionState,
371 UA_StatusCode recoveryStatus);
372
373 void LoadOpcuaConfig();
374
376 SubscriptionPtr m_subscription;
377
379 std::string m_endpoint;
380
381 bool m_monitoring;
382
385 inline static std::map<std::string, std::pair<std::string, Open62541*>> m_registration_map;
386
388 std::string m_device;
389
391 std::map<std::string, MonitoredItemPtr> m_map_monitor_items;
392
395
398
401
403 std::string m_opcua_config_file;
404 ClientConfig m_opua_config;
405
407 log4cplus::Logger m_logger;
408
410 inline static std::mutex m_connection_map_mutex;
411
412 static std::shared_ptr<OpcuaConnection> GetConnection(const std::string& address);
413};
414
415} // namespace ifw::core::protocol::opcua
416
417#endif // CORE_PROTOCOL_OPEN62541_OPEN62541_HPP_
Definition dispatcher.hpp:16
Definition iComm.hpp:48
The IDataChangeHandler class Defines an entry point for data change notifications.
Definition iDataChangeHandler.hpp:36
bool IsServerReady(UA_Client *client)
Check if server reports ready/running state.
Definition open62541.cpp:950
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:785
virtual void StopMonitorItem(const std::string &item) override
Stop monitoring an attribute.
Definition open62541.cpp:719
void SetEndpoint(const std::string &endpoint)
Set endpoint to the connection.
Definition open62541.cpp:795
virtual void HandleDataChange(const std::shared_ptr< MonitoredItem > monitor_item, UA_DataValue *value)
Handle data changes.
Definition open62541.cpp:807
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:389
virtual void Connect(const std::string &device, const std::string &address)
Establish the connection to the OPCUA server.
Definition open62541.cpp:100
std::string GetEndpoint() const
Get endpoint of the connection.
Definition open62541.cpp:801
virtual void HandleSessionChanges(bool status)
Handle changes in the OPCUA session.
Definition open62541.cpp:825
virtual ~Open62541()
Definition open62541.cpp:62
virtual void Write(const protocol::base::VectorVariant &params) override
Performs a Write operation.
Definition open62541.cpp:310
void UpdateState(UA_SecureChannelState channel_state, UA_SessionState session_state, UA_StatusCode recovery_status)
Update connection state.
Definition open62541.cpp:934
Open62541(const std::optional< std::string > opcua_config_file=std::nullopt)
Constructor.
Definition open62541.cpp:56
virtual void StartMonitorItems(const std::vector< std::string > &item_vector) override
Start monitoring a vector of attributes.
Definition open62541.cpp:650
virtual void Read(protocol::base::VectorVariant &params) override
Performs a Read operation.
Definition open62541.cpp:229
UA_StatusCode ResumeSubscriptions()
Resume subscriptions for all connections.
Definition open62541.cpp:75
virtual void StartMonitorItem(const std::string &item) override
Start monitoring an attribute.
Definition open62541.cpp:589
static std::map< std::string, std::shared_ptr< OpcuaConnection > > m_connection_map
Definition open62541.hpp:317
virtual void Disconnect()
Disconnects from the server.
Definition open62541.cpp:723
std::vector< PairVariant > VectorVariant
Definition iComm.hpp:45
std::variant< bool, int, unsigned int, short, double, std::string, unsigned short, float, int8_t, uint8_t, std::vector< bool >, std::vector< int >, std::vector< unsigned int >, std::vector< short >, std::vector< double >, std::vector< float >, std::vector< std::string > > Variant
Definition iComm.hpp:24
Definition iDataChangeHandler.hpp:27
std::shared_ptr< Subscription > SubscriptionPtr
Definition subscription.hpp:33
Definition open62541.hpp:92
std::string private_key_file
Definition open62541.hpp:109
int session_timeout
Definition open62541.hpp:114
std::string certificate_file
Definition open62541.hpp:108
bool validate_server_certificate
Definition open62541.hpp:110
int outstanding_publish_requests
Definition open62541.hpp:118
int secure_channel_lifetime
Definition open62541.hpp:106
virtual std::string ToString() const
Definition open62541.hpp:137
std::string username
Definition open62541.hpp:99
std::string password
Definition open62541.hpp:100
int timeout
Definition open62541.hpp:112
bool use_anonymous_login
Definition open62541.hpp:98
int connectivity_check_interval
Definition open62541.hpp:116
Connection Struct.
Definition open62541.hpp:73
std::atomic< bool > m_connected
Definition open62541.hpp:75
UA_SecureChannelState m_last_channel_state
Definition open62541.hpp:82
std::atomic< bool > m_lost_connection
Definition open62541.hpp:76
UA_SessionState m_session_state
Definition open62541.hpp:85
UA_Client * m_client
Definition open62541.hpp:74
UA_StatusCode m_last_connect_status
Definition open62541.hpp:86
UA_ExtensionObject m_user_identity_ext_obj
Definition open62541.hpp:79
UA_UserNameIdentityToken * m_user_identity
Definition open62541.hpp:78
UA_SessionState m_last_session_state
Definition open62541.hpp:84
std::mutex m_mutex
Definition open62541.hpp:88
UA_SecureChannelState m_channel_state
Definition open62541.hpp:83
UA_StatusCode m_connect_status
Definition open62541.hpp:87
UA_StatusCode m_last_error
Definition open62541.hpp:81