示例#1
0
 /// <inheritdoc/>
 private string GetNormalizedEntityName(MonitoredItemMessageModel sample)
 {
     if (string.IsNullOrEmpty(sample.PublisherId) ||
         string.IsNullOrEmpty(sample.DataSetWriterId) ||
         string.IsNullOrEmpty(sample.NodeId))
     {
         return(null);
     }
     return(GetNormalizedKey($"{sample.PublisherId}_{sample.DataSetWriterId}" +
                             $"_{sample.NodeId}"));
 }
示例#2
0
        /// <inheritdoc/>
        public async Task HandleSampleAsync(MonitoredItemMessageModel sample)
        {
            var arguments = new object[] { sample.ToApiModel() };

            if (!string.IsNullOrEmpty(sample.EndpointId))
            {
                // Send to endpoint listeners
                await _callback.MulticastAsync(sample.EndpointId,
                                               EventTargets.PublisherSampleTarget, arguments);
            }
        }
示例#3
0
        /// <inheritdoc/>
        public Task HandleSampleAsync(MonitoredItemMessageModel sample)
        {
            // Set timestamp as source timestamp
            var properties = new Dictionary <string, string>()
            {
                [CommonProperties.EventSchemaType] =
                    Core.MessageSchemaTypes.MonitoredItemMessageModelJson
            };

            return(_client.SendAsync(_serializer.SerializeToBytes(sample).ToArray(),
                                     properties, sample.DataSetWriterId));
        }
        public async Task TestPublishTelemetryEventAndReceiveAsync(VariantValue v)
        {
            var bus    = _factory.Resolve <ISubscriberMessageProcessor>();
            var client = _factory.Resolve <IPublisherServiceEvents>();

            var endpointId = "testid";

            var result = new TaskCompletionSource <MonitoredItemMessageApiModel>();

            await using (await client.NodePublishSubscribeByEndpointAsync(endpointId, ev => {
                result.SetResult(ev);
                return(Task.CompletedTask);
            })) {
                var expected = new MonitoredItemMessageModel {
                    DataSetWriterId = "testid",
                    EndpointId      = endpointId,
                    DisplayName     = "holla",
                    NodeId          = "nodeid",
                    SourceTimestamp = DateTime.UtcNow,
                    Timestamp       = DateTime.UtcNow,
                    Value           = v
                };
                await bus.HandleSampleAsync(expected);

                await Task.WhenAny(result.Task, Task.Delay(5000));

                Assert.True(result.Task.IsCompleted);
                var received = result.Task.Result;

                Assert.Equal(expected.DisplayName, received.DisplayName);
                Assert.Equal(expected.DataSetWriterId, received.DataSetWriterId);
                Assert.Equal(expected.NodeId, received.NodeId);
                Assert.Equal(expected.SourceTimestamp, received.SourceTimestamp);
                Assert.Equal(expected.Timestamp, received.Timestamp);

                Assert.NotNull(received?.Value);
                Assert.Equal(expected.Value, received.Value);
            }
        }
        public async Task TestPublishPublisherEventAndReceiveMultipleAsync(int total)
        {
            var bus    = _factory.Resolve <ISubscriberMessageProcessor>();
            var client = _factory.Resolve <IPublisherServiceEvents>();

            var endpointId = "testid";
            var expected   = new MonitoredItemMessageModel {
                DataSetWriterId = "testid",
                EndpointId      = endpointId,
                DisplayName     = "holla",
                NodeId          = "nodeid",
                SourceTimestamp = DateTime.UtcNow,
                Timestamp       = DateTime.UtcNow,
                Value           = 234234
            };
            var result  = new TaskCompletionSource <bool>();
            var counter = 0;

            await using (await client.NodePublishSubscribeByEndpointAsync(endpointId, ev => {
                counter++;
                if (counter == total)
                {
                    result.SetResult(true);
                }
                return(Task.CompletedTask);
            })) {
                for (var i = 0; i < total; i++)
                {
                    await bus.HandleSampleAsync(expected);
                }

                await Task.WhenAny(result.Task, Task.Delay(10000));

                Assert.True(result.Task.IsCompleted, $"{counter} received instead of {total}");
            }
        }
示例#6
0
 /// <inheritdoc/>
 public Task HandleSampleAsync(MonitoredItemMessageModel sample)
 {
     return(ProcessCdmSampleAsync(sample));
 }
示例#7
0
        /// <inheritdoc/>
        private CdmDataPartitionDefinition GetOrCreateEntityDataPartition(CdmManifestDefinition manifest,
                                                                          string key, MonitoredItemMessageModel sample, out bool persist, bool forceNew = false)
        {
            persist = false;
            if (string.IsNullOrEmpty(key) || sample == null)
            {
                return(null);
            }

            // check if the enetity was aleready added
            var entityDefinition = manifest.Entities.Item(key);

            if (entityDefinition == null)
            {
                // add a new entity for the sample

                // add a new entity for the Message
                var newSampleEntity = _cdmCorpus.MakeObject <CdmEntityDefinition>(
                    CdmObjectType.EntityDef, key, false);

                var info = typeof(MonitoredItemMessageModel).GetProperties();
                foreach (var property in info)
                {
                    // add the attributes required
                    var attribute = _cdmCorpus.MakeObject <CdmTypeAttributeDefinition>(
                        CdmObjectType.TypeAttributeDef, property.Name, false);
                    attribute.Purpose = _cdmCorpus.MakeRef <CdmPurposeReference>(
                        CdmObjectType.PurposeRef, "hasA", true);
                    //  if we handle a value, lookup it's type property
                    if (property.Name == "Value")
                    {
                        attribute.DataFormat = VariantValueTypeToCdmDataFormat(sample.Value);
                    }
                    else
                    {
                        attribute.DataFormat = DataTypeToCdmDataFormat(property.PropertyType);
                    }

                    newSampleEntity.Attributes.Add(attribute);
                }

                newSampleEntity.DisplayName = kPublisherSampleEntityName;
                newSampleEntity.Version     = "0.0.2";
                newSampleEntity.Description = "Opc Ua Monitored Item Sample";

                // Create a new document where the new entity's definition will be stored
                var newSampleEntityDoc = _cdmCorpus.MakeObject <CdmDocumentDefinition>(
                    CdmObjectType.DocumentDef, $"{newSampleEntity.EntityName}.cdm.json", false);
                newSampleEntityDoc.Imports.Add($"{newSampleEntity.EntityName}.cdm.json");
                newSampleEntityDoc.Imports.Add(kFoundationJsonPath);
                newSampleEntityDoc.Definitions.Add(newSampleEntity);
                _cdmCorpus.Storage.FetchRootFolder("adls").Documents.Add(newSampleEntityDoc);
                entityDefinition = manifest.Entities.Add(newSampleEntity);
                persist         |= true;
            }

            var partition = entityDefinition.DataPartitions.Count != 0
                ? entityDefinition.DataPartitions.Last() : null;

            if (forceNew || partition == null)
            {
                // Define a partition and add it to the local declaration
                var newPartition = _cdmCorpus.MakeObject <CdmDataPartitionDefinition>(
                    CdmObjectType.DataPartitionDef, entityDefinition.EntityName);
                var timestamp = DateTime.UtcNow.ToString(
                    "yyMMddHHmmss", DateTimeFormatInfo.InvariantInfo);
                newPartition.Location =
                    $"adls:/{entityDefinition.EntityName}/partition-data-{timestamp}.csv";
                newPartition.Explanation = "OPC UA PubSub DataSet Partition";
                var partitionTrait = newPartition.ExhibitsTraits.Add(
                    "is.partition.format.CSV");
                partitionTrait.Arguments.Add("columnHeaders", "true");
                partitionTrait.Arguments.Add("delimiter", kCsvPartitionsDelimiter);
                partition = entityDefinition.DataPartitions.Add(newPartition);
                persist  |= true;
            }
            return(partition);
        }