public async Task <bool> IsFolderTypeAsync(string serverUrl, string nodeIdStr) { Session session = await GetSessionAsync(serverUrl); NodeId nodeToBrowseId = PlatformUtils.ParsePlatformNodeIdString(nodeIdStr); //Set a Browser object to follow HasTypeDefinition Reference only var browser = new Browser(session) { ResultMask = (uint)BrowseResultMask.DisplayName | (uint)BrowseResultMask.TargetInfo, BrowseDirection = BrowseDirection.Forward, ReferenceTypeId = ReferenceTypeIds.HasTypeDefinition }; ReferenceDescription refDescription = browser.Browse(nodeToBrowseId)[0]; NodeId targetId = ExpandedNodeId.ToNodeId(refDescription.NodeId, session.MessageContext.NamespaceUris); //Once got the Object Type, set the browser to follow Type hierarchy in inverse order. browser.ReferenceTypeId = ReferenceTypeIds.HasSubtype; browser.BrowseDirection = BrowseDirection.Inverse; while (targetId != ObjectTypeIds.FolderType && targetId != ObjectTypeIds.BaseObjectType) { refDescription = browser.Browse(targetId)[0]; targetId = ExpandedNodeId.ToNodeId(refDescription.NodeId, session.MessageContext.NamespaceUris); } return(targetId == ObjectTypeIds.FolderType); }
public async Task <Node> ReadNodeAsync(string serverUrl, string nodeIdStr) { Session session = await GetSessionAsync(serverUrl); NodeId nodeToRead = PlatformUtils.ParsePlatformNodeIdString(nodeIdStr); var node = session.ReadNode(nodeToRead); return(node); }
public async Task <IEnumerable <EdgeDescription> > BrowseAsync(string serverUrl, string nodeToBrowseIdStr) { Session session = await GetSessionAsync(serverUrl); NodeId nodeToBrowseId = PlatformUtils.ParsePlatformNodeIdString(nodeToBrowseIdStr); var browser = new Browser(session) { NodeClassMask = (int)NodeClass.Method | (int)NodeClass.Object | (int)NodeClass.Variable, ResultMask = (uint)BrowseResultMask.DisplayName | (uint)BrowseResultMask.NodeClass | (uint)BrowseResultMask.ReferenceTypeInfo, BrowseDirection = BrowseDirection.Forward, ReferenceTypeId = ReferenceTypeIds.HierarchicalReferences }; return(browser.Browse(nodeToBrowseId) .Select(rd => new EdgeDescription(rd.NodeId.ToStringId(session.MessageContext.NamespaceUris), rd.DisplayName.Text, rd.NodeClass, rd.ReferenceTypeId))); }
public async Task <bool[]> CreateMonitoredItemsAsync(string serverUrl, MonitorableNode[] monitorableNodes, string brokerUrl, string topic) { var session = await GetSessionAsync(serverUrl); MonitorPublishInfo monitorInfo; const string pattern = @"^(mqtt|signalr):(.*)$"; var match = Regex.Match(brokerUrl, pattern); var protocol = match.Groups[1].Value; var url = match.Groups[2].Value; var publisher = PublisherFactory.GetPublisherForProtocol(protocol, url); //Set publishInterval to minimum samplinginterval var publishInterval = monitorableNodes.Select(elem => elem.SamplingInterval).Min(); lock (_monitorPublishInfo) { //Check if a Subscription for the if (_monitorPublishInfo.ContainsKey(serverUrl)) { monitorInfo = _monitorPublishInfo[serverUrl].FirstOrDefault(info => info.Topic == topic && info.BrokerUrl == url); if (monitorInfo == null) { monitorInfo = new MonitorPublishInfo() { Topic = topic, BrokerUrl = url, Subscription = CreateSubscription(session, publishInterval, 0), Publisher = publisher }; _monitorPublishInfo[serverUrl].Add(monitorInfo); } else if (monitorInfo.Subscription.PublishingInterval > publishInterval) { monitorInfo.Subscription.PublishingInterval = publishInterval; monitorInfo.Subscription.Modify(); } } else { monitorInfo = new MonitorPublishInfo() { Topic = topic, BrokerUrl = url, Subscription = CreateSubscription(session, publishInterval, 0), Publisher = publisher }; var list = new List <MonitorPublishInfo> { monitorInfo }; _monitorPublishInfo.Add(serverUrl, list); } } var createdMonitoredItems = new List <MonitoredItem>(); foreach (var monitorableNode in monitorableNodes) { var mi = new MonitoredItem() { StartNodeId = PlatformUtils.ParsePlatformNodeIdString(monitorableNode.NodeId), DisplayName = monitorableNode.NodeId, SamplingInterval = monitorableNode.SamplingInterval }; if (monitorableNode.DeadBand != "none") { mi.Filter = new DataChangeFilter() { Trigger = DataChangeTrigger.StatusValue, DeadbandType = (uint)(DeadbandType)Enum.Parse(typeof(DeadbandType), monitorableNode.DeadBand, true), DeadbandValue = monitorableNode.DeadBandValue }; } mi.Notification += OnMonitorNotification; monitorInfo.Subscription.AddItem(mi); var monitoredItems = monitorInfo.Subscription.CreateItems(); createdMonitoredItems.AddRange(monitoredItems); } var results = createdMonitoredItems.Distinct().Select(m => m.Created).ToArray(); foreach (var monitoredItem in createdMonitoredItems.Where(m => !m.Created)) { monitorInfo.Subscription.RemoveItem(monitoredItem); } return(results); }