private Result <DataResponse>[] ReadEvents(Session session, IEventDataResponse eventDataResponse, OpcUAQuery[] opcUAQuery, NamespaceTable namespaceTable)
        {
            var nodeCache   = _nodeCacheFactory.Create(session);
            var browsePaths = opcUAQuery.Select(a => ResolveRelativePath(a, namespaceTable)).ToArray();

            Result <NodeId>[] nodeIdsResult = GetNodeIds(session, browsePaths, namespaceTable);

            var results = new Result <DataResponse> [opcUAQuery.Length];

            // Do one by one for now. unsure of use-case with multiple node ids for same filter.
            for (int i = 0; i < opcUAQuery.Length; i++)
            {
                var nodeIdResult = nodeIdsResult[i];
                if (nodeIdResult.Success)
                {
                    var query = opcUAQuery[i];
                    var tr    = query.timeRange;
                    //var nodeId = Converter.GetNodeId(query.nodeId, namespaceTable);
                    DateTime fromTime    = DateTimeOffset.FromUnixTimeMilliseconds(tr.FromEpochMS).UtcDateTime;
                    DateTime toTime      = DateTimeOffset.FromUnixTimeMilliseconds(tr.ToEpochMS).UtcDateTime;
                    var      eventFilter = Converter.GetEventFilter(query, namespaceTable);
                    var      response    = session.ReadEvents(fromTime, toTime, uint.MaxValue, eventFilter, new[] { nodeIdResult.Value });
                    results[i] = eventDataResponse.CreateEventDataResponse(response[0], query, nodeCache);
                }
                else
                {
                    results[i] = new Result <DataResponse>(nodeIdResult.StatusCode, nodeIdResult.Error);
                }
            }
            return(results);
        }
Esempio n. 2
0
        public Result <DataResponse> GetEventData(OpcUAQuery query, NodeId startNodeId, Opc.Ua.EventFilter eventFilter)
        {
            var nodeCache = _nodeCacheFactory.Create(_session);

            eventFilter.AddSelectClause(ObjectTypeIds.BaseEventType, "SourceNode");
            eventFilter.AddSelectClause(ObjectTypeIds.BaseEventType, "EventType");

            var eventFilterValues = GetEventFilterValues(startNodeId, eventFilter);

            if (eventFilterValues == null)
            {
                var monitorItem = AddMonitorItem(startNodeId, eventFilter);
                eventFilterValues = new EventFilterValues(monitorItem, query, eventFilter);
                if (!TryAddEventFilterValues(startNodeId, eventFilterValues))
                {
                    RemoveMonitorItem(monitorItem);
                    eventFilterValues = null;
                }
            }

            lock (_eventData)
            {
                if (eventFilterValues == null)
                {
                    eventFilterValues = GetEventFilterValues(startNodeId, eventFilter);
                }
                if (eventFilterValues != null)
                {
                    return(_eventDataResponse.CreateEventSubscriptionDataResponse(eventFilterValues.Values.Values, query, nodeCache));
                }
            }
            return(new Result <DataResponse>(StatusCodes.BadUnexpectedError, ""));
        }