Ejemplo n.º 1
0
  void Subscription::UnSubscribe(std::vector<uint32_t> handles) 
  {
    std::unique_lock<std::mutex> lock(Mutex); 

    DeleteMonitoredItemsParameters params;
    params.SubscriptionId = Data.SubscriptionId;
    std::vector<uint32_t> mids;
    for (auto id : handles)
    {
      if (Debug) std::cout << "Subscription | Sending unsubscribe for monitoreditemsid: " << id << std::endl;
      mids.push_back(uint32_t(id));
      //Now trying to remove monitoreditem from our internal cache
      for ( auto pair : AttributeValueMap )
      {
        if (pair.second.MonitoredItemId == id)
        {
          AttributeValueMap.erase(pair.first);
          break; //we modified our iterating object, so quit!!
        }
      }
    }
    params.MonitoredItemIds = mids;
    auto results = Server->Subscriptions()-> DeleteMonitoredItems(params);
    for (auto res : results)
    {
      CheckStatusCode(res);
    }
  }
Ejemplo n.º 2
0
 void Subscription::Delete()
 {
   std::vector<StatusCode> results = Server->Subscriptions()->DeleteSubscriptions(std::vector<uint32_t>{Data.SubscriptionId});
   for (auto res: results)
   {
     CheckStatusCode(res);
   }
 }
Ejemplo n.º 3
0
 void Subscription::Delete()
 {
   std::vector<StatusCode> results = Server->Subscriptions()->DeleteSubscriptions(std::vector<IntegerId>({Data.Id}));
   for (auto res: results)
   {
     CheckStatusCode(res);
   }
 }
Ejemplo n.º 4
0
 void Variable::SetValue(const DataValue& value)
 {
   WriteValue writeValue;
   writeValue.Attribute = AttributeID::VALUE;
   writeValue.Data = value;
   writeValue.Node = Id;
   std::vector<StatusCode> result = GetServices()->Attributes()->Write({writeValue});
   if (result.size() != 1)
   {
     throw std::runtime_error("Failed to write data. Server returned wron nunber of status codes.");
   }
   CheckStatusCode(result[0]);
 }
Ejemplo n.º 5
0
  uint32_t Subscription::SubscribeEvents(const Node& node, const EventFilter& eventfilter)
  {
    std::unique_lock<std::mutex> lock(Mutex); 

    MonitoredItemsParameters itemsParams;
    itemsParams.SubscriptionId = Data.SubscriptionId;
    itemsParams.TimestampsToReturn = TimestampsToReturn(2); // Don't know for better

    ReadValueId avid;
    avid.NodeId = node.GetId();
    avid.AttributeId = AttributeId::EventNotifier;

    MonitoredItemCreateRequest req;
    req.ItemToMonitor = avid;
    req.MonitoringMode = MonitoringMode::Reporting;
    MonitoringParameters params;
    params.SamplingInterval = Data.RevisedPublishingInterval;
    params.QueueSize = std::numeric_limits<uint32_t>::max();
    params.DiscardOldest = true;
    params.ClientHandle = (uint32_t)++LastMonitoredItemHandle;

    MonitoringFilter filter(eventfilter);
    params.Filter = filter;
    req.RequestedParameters = params;
    itemsParams.ItemsToCreate.push_back(req);

    std::vector<MonitoredItemCreateResult> results =  Server->Subscriptions()->CreateMonitoredItems(itemsParams);
    if ( results.size()  != 1 )
    {
      throw(std::runtime_error("Subscription | Protocol Error CreateMonitoredItems should return one result"));
    }

    MonitoredItemData mdata;
    mdata.TargetNode = Node(Server, avid.NodeId);
    mdata.Attribute = avid.AttributeId;
    mdata.MonitoredItemId = results[0].MonitoredItemId;
    mdata.Filter = results[0].FilterResult;
    AttributeValueMap[params.ClientHandle] = mdata;


    MonitoredItemCreateResult res = results[0];
    CheckStatusCode(res.Status);
    SimpleAttributeOperandMap[res.MonitoredItemId] = eventfilter; //Not used
    return res.MonitoredItemId;
  }
Ejemplo n.º 6
0
  std::vector<uint32_t> Subscription::SubscribeDataChange(const std::vector<ReadValueId>& attributes)
  {
    std::unique_lock<std::mutex> lock(Mutex); 

    MonitoredItemsParameters itemsParams;
    itemsParams.SubscriptionId = Data.SubscriptionId;
    itemsParams.TimestampsToReturn = TimestampsToReturn(2); // Don't know for better

    for (ReadValueId attr : attributes)
    {
      MonitoredItemCreateRequest req;
      req.ItemToMonitor = attr;
      req.MonitoringMode = MonitoringMode::Reporting;
      MonitoringParameters params;
      params.SamplingInterval = Data.RevisedPublishingInterval;
      params.QueueSize = 1;
      params.DiscardOldest = true;
      params.ClientHandle = (uint32_t)++LastMonitoredItemHandle;
      req.RequestedParameters = params;
      itemsParams.ItemsToCreate.push_back(req);
    }

    std::vector<MonitoredItemCreateResult> results =  Server->Subscriptions()->CreateMonitoredItems(itemsParams);

    if ( results.size() != attributes.size() ) 
    {
      throw(std::runtime_error("Subscription | Error server did not send answer for all monitoreditem requests"));
    }

    std::vector<uint32_t> monitoredItemsIds;
    unsigned int i = 0;
    for (const auto& res : results)
    {
      CheckStatusCode(res.Status);
      if (Debug ) { std::cout << "Subscription | storing monitoreditem with handle " << itemsParams.ItemsToCreate[i].RequestedParameters.ClientHandle << " and id " << res.MonitoredItemId << std::endl;  }
      MonitoredItemData mdata; 
      mdata.MonitoredItemId = res.MonitoredItemId;
      mdata.Attribute =  attributes[i].AttributeId;
      mdata.TargetNode =  Node(Server, attributes[i].NodeId);
      AttributeValueMap[itemsParams.ItemsToCreate[i].RequestedParameters.ClientHandle] = mdata;
      monitoredItemsIds.push_back(res.MonitoredItemId);
      ++i;
    }
    return monitoredItemsIds;
  }