/// <summary> /// Increments the message counter. /// </summary> public void MessagePublished(DataSetWriterDataType writer, DataSet dataset) { if (writer.KeyFrameCount > 1) { lock (DataSets) { DataSetState state = GetState(writer); state.MessageCount++; state.ConfigurationVersion = dataset.DataSetMetaData.ConfigurationVersion; if (state.LastDataSet == null) { state.LastDataSet = Copy(dataset); return; } for (int ii = 0; ii < dataset.Fields.Length && ii < state.LastDataSet.Fields.Length; ii++) { var field = dataset.Fields[ii]; if (field != null) { state.LastDataSet.Fields[ii] = field; } } } } }
/// <summary> /// Create and return the current DataSet for the provided dataSetWriter according to current WriterGroupPublishState /// </summary> /// <returns></returns> protected DataSet CreateDataSet(DataSetWriterDataType dataSetWriter, WriterGroupPublishState state) { DataSet dataSet = null; //check if dataSetWriter enabled if (dataSetWriter.Enabled) { uint sequenceNumber = 0; bool isDeltaFrame = state.IsDeltaFrame(dataSetWriter, out sequenceNumber); dataSet = Application.DataCollector.CollectData(dataSetWriter.DataSetName); if (dataSet != null) { dataSet.SequenceNumber = sequenceNumber; dataSet.IsDeltaFrame = isDeltaFrame; if (isDeltaFrame) { dataSet = state.ExcludeUnchangedFields(dataSetWriter, dataSet); } } } return(dataSet); }
/// <summary> /// Returns TRUE if the next DataSetMessage is a delta frame. /// </summary> public bool HasMetaDataChanged(DataSetWriterDataType writer, DataSetMetaDataType metadata) { if (metadata == null) { return(false); } lock (m_dataSetStates) { DataSetState state = GetState(writer); ConfigurationVersionDataType version = state.ConfigurationVersion; // no matter what the TransportSettings.MetaDataUpdateTime is the ConfigurationVersion is checked if (version == null) { // keep a copy of ConfigurationVersion state.ConfigurationVersion = metadata.ConfigurationVersion.MemberwiseClone() as ConfigurationVersionDataType; state.LastMetaDataUpdate = DateTime.UtcNow; return(true); } if (version.MajorVersion != metadata.ConfigurationVersion.MajorVersion || version.MinorVersion != metadata.ConfigurationVersion.MinorVersion) { // keep a copy of ConfigurationVersion state.ConfigurationVersion = metadata.ConfigurationVersion.MemberwiseClone() as ConfigurationVersionDataType; state.LastMetaDataUpdate = DateTime.UtcNow; return(true); } } return(false); }
/// <summary> /// Create and return the list of DataSetMetaData response messages /// </summary> /// <param name="dataSetWriterIds"></param> /// <returns></returns> public IList <UaNetworkMessage> CreateDataSetMetaDataNetworkMessages(UInt16[] dataSetWriterIds) { List <UaNetworkMessage> networkMessages = new List <UaNetworkMessage>(); var writers = GetAllDataSetWriters(); foreach (UInt16 dataSetWriterId in dataSetWriterIds) { DataSetWriterDataType writer = writers.Where(w => w.DataSetWriterId == dataSetWriterId).FirstOrDefault(); if (writer != null) { WriterGroupDataType writerGroup = PubSubConnectionConfiguration.WriterGroups.Where(wg => wg.DataSetWriters.Contains(writer)).FirstOrDefault(); if (writerGroup != null) { DataSetMetaDataType metaData = Application.DataCollector.GetPublishedDataSet(writer.DataSetName)?.DataSetMetaData; if (metaData != null) { UadpNetworkMessage networkMessage = new UadpNetworkMessage(writerGroup, metaData); networkMessage.PublisherId = PubSubConnectionConfiguration.PublisherId.Value; networkMessage.DataSetWriterId = dataSetWriterId; networkMessages.Add(networkMessage); } } } } return(networkMessages); }
/// <summary> /// Increments the message counter. /// </summary> public void OnMessagePublished(DataSetWriterDataType writer, DataSet dataset) { lock (m_dataSetStates) { DataSetState state = GetState(writer); state.MessageCount++; if (writer.KeyFrameCount > 1) { state.ConfigurationVersion = dataset.DataSetMetaData.ConfigurationVersion.MemberwiseClone() as ConfigurationVersionDataType; if (state.LastDataSet == null) { state.LastDataSet = dataset.MemberwiseClone() as DataSet; return; } for (int ii = 0; ii < dataset.Fields.Length && ii < state.LastDataSet.Fields.Length; ii++) { var field = dataset.Fields[ii]; if (field != null) { state.LastDataSet.Fields[ii] = field.MemberwiseClone() as Field; } } } } }
/// <summary> /// Create new instance of <see cref="MqttMetadataPublisher"/>. /// </summary> internal MqttMetadataPublisher(IMqttPubSubConnection parentConnection, WriterGroupDataType writerGroup, DataSetWriterDataType dataSetWriter, double metaDataUpdateTime) { m_parentConnection = parentConnection; m_writerGroup = writerGroup; m_dataSetWriter = dataSetWriter; m_intervalRunner = new IntervalRunner(dataSetWriter.DataSetWriterId, metaDataUpdateTime, CanPublish, PublishMessage); }
public void ValidateOperational_2ToDisabled_0_Publisher() { UaPubSubApplication uaPubSubApplication = UaPubSubApplication.Create(publisherConfigurationFile); UaPubSubConfigurator configurator = uaPubSubApplication.UaPubSubConfigurator; // The hierarchy PubSub -> PubSubConnection -> PubSubWriterGroup -> DataSetWriter brought to [Disabled, Disabled, Disabled, Disabled] PubSubConfigurationDataType pubSub = uaPubSubApplication.UaPubSubConfigurator.PubSubConfiguration; PubSubConnectionDataType publisherConnection = uaPubSubApplication.UaPubSubConfigurator.PubSubConfiguration.Connections.First(); WriterGroupDataType writerGroup = publisherConnection.WriterGroups[0]; DataSetWriterDataType datasetWriter = writerGroup.DataSetWriters[0]; configurator.Disable(pubSub); configurator.Disable(publisherConnection); configurator.Disable(writerGroup); configurator.Disable(datasetWriter); PubSubState psState = uaPubSubApplication.UaPubSubConfigurator.FindStateForObject(pubSub); PubSubState conState = uaPubSubApplication.UaPubSubConfigurator.FindStateForObject(publisherConnection); PubSubState wgState = uaPubSubApplication.UaPubSubConfigurator.FindStateForObject(writerGroup); PubSubState dswState = uaPubSubApplication.UaPubSubConfigurator.FindStateForObject(datasetWriter); Assert.That(psState == PubSubState.Disabled, Is.True); Assert.That(conState == PubSubState.Disabled, Is.True); Assert.That(wgState == PubSubState.Disabled, Is.True); Assert.That(dswState == PubSubState.Disabled, Is.True); // The hierarchy PubSub -> PubSubConnection -> PubSubWriterGroup -> DataSetWriter brought to [Operational, Operational, Operational, Operational] configurator.Enable(pubSub); configurator.Enable(publisherConnection); configurator.Enable(writerGroup); configurator.Enable(datasetWriter); psState = uaPubSubApplication.UaPubSubConfigurator.FindStateForObject(pubSub); conState = uaPubSubApplication.UaPubSubConfigurator.FindStateForObject(publisherConnection); wgState = uaPubSubApplication.UaPubSubConfigurator.FindStateForObject(writerGroup); dswState = uaPubSubApplication.UaPubSubConfigurator.FindStateForObject(datasetWriter); Assert.That(psState == PubSubState.Operational, Is.True); Assert.That(conState == PubSubState.Operational, Is.True); Assert.That(wgState == PubSubState.Operational, Is.True); Assert.That(dswState == PubSubState.Operational, Is.True); // The hierarchy PubSub -> PubSubConnection -> PubSubWriterGroup -> DataSetWriter brought to [Disabled, Disabled, Disabled, Disabled] configurator.Disable(pubSub); configurator.Disable(publisherConnection); configurator.Disable(writerGroup); configurator.Disable(datasetWriter); psState = uaPubSubApplication.UaPubSubConfigurator.FindStateForObject(pubSub); conState = uaPubSubApplication.UaPubSubConfigurator.FindStateForObject(publisherConnection); wgState = uaPubSubApplication.UaPubSubConfigurator.FindStateForObject(writerGroup); dswState = uaPubSubApplication.UaPubSubConfigurator.FindStateForObject(datasetWriter); Assert.That(psState == PubSubState.Disabled, Is.True); Assert.That(conState == PubSubState.Disabled, Is.True); Assert.That(wgState == PubSubState.Disabled, Is.True); Assert.That(dswState == PubSubState.Disabled, Is.True); }
private DataSetState GetState(DataSetWriterDataType writer) { DataSetState state; if (!m_dataSetStates.TryGetValue(writer.DataSetWriterId, out state)) { m_dataSetStates[writer.DataSetWriterId] = state = new DataSetState(); } return(state); }
/// <summary> /// Create new instance of <see cref="MetaDataState"/> /// </summary> /// <param name="dataSetWriter"></param> public MetaDataState(DataSetWriterDataType dataSetWriter) { DataSetWriter = dataSetWriter; LastSendTime = DateTime.MinValue; BrokerDataSetWriterTransportDataType transport = ExtensionObject.ToEncodeable(DataSetWriter.TransportSettings) as BrokerDataSetWriterTransportDataType; MetaDataUpdateTime = transport?.MetaDataUpdateTime ?? 0; }
/// <summary> /// Checks if the DataSet has changed and null /// </summary> public DataSet ExcludeUnchangedFields(DataSetWriterDataType writer, DataSet dataset) { lock (m_dataSetStates) { DataSetState state = GetState(writer); DataSet lastDataSet = state.LastDataSet; if (lastDataSet == null) { state.LastDataSet = dataset.MemberwiseClone() as DataSet; return(dataset); } bool changed = false; for (int ii = 0; ii < dataset.Fields.Length && ii < lastDataSet.Fields.Length; ii++) { var field1 = dataset.Fields[ii]; var field2 = lastDataSet.Fields[ii]; if (field1 == null || field2 == null) { changed = true; continue; } if (field1.Value.StatusCode != field2.Value.StatusCode) { changed = true; continue; } if (!Utils.IsEqual(field1.Value.WrappedValue, field2.Value.WrappedValue)) { changed = true; continue; } dataset.Fields[ii] = null; } if (!changed) { return(null); } } return(dataset); }
/// <summary> /// Returns TRUE if the next DataSetMessage is a delta frame. /// </summary> public bool IsDeltaFrame(DataSetWriterDataType writer, out uint sequenceNumber) { lock (m_dataSetStates) { DataSetState state = GetState(writer); sequenceNumber = state.MessageCount + 1; if (state.MessageCount % writer.KeyFrameCount != 0) { return(true); } } return(false); }
/// <summary> /// Returns TRUE if the next DataSetMessage is a delta frame. /// </summary> public bool HasMetaDataChanged(DataSetWriterDataType writer, DataSetMetaDataType metadata, double updateTime) { if (metadata == null) { return(false); } lock (DataSets) { DataSetState state = GetState(writer); ConfigurationVersionDataType version = state.ConfigurationVersion; if (version == null) { state.ConfigurationVersion = metadata.ConfigurationVersion; state.LastMetaDataUpdate = DateTime.UtcNow; return(true); } if (version.MajorVersion != metadata.ConfigurationVersion.MajorVersion || version.MinorVersion != metadata.ConfigurationVersion.MinorVersion) { state.ConfigurationVersion = metadata.ConfigurationVersion; state.LastMetaDataUpdate = DateTime.UtcNow; return(true); } if (updateTime > 0) { if (state.LastMetaDataUpdate.AddMilliseconds(updateTime) <= DateTime.UtcNow) { state.LastMetaDataUpdate = DateTime.UtcNow; return(true); } } } return(false); }
/// <summary> /// Creates a PubSubConfiguration object for MQTT & UADP programmatically. /// </summary> /// <returns></returns> private static PubSubConfigurationDataType CreatePublisherConfiguration_MqttUadp(string urlAddress) { // Define a PubSub connection with PublisherId 3 PubSubConnectionDataType pubSubConnection1 = new PubSubConnectionDataType(); pubSubConnection1.Name = "Publisher Connection MQTT UADP"; pubSubConnection1.Enabled = true; pubSubConnection1.PublisherId = (UInt16)3; pubSubConnection1.TransportProfileUri = Profiles.PubSubMqttUadpTransport; NetworkAddressUrlDataType address = new NetworkAddressUrlDataType(); // Specify the local Network interface name to be used // e.g. address.NetworkInterface = "Ethernet"; // Leave empty to publish on all available local interfaces. address.NetworkInterface = String.Empty; address.Url = urlAddress; pubSubConnection1.Address = new ExtensionObject(address); // Configure the mqtt specific configuration with the MQTTbroker ITransportProtocolConfiguration mqttConfiguration = new MqttClientProtocolConfiguration(version: EnumMqttProtocolVersion.V500); pubSubConnection1.ConnectionProperties = mqttConfiguration.ConnectionProperties; string brokerQueueName = "Uadp_WriterGroup_1"; string brokerMetaData = "$Metadata"; #region Define WriterGroup1 WriterGroupDataType writerGroup1 = new WriterGroupDataType(); writerGroup1.Name = "WriterGroup 1"; writerGroup1.Enabled = true; writerGroup1.WriterGroupId = 1; writerGroup1.PublishingInterval = 5000; writerGroup1.KeepAliveTime = 5000; writerGroup1.MaxNetworkMessageSize = 1500; writerGroup1.HeaderLayoutUri = "UADP-Cyclic-Fixed"; UadpWriterGroupMessageDataType uadpMessageSettings = new UadpWriterGroupMessageDataType() { DataSetOrdering = DataSetOrderingType.AscendingWriterId, GroupVersion = 0, NetworkMessageContentMask = (uint)(UadpNetworkMessageContentMask.PublisherId | UadpNetworkMessageContentMask.GroupHeader | UadpNetworkMessageContentMask.WriterGroupId | UadpNetworkMessageContentMask.PayloadHeader | UadpNetworkMessageContentMask.GroupVersion | UadpNetworkMessageContentMask.NetworkMessageNumber | UadpNetworkMessageContentMask.SequenceNumber) }; writerGroup1.MessageSettings = new ExtensionObject(uadpMessageSettings); // initialize Broker transport settings writerGroup1.TransportSettings = new ExtensionObject(new BrokerWriterGroupTransportDataType() { QueueName = brokerQueueName, }); // Define DataSetWriter 'Simple' DataSetWriterDataType dataSetWriter1 = new DataSetWriterDataType(); dataSetWriter1.Name = "Writer 1"; dataSetWriter1.DataSetWriterId = 1; dataSetWriter1.Enabled = true; dataSetWriter1.DataSetFieldContentMask = (uint)DataSetFieldContentMask.RawData; dataSetWriter1.DataSetName = "Simple"; dataSetWriter1.KeyFrameCount = 1; UadpDataSetWriterMessageDataType uadpDataSetWriterMessage = new UadpDataSetWriterMessageDataType() { ConfiguredSize = 32, DataSetOffset = 15, NetworkMessageNumber = 1, DataSetMessageContentMask = (uint)(UadpDataSetMessageContentMask.Status | UadpDataSetMessageContentMask.SequenceNumber), }; dataSetWriter1.MessageSettings = new ExtensionObject(uadpDataSetWriterMessage); BrokerDataSetWriterTransportDataType uadpDataSetWriterTransport = new BrokerDataSetWriterTransportDataType() { QueueName = brokerQueueName, MetaDataQueueName = $"{brokerQueueName}/{brokerMetaData}", MetaDataUpdateTime = 60000 }; dataSetWriter1.TransportSettings = new ExtensionObject(uadpDataSetWriterTransport); writerGroup1.DataSetWriters.Add(dataSetWriter1); // Define DataSetWriter 'AllTypes' DataSetWriterDataType dataSetWriter2 = new DataSetWriterDataType(); dataSetWriter2.Name = "Writer 2"; dataSetWriter2.DataSetWriterId = 2; dataSetWriter2.Enabled = true; dataSetWriter2.DataSetFieldContentMask = (uint)DataSetFieldContentMask.RawData; dataSetWriter2.DataSetName = "AllTypes"; dataSetWriter2.KeyFrameCount = 1; uadpDataSetWriterMessage = new UadpDataSetWriterMessageDataType() { ConfiguredSize = 32, DataSetOffset = 47, NetworkMessageNumber = 1, DataSetMessageContentMask = (uint)(UadpDataSetMessageContentMask.Status | UadpDataSetMessageContentMask.SequenceNumber), }; dataSetWriter2.MessageSettings = new ExtensionObject(uadpDataSetWriterMessage); dataSetWriter2.TransportSettings = new ExtensionObject(uadpDataSetWriterTransport); writerGroup1.DataSetWriters.Add(dataSetWriter2); pubSubConnection1.WriterGroups.Add(writerGroup1); #endregion // Define PublishedDataSet Simple PublishedDataSetDataType publishedDataSetSimple = CreatePublishedDataSetSimple(); // Define PublishedDataSet AllTypes PublishedDataSetDataType publishedDataSetAllTypes = CreatePublishedDataSetAllTypes(); //create the PubSub configuration root object PubSubConfigurationDataType pubSubConfiguration = new PubSubConfigurationDataType(); pubSubConfiguration.Connections = new PubSubConnectionDataTypeCollection() { pubSubConnection1 }; pubSubConfiguration.PublishedDataSets = new PublishedDataSetDataTypeCollection() { publishedDataSetSimple, publishedDataSetAllTypes }; return(pubSubConfiguration); }
public void ValidateDisabled_0ToPause_1_Publisher() { UaPubSubApplication uaPubSubApplication = UaPubSubApplication.Create(PublisherConfigurationFileName); UaPubSubConfigurator configurator = uaPubSubApplication.UaPubSubConfigurator; // The hierarchy PubSub -> PubSubConnection -> PubSubWriterGroup -> DataSetWriter brought to [Disabled, Disabled, Disabled, Disabled] PubSubConfigurationDataType pubSub = uaPubSubApplication.UaPubSubConfigurator.PubSubConfiguration; PubSubConnectionDataType publisherConnection = uaPubSubApplication.UaPubSubConfigurator.PubSubConfiguration.Connections[0]; WriterGroupDataType writerGroup = publisherConnection.WriterGroups[0]; DataSetWriterDataType datasetWriter = writerGroup.DataSetWriters[0]; configurator.Disable(pubSub); configurator.Disable(publisherConnection); configurator.Disable(writerGroup); configurator.Disable(datasetWriter); PubSubState psState = uaPubSubApplication.UaPubSubConfigurator.FindStateForObject(pubSub); PubSubState conState = uaPubSubApplication.UaPubSubConfigurator.FindStateForObject(publisherConnection); PubSubState wgState = uaPubSubApplication.UaPubSubConfigurator.FindStateForObject(writerGroup); PubSubState dswState = uaPubSubApplication.UaPubSubConfigurator.FindStateForObject(datasetWriter); Assert.That(psState == PubSubState.Disabled, Is.True); Assert.That(conState == PubSubState.Disabled, Is.True); Assert.That(wgState == PubSubState.Disabled, Is.True); Assert.That(dswState == PubSubState.Disabled, Is.True); // Bring connection to Enabled configurator.Enable(publisherConnection); psState = uaPubSubApplication.UaPubSubConfigurator.FindStateForObject(pubSub); conState = uaPubSubApplication.UaPubSubConfigurator.FindStateForObject(publisherConnection); wgState = uaPubSubApplication.UaPubSubConfigurator.FindStateForObject(writerGroup); dswState = uaPubSubApplication.UaPubSubConfigurator.FindStateForObject(datasetWriter); Assert.That(psState == PubSubState.Disabled, Is.True); Assert.That(conState == PubSubState.Paused, Is.True); Assert.That(wgState == PubSubState.Disabled, Is.True); Assert.That(dswState == PubSubState.Disabled, Is.True); // Bring writerGroup to Enabled configurator.Enable(writerGroup); psState = uaPubSubApplication.UaPubSubConfigurator.FindStateForObject(pubSub); conState = uaPubSubApplication.UaPubSubConfigurator.FindStateForObject(publisherConnection); wgState = uaPubSubApplication.UaPubSubConfigurator.FindStateForObject(writerGroup); dswState = uaPubSubApplication.UaPubSubConfigurator.FindStateForObject(datasetWriter); Assert.That(psState == PubSubState.Disabled, Is.True); Assert.That(conState == PubSubState.Paused, Is.True); Assert.That(wgState == PubSubState.Paused, Is.True); Assert.That(dswState == PubSubState.Disabled, Is.True); // Bring datasetWriter to Enabled configurator.Enable(datasetWriter); psState = uaPubSubApplication.UaPubSubConfigurator.FindStateForObject(pubSub); conState = uaPubSubApplication.UaPubSubConfigurator.FindStateForObject(publisherConnection); wgState = uaPubSubApplication.UaPubSubConfigurator.FindStateForObject(writerGroup); dswState = uaPubSubApplication.UaPubSubConfigurator.FindStateForObject(datasetWriter); Assert.That(psState == PubSubState.Disabled, Is.True); Assert.That(conState == PubSubState.Paused, Is.True); Assert.That(wgState == PubSubState.Paused, Is.True); Assert.That(dswState == PubSubState.Paused, Is.True); }
/// <summary> /// Creates a PubSubConfiguration object programmatically. /// </summary> /// <returns></returns> public static PubSubConfigurationDataType CreatePublisherConfiguration() { // Define a PubSub connection with PublisherId 100 PubSubConnectionDataType pubSubConnection1 = new PubSubConnectionDataType(); pubSubConnection1.Name = "UADPConnection1"; pubSubConnection1.Enabled = true; pubSubConnection1.PublisherId = (UInt16)100; pubSubConnection1.TransportProfileUri = Profiles.UadpTransport; NetworkAddressUrlDataType address = new NetworkAddressUrlDataType(); // Specify the local Network interface name to be used // e.g. address.NetworkInterface = "Ethernet"; // Leave empty to publish on all available local interfaces. address.NetworkInterface = String.Empty; address.Url = "opc.udp://239.0.0.1:4840"; pubSubConnection1.Address = new ExtensionObject(address); #region Define WriterGroup1 WriterGroupDataType writerGroup1 = new WriterGroupDataType(); writerGroup1.Name = "WriterGroup 1"; writerGroup1.Enabled = true; writerGroup1.WriterGroupId = 1; writerGroup1.PublishingInterval = 5000; writerGroup1.KeepAliveTime = 5000; writerGroup1.MaxNetworkMessageSize = 1500; writerGroup1.HeaderLayoutUri = "UADP-Cyclic-Fixed"; UadpWriterGroupMessageDataType messageSettings = new UadpWriterGroupMessageDataType() { DataSetOrdering = DataSetOrderingType.AscendingWriterId, GroupVersion = 0, NetworkMessageContentMask = (uint)(UadpNetworkMessageContentMask.PublisherId | UadpNetworkMessageContentMask.GroupHeader | UadpNetworkMessageContentMask.WriterGroupId | UadpNetworkMessageContentMask.GroupVersion | UadpNetworkMessageContentMask.NetworkMessageNumber | UadpNetworkMessageContentMask.SequenceNumber) }; writerGroup1.MessageSettings = new ExtensionObject(messageSettings); writerGroup1.TransportSettings = new ExtensionObject(new DatagramWriterGroupTransportDataType()); // Define DataSetWriter 'Simple' DataSetWriterDataType dataSetWriter1 = new DataSetWriterDataType(); dataSetWriter1.Name = "Writer 1"; dataSetWriter1.DataSetWriterId = 1; dataSetWriter1.Enabled = true; dataSetWriter1.DataSetFieldContentMask = (uint)DataSetFieldContentMask.RawData; dataSetWriter1.DataSetName = "Simple"; dataSetWriter1.KeyFrameCount = 1; UadpDataSetWriterMessageDataType uadpDataSetWriterMessage = new UadpDataSetWriterMessageDataType() { ConfiguredSize = 32, DataSetOffset = 15, NetworkMessageNumber = 1, DataSetMessageContentMask = (uint)(UadpDataSetMessageContentMask.Status | UadpDataSetMessageContentMask.SequenceNumber), }; dataSetWriter1.MessageSettings = new ExtensionObject(uadpDataSetWriterMessage); writerGroup1.DataSetWriters.Add(dataSetWriter1); // Define DataSetWriter 'AllTypes' DataSetWriterDataType dataSetWriter2 = new DataSetWriterDataType(); dataSetWriter2.Name = "Writer 2"; dataSetWriter2.DataSetWriterId = 2; dataSetWriter2.Enabled = true; dataSetWriter2.DataSetFieldContentMask = (uint)DataSetFieldContentMask.RawData; dataSetWriter2.DataSetName = "AllTypes"; dataSetWriter2.KeyFrameCount = 1; uadpDataSetWriterMessage = new UadpDataSetWriterMessageDataType() { ConfiguredSize = 32, DataSetOffset = 47, NetworkMessageNumber = 1, DataSetMessageContentMask = (uint)(UadpDataSetMessageContentMask.Status | UadpDataSetMessageContentMask.SequenceNumber), }; dataSetWriter2.MessageSettings = new ExtensionObject(uadpDataSetWriterMessage); writerGroup1.DataSetWriters.Add(dataSetWriter2); pubSubConnection1.WriterGroups.Add(writerGroup1); #endregion #region Define PublishedDataSet Simple PublishedDataSetDataType publishedDataSetSimple = new PublishedDataSetDataType(); publishedDataSetSimple.Name = "Simple"; //name shall be unique in a configuration // Define publishedDataSetSimple.DataSetMetaData publishedDataSetSimple.DataSetMetaData = new DataSetMetaDataType(); publishedDataSetSimple.DataSetMetaData.DataSetClassId = Uuid.Empty; publishedDataSetSimple.DataSetMetaData.Name = publishedDataSetSimple.Name; publishedDataSetSimple.DataSetMetaData.Fields = new FieldMetaDataCollection() { new FieldMetaData() { Name = "BoolToggle", DataSetFieldId = new Uuid(Guid.NewGuid()), BuiltInType = (byte)DataTypes.Boolean, DataType = DataTypeIds.Boolean, ValueRank = ValueRanks.Scalar }, new FieldMetaData() { Name = "Int32", DataSetFieldId = new Uuid(Guid.NewGuid()), BuiltInType = (byte)DataTypes.Int32, DataType = DataTypeIds.Int32, ValueRank = ValueRanks.Scalar }, new FieldMetaData() { Name = "Int32Fast", DataSetFieldId = new Uuid(Guid.NewGuid()), BuiltInType = (byte)DataTypes.Int32, DataType = DataTypeIds.Int32, ValueRank = ValueRanks.Scalar }, new FieldMetaData() { Name = "DateTime", DataSetFieldId = new Uuid(Guid.NewGuid()), BuiltInType = (byte)DataTypes.DateTime, DataType = DataTypeIds.DateTime, ValueRank = ValueRanks.Scalar }, }; publishedDataSetSimple.DataSetMetaData.ConfigurationVersion = new ConfigurationVersionDataType() { MinorVersion = 1, MajorVersion = 1 }; PublishedDataItemsDataType publishedDataSetSimpleSource = new PublishedDataItemsDataType(); publishedDataSetSimpleSource.PublishedData = new PublishedVariableDataTypeCollection(); //create PublishedData based on metadata names foreach (var field in publishedDataSetSimple.DataSetMetaData.Fields) { publishedDataSetSimpleSource.PublishedData.Add( new PublishedVariableDataType() { PublishedVariable = new NodeId(field.Name, PublishedValuesWrites.NamespaceIndexSimple), AttributeId = Attributes.Value, }); } publishedDataSetSimple.DataSetSource = new ExtensionObject(publishedDataSetSimpleSource); #endregion #region Define PublishedDataSet AllTypes PublishedDataSetDataType publishedDataSetAllTypes = new PublishedDataSetDataType(); publishedDataSetAllTypes.Name = "AllTypes"; //name shall be unique in a configuration // Define publishedDataSetAllTypes.DataSetMetaData publishedDataSetAllTypes.DataSetMetaData = new DataSetMetaDataType(); publishedDataSetAllTypes.DataSetMetaData.DataSetClassId = Uuid.Empty; publishedDataSetAllTypes.DataSetMetaData.Name = publishedDataSetAllTypes.Name; publishedDataSetAllTypes.DataSetMetaData.Fields = new FieldMetaDataCollection() { new FieldMetaData() { Name = "BoolToggle", DataSetFieldId = new Uuid(Guid.NewGuid()), BuiltInType = (byte)DataTypes.Boolean, DataType = DataTypeIds.Boolean, ValueRank = ValueRanks.Scalar }, new FieldMetaData() { Name = "Byte", DataSetFieldId = new Uuid(Guid.NewGuid()), BuiltInType = (byte)DataTypes.Byte, DataType = DataTypeIds.Byte, ValueRank = ValueRanks.Scalar }, new FieldMetaData() { Name = "Int16", DataSetFieldId = new Uuid(Guid.NewGuid()), BuiltInType = (byte)DataTypes.Int16, DataType = DataTypeIds.Int16, ValueRank = ValueRanks.Scalar }, new FieldMetaData() { Name = "Int32", DataSetFieldId = new Uuid(Guid.NewGuid()), BuiltInType = (byte)DataTypes.Int32, DataType = DataTypeIds.Int32, ValueRank = ValueRanks.Scalar }, new FieldMetaData() { Name = "SByte", DataSetFieldId = new Uuid(Guid.NewGuid()), BuiltInType = (byte)DataTypes.SByte, DataType = DataTypeIds.SByte, ValueRank = ValueRanks.Scalar }, new FieldMetaData() { Name = "UInt16", DataSetFieldId = new Uuid(Guid.NewGuid()), BuiltInType = (byte)DataTypes.UInt16, DataType = DataTypeIds.UInt16, ValueRank = ValueRanks.Scalar }, new FieldMetaData() { Name = "UInt32", DataSetFieldId = new Uuid(Guid.NewGuid()), BuiltInType = (byte)DataTypes.UInt32, DataType = DataTypeIds.UInt32, ValueRank = ValueRanks.Scalar }, new FieldMetaData() { Name = "Float", DataSetFieldId = new Uuid(Guid.NewGuid()), BuiltInType = (byte)DataTypes.Float, DataType = DataTypeIds.Float, ValueRank = ValueRanks.Scalar }, new FieldMetaData() { Name = "Double", DataSetFieldId = new Uuid(Guid.NewGuid()), BuiltInType = (byte)DataTypes.Double, DataType = DataTypeIds.Double, ValueRank = ValueRanks.Scalar }, }; publishedDataSetAllTypes.DataSetMetaData.ConfigurationVersion = new ConfigurationVersionDataType() { MinorVersion = 1, MajorVersion = 1 }; PublishedDataItemsDataType publishedDataSetAllTypesSource = new PublishedDataItemsDataType(); //create PublishedData based on metadata names foreach (var field in publishedDataSetAllTypes.DataSetMetaData.Fields) { publishedDataSetAllTypesSource.PublishedData.Add( new PublishedVariableDataType() { PublishedVariable = new NodeId(field.Name, PublishedValuesWrites.NamespaceIndexAllTypes), AttributeId = Attributes.Value, }); } publishedDataSetAllTypes.DataSetSource = new ExtensionObject(publishedDataSetAllTypesSource); #endregion //create the PubSub configuration root object PubSubConfigurationDataType pubSubConfiguration = new PubSubConfigurationDataType(); pubSubConfiguration.Connections = new PubSubConnectionDataTypeCollection() { pubSubConnection1 }; pubSubConfiguration.PublishedDataSets = new PublishedDataSetDataTypeCollection() { publishedDataSetSimple, publishedDataSetAllTypes }; return(pubSubConfiguration); }
/// <summary> /// Creates a PubSubConfiguration object for MQTT & Json programmatically. /// </summary> /// <returns></returns> private static PubSubConfigurationDataType CreatePublisherConfiguration_MqttJson(string urlAddress) { // Define a PubSub connection with PublisherId 100 PubSubConnectionDataType pubSubConnection1 = new PubSubConnectionDataType(); pubSubConnection1.Name = "Publisher Connection3 MQTT Json"; pubSubConnection1.Enabled = true; pubSubConnection1.PublisherId = (UInt16)2; pubSubConnection1.TransportProfileUri = Profiles.PubSubMqttJsonTransport; NetworkAddressUrlDataType address = new NetworkAddressUrlDataType(); // Specify the local Network interface name to be used // e.g. address.NetworkInterface = "Ethernet"; // Leave empty to publish on all available local interfaces. address.NetworkInterface = String.Empty; address.Url = urlAddress; pubSubConnection1.Address = new ExtensionObject(address); // Configure the mqtt specific configuration with the MQTTbroker ITransportProtocolConfiguration mqttConfiguration = new MqttClientProtocolConfiguration(version: EnumMqttProtocolVersion.V500); pubSubConnection1.ConnectionProperties = mqttConfiguration.ConnectionProperties; string brokerQueueName = "Json_WriterGroup_1"; string brokerMetaData = "$Metadata"; #region Define WriterGroup1 - Json WriterGroupDataType writerGroup1 = new WriterGroupDataType(); writerGroup1.Name = "WriterGroup 1"; writerGroup1.Enabled = true; writerGroup1.WriterGroupId = 1; writerGroup1.PublishingInterval = 5000; writerGroup1.KeepAliveTime = 5000; writerGroup1.MaxNetworkMessageSize = 1500; JsonWriterGroupMessageDataType jsonMessageSettings = new JsonWriterGroupMessageDataType() { NetworkMessageContentMask = (uint)(JsonNetworkMessageContentMask.NetworkMessageHeader | JsonNetworkMessageContentMask.DataSetMessageHeader | JsonNetworkMessageContentMask.PublisherId | JsonNetworkMessageContentMask.DataSetClassId | JsonNetworkMessageContentMask.ReplyTo) }; writerGroup1.MessageSettings = new ExtensionObject(jsonMessageSettings); writerGroup1.TransportSettings = new ExtensionObject(new BrokerWriterGroupTransportDataType() { QueueName = brokerQueueName, } ); // Define DataSetWriter 'Simple' Variant encoding DataSetWriterDataType dataSetWriter1 = new DataSetWriterDataType(); dataSetWriter1.Name = "Writer Variant Encoding"; dataSetWriter1.DataSetWriterId = 1; dataSetWriter1.Enabled = true; dataSetWriter1.DataSetFieldContentMask = 0;// Variant encoding; dataSetWriter1.DataSetName = "Simple"; dataSetWriter1.KeyFrameCount = 1; JsonDataSetWriterMessageDataType jsonDataSetWriterMessage = new JsonDataSetWriterMessageDataType() { DataSetMessageContentMask = (uint)(JsonDataSetMessageContentMask.DataSetWriterId | JsonDataSetMessageContentMask.MetaDataVersion | JsonDataSetMessageContentMask.SequenceNumber | JsonDataSetMessageContentMask.Status | JsonDataSetMessageContentMask.Timestamp), }; dataSetWriter1.MessageSettings = new ExtensionObject(jsonDataSetWriterMessage); BrokerDataSetWriterTransportDataType jsonDataSetWriterTransport = new BrokerDataSetWriterTransportDataType() { QueueName = brokerQueueName, MetaDataQueueName = $"{brokerQueueName}/{brokerMetaData}", MetaDataUpdateTime = 10000 }; dataSetWriter1.TransportSettings = new ExtensionObject(jsonDataSetWriterTransport); writerGroup1.DataSetWriters.Add(dataSetWriter1); // Define DataSetWriter 'Simple' - Variant encoding DataSetWriterDataType dataSetWriter2 = new DataSetWriterDataType(); dataSetWriter2.Name = "Writer RawData Encoding"; dataSetWriter2.DataSetWriterId = 2; dataSetWriter2.Enabled = true; dataSetWriter2.DataSetFieldContentMask = (uint)DataSetFieldContentMask.RawData; dataSetWriter2.DataSetName = "AllTypes"; dataSetWriter2.KeyFrameCount = 1; jsonDataSetWriterMessage = new JsonDataSetWriterMessageDataType() { DataSetMessageContentMask = (uint)(JsonDataSetMessageContentMask.DataSetWriterId | JsonDataSetMessageContentMask.SequenceNumber | JsonDataSetMessageContentMask.Status | JsonDataSetMessageContentMask.Timestamp), }; dataSetWriter2.MessageSettings = new ExtensionObject(jsonDataSetWriterMessage); dataSetWriter2.TransportSettings = new ExtensionObject(jsonDataSetWriterTransport); writerGroup1.DataSetWriters.Add(dataSetWriter2); pubSubConnection1.WriterGroups.Add(writerGroup1); #endregion // Define PublishedDataSet Simple PublishedDataSetDataType publishedDataSetSimple = CreatePublishedDataSetSimple(); // Define PublishedDataSet AllTypes PublishedDataSetDataType publishedDataSetAllTypes = CreatePublishedDataSetAllTypes(); //create the PubSub configuration root object PubSubConfigurationDataType pubSubConfiguration = new PubSubConfigurationDataType(); pubSubConfiguration.Connections = new PubSubConnectionDataTypeCollection() { pubSubConnection1 }; pubSubConfiguration.PublishedDataSets = new PublishedDataSetDataTypeCollection() { publishedDataSetSimple, publishedDataSetAllTypes }; return(pubSubConfiguration); }
/// <summary> /// Creates a PubSubConfiguration object for UDP & UADP programmatically. /// </summary> /// <returns></returns> private static PubSubConfigurationDataType CreatePublisherConfiguration_UdpUadp(string urlAddress) { // Define a PubSub connection with PublisherId 1 PubSubConnectionDataType pubSubConnection1 = new PubSubConnectionDataType(); pubSubConnection1.Name = "Publisher Connection1 UDP UADP"; pubSubConnection1.Enabled = true; pubSubConnection1.PublisherId = (UInt16)1; pubSubConnection1.TransportProfileUri = Profiles.PubSubUdpUadpTransport; NetworkAddressUrlDataType address = new NetworkAddressUrlDataType(); // Specify the local Network interface name to be used // e.g. address.NetworkInterface = "Ethernet"; // Leave empty to publish on all available local interfaces. address.NetworkInterface = String.Empty; address.Url = urlAddress; pubSubConnection1.Address = new ExtensionObject(address); #region Define WriterGroup1 WriterGroupDataType writerGroup1 = new WriterGroupDataType(); writerGroup1.Name = "WriterGroup 1"; writerGroup1.Enabled = true; writerGroup1.WriterGroupId = 1; writerGroup1.PublishingInterval = 5000; writerGroup1.KeepAliveTime = 5000; writerGroup1.MaxNetworkMessageSize = 1500; writerGroup1.HeaderLayoutUri = "UADP-Cyclic-Fixed"; UadpWriterGroupMessageDataType uadpMessageSettings = new UadpWriterGroupMessageDataType() { DataSetOrdering = DataSetOrderingType.AscendingWriterId, GroupVersion = 0, NetworkMessageContentMask = (uint)(UadpNetworkMessageContentMask.PublisherId | UadpNetworkMessageContentMask.GroupHeader | UadpNetworkMessageContentMask.WriterGroupId | UadpNetworkMessageContentMask.GroupVersion | UadpNetworkMessageContentMask.NetworkMessageNumber | UadpNetworkMessageContentMask.SequenceNumber) }; writerGroup1.MessageSettings = new ExtensionObject(uadpMessageSettings); // initialize Datagram (UDP) Transport Settings writerGroup1.TransportSettings = new ExtensionObject(new DatagramWriterGroupTransportDataType()); // Define DataSetWriter 'Simple' DataSetWriterDataType dataSetWriter1 = new DataSetWriterDataType(); dataSetWriter1.Name = "Writer 1"; dataSetWriter1.DataSetWriterId = 1; dataSetWriter1.Enabled = true; dataSetWriter1.DataSetFieldContentMask = (uint)DataSetFieldContentMask.RawData; dataSetWriter1.DataSetName = "Simple"; dataSetWriter1.KeyFrameCount = 1; UadpDataSetWriterMessageDataType uadpDataSetWriterMessage = new UadpDataSetWriterMessageDataType() { ConfiguredSize = 32, DataSetOffset = 15, NetworkMessageNumber = 1, DataSetMessageContentMask = (uint)(UadpDataSetMessageContentMask.Status | UadpDataSetMessageContentMask.SequenceNumber), }; dataSetWriter1.MessageSettings = new ExtensionObject(uadpDataSetWriterMessage); writerGroup1.DataSetWriters.Add(dataSetWriter1); // Define DataSetWriter 'AllTypes' DataSetWriterDataType dataSetWriter2 = new DataSetWriterDataType(); dataSetWriter2.Name = "Writer 2"; dataSetWriter2.DataSetWriterId = 2; dataSetWriter2.Enabled = true; dataSetWriter2.DataSetFieldContentMask = (uint)DataSetFieldContentMask.RawData; dataSetWriter2.DataSetName = "AllTypes"; dataSetWriter2.KeyFrameCount = 1; uadpDataSetWriterMessage = new UadpDataSetWriterMessageDataType() { ConfiguredSize = 32, DataSetOffset = 47, NetworkMessageNumber = 1, DataSetMessageContentMask = (uint)(UadpDataSetMessageContentMask.Status | UadpDataSetMessageContentMask.SequenceNumber), }; dataSetWriter2.MessageSettings = new ExtensionObject(uadpDataSetWriterMessage); writerGroup1.DataSetWriters.Add(dataSetWriter2); pubSubConnection1.WriterGroups.Add(writerGroup1); #endregion // Define PublishedDataSet Simple PublishedDataSetDataType publishedDataSetSimple = CreatePublishedDataSetSimple(); // Define PublishedDataSet AllTypes PublishedDataSetDataType publishedDataSetAllTypes = CreatePublishedDataSetAllTypes(); //create the PubSub configuration root object PubSubConfigurationDataType pubSubConfiguration = new PubSubConfigurationDataType(); pubSubConfiguration.Connections = new PubSubConnectionDataTypeCollection() { pubSubConnection1 }; pubSubConfiguration.PublishedDataSets = new PublishedDataSetDataTypeCollection() { publishedDataSetSimple, publishedDataSetAllTypes }; return(pubSubConfiguration); }