/// <summary> /// Create new instance of <see cref="UdpPubSubConnection"/> from <see cref="PubSubConnectionDataType"/> configuration data /// </summary> public UdpPubSubConnection(UaPubSubApplication uaPubSubApplication, PubSubConnectionDataType pubSubConnectionDataType) : base(uaPubSubApplication, pubSubConnectionDataType) { m_transportProtocol = TransportProtocol.UADP; Utils.Trace("UdpPubSubConnection with name '{0}' was created.", pubSubConnectionDataType.Name); }
/// <summary> /// Initialize Connection properties from connection configuration object /// </summary> private void Initialize() { PubSubConnectionDataType pubSubConnectionConfiguration = m_udpConnection.PubSubConnectionConfiguration; DatagramConnectionTransportDataType transportSettings = ExtensionObject.ToEncodeable(pubSubConnectionConfiguration.TransportSettings) as DatagramConnectionTransportDataType; if (transportSettings != null && transportSettings.DiscoveryAddress != null) { NetworkAddressUrlDataType discoveryNetworkAddressUrlState = ExtensionObject.ToEncodeable(transportSettings.DiscoveryAddress) as NetworkAddressUrlDataType; if (discoveryNetworkAddressUrlState != null) { Utils.Trace(Utils.TraceMasks.Information, "The configuration for connection {0} has custom DiscoveryAddress configuration.", pubSubConnectionConfiguration.Name); DiscoveryNetworkInterfaceName = discoveryNetworkAddressUrlState.NetworkInterface; DiscoveryNetworkAddressEndPoint = UdpClientCreator.GetEndPoint(discoveryNetworkAddressUrlState.Url); } } if (DiscoveryNetworkAddressEndPoint == null) { Utils.Trace(Utils.TraceMasks.Information, "The configuration for connection {0} will use the default DiscoveryAddress: {1}.", pubSubConnectionConfiguration.Name, kDefaultDiscoveryUrl); DiscoveryNetworkAddressEndPoint = UdpClientCreator.GetEndPoint(kDefaultDiscoveryUrl); } }
/// <summary> /// Create new instance of UaPubSubConnection with PubSubConnectionDataType configuration data /// </summary> internal UaPubSubConnection(UaPubSubApplication parentUaPubSubApplication, PubSubConnectionDataType pubSubConnectionDataType) { // set the default message context that uses the GlobalContext MessageContext = new ServiceMessageContext { NamespaceUris = ServiceMessageContext.GlobalContext.NamespaceUris, ServerUris = ServiceMessageContext.GlobalContext.ServerUris }; if (parentUaPubSubApplication == null) { throw new ArgumentNullException(nameof(parentUaPubSubApplication)); } m_uaPubSubApplication = parentUaPubSubApplication; m_uaPubSubApplication.UaPubSubConfigurator.WriterGroupAdded += UaPubSubConfigurator_WriterGroupAdded; m_pubSubConnectionDataType = pubSubConnectionDataType; m_publishers = new List <IUaPublisher>(); if (string.IsNullOrEmpty(pubSubConnectionDataType.Name)) { pubSubConnectionDataType.Name = "<connection>"; Utils.Trace("UaPubSubConnection() received a PubSubConnectionDataType object without name. '<connection>' will be used"); } }
public void ValidateOperational_2ToDisabled_0_Reader() { UaPubSubApplication uaPubSubApplication = UaPubSubApplication.Create(SubscriberConfigurationFileName); UaPubSubConfigurator configurator = uaPubSubApplication.UaPubSubConfigurator; // The hierarchy PubSub -> PubSubConnection -> PubSubReaderGroup -> DataSetReader brought to [Disabled, Disabled, Disabled, Disabled] PubSubConfigurationDataType pubSub = uaPubSubApplication.UaPubSubConfigurator.PubSubConfiguration; PubSubConnectionDataType subscriberConnection = uaPubSubApplication.UaPubSubConfigurator.PubSubConfiguration.Connections[0]; ReaderGroupDataType readerGroup = subscriberConnection.ReaderGroups[0]; DataSetReaderDataType datasetReader = readerGroup.DataSetReaders[0]; configurator.Disable(pubSub); configurator.Disable(subscriberConnection); configurator.Disable(readerGroup); configurator.Disable(datasetReader); PubSubState psState = uaPubSubApplication.UaPubSubConfigurator.FindStateForObject(pubSub); PubSubState conState = uaPubSubApplication.UaPubSubConfigurator.FindStateForObject(subscriberConnection); PubSubState rgState = uaPubSubApplication.UaPubSubConfigurator.FindStateForObject(readerGroup); PubSubState dsrState = uaPubSubApplication.UaPubSubConfigurator.FindStateForObject(datasetReader); Assert.That(psState == PubSubState.Disabled, Is.True); Assert.That(conState == PubSubState.Disabled, Is.True); Assert.That(rgState == PubSubState.Disabled, Is.True); Assert.That(dsrState == PubSubState.Disabled, Is.True); // The hierarchy PubSub -> PubSubConnection -> PubSubReaderGroup -> DataSetReader brought to [Operational, Operational, Operational, Operational] configurator.Enable(pubSub); configurator.Enable(subscriberConnection); configurator.Enable(readerGroup); configurator.Enable(datasetReader); psState = uaPubSubApplication.UaPubSubConfigurator.FindStateForObject(pubSub); conState = uaPubSubApplication.UaPubSubConfigurator.FindStateForObject(subscriberConnection); rgState = uaPubSubApplication.UaPubSubConfigurator.FindStateForObject(readerGroup); dsrState = uaPubSubApplication.UaPubSubConfigurator.FindStateForObject(datasetReader); Assert.That(psState == PubSubState.Operational, Is.True); Assert.That(conState == PubSubState.Operational, Is.True); Assert.That(rgState == PubSubState.Operational, Is.True); Assert.That(dsrState == PubSubState.Operational, Is.True); // The hierarchy PubSub -> PubSubConnection -> PubSubReaderGroup -> DataSetReader brought to [Disabled, Disabled, Disabled, Disabled] configurator.Disable(pubSub); configurator.Disable(subscriberConnection); configurator.Disable(readerGroup); configurator.Disable(datasetReader); psState = uaPubSubApplication.UaPubSubConfigurator.FindStateForObject(pubSub); conState = uaPubSubApplication.UaPubSubConfigurator.FindStateForObject(subscriberConnection); rgState = uaPubSubApplication.UaPubSubConfigurator.FindStateForObject(readerGroup); dsrState = uaPubSubApplication.UaPubSubConfigurator.FindStateForObject(datasetReader); Assert.That(psState == PubSubState.Disabled, Is.True); Assert.That(conState == PubSubState.Disabled, Is.True); Assert.That(rgState == PubSubState.Disabled, Is.True); Assert.That(dsrState == PubSubState.Disabled, Is.True); }
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); }
/// <summary> /// Handler for <see cref="UaPubSubConfigurator.WriterGroupAdded"/> event. /// </summary> private void UaPubSubConfigurator_WriterGroupAdded(object sender, WriterGroupEventArgs e) { PubSubConnectionDataType pubSubConnectionDataType = m_uaPubSubApplication.UaPubSubConfigurator.FindObjectById(e.ConnectionId) as PubSubConnectionDataType; if (m_pubSubConnectionDataType == pubSubConnectionDataType) { UaPublisher publisher = new UaPublisher(this, e.WriterGroupDataType); m_publishers.Add(publisher); } }
/// <summary> /// Create new instance of UaPubSubConnection with PubSubConnectionDataType configuration data /// </summary> /// <param name="parentUaPubSubApplication"></param> /// <param name="pubSubConnectionDataType"></param> public UaPubSubConnection(UaPubSubApplication parentUaPubSubApplication, PubSubConnectionDataType pubSubConnectionDataType) { m_uaPubSubApplication = parentUaPubSubApplication; m_uaPubSubApplication.UaPubSubConfigurator.WriterGroupAdded += UaPubSubConfigurator_WriterGroupAdded; m_pubSubConnectionDataType = pubSubConnectionDataType; m_publishers = new List <IUaPublisher>(); if (string.IsNullOrEmpty(pubSubConnectionDataType.Name)) { pubSubConnectionDataType.Name = "<connection>"; } }
public void ValidateUadpPubSubConnectionPubSubConnectionConfiguration() { //Assert Assert.IsNotNull(m_uadpPublisherConnection, "The UADP connection from standard configuration is invalid."); PubSubConnectionDataType connectionConfiguration = m_uadpPublisherConnection.PubSubConnectionConfiguration; PubSubConnectionDataType originalConnectionConfiguration = m_publisherConfiguration.Connections[0]; Assert.IsNotNull(connectionConfiguration, "The UADP connection configuration from UADP connection object is invalid."); Assert.AreEqual(originalConnectionConfiguration.Name, connectionConfiguration.Name, "The connection configuration Name is invalid."); Assert.AreEqual(originalConnectionConfiguration.PublisherId, connectionConfiguration.PublisherId, "The connection configuration PublisherId is invalid."); Assert.AreEqual(originalConnectionConfiguration.Address, connectionConfiguration.Address, "The connection configuration Address is invalid."); Assert.AreEqual(originalConnectionConfiguration.Enabled, connectionConfiguration.Enabled, "The connection configuration Enabled is invalid."); Assert.AreEqual(originalConnectionConfiguration.TransportProfileUri, connectionConfiguration.TransportProfileUri, "The connection configuration TransportProfileUri is invalid."); }
/// <summary> /// Create new instance of UaPubSubConnection with PubSubConnectionDataType configuration data /// </summary> public UaPubSubConnection(UaPubSubApplication parentUaPubSubApplication, PubSubConnectionDataType pubSubConnectionDataType) { if (parentUaPubSubApplication == null) { throw new ArgumentNullException(nameof(parentUaPubSubApplication)); } m_uaPubSubApplication = parentUaPubSubApplication; m_uaPubSubApplication.UaPubSubConfigurator.WriterGroupAdded += UaPubSubConfigurator_WriterGroupAdded; m_pubSubConnectionDataType = pubSubConnectionDataType; m_publishers = new List<IUaPublisher>(); if (string.IsNullOrEmpty(pubSubConnectionDataType.Name)) { pubSubConnectionDataType.Name = "<connection>"; Utils.Trace("UaPubSubConnection() received a PubSubConnectionDataType object without name. '<connection>' will be used"); } }
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> /// Create new instance of <see cref="UadpPubSubConnection"/> from <see cref="PubSubConnectionDataType"/> configuration data /// </summary> /// <param name="uaPubSubApplication"></param> /// <param name="pubSubConnectionDataType"></param> public UadpPubSubConnection(UaPubSubApplication uaPubSubApplication, PubSubConnectionDataType pubSubConnectionDataType) : base(uaPubSubApplication, pubSubConnectionDataType) { m_transportProtocol = TransportProtocol.UADP; }
/// <summary> /// Create connections from PubSubConnectionDataType configuration objects. /// </summary> /// <param name="uaPubSubApplication">The parent <see cref="UaPubSubApplication"/></param> /// <param name="pubSubConnectionDataType">The configuration object for the new <see cref="UaPubSubConnection"/></param> /// <returns>The new instance of <see cref="UaPubSubConnection"/>.</returns> public static UaPubSubConnection CreateConnection(UaPubSubApplication uaPubSubApplication, PubSubConnectionDataType pubSubConnectionDataType) { if (pubSubConnectionDataType.TransportProfileUri == Profiles.PubSubUdpUadpTransport) { return(new UdpPubSubConnection(uaPubSubApplication, pubSubConnectionDataType)); } else if (pubSubConnectionDataType.TransportProfileUri == Profiles.PubSubMqttUadpTransport) { return(new MqttPubSubConnection(uaPubSubApplication, pubSubConnectionDataType, MessageMapping.Uadp)); } else if (pubSubConnectionDataType.TransportProfileUri == Profiles.PubSubMqttJsonTransport) { return(new MqttPubSubConnection(uaPubSubApplication, pubSubConnectionDataType, MessageMapping.Json)); } throw new ArgumentException("Invalid TransportProfileUri.", nameof(pubSubConnectionDataType)); }
public void ValidateMqttLocalPubSubConnectionWithUadp( [Values((byte)1, (UInt16)1, (UInt32)1, (UInt64)1, "abc")] object publisherId) { RestartMosquitto("mosquitto"); //Arrange UInt16 writerGroupId = 1; string mqttLocalBrokerUrl = "mqtt://localhost:1883"; ITransportProtocolConfiguration mqttConfiguration = new MqttClientProtocolConfiguration(version: EnumMqttProtocolVersion.V500); UadpNetworkMessageContentMask uadpNetworkMessageContentMask = UadpNetworkMessageContentMask.PublisherId | UadpNetworkMessageContentMask.WriterGroupId | UadpNetworkMessageContentMask.PayloadHeader; UadpDataSetMessageContentMask uadpDataSetMessageContentMask = UadpDataSetMessageContentMask.None; DataSetFieldContentMask dataSetFieldContentMask = DataSetFieldContentMask.None; DataSetMetaDataType[] dataSetMetaDataArray = new DataSetMetaDataType[] { MessagesHelper.CreateDataSetMetaData1("DataSet1"), MessagesHelper.CreateDataSetMetaData2("DataSet2"), MessagesHelper.CreateDataSetMetaData3("DataSet3") }; PubSubConfigurationDataType publisherConfiguration = MessagesHelper.CreatePublisherConfiguration( Profiles.PubSubMqttUadpTransport, mqttLocalBrokerUrl, publisherId: publisherId, writerGroupId: writerGroupId, uadpNetworkMessageContentMask: uadpNetworkMessageContentMask, uadpDataSetMessageContentMask: uadpDataSetMessageContentMask, dataSetFieldContentMask: dataSetFieldContentMask, dataSetMetaDataArray: dataSetMetaDataArray, nameSpaceIndexForData: kNamespaceIndexAllTypes); Assert.IsNotNull(publisherConfiguration, "publisherConfiguration should not be null"); // Configure the mqtt publisher configuration with the MQTTbroker PubSubConnectionDataType mqttPublisherConnection = MessagesHelper.GetConnection(publisherConfiguration, publisherId); Assert.IsNotNull(mqttPublisherConnection, "The MQTT publisher connection is invalid."); mqttPublisherConnection.ConnectionProperties = mqttConfiguration.ConnectionProperties; Assert.IsNotNull(mqttPublisherConnection.ConnectionProperties, "The MQTT publisher connection properties are not valid."); // Create publisher application for multiple datasets UaPubSubApplication publisherApplication = UaPubSubApplication.Create(publisherConfiguration); MessagesHelper.LoadData(publisherApplication, kNamespaceIndexAllTypes); IUaPubSubConnection publisherConnection = publisherApplication.PubSubConnections.First(); Assert.IsNotNull(publisherConnection, "Publisher first connection should not be null"); Assert.IsNotNull(publisherConfiguration.Connections.First(), "publisherConfiguration first connection should not be null"); Assert.IsNotNull(publisherConfiguration.Connections.First().WriterGroups.First(), "publisherConfiguration first writer group of first connection should not be null"); var networkMessages = publisherConnection.CreateNetworkMessages(publisherConfiguration.Connections.First().WriterGroups.First(), new WriterGroupPublishState()); Assert.IsNotNull(networkMessages, "connection.CreateNetworkMessages shall not return null"); Assert.GreaterOrEqual(networkMessages.Count, 1, "connection.CreateNetworkMessages shall have at least one network message"); UadpNetworkMessage uaNetworkMessage = networkMessages[0] as UadpNetworkMessage; Assert.IsNotNull(uaNetworkMessage, "networkMessageEncode should not be null"); bool hasDataSetWriterId = (uadpNetworkMessageContentMask & UadpNetworkMessageContentMask.PayloadHeader) != 0; PubSubConfigurationDataType subscriberConfiguration = MessagesHelper.CreateSubscriberConfiguration( Profiles.PubSubMqttUadpTransport, mqttLocalBrokerUrl, publisherId: publisherId, writerGroupId: writerGroupId, setDataSetWriterId: hasDataSetWriterId, uadpNetworkMessageContentMask: uadpNetworkMessageContentMask, uadpDataSetMessageContentMask: uadpDataSetMessageContentMask, dataSetFieldContentMask: dataSetFieldContentMask, dataSetMetaDataArray: dataSetMetaDataArray, nameSpaceIndexForData: kNamespaceIndexAllTypes); Assert.IsNotNull(subscriberConfiguration, "subscriberConfiguration should not be null"); // Create subscriber application for multiple datasets UaPubSubApplication subscriberApplication = UaPubSubApplication.Create(subscriberConfiguration); Assert.IsNotNull(subscriberApplication, "subscriberApplication should not be null"); Assert.IsNotNull(subscriberApplication.PubSubConnections.First(), "subscriberConfiguration first connection should not be null"); // Configure the mqtt subscriber configuration with the MQTTbroker PubSubConnectionDataType mqttSubcriberConnection = MessagesHelper.GetConnection(subscriberConfiguration, publisherId); Assert.IsNotNull(mqttSubcriberConnection, "The MQTT subscriber connection is invalid."); mqttSubcriberConnection.ConnectionProperties = mqttConfiguration.ConnectionProperties; Assert.IsNotNull(mqttSubcriberConnection.ConnectionProperties, "The MQTT subscriber connection properties are not valid."); var dataSetReaders = subscriberApplication.PubSubConnections.First().GetOperationalDataSetReaders(); Assert.IsNotNull(dataSetReaders, "dataSetReaders should not be null"); IUaPubSubConnection subscriberConnection = subscriberApplication.PubSubConnections.First(); Assert.IsNotNull(subscriberConnection, "Subscriber first connection should not be null"); //Act // it will signal if the uadp message was received from local ip m_uaDataShutdownEvent = new ManualResetEvent(false); subscriberApplication.DataReceived += UaPubSubApplication_DataReceived; subscriberConnection.Start(); publisherConnection.Start(); //Assert if (!m_uaDataShutdownEvent.WaitOne(kEstimatedPublishingTime)) { Assert.Fail("The UADP message was not received"); } subscriberConnection.Stop(); publisherConnection.Stop(); }
/// <summary> /// Create connections from PubSubConnectionDataType configuration objects. /// </summary> /// <param name="uaPubSubApplication"></param> /// <param name="pubSubConnectionDataType"></param> /// <returns></returns> public static UaPubSubConnection CreateConnection(UaPubSubApplication uaPubSubApplication, PubSubConnectionDataType pubSubConnectionDataType) { if (pubSubConnectionDataType.TransportProfileUri == Profiles.UadpTransport) { return(new UadpPubSubConnection(uaPubSubApplication, pubSubConnectionDataType)); } throw new ArgumentException("Invalid TransportProfileUri.", "pubSubConnectionDataType"); }
/// <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); }
/// <summary> /// Creates a Subscriber PubSubConfiguration object for UDP & UADP programmatically. /// </summary> /// <returns></returns> private static PubSubConfigurationDataType CreateSubscriberConfiguration_UdpUadp(string urlAddress) { // Define a PubSub connection with PublisherId 1 PubSubConnectionDataType pubSubConnection1 = new PubSubConnectionDataType(); pubSubConnection1.Name = "Subscriber Connection 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 subscribe on all available local interfaces. address.NetworkInterface = String.Empty; address.Url = urlAddress; pubSubConnection1.Address = new ExtensionObject(address); // configure custoom DicoveryAddress for Dicovery messages pubSubConnection1.TransportSettings = new ExtensionObject() { Body = new DatagramConnectionTransportDataType() { DiscoveryAddress = new ExtensionObject() { Body = new NetworkAddressUrlDataType() { Url = "opc.udp://224.0.2.15:4840" } } } }; #region Define ReaderGroup1 ReaderGroupDataType readerGroup1 = new ReaderGroupDataType(); readerGroup1.Name = "ReaderGroup 1"; readerGroup1.Enabled = true; readerGroup1.MaxNetworkMessageSize = 1500; readerGroup1.MessageSettings = new ExtensionObject(new ReaderGroupMessageDataType()); readerGroup1.TransportSettings = new ExtensionObject(new ReaderGroupTransportDataType()); #region Define DataSetReader 'Simple' for PublisherId = (UInt16)1, DataSetWriterId = 1 DataSetReaderDataType dataSetReaderSimple = new DataSetReaderDataType(); dataSetReaderSimple.Name = "Reader 1 UDP UADP"; dataSetReaderSimple.PublisherId = (UInt16)1; dataSetReaderSimple.WriterGroupId = 0; dataSetReaderSimple.DataSetWriterId = 1; dataSetReaderSimple.Enabled = true; dataSetReaderSimple.DataSetFieldContentMask = (uint)DataSetFieldContentMask.RawData; dataSetReaderSimple.KeyFrameCount = 1; dataSetReaderSimple.TransportSettings = new ExtensionObject(new DataSetReaderTransportDataType()); UadpDataSetReaderMessageDataType uadpDataSetReaderMessage = new UadpDataSetReaderMessageDataType() { GroupVersion = 0, NetworkMessageNumber = 0, NetworkMessageContentMask = (uint)(uint)(UadpNetworkMessageContentMask.PublisherId | UadpNetworkMessageContentMask.GroupHeader | UadpNetworkMessageContentMask.WriterGroupId | UadpNetworkMessageContentMask.GroupVersion | UadpNetworkMessageContentMask.NetworkMessageNumber | UadpNetworkMessageContentMask.SequenceNumber), DataSetMessageContentMask = (uint)(UadpDataSetMessageContentMask.Status | UadpDataSetMessageContentMask.SequenceNumber), }; dataSetReaderSimple.MessageSettings = new ExtensionObject(uadpDataSetReaderMessage); // Create and set DataSetMetaData for DataSet Simple DataSetMetaDataType simpleMetaData = CreateDataSetMetaDataSimple(); dataSetReaderSimple.DataSetMetaData = simpleMetaData; // Create and set SubscribedDataSet TargetVariablesDataType subscribedDataSet = new TargetVariablesDataType(); subscribedDataSet.TargetVariables = new FieldTargetDataTypeCollection(); foreach (var fieldMetaData in simpleMetaData.Fields) { subscribedDataSet.TargetVariables.Add(new FieldTargetDataType() { DataSetFieldId = fieldMetaData.DataSetFieldId, TargetNodeId = new NodeId(fieldMetaData.Name, NamespaceIndexSimple), AttributeId = Attributes.Value, OverrideValueHandling = OverrideValueHandling.OverrideValue, OverrideValue = new Variant(TypeInfo.GetDefaultValue(fieldMetaData.DataType, (int)ValueRanks.Scalar)) }); } dataSetReaderSimple.SubscribedDataSet = new ExtensionObject(subscribedDataSet); #endregion readerGroup1.DataSetReaders.Add(dataSetReaderSimple); #region Define DataSetReader 'AllTypes' for PublisherId = (UInt16)1, DataSetWriterId = 2 DataSetReaderDataType dataSetReaderAllTypes = new DataSetReaderDataType(); dataSetReaderAllTypes.Name = "Reader 2 UDP UADP"; dataSetReaderAllTypes.PublisherId = (UInt16)1; dataSetReaderAllTypes.WriterGroupId = 0; dataSetReaderAllTypes.DataSetWriterId = 2; dataSetReaderAllTypes.Enabled = true; dataSetReaderAllTypes.DataSetFieldContentMask = (uint)DataSetFieldContentMask.RawData; dataSetReaderAllTypes.KeyFrameCount = 1; dataSetReaderAllTypes.TransportSettings = new ExtensionObject(new DataSetReaderTransportDataType()); uadpDataSetReaderMessage = new UadpDataSetReaderMessageDataType() { GroupVersion = 0, NetworkMessageNumber = 0, NetworkMessageContentMask = (uint)(uint)(UadpNetworkMessageContentMask.PublisherId | UadpNetworkMessageContentMask.GroupHeader | UadpNetworkMessageContentMask.WriterGroupId | UadpNetworkMessageContentMask.GroupVersion | UadpNetworkMessageContentMask.NetworkMessageNumber | UadpNetworkMessageContentMask.SequenceNumber), DataSetMessageContentMask = (uint)(UadpDataSetMessageContentMask.Status | UadpDataSetMessageContentMask.SequenceNumber), }; dataSetReaderAllTypes.MessageSettings = new ExtensionObject(uadpDataSetReaderMessage); // Create and set DataSetMetaData for DataSet AllTypes DataSetMetaDataType allTypesMetaData = CreateDataSetMetaDataAllTypes(); dataSetReaderAllTypes.DataSetMetaData = allTypesMetaData; // Create and set SubscribedDataSet subscribedDataSet = new TargetVariablesDataType(); subscribedDataSet.TargetVariables = new FieldTargetDataTypeCollection(); foreach (var fieldMetaData in allTypesMetaData.Fields) { subscribedDataSet.TargetVariables.Add(new FieldTargetDataType() { DataSetFieldId = fieldMetaData.DataSetFieldId, TargetNodeId = new NodeId(fieldMetaData.Name, NamespaceIndexAllTypes), AttributeId = Attributes.Value, OverrideValueHandling = OverrideValueHandling.OverrideValue, OverrideValue = new Variant(TypeInfo.GetDefaultValue(fieldMetaData.DataType, (int)ValueRanks.Scalar)) }); } dataSetReaderAllTypes.SubscribedDataSet = new ExtensionObject(subscribedDataSet); #endregion readerGroup1.DataSetReaders.Add(dataSetReaderAllTypes); #endregion pubSubConnection1.ReaderGroups.Add(readerGroup1); //create pub sub configuration root object PubSubConfigurationDataType pubSubConfiguration = new PubSubConfigurationDataType(); pubSubConfiguration.Connections = new PubSubConnectionDataTypeCollection() { pubSubConnection1 }; return(pubSubConfiguration); }
/// <summary> /// Creates a Subscriber PubSubConfiguration object for MQTT & Json programmatically. /// </summary> /// <returns></returns> private static PubSubConfigurationDataType CreateSubscriberConfiguration_MqttJson(string urlAddress) { // Define a PubSub connection with PublisherId 2 PubSubConnectionDataType pubSubConnection1 = new PubSubConnectionDataType(); pubSubConnection1.Name = "Subscriber 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 subscribe 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; // Define "Simple" MetaData DataSetMetaDataType simpleMetaData = CreateDataSetMetaDataSimple(); // Define "AllTypes" Metadata DataSetMetaDataType allTypesMetaData = CreateDataSetMetaDataAllTypes(); #region Define ReaderGroup1 ReaderGroupDataType readerGroup1 = new ReaderGroupDataType(); readerGroup1.Name = "ReaderGroup 1"; readerGroup1.Enabled = true; readerGroup1.MaxNetworkMessageSize = 1500; readerGroup1.MessageSettings = new ExtensionObject(new ReaderGroupMessageDataType()); readerGroup1.TransportSettings = new ExtensionObject(new ReaderGroupTransportDataType()); #region Define DataSetReader1 'Simple' for PublisherId = (UInt16)3, DataSetWriterId = 1 DataSetReaderDataType dataSetReaderSimple = new DataSetReaderDataType(); dataSetReaderSimple.Name = "Reader 1 MQTT JSON Variant Encoding"; dataSetReaderSimple.PublisherId = (UInt16)2; dataSetReaderSimple.WriterGroupId = 1; dataSetReaderSimple.DataSetWriterId = 1; dataSetReaderSimple.Enabled = true; dataSetReaderSimple.DataSetFieldContentMask = 0;// Variant encoding; dataSetReaderSimple.KeyFrameCount = 1; dataSetReaderSimple.DataSetMetaData = simpleMetaData; BrokerDataSetReaderTransportDataType brokerTransportSettings = new BrokerDataSetReaderTransportDataType() { QueueName = "Json_WriterGroup_1", }; dataSetReaderSimple.TransportSettings = new ExtensionObject(brokerTransportSettings); JsonDataSetReaderMessageDataType jsonDataSetReaderMessage = new JsonDataSetReaderMessageDataType() { NetworkMessageContentMask = (uint)(uint)(JsonNetworkMessageContentMask.NetworkMessageHeader | JsonNetworkMessageContentMask.DataSetMessageHeader | JsonNetworkMessageContentMask.PublisherId | JsonNetworkMessageContentMask.DataSetClassId | JsonNetworkMessageContentMask.ReplyTo), DataSetMessageContentMask = (uint)(JsonDataSetMessageContentMask.DataSetWriterId | JsonDataSetMessageContentMask.MetaDataVersion | JsonDataSetMessageContentMask.SequenceNumber | JsonDataSetMessageContentMask.Status | JsonDataSetMessageContentMask.Timestamp), }; dataSetReaderSimple.MessageSettings = new ExtensionObject(jsonDataSetReaderMessage); TargetVariablesDataType subscribedDataSet = new TargetVariablesDataType(); subscribedDataSet.TargetVariables = new FieldTargetDataTypeCollection(); foreach (var fieldMetaData in simpleMetaData.Fields) { subscribedDataSet.TargetVariables.Add(new FieldTargetDataType() { DataSetFieldId = fieldMetaData.DataSetFieldId, TargetNodeId = new NodeId(fieldMetaData.Name, NamespaceIndexSimple), AttributeId = Attributes.Value, OverrideValueHandling = OverrideValueHandling.OverrideValue, OverrideValue = new Variant(TypeInfo.GetDefaultValue(fieldMetaData.DataType, (int)ValueRanks.Scalar)) }); } dataSetReaderSimple.SubscribedDataSet = new ExtensionObject(subscribedDataSet); #endregion readerGroup1.DataSetReaders.Add(dataSetReaderSimple); #region Define DataSetReader2 'AllTypes' for PublisherId = (UInt16)2, DataSetWriterId = 1 DataSetReaderDataType dataSetReaderAllTypes = new DataSetReaderDataType(); dataSetReaderAllTypes.Name = "Reader 2 MQTT JSON RawData Encoding"; dataSetReaderAllTypes.PublisherId = (UInt16)2; dataSetReaderAllTypes.WriterGroupId = 1; dataSetReaderAllTypes.DataSetWriterId = 2; dataSetReaderAllTypes.Enabled = true; dataSetReaderAllTypes.DataSetFieldContentMask = (uint)DataSetFieldContentMask.RawData; dataSetReaderAllTypes.KeyFrameCount = 1; dataSetReaderAllTypes.DataSetMetaData = allTypesMetaData; brokerTransportSettings = new BrokerDataSetReaderTransportDataType() { QueueName = "Json_WriterGroup_1", }; dataSetReaderAllTypes.TransportSettings = new ExtensionObject(brokerTransportSettings); jsonDataSetReaderMessage = new JsonDataSetReaderMessageDataType() { NetworkMessageContentMask = (uint)(JsonNetworkMessageContentMask.NetworkMessageHeader | JsonNetworkMessageContentMask.DataSetMessageHeader | JsonNetworkMessageContentMask.PublisherId | JsonNetworkMessageContentMask.DataSetClassId | JsonNetworkMessageContentMask.ReplyTo), DataSetMessageContentMask = (uint)(JsonDataSetMessageContentMask.DataSetWriterId | JsonDataSetMessageContentMask.MetaDataVersion | JsonDataSetMessageContentMask.SequenceNumber | JsonDataSetMessageContentMask.Status | JsonDataSetMessageContentMask.Timestamp), }; dataSetReaderAllTypes.MessageSettings = new ExtensionObject(jsonDataSetReaderMessage); subscribedDataSet = new TargetVariablesDataType(); subscribedDataSet.TargetVariables = new FieldTargetDataTypeCollection(); foreach (var fieldMetaData in allTypesMetaData.Fields) { subscribedDataSet.TargetVariables.Add(new FieldTargetDataType() { DataSetFieldId = fieldMetaData.DataSetFieldId, TargetNodeId = new NodeId(fieldMetaData.Name, NamespaceIndexSimple), AttributeId = Attributes.Value, OverrideValueHandling = OverrideValueHandling.OverrideValue, OverrideValue = new Variant(TypeInfo.GetDefaultValue(fieldMetaData.DataType, (int)ValueRanks.Scalar)) }); } dataSetReaderAllTypes.SubscribedDataSet = new ExtensionObject(subscribedDataSet); #endregion readerGroup1.DataSetReaders.Add(dataSetReaderAllTypes); #endregion pubSubConnection1.ReaderGroups.Add(readerGroup1); //create pub sub configuration root object PubSubConfigurationDataType pubSubConfiguration = new PubSubConfigurationDataType(); pubSubConfiguration.Connections = new PubSubConnectionDataTypeCollection() { pubSubConnection1 }; return(pubSubConfiguration); }
/// <summary> /// Creates a PubSubConfiguration object programmatically. /// </summary> /// <returns></returns> public static PubSubConfigurationDataType CreateSubscriberConfiguration() { // 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 subscribe 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 'Simple' MetaData DataSetMetaDataType simpleMetaData = new DataSetMetaDataType(); simpleMetaData.DataSetClassId = new Uuid(Guid.Empty); simpleMetaData.Name = "Simple"; simpleMetaData.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 }, }; simpleMetaData.ConfigurationVersion = new ConfigurationVersionDataType() { MinorVersion = 1, MajorVersion = 1 }; #endregion #region Define 'AllTypes' Metadata DataSetMetaDataType allTypesMetaData = new DataSetMetaDataType(); allTypesMetaData.DataSetClassId = new Uuid(Guid.Empty); allTypesMetaData.Name = "AllTypes"; allTypesMetaData.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 }, }; allTypesMetaData.ConfigurationVersion = new ConfigurationVersionDataType() { MinorVersion = 1, MajorVersion = 1 }; #endregion #region Define ReaderGroup1 ReaderGroupDataType readerGroup1 = new ReaderGroupDataType(); readerGroup1.Name = "ReaderGroup 1"; readerGroup1.Enabled = true; readerGroup1.MaxNetworkMessageSize = 1500; readerGroup1.MessageSettings = new ExtensionObject(new ReaderGroupMessageDataType()); readerGroup1.TransportSettings = new ExtensionObject(new ReaderGroupTransportDataType()); #region Define DataSetReader 'Simple' for PublisherId = (UInt16)100, DataSetWriterId = 1 DataSetReaderDataType dataSetReaderSimple = new DataSetReaderDataType(); dataSetReaderSimple.Name = "Reader 1"; dataSetReaderSimple.PublisherId = (UInt16)100; dataSetReaderSimple.WriterGroupId = 0; dataSetReaderSimple.DataSetWriterId = 0; dataSetReaderSimple.Enabled = true; dataSetReaderSimple.DataSetFieldContentMask = (uint)DataSetFieldContentMask.RawData; dataSetReaderSimple.KeyFrameCount = 1; dataSetReaderSimple.DataSetMetaData = simpleMetaData; UadpDataSetReaderMessageDataType uadpDataSetReaderMessage = new UadpDataSetReaderMessageDataType() { GroupVersion = 0, DataSetOffset = 15, NetworkMessageNumber = 0, NetworkMessageContentMask = (uint)(uint)(UadpNetworkMessageContentMask.PublisherId | UadpNetworkMessageContentMask.GroupHeader | UadpNetworkMessageContentMask.WriterGroupId | UadpNetworkMessageContentMask.GroupVersion | UadpNetworkMessageContentMask.NetworkMessageNumber | UadpNetworkMessageContentMask.SequenceNumber), DataSetMessageContentMask = (uint)(UadpDataSetMessageContentMask.Status | UadpDataSetMessageContentMask.SequenceNumber), }; dataSetReaderSimple.MessageSettings = new ExtensionObject(uadpDataSetReaderMessage); TargetVariablesDataType subscribedDataSet = new TargetVariablesDataType(); subscribedDataSet.TargetVariables = new FieldTargetDataTypeCollection(); foreach (var fieldMetaData in simpleMetaData.Fields) { subscribedDataSet.TargetVariables.Add(new FieldTargetDataType() { DataSetFieldId = fieldMetaData.DataSetFieldId, TargetNodeId = new NodeId(fieldMetaData.Name, NamespaceIndexSimple), AttributeId = Attributes.Value, OverrideValueHandling = OverrideValueHandling.OverrideValue, OverrideValue = new Variant(TypeInfo.GetDefaultValue(fieldMetaData.DataType, (int)ValueRanks.Scalar)) }); } dataSetReaderSimple.SubscribedDataSet = new ExtensionObject(subscribedDataSet); #endregion readerGroup1.DataSetReaders.Add(dataSetReaderSimple); #region Define DataSetReader 'AllTypes' for PublisherId = (UInt16)100, DataSetWriterId = 2 DataSetReaderDataType dataSetReaderAllTypes = new DataSetReaderDataType(); dataSetReaderAllTypes.Name = "Reader 2"; dataSetReaderAllTypes.PublisherId = (UInt16)100; dataSetReaderAllTypes.WriterGroupId = 0; dataSetReaderAllTypes.DataSetWriterId = 0; dataSetReaderAllTypes.Enabled = true; dataSetReaderAllTypes.DataSetFieldContentMask = (uint)DataSetFieldContentMask.RawData; dataSetReaderAllTypes.KeyFrameCount = 1; dataSetReaderAllTypes.DataSetMetaData = allTypesMetaData; uadpDataSetReaderMessage = new UadpDataSetReaderMessageDataType() { GroupVersion = 0, DataSetOffset = 47, NetworkMessageNumber = 0, NetworkMessageContentMask = (uint)(uint)(UadpNetworkMessageContentMask.PublisherId | UadpNetworkMessageContentMask.GroupHeader | UadpNetworkMessageContentMask.WriterGroupId | UadpNetworkMessageContentMask.GroupVersion | UadpNetworkMessageContentMask.NetworkMessageNumber | UadpNetworkMessageContentMask.SequenceNumber), DataSetMessageContentMask = (uint)(UadpDataSetMessageContentMask.Status | UadpDataSetMessageContentMask.SequenceNumber), }; dataSetReaderAllTypes.MessageSettings = new ExtensionObject(uadpDataSetReaderMessage); subscribedDataSet = new TargetVariablesDataType(); subscribedDataSet.TargetVariables = new FieldTargetDataTypeCollection(); foreach (var fieldMetaData in allTypesMetaData.Fields) { subscribedDataSet.TargetVariables.Add(new FieldTargetDataType() { DataSetFieldId = fieldMetaData.DataSetFieldId, TargetNodeId = new NodeId(fieldMetaData.Name, NamespaceIndexAllTypes), AttributeId = Attributes.Value, OverrideValueHandling = OverrideValueHandling.OverrideValue, OverrideValue = new Variant(TypeInfo.GetDefaultValue(fieldMetaData.DataType, (int)ValueRanks.Scalar)) }); } dataSetReaderAllTypes.SubscribedDataSet = new ExtensionObject(subscribedDataSet); #endregion readerGroup1.DataSetReaders.Add(dataSetReaderAllTypes); #endregion pubSubConnection1.ReaderGroups.Add(readerGroup1); //create pub sub configuration root object PubSubConfigurationDataType pubSubConfiguration = new PubSubConfigurationDataType(); pubSubConfiguration.Connections = new PubSubConnectionDataTypeCollection() { pubSubConnection1 }; return(pubSubConfiguration); }
public void ValidateUdpClientCreatorGetUdpClients() { // Create a publisher application UaPubSubApplication publisherApplication = UaPubSubApplication.Create(PublisherConfigurationFileName); Assert.IsNotNull(publisherApplication, "m_publisherApplication should not be null"); // Get the publisher configuration PubSubConfigurationDataType publisherConfiguration = publisherApplication.UaPubSubConfigurator.PubSubConfiguration; Assert.IsNotNull(publisherConfiguration, "m_publisherConfiguration should not be null"); // Check publisher connections Assert.IsNotNull(publisherConfiguration.Connections, "m_publisherConfiguration.Connections should not be null"); Assert.IsNotEmpty(publisherConfiguration.Connections, "m_publisherConfiguration.Connections should not be empty"); PubSubConnectionDataType publisherConnection1 = publisherConfiguration.Connections[0]; Assert.IsNotNull(publisherConnection1, "publisherConnection1 should not be null"); NetworkAddressUrlDataType networkAddressUrlState1 = ExtensionObject.ToEncodeable(publisherConnection1.Address) as NetworkAddressUrlDataType; Assert.IsNotNull(networkAddressUrlState1, "networkAddressUrlState1 is null"); IPEndPoint configuredEndPoint1 = UdpClientCreator.GetEndPoint(networkAddressUrlState1.Url); Assert.IsNotNull(configuredEndPoint1, "configuredEndPoint1 is null"); List <UdpClient> udpClients1 = UdpClientCreator.GetUdpClients(UsedInContext.Publisher, networkAddressUrlState1, configuredEndPoint1); Assert.IsNotNull(udpClients1, "udpClients1 is null"); Assert.IsNotEmpty(udpClients1, "udpClients1 is empty"); UdpClient udpClient1 = udpClients1[0]; Assert.IsTrue(udpClient1 is UdpClientMulticast, "udpClient1 was configured as UdpClientMulticast"); Assert.IsNotNull(udpClient1.Client.LocalEndPoint, "udpClient1 IP address is empty"); PubSubConnectionDataType publisherConnection2 = publisherConfiguration.Connections[1]; Assert.IsNotNull(publisherConnection2, "publisherConnection2 should not be null"); NetworkAddressUrlDataType networkAddressUrlState2 = ExtensionObject.ToEncodeable(publisherConnection2.Address) as NetworkAddressUrlDataType; Assert.IsNotNull(networkAddressUrlState2, "networkAddressUrlState2 is null"); IPEndPoint configuredEndPoint2 = UdpClientCreator.GetEndPoint(networkAddressUrlState2.Url); Assert.IsNotNull(configuredEndPoint2, "configuredEndPoint2 is null"); List <UdpClient> udpClients2 = UdpClientCreator.GetUdpClients(UsedInContext.Publisher, networkAddressUrlState2, configuredEndPoint2); Assert.IsNotNull(udpClients2, "udpClients2 is null"); Assert.IsNotEmpty(udpClients2, "udpClients2 is empty"); UdpClient udpClient2 = udpClients2[0]; Assert.IsTrue(udpClient2 is UdpClientBroadcast, "udpClient2 was configured as UdpClientBroadcast"); Assert.IsNotNull(udpClient2.Client.LocalEndPoint, "udpClient2 IP address is empty"); IPEndPoint udpClientEndPoint1 = udpClient1.Client.LocalEndPoint as IPEndPoint; Assert.IsNotNull(udpClientEndPoint1, "udpClientEndPoint1 could not be cast to IPEndPoint"); IPEndPoint udpClientEndPoint2 = udpClient2.Client.LocalEndPoint as IPEndPoint; Assert.IsNotNull(udpClientEndPoint2, "udpClientEndPoint2 could not be cast to IPEndPoint"); Assert.AreEqual(udpClientEndPoint1.Address.ToString(), udpClientEndPoint2.Address.ToString(), "udpClientEndPoint1 IP address: {0} should match udpClientEndPoint2 IP Address {1}", udpClientEndPoint1.Address.ToString(), udpClientEndPoint2.Address.ToString()); Assert.AreNotEqual(udpClientEndPoint1.Port, udpClientEndPoint2.Port, "udpClientEndPoint1 port number: {0} should not match udpClientEndPoint1 port number: {1}", udpClientEndPoint1.Port, udpClientEndPoint2.Port); }
/// <summary> /// Creates a Subscriber PubSubConfiguration object for UDP & UADP programmatically. /// </summary> /// <returns></returns> private static PubSubConfigurationDataType CreateSubscriberConfiguration_MqttUadp(string urlAddress) { // Define a PubSub connection with PublisherId 3 PubSubConnectionDataType pubSubConnection1 = new PubSubConnectionDataType(); pubSubConnection1.Name = "Subscriber 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 subscribe 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 ReaderGroup1 ReaderGroupDataType readerGroup1 = new ReaderGroupDataType(); readerGroup1.Name = "ReaderGroup 1"; readerGroup1.Enabled = true; readerGroup1.MaxNetworkMessageSize = 1500; readerGroup1.MessageSettings = new ExtensionObject(new ReaderGroupMessageDataType()); readerGroup1.TransportSettings = new ExtensionObject(new ReaderGroupTransportDataType()); #region Define DataSetReader 'Simple' for PublisherId = (UInt16)1, DataSetWriterId = 1 DataSetReaderDataType dataSetReaderSimple = new DataSetReaderDataType(); dataSetReaderSimple.Name = "Reader 1 MQTT UADP"; dataSetReaderSimple.PublisherId = (UInt16)3; dataSetReaderSimple.WriterGroupId = 0; dataSetReaderSimple.DataSetWriterId = 1; dataSetReaderSimple.Enabled = true; dataSetReaderSimple.DataSetFieldContentMask = (uint)DataSetFieldContentMask.RawData; dataSetReaderSimple.KeyFrameCount = 1; BrokerDataSetReaderTransportDataType brokerTransportSettings = new BrokerDataSetReaderTransportDataType() { QueueName = brokerQueueName, MetaDataQueueName = $"{brokerQueueName}/{brokerMetaData}", }; dataSetReaderSimple.TransportSettings = new ExtensionObject(brokerTransportSettings); UadpDataSetReaderMessageDataType uadpDataSetReaderMessage = new UadpDataSetReaderMessageDataType() { GroupVersion = 0, NetworkMessageNumber = 0, NetworkMessageContentMask = (uint)(uint)(UadpNetworkMessageContentMask.PublisherId | UadpNetworkMessageContentMask.GroupHeader | UadpNetworkMessageContentMask.WriterGroupId | UadpNetworkMessageContentMask.PayloadHeader | UadpNetworkMessageContentMask.GroupVersion | UadpNetworkMessageContentMask.NetworkMessageNumber | UadpNetworkMessageContentMask.SequenceNumber), DataSetMessageContentMask = (uint)(UadpDataSetMessageContentMask.Status | UadpDataSetMessageContentMask.SequenceNumber), }; dataSetReaderSimple.MessageSettings = new ExtensionObject(uadpDataSetReaderMessage); // Create and set DataSetMetaData for DataSet Simple DataSetMetaDataType simpleMetaData = CreateDataSetMetaDataSimple(); dataSetReaderSimple.DataSetMetaData = simpleMetaData; // Create and set SubscribedDataSet TargetVariablesDataType subscribedDataSet = new TargetVariablesDataType(); subscribedDataSet.TargetVariables = new FieldTargetDataTypeCollection(); foreach (var fieldMetaData in simpleMetaData.Fields) { subscribedDataSet.TargetVariables.Add(new FieldTargetDataType() { DataSetFieldId = fieldMetaData.DataSetFieldId, TargetNodeId = new NodeId(fieldMetaData.Name, NamespaceIndexSimple), AttributeId = Attributes.Value, OverrideValueHandling = OverrideValueHandling.OverrideValue, OverrideValue = new Variant(TypeInfo.GetDefaultValue(fieldMetaData.DataType, (int)ValueRanks.Scalar)) }); } dataSetReaderSimple.SubscribedDataSet = new ExtensionObject(subscribedDataSet); #endregion readerGroup1.DataSetReaders.Add(dataSetReaderSimple); #region Define DataSetReader 'AllTypes' for PublisherId = (UInt16)1, DataSetWriterId = 2 DataSetReaderDataType dataSetReaderAllTypes = new DataSetReaderDataType(); dataSetReaderAllTypes.Name = "Reader 2 MQTT UADP"; dataSetReaderAllTypes.PublisherId = (UInt16)3; dataSetReaderAllTypes.WriterGroupId = 0; dataSetReaderAllTypes.DataSetWriterId = 2; dataSetReaderAllTypes.Enabled = true; dataSetReaderAllTypes.DataSetFieldContentMask = (uint)DataSetFieldContentMask.RawData; dataSetReaderAllTypes.KeyFrameCount = 1; dataSetReaderAllTypes.TransportSettings = new ExtensionObject(brokerTransportSettings); uadpDataSetReaderMessage = new UadpDataSetReaderMessageDataType() { GroupVersion = 0, NetworkMessageNumber = 0, NetworkMessageContentMask = (uint)(uint)(UadpNetworkMessageContentMask.PublisherId | UadpNetworkMessageContentMask.GroupHeader | UadpNetworkMessageContentMask.WriterGroupId | UadpNetworkMessageContentMask.PayloadHeader | UadpNetworkMessageContentMask.GroupVersion | UadpNetworkMessageContentMask.NetworkMessageNumber | UadpNetworkMessageContentMask.SequenceNumber), DataSetMessageContentMask = (uint)(UadpDataSetMessageContentMask.Status | UadpDataSetMessageContentMask.SequenceNumber), }; dataSetReaderAllTypes.MessageSettings = new ExtensionObject(uadpDataSetReaderMessage); // Create and set DataSetMetaData for DataSet AllTypes DataSetMetaDataType allTypesMetaData = CreateDataSetMetaDataAllTypes(); dataSetReaderAllTypes.DataSetMetaData = allTypesMetaData; // Create and set SubscribedDataSet subscribedDataSet = new TargetVariablesDataType(); subscribedDataSet.TargetVariables = new FieldTargetDataTypeCollection(); foreach (var fieldMetaData in allTypesMetaData.Fields) { subscribedDataSet.TargetVariables.Add(new FieldTargetDataType() { DataSetFieldId = fieldMetaData.DataSetFieldId, TargetNodeId = new NodeId(fieldMetaData.Name, NamespaceIndexAllTypes), AttributeId = Attributes.Value, OverrideValueHandling = OverrideValueHandling.OverrideValue, OverrideValue = new Variant(TypeInfo.GetDefaultValue(fieldMetaData.DataType, (int)ValueRanks.Scalar)) }); } dataSetReaderAllTypes.SubscribedDataSet = new ExtensionObject(subscribedDataSet); #endregion readerGroup1.DataSetReaders.Add(dataSetReaderAllTypes); #endregion pubSubConnection1.ReaderGroups.Add(readerGroup1); //create pub sub configuration root object PubSubConfigurationDataType pubSubConfiguration = new PubSubConfigurationDataType(); pubSubConfiguration.Connections = new PubSubConnectionDataTypeCollection() { pubSubConnection1 }; return(pubSubConfiguration); }
public void ValidateMqttLocalPubSubConnectionWithJson( [Values((byte)1, (UInt16)1, (UInt32)1, (UInt64)1, "abc")] object publisherId, [Values(0, 10000)] double metaDataUpdateTime) { RestartMosquitto("mosquitto"); //Arrange UInt16 writerGroupId = 1; string mqttLocalBrokerUrl = "mqtt://localhost:1883"; ITransportProtocolConfiguration mqttConfiguration = new MqttClientProtocolConfiguration(version: EnumMqttProtocolVersion.V500); JsonNetworkMessageContentMask jsonNetworkMessageContentMask = JsonNetworkMessageContentMask.NetworkMessageHeader | JsonNetworkMessageContentMask.PublisherId | JsonNetworkMessageContentMask.DataSetMessageHeader; JsonDataSetMessageContentMask jsonDataSetMessageContentMask = JsonDataSetMessageContentMask.None; DataSetFieldContentMask dataSetFieldContentMask = DataSetFieldContentMask.None; DataSetMetaDataType[] dataSetMetaDataArray = new DataSetMetaDataType[] { MessagesHelper.CreateDataSetMetaData1("DataSet1"), MessagesHelper.CreateDataSetMetaData2("DataSet2"), MessagesHelper.CreateDataSetMetaData3("DataSet3"), MessagesHelper.CreateDataSetMetaDataAllTypes("DataSet4") }; PubSubConfigurationDataType publisherConfiguration = MessagesHelper.CreatePublisherConfiguration( Profiles.PubSubMqttJsonTransport, mqttLocalBrokerUrl, publisherId: publisherId, writerGroupId: writerGroupId, jsonNetworkMessageContentMask: jsonNetworkMessageContentMask, jsonDataSetMessageContentMask: jsonDataSetMessageContentMask, dataSetFieldContentMask: dataSetFieldContentMask, dataSetMetaDataArray: dataSetMetaDataArray, nameSpaceIndexForData: NamespaceIndexAllTypes, metaDataUpdateTime); Assert.IsNotNull(publisherConfiguration, "publisherConfiguration should not be null"); // Configure the mqtt publisher configuration with the MQTTbroker PubSubConnectionDataType mqttPublisherConnection = MessagesHelper.GetConnection(publisherConfiguration, publisherId); Assert.IsNotNull(mqttPublisherConnection, "The MQTT publisher connection is invalid."); mqttPublisherConnection.ConnectionProperties = mqttConfiguration.ConnectionProperties; Assert.IsNotNull(mqttPublisherConnection.ConnectionProperties, "The MQTT publisher connection properties are not valid."); // Create publisher application for multiple datasets UaPubSubApplication publisherApplication = UaPubSubApplication.Create(publisherConfiguration); MessagesHelper.LoadData(publisherApplication, NamespaceIndexAllTypes); IUaPubSubConnection publisherConnection = publisherApplication.PubSubConnections.First(); Assert.IsNotNull(publisherConnection, "Publisher first connection should not be null"); Assert.IsNotNull(publisherConfiguration.Connections.First(), "publisherConfiguration first connection should not be null"); Assert.IsNotNull(publisherConfiguration.Connections.First().WriterGroups.First(), "publisherConfiguration first writer group of first connection should not be null"); var networkMessages = publisherConnection.CreateNetworkMessages(publisherConfiguration.Connections.First().WriterGroups.First(), new WriterGroupPublishState()); Assert.IsNotNull(networkMessages, "connection.CreateNetworkMessages shall not return null"); Assert.GreaterOrEqual(networkMessages.Count, 1, "connection.CreateNetworkMessages shall have at least one network message"); List <JsonNetworkMessage> uaNetworkMessages = MessagesHelper.GetJsonUaDataNetworkMessages(networkMessages.Cast <JsonNetworkMessage>().ToList()); Assert.IsNotNull(uaNetworkMessages, "Json ua-data entries are missing from configuration!"); List <JsonNetworkMessage> uaMetaDataNetworkMessages = MessagesHelper.GetJsonUaMetaDataNetworkMessages(networkMessages.Cast <JsonNetworkMessage>().ToList()); Assert.IsNotNull(uaMetaDataNetworkMessages, "Json ua-metadata entries are missing from configuration!"); bool hasDataSetWriterId = (jsonNetworkMessageContentMask & JsonNetworkMessageContentMask.DataSetMessageHeader) != 0 && (jsonDataSetMessageContentMask & JsonDataSetMessageContentMask.DataSetWriterId) != 0; PubSubConfigurationDataType subscriberConfiguration = MessagesHelper.CreateSubscriberConfiguration( Profiles.PubSubMqttJsonTransport, mqttLocalBrokerUrl, publisherId: publisherId, writerGroupId: writerGroupId, setDataSetWriterId: hasDataSetWriterId, jsonNetworkMessageContentMask: jsonNetworkMessageContentMask, jsonDataSetMessageContentMask: jsonDataSetMessageContentMask, dataSetFieldContentMask: dataSetFieldContentMask, dataSetMetaDataArray: dataSetMetaDataArray, nameSpaceIndexForData: NamespaceIndexAllTypes); Assert.IsNotNull(subscriberConfiguration, "subscriberConfiguration should not be null"); // Create subscriber application for multiple datasets UaPubSubApplication subscriberApplication = UaPubSubApplication.Create(subscriberConfiguration); Assert.IsNotNull(subscriberApplication, "subscriberApplication should not be null"); Assert.IsNotNull(subscriberApplication.PubSubConnections.First(), "subscriberConfiguration first connection should not be null"); // Configure the mqtt subscriber configuration with the MQTTbroker PubSubConnectionDataType mqttSubcriberConnection = MessagesHelper.GetConnection(subscriberConfiguration, publisherId); Assert.IsNotNull(mqttSubcriberConnection, "The MQTT subscriber connection is invalid."); mqttSubcriberConnection.ConnectionProperties = mqttConfiguration.ConnectionProperties; Assert.IsNotNull(mqttSubcriberConnection.ConnectionProperties, "The MQTT subscriber connection properties are not valid."); var dataSetReaders = subscriberApplication.PubSubConnections.First().GetOperationalDataSetReaders(); Assert.IsNotNull(dataSetReaders, "dataSetReaders should not be null"); IUaPubSubConnection subscriberConnection = subscriberApplication.PubSubConnections.First(); Assert.IsNotNull(subscriberConnection, "Subscriber first connection should not be null"); //Act // it will signal if the mqtt message was received from local ip m_uaDataShutdownEvent = new ManualResetEvent(false); // it will signal if the mqtt metadata message was received from local ip m_uaMetaDataShutdownEvent = new ManualResetEvent(false); // it will signal if the changed configuration message was received on local ip m_uaConfigurationUpdateEvent = new ManualResetEvent(false); subscriberApplication.DataReceived += UaPubSubApplication_DataReceived; subscriberApplication.MetaDataReceived += UaPubSubApplication_MetaDataReceived; subscriberApplication.ConfigurationUpdating += UaPubSubApplication_ConfigurationUpdating; subscriberConnection.Start(); publisherConnection.Start(); //Assert if (!m_uaDataShutdownEvent.WaitOne(EstimatedPublishingTime)) { Assert.Fail("The JSON message was not received"); } if (!m_uaMetaDataShutdownEvent.WaitOne(EstimatedPublishingTime)) { Assert.Fail("The JSON metadata message was not received"); } subscriberConnection.Stop(); publisherConnection.Stop(); }
/// <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); }