/// <summary> /// Returns a list of all configured nodes in NodeId format. /// </summary> /// <returns></returns> public static async Task <List <PublisherConfigurationFileEntryLegacy> > GetPublisherConfigurationFileEntriesAsNodeIds(Uri endpointUrl) { List <PublisherConfigurationFileEntryLegacy> publisherConfigurationFileEntriesLegacy = new List <PublisherConfigurationFileEntryLegacy>(); try { PublisherNodeConfigurationSemaphore.Wait(); try { OpcSessionsListSemaphore.Wait(); // itereate through all sessions, subscriptions and monitored items and create config file entries foreach (var session in OpcSessions) { bool sessionLocked = false; try { sessionLocked = session.LockSessionAsync().Result; if (sessionLocked && (endpointUrl == null || session.EndpointUrl.AbsoluteUri.Equals(endpointUrl.AbsoluteUri, StringComparison.OrdinalIgnoreCase))) { PublisherConfigurationFileEntryLegacy publisherConfigurationFileEntryLegacy = new PublisherConfigurationFileEntryLegacy(); publisherConfigurationFileEntryLegacy.EndpointUrl = session.EndpointUrl; publisherConfigurationFileEntryLegacy.NodeId = null; publisherConfigurationFileEntryLegacy.OpcNodes = null; foreach (var subscription in session.OpcSubscriptions) { foreach (var monitoredItem in subscription.OpcMonitoredItems) { // ignore items tagged to stop if (monitoredItem.State != OpcMonitoredItemState.RemovalRequested) { if (monitoredItem.ConfigType == OpcMonitoredItemConfigurationType.ExpandedNodeId) { // for certain scenarios we support returning the NodeId format even so the // actual configuration of the node was in ExpandedNodeId format publisherConfigurationFileEntryLegacy.EndpointUrl = session.EndpointUrl; publisherConfigurationFileEntryLegacy.NodeId = new NodeId(monitoredItem.ConfigExpandedNodeId.Identifier, (ushort)session.GetNamespaceIndexUnlocked(monitoredItem.ConfigExpandedNodeId?.NamespaceUri)); publisherConfigurationFileEntriesLegacy.Add(publisherConfigurationFileEntryLegacy); } else { // we do not convert nodes with legacy configuration to the new format to keep backward // compatibility with external configurations. // the conversion would only be possible, if the session is connected, to have access to the // server namespace array. publisherConfigurationFileEntryLegacy.EndpointUrl = session.EndpointUrl; publisherConfigurationFileEntryLegacy.NodeId = monitoredItem.ConfigNodeId; publisherConfigurationFileEntriesLegacy.Add(publisherConfigurationFileEntryLegacy); } } } } } } finally { if (sessionLocked) { session.ReleaseSession(); } } } } finally { OpcSessionsListSemaphore.Release(); } } catch (Exception e) { Logger.Information(e, "Creation of configuration file entries failed."); publisherConfigurationFileEntriesLegacy = null; } finally { PublisherNodeConfigurationSemaphore.Release(); } return(publisherConfigurationFileEntriesLegacy); }
/// <summary> /// Returns a list of all published nodes for a specific endpoint in config file format. /// </summary> /// <returns></returns> public static List <PublisherConfigurationFileEntryModel> GetPublisherConfigurationFileEntries(string endpointUrl, bool getAll, out uint nodeConfigVersion) { List <PublisherConfigurationFileEntryModel> publisherConfigurationFileEntries = new List <PublisherConfigurationFileEntryModel>(); nodeConfigVersion = (uint)NodeConfigVersion; try { PublisherNodeConfigurationSemaphore.Wait(); try { OpcSessionsListSemaphore.Wait(); // itereate through all sessions, subscriptions and monitored items and create config file entries foreach (var session in OpcSessions) { bool sessionLocked = false; try { sessionLocked = session.LockSessionAsync().Result; if (sessionLocked && (endpointUrl == null || session.EndpointUrl.Equals(endpointUrl, StringComparison.OrdinalIgnoreCase))) { PublisherConfigurationFileEntryModel publisherConfigurationFileEntry = new PublisherConfigurationFileEntryModel(); publisherConfigurationFileEntry.EndpointUrl = new Uri(session.EndpointUrl); publisherConfigurationFileEntry.UseSecurity = session.UseSecurity; publisherConfigurationFileEntry.OpcNodes = new List <OpcNodeOnEndpointModel>(); foreach (var subscription in session.OpcSubscriptions) { foreach (var monitoredItem in subscription.OpcMonitoredItems) { // ignore items tagged to stop if (monitoredItem.State != OpcMonitoredItemState.RemovalRequested || getAll == true) { OpcNodeOnEndpointModel opcNodeOnEndpoint = new OpcNodeOnEndpointModel(monitoredItem.OriginalId) { OpcPublishingInterval = subscription.RequestedPublishingIntervalFromConfiguration ? subscription.RequestedPublishingInterval : (int?)null, OpcSamplingInterval = monitoredItem.RequestedSamplingIntervalFromConfiguration ? monitoredItem.RequestedSamplingInterval : (int?)null, DisplayName = monitoredItem.DisplayNameFromConfiguration ? monitoredItem.DisplayName : null }; publisherConfigurationFileEntry.OpcNodes.Add(opcNodeOnEndpoint); } } } publisherConfigurationFileEntries.Add(publisherConfigurationFileEntry); } } finally { if (sessionLocked) { session.ReleaseSession(); } } } nodeConfigVersion = (uint)NodeConfigVersion; } finally { OpcSessionsListSemaphore.Release(); } } catch (Exception e) { Logger.Error(e, "Reading configuration file entries failed."); publisherConfigurationFileEntries = null; } finally { PublisherNodeConfigurationSemaphore.Release(); } return(publisherConfigurationFileEntries); }
/// <summary> /// Returns a list of all published nodes for a specific endpoint in config file format. /// </summary> /// <returns></returns> public static List <PublisherConfigurationFileEntry> GetPublisherConfigurationFileEntries(Uri endpointUrl, bool getAll, out uint nodeConfigVersion) { List <PublisherConfigurationFileEntry> publisherConfigurationFileEntries = new List <PublisherConfigurationFileEntry>(); nodeConfigVersion = (uint)NodeConfigVersion; try { PublisherNodeConfigurationSemaphore.Wait(); try { OpcSessionsListSemaphore.Wait(); // itereate through all sessions, subscriptions and monitored items and create config file entries foreach (var session in OpcSessions) { bool sessionLocked = false; try { sessionLocked = session.LockSessionAsync().Result; if (sessionLocked && (endpointUrl == null || session.EndpointUrl.AbsoluteUri.Equals(endpointUrl.AbsoluteUri, StringComparison.OrdinalIgnoreCase))) { PublisherConfigurationFileEntry publisherConfigurationFileEntry = new PublisherConfigurationFileEntry(); publisherConfigurationFileEntry.EndpointUrl = session.EndpointUrl; publisherConfigurationFileEntry.UseSecurity = session.UseSecurity; publisherConfigurationFileEntry.OpcNodes = new List <OpcNodeOnEndpoint>(); foreach (var subscription in session.OpcSubscriptions) { foreach (var monitoredItem in subscription.OpcMonitoredItems) { // ignore items tagged to stop if (monitoredItem.State != OpcMonitoredItemState.RemovalRequested || getAll == true) { OpcNodeOnEndpoint opcNodeOnEndpoint = new OpcNodeOnEndpoint(); opcNodeOnEndpoint.Id = monitoredItem.OriginalId; opcNodeOnEndpoint.OpcPublishingInterval = subscription.RequestedPublishingInterval == OpcPublishingInterval ? (int?)null : subscription.RequestedPublishingInterval; opcNodeOnEndpoint.OpcSamplingInterval = monitoredItem.RequestedSamplingInterval == OpcSamplingInterval ? (int?)null : monitoredItem.RequestedSamplingInterval; publisherConfigurationFileEntry.OpcNodes.Add(opcNodeOnEndpoint); } } } publisherConfigurationFileEntries.Add(publisherConfigurationFileEntry); } } finally { if (sessionLocked) { session.ReleaseSession(); } } } nodeConfigVersion = (uint)NodeConfigVersion; } finally { OpcSessionsListSemaphore.Release(); } } catch (Exception e) { Logger.Information(e, "Creation of configuration file entries failed."); publisherConfigurationFileEntries = null; } finally { PublisherNodeConfigurationSemaphore.Release(); } return(publisherConfigurationFileEntries); }