open62541pp 0.17.0
C++ wrapper of open62541
Loading...
Searching...
No Matches
subscription.hpp
Go to the documentation of this file.
1#pragma once
2
3#include <type_traits>
4#include <utility> // move
5#include <vector>
6
7#include "open62541pp/common.hpp" // AttributeId
8#include "open62541pp/config.hpp"
12#include "open62541pp/types.hpp"
13#include "open62541pp/ua/types.hpp" // IntegerId
14
15#ifdef UA_ENABLE_SUBSCRIPTIONS
16
17namespace opcua {
18
19class Server;
20
25
26/**
27 * High-level subscription class.
28 *
29 * The API is symmetric for both Server and Client, although servers don't use the subscription
30 * mechanism of OPC UA to transport notifications of data changes and events. Instead MonitoredItems
31 * are registered locally. Notifications are then forwarded to user-defined callbacks instead of a
32 * remote client. The `subscriptionId` for servers is always `0U`.
33 *
34 * @tparam Connection Server or Client
35 * @note Not all methods are available and implemented for servers.
36 *
37 * Use the free functions in the opcua::services namespace for more advanced usage:
38 * - @ref Subscription
39 * - @ref MonitoredItem
40 */
41template <typename Connection>
43public:
44 /// Create a new subscription.
45 /// The subscription is not automatically deleted by the destructor.
46 /// You must delete it manually with @ref deleteSubscription or services::deleteSubscription.
47 explicit Subscription(Connection& connection, const SubscriptionParameters& parameters = {});
48
49 /// Wrap an existing subscription.
50 /// The `subscriptionId` is ignored and set to `0U` for servers.
52 : connection_(&connection),
53 subscriptionId_(std::is_same_v<Connection, Server> ? 0U : subscriptionId) {}
54
55 /// Get the server/client instance.
56 Connection& connection() noexcept {
57 return *connection_;
58 }
59
60 /// Get the server/client instance.
61 const Connection& connection() const noexcept {
62 return *connection_;
63 }
64
65 /// Get the server-assigned identifier of this subscription.
66 IntegerId subscriptionId() const noexcept {
67 return subscriptionId_;
68 }
69
70 /// Get all local monitored items.
71 std::vector<MonitoredItem<Connection>> monitoredItems();
72
73 /// @deprecated Use monitoredItems() instead
74 [[deprecated("use monitoredItems() instead")]]
75 std::vector<MonitoredItem<Connection>> getMonitoredItems() {
76 return monitoredItems();
77 }
78
79 /// Modify this subscription.
80 /// @note Not implemented for Server.
81 /// @see services::modifySubscription
83 const auto response = services::modifySubscription(
84 connection(), subscriptionId(), parameters
85 );
86 response.responseHeader().serviceResult().throwIfBad();
87 }
88
89 /// Enable/disable publishing of notification messages.
90 /// @note Not implemented for Server.
91 /// @see services::setPublishingMode
92 void setPublishingMode(bool publishing) {
93 services::setPublishingMode(connection(), subscriptionId(), publishing).throwIfBad();
94 }
95
96 /// Create a monitored item for data change notifications.
98 const NodeId& id,
99 AttributeId attribute,
100 MonitoringMode monitoringMode,
101 const MonitoringParametersEx& parameters,
103 ) {
104 const auto result = services::createMonitoredItemDataChange(
105 connection(),
107 {id, attribute},
108 monitoringMode,
109 parameters,
110 std::move(onDataChange),
111 {}
112 );
113 result.statusCode().throwIfBad();
114 return {connection(), subscriptionId(), result.monitoredItemId()};
115 }
116
117 /// Create a monitored item for data change notifications (default settings).
118 /// The monitoring mode is set to MonitoringMode::Reporting and the default open62541
119 /// MonitoringParametersEx are used.
121 const NodeId& id, AttributeId attribute, DataChangeNotificationCallback onDataChange
122 ) {
123 const MonitoringParametersEx parameters;
124 return subscribeDataChange(
125 id, attribute, MonitoringMode::Reporting, parameters, std::move(onDataChange)
126 );
127 }
128
129 /// Create a monitored item for event notifications.
130 /// @note Not implemented for Server.
132 const NodeId& id,
133 MonitoringMode monitoringMode,
134 const MonitoringParametersEx& parameters,
135 EventNotificationCallback onEvent // NOLINT(*-unnecessary-value-param), false positive?
136 ) {
137 const auto result = services::createMonitoredItemEvent(
138 connection(),
141 monitoringMode,
142 parameters,
143 std::move(onEvent)
144 );
145 result.statusCode().throwIfBad();
146 return {connection(), subscriptionId(), result.monitoredItemId()};
147 }
148
149 /// Create a monitored item for event notifications (default settings).
150 /// The monitoring mode is set to MonitoringMode::Reporting and the default open62541
151 /// MonitoringParametersEx are used.
152 /// @note Not implemented for Server.
154 const NodeId& id, const EventFilter& eventFilter, EventNotificationCallback onEvent
155 ) {
156 MonitoringParametersEx parameters;
157 parameters.filter = ExtensionObject(eventFilter);
158 return subscribeEvent(id, MonitoringMode::Reporting, parameters, std::move(onEvent));
159 }
160
161 /// Delete this subscription.
162 /// @note Not implemented for Server.
166
167private:
168 Connection* connection_;
169 IntegerId subscriptionId_{0U};
170};
171
172/* ---------------------------------------------------------------------------------------------- */
173
174/// @relates Subscription
175template <typename T>
176inline bool operator==(const Subscription<T>& lhs, const Subscription<T>& rhs) noexcept {
177 return (lhs.connection() == rhs.connection()) && (lhs.subscriptionId() == rhs.subscriptionId());
178}
179
180/// @relates Subscription
181template <typename T>
182inline bool operator!=(const Subscription<T>& lhs, const Subscription<T>& rhs) noexcept {
183 return !(lhs == rhs);
184}
185
186} // namespace opcua
187
188#endif
UA_ExtensionObject wrapper class.
Definition types.hpp:2077
High-level monitored item class.
UA_NodeId wrapper class.
Definition types.hpp:666
constexpr void throwIfBad() const
Throw a BadStatus exception if the status code is bad.
Definition types.hpp:84
High-level subscription class.
void deleteSubscription()
Delete this subscription.
IntegerId subscriptionId() const noexcept
Get the server-assigned identifier of this subscription.
MonitoredItem< Connection > subscribeDataChange(const NodeId &id, AttributeId attribute, MonitoringMode monitoringMode, const MonitoringParametersEx &parameters, DataChangeNotificationCallback onDataChange)
Create a monitored item for data change notifications.
const Connection & connection() const noexcept
Get the server/client instance.
void setSubscriptionParameters(const SubscriptionParameters &parameters)
Modify this subscription.
Connection & connection() noexcept
Get the server/client instance.
bool operator!=(const Subscription< T > &lhs, const Subscription< T > &rhs) noexcept
bool operator==(const Subscription< T > &lhs, const Subscription< T > &rhs) noexcept
MonitoredItem< Connection > subscribeDataChange(const NodeId &id, AttributeId attribute, DataChangeNotificationCallback onDataChange)
Create a monitored item for data change notifications (default settings).
std::vector< MonitoredItem< Connection > > monitoredItems()
Get all local monitored items.
Subscription(Connection &connection, const SubscriptionParameters &parameters={})
Create a new subscription.
MonitoredItem< Connection > subscribeEvent(const NodeId &id, const EventFilter &eventFilter, EventNotificationCallback onEvent)
Create a monitored item for event notifications (default settings).
void setPublishingMode(bool publishing)
Enable/disable publishing of notification messages.
MonitoredItem< Connection > subscribeEvent(const NodeId &id, MonitoringMode monitoringMode, const MonitoringParametersEx &parameters, EventNotificationCallback onEvent)
Create a monitored item for event notifications.
Subscription(Connection &connection, IntegerId subscriptionId) noexcept
Wrap an existing subscription.
std::vector< MonitoredItem< Connection > > getMonitoredItems()
UA_EventFilter wrapper class.
Definition types.hpp:1932
const StatusCode & statusCode() const noexcept
Definition types.hpp:2040
MonitoredItemCreateResult createMonitoredItemEvent(Client &connection, IntegerId subscriptionId, const ReadValueId &itemToMonitor, MonitoringMode monitoringMode, const MonitoringParametersEx &parameters, EventNotificationCallback eventCallback, DeleteMonitoredItemCallback deleteCallback={})
Create and add a monitored item to a subscription for event notifications.
MonitoredItemCreateResult createMonitoredItemDataChange(T &connection, IntegerId subscriptionId, const ReadValueId &itemToMonitor, MonitoringMode monitoringMode, const MonitoringParametersEx &parameters, DataChangeNotificationCallback dataChangeCallback, DeleteMonitoredItemCallback deleteCallback)
Create and add a monitored item to a subscription for data change notifications.
std::function< void(IntegerId subId, IntegerId monId, const DataValue &value)> DataChangeNotificationCallback
Data change notification callback.
std::function< void(IntegerId subId, IntegerId monId, Span< const Variant > eventFields)> EventNotificationCallback
Event notification callback.
StatusCode deleteSubscription(Client &connection, IntegerId subscriptionId) noexcept
Delete a single subscription.
ModifySubscriptionResponse modifySubscription(Client &connection, const ModifySubscriptionRequest &request) noexcept
Modify a subscription.
SetPublishingModeResponse setPublishingMode(Client &connection, const SetPublishingModeRequest &request) noexcept
Enable/disable publishing of notification messages of subscriptions.
MonitoringMode
Monitoring mode.
Definition types.hpp:1664
uint32_t IntegerId
IntegerId.
Definition types.hpp:123
services::EventNotificationCallback EventNotificationCallback
services::DataChangeNotificationCallback DataChangeNotificationCallback
AttributeId
Attribute identifiers.
Definition common.hpp:28
@ EventNotifier
Indicates if the node can be used to subscribe to events or the read/write historic events.
Extended monitoring parameters with default values from open62541.
ExtensionObject filter
Filter is used by the server to determine if the MonitoredItem should generate notifications.
Subscription parameters with default values from open62541.