/// <summary> /// Set MessageContentMask /// </summary> /// <param name="messageContentMask"></param> public void SetMessageContentMask(UadpDataSetMessageContentMask messageContentMask) { DataSetMessageContentMask = messageContentMask; DataSetFlags1 &= kPreservedDataSetFlags1UsedBits; DataSetFlags2 = 0; #region DataSetFlags1: Bit range 3-7: Enabled flags options if ((DataSetMessageContentMask & UadpDataSetMessageContentMask.SequenceNumber) != 0) { DataSetFlags1 |= DataSetFlags1EncodingMask.SequenceNumber; } if ((DataSetMessageContentMask & UadpDataSetMessageContentMask.Status) != 0) { DataSetFlags1 |= DataSetFlags1EncodingMask.Status; } if ((DataSetMessageContentMask & UadpDataSetMessageContentMask.MajorVersion) != 0) { DataSetFlags1 |= DataSetFlags1EncodingMask.ConfigurationVersionMajorVersion; } if ((DataSetMessageContentMask & UadpDataSetMessageContentMask.MinorVersion) != 0) { DataSetFlags1 |= DataSetFlags1EncodingMask.ConfigurationVersionMinorVersion; } #endregion #region DataSetFlags2 // Bit range 0-3: UADP DataSetMessage type // 0000 Data Key Frame (by default for now) // 0001 Data Delta Frame // 0010 Event // 0011 Keep Alive if (DataSet != null && DataSet.IsDeltaFrame) { DataSetFlags1 |= DataSetFlags1EncodingMask.DataSetFlags2; DataSetFlags2 |= DataSetFlags2EncodingMask.DataDeltaFrame; } //Always Key frame is sent. if ((DataSetMessageContentMask & UadpDataSetMessageContentMask.Timestamp) != 0) { DataSetFlags1 |= DataSetFlags1EncodingMask.DataSetFlags2; DataSetFlags2 |= DataSetFlags2EncodingMask.Timestamp; } if ((DataSetMessageContentMask & UadpDataSetMessageContentMask.PicoSeconds) != 0) { DataSetFlags1 |= DataSetFlags1EncodingMask.DataSetFlags2; DataSetFlags2 |= DataSetFlags2EncodingMask.PicoSeconds; } #endregion }
public void ValidateStatus( [Values(UadpDataSetMessageContentMask.None, UadpDataSetMessageContentMask.Timestamp, UadpDataSetMessageContentMask.MajorVersion, UadpDataSetMessageContentMask.MinorVersion, UadpDataSetMessageContentMask.SequenceNumber, UadpDataSetMessageContentMask.MajorVersion | UadpDataSetMessageContentMask.MinorVersion, UadpDataSetMessageContentMask.MajorVersion | UadpDataSetMessageContentMask.MinorVersion | UadpDataSetMessageContentMask.SequenceNumber)] UadpDataSetMessageContentMask messageContentMask, [Values(StatusCodes.Good, StatusCodes.UncertainDataSubNormal, StatusCodes.BadAggregateListMismatch, StatusCodes.BadUnknownResponse, StatusCodes.Bad, StatusCodes.BadAggregateConfigurationRejected, StatusCodes.BadAggregateInvalidInputs, StatusCodes.BadAlreadyExists)] uint statusCode ) { // Arrange UadpDataSetMessage uadpDataSetMessage = GetFirstDataSetMessage(DataSetFieldContentMask.None); // Act uadpDataSetMessage.SetMessageContentMask(messageContentMask | UadpDataSetMessageContentMask.Status); uadpDataSetMessage.Status = statusCode; // Assert CompareEncodeDecode(uadpDataSetMessage); }
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> /// Compare dataset messages options /// </summary> /// <param name="uadpDataSetMessageEncode"></param> /// <param name="uadpDataSetMessageDecoded"></param> /// <returns></returns> private void CompareUadpDataSetMessages(UadpDataSetMessage uadpDataSetMessageEncode, UadpDataSetMessage uadpDataSetMessageDecoded) { DataSet dataSetDecoded = uadpDataSetMessageDecoded.DataSet; UadpDataSetMessageContentMask dataSetMessageContentMask = uadpDataSetMessageEncode.DataSetMessageContentMask; Assert.AreEqual(uadpDataSetMessageEncode.DataSetFlags1, uadpDataSetMessageDecoded.DataSetFlags1, "DataSetMessages DataSetFlags1 do not match:"); Assert.AreEqual(uadpDataSetMessageEncode.DataSetFlags2, uadpDataSetMessageDecoded.DataSetFlags2, "DataSetMessages DataSetFlags2 do not match:"); if ((dataSetMessageContentMask & UadpDataSetMessageContentMask.Timestamp) == UadpDataSetMessageContentMask.Timestamp) { Assert.AreEqual(uadpDataSetMessageEncode.Timestamp, uadpDataSetMessageDecoded.Timestamp, "DataSetMessages TimeStamp do not match:"); } if ((dataSetMessageContentMask & UadpDataSetMessageContentMask.PicoSeconds) == UadpDataSetMessageContentMask.PicoSeconds) { Assert.AreEqual(uadpDataSetMessageEncode.PicoSeconds, uadpDataSetMessageDecoded.PicoSeconds, "DataSetMessages PicoSeconds do not match:"); } if ((dataSetMessageContentMask & UadpDataSetMessageContentMask.Status) == UadpDataSetMessageContentMask.Status) { Assert.AreEqual(uadpDataSetMessageEncode.Status, uadpDataSetMessageDecoded.Status, "DataSetMessages Status do not match:"); } if ((dataSetMessageContentMask & UadpDataSetMessageContentMask.MajorVersion) == UadpDataSetMessageContentMask.MajorVersion) { Assert.AreEqual(uadpDataSetMessageEncode.MetaDataVersion.MajorVersion, uadpDataSetMessageDecoded.MetaDataVersion.MajorVersion, "DataSetMessages ConfigurationMajorVersion do not match:"); } if ((dataSetMessageContentMask & UadpDataSetMessageContentMask.MinorVersion) == UadpDataSetMessageContentMask.MinorVersion) { Assert.AreEqual(uadpDataSetMessageEncode.MetaDataVersion.MinorVersion, uadpDataSetMessageDecoded.MetaDataVersion.MinorVersion, "DataSetMessages ConfigurationMajorVersion do not match:"); } // check also the payload data Assert.AreEqual(uadpDataSetMessageEncode.DataSet.Fields.Length, dataSetDecoded.Fields.Length, "DataSetMessages DataSet fields size do not match:"); for (int index = 0; index < uadpDataSetMessageEncode.DataSet.Fields.Length; index++) { Field dataSetFieldEncoded = uadpDataSetMessageEncode.DataSet.Fields[index]; Field dataSetFieldDecoded = dataSetDecoded.Fields[index]; Assert.IsNotNull(dataSetFieldEncoded.Value, "DataSetFieldEncoded.Value is null"); Assert.IsNotNull(dataSetFieldDecoded.Value, "DataSetFieldDecoded.Value is null"); object encodedValue = dataSetFieldEncoded.Value.Value; object decodedValue = dataSetFieldDecoded.Value.Value; Assert.AreEqual(encodedValue, decodedValue, "DataSetMessages Field.Value does not match value field at position: {0} {1}|{2}", index, encodedValue, decodedValue); } }