Go to the documentation of this file.00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020 #pragma once
00021
00022 #include <opc/ua/global.h>
00023 #include <opc/ua/node.h>
00024 #include <opc/ua/event.h>
00025 #include <opc/ua/services/subscriptions.h>
00026
00027 #include <sstream>
00028 #include <map>
00029 #include <mutex>
00030
00031 #include <iostream>
00032
00033 namespace OpcUa
00034 {
00035
00036 struct UserData
00037 {
00038 };
00039
00040 struct MonitoredItemData
00041 {
00042 IntegerId MonitoredItemId;
00043 Node TargetNode;
00044 AttributeId Attribute;
00045 MonitoringFilter Filter;
00046 UserData *usrVar;
00047 };
00048
00049 typedef std::map<uint32_t, MonitoredItemData> AttValMap;
00050 typedef std::map<uint32_t, EventFilter> SimpleAttOpMap;
00051
00052 class SubscriptionHandler
00053 {
00054 public:
00055 virtual ~SubscriptionHandler() {}
00056
00057 virtual void DataChange(uint32_t handle, const Node& node, const Variant& val, AttributeId attribute)
00058 {
00059 OPCUA_UNUSED(handle);
00060 OPCUA_UNUSED(node);
00061 OPCUA_UNUSED(val);
00062 OPCUA_UNUSED(attribute);
00063 std::cout << "default dc" << std::endl;
00064 }
00065
00066
00067 virtual void DataValueChange(uint32_t handle, const Node& node, const DataValue& val, AttributeId attribute)
00068 {
00069 OPCUA_UNUSED(handle);
00070 OPCUA_UNUSED(node);
00071 OPCUA_UNUSED(val);
00072 OPCUA_UNUSED(attribute);
00073 }
00074
00075 virtual void Event(uint32_t handle, const Event& event)
00076 {
00077 OPCUA_UNUSED(handle);
00078 OPCUA_UNUSED(event);
00079 std::cout << "default c++ event callback has been called" << std::endl;
00080 }
00081
00082 virtual void StatusChange(StatusCode status)
00083 {
00084 OPCUA_UNUSED(status);
00085 }
00086 };
00087
00088
00089 class Subscription
00090 {
00091 public:
00092
00093
00094
00095
00096
00097
00098 Subscription(Services::SharedPtr server, const CreateSubscriptionParameters& params, SubscriptionHandler& callback, bool debug=false);
00099 virtual ~Subscription() {}
00100
00101
00102 void Delete();
00103
00104
00105 SubscriptionData GetData() {return Data; }
00106 uint32_t GetId() const { return Data.SubscriptionId; }
00107 double GetPeriode() const { return Data.RevisedPublishingInterval; }
00108
00109
00110
00111 uint32_t SubscribeDataChange(const Node& node, AttributeId attr=AttributeId::Value);
00112 std::vector<uint32_t> SubscribeDataChange(const std::vector<ReadValueId>& attributes);
00113
00114
00115 void setUsrPtr(uint32_t handle,UserData *usr);
00116 UserData* getUsrPtr(uint32_t handle);
00117
00118
00119 void UnSubscribe(uint32_t handle);
00120 void UnSubscribe(std::vector<uint32_t> handles);
00121
00122
00123
00124 uint32_t SubscribeEvents(const Node& node, const EventFilter& eventfilter);
00125 uint32_t SubscribeEvents(const Node& node, const Node& eventType);
00126 uint32_t SubscribeEvents();
00127
00128
00129
00130 std::vector<MonitoredItemCreateResult> Subscribe(std::vector<MonitoredItemCreateRequest> request);
00131
00132
00133
00134 virtual void PublishCallback( Services::SharedPtr serverLocalPtr, const PublishResult result);
00135
00136
00137
00138 RepublishResponse Republish(uint32_t sequenceNumber);
00139
00140
00141
00142 private:
00143 void CallDataChangeCallback(const NotificationData& data);
00144 void CallEventCallback(const NotificationData& data);
00145 void CallStatusChangeCallback(const NotificationData& data);
00146
00147 Services::SharedPtr Server;
00148 SubscriptionData Data;
00149 SubscriptionHandler& Client;
00150 uint32_t LastMonitoredItemHandle = 1;
00151 AttValMap AttributeValueMap;
00152 SimpleAttOpMap SimpleAttributeOperandMap;
00153 std::mutex Mutex;
00154 bool Debug;
00155 };
00156 }
00157
00158