/// <summary> /// Set network message content mask /// </summary> /// <param name="networkMessageContentMask"></param> public void SetNetworkMessageContentMask(JsonNetworkMessageContentMask networkMessageContentMask) { NetworkMessageContentMask = networkMessageContentMask; foreach (JsonDataSetMessage jsonDataSetMessage in DataSetMessages) { jsonDataSetMessage.HasDataSetMessageHeader = HasDataSetMessageHeader; } }
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: kNamespaceIndexAllTypes, 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, 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"); 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: 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 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(kEstimatedPublishingTime)) { Assert.Fail("The JSON message was not received"); } if (!m_uaMetaDataShutdownEvent.WaitOne(kEstimatedPublishingTime)) { Assert.Fail("The JSON metadata message was not received"); } subscriberConnection.Stop(); publisherConnection.Stop(); }
/// <summary> /// Decode the stream from decoder parameter and produce a Dataset /// </summary> /// <param name="jsonDecoder"></param> /// <param name="dataSetReaders"></param> /// <returns></returns> public void DecodeSubscribedDataSets(JsonDecoder jsonDecoder, IEnumerable <DataSetReaderDataType> dataSetReaders) { try { List <DataSetReaderDataType> dataSetReadersFiltered = new List <DataSetReaderDataType>(); // 1. decode network message header (PublisherId & DataSetClassId) DecodeNetworkMessageHeader(jsonDecoder); // ignore network messages that are not dataSet messages if (m_jsonNetworkMessageType != JSONNetworkMessageType.DataSetMessage) { return; } //* 6.2.8.1 PublisherId // The parameter PublisherId defines the Publisher to receive NetworkMessages from. // If the value is null, the parameter shall be ignored and all received NetworkMessages pass the PublisherId filter. */ foreach (DataSetReaderDataType dataSetReader in dataSetReaders) { if (dataSetReader.PublisherId == Variant.Null) { dataSetReadersFiltered.Add(dataSetReader); } // publisher id else if ((NetworkMessageContentMask & JsonNetworkMessageContentMask.PublisherId) != 0 && PublisherId != null && PublisherId.Equals(dataSetReader.PublisherId.Value.ToString())) { dataSetReadersFiltered.Add(dataSetReader); } } if (dataSetReadersFiltered.Count == 0) { return; } dataSetReaders = dataSetReadersFiltered; object messagesToken = null; List <object> messagesList = null; string messagesListName = string.Empty; if (jsonDecoder.ReadField(kFieldMessages, out messagesToken)) { messagesList = messagesToken as List <object>; if (messagesList == null) { // this is a SingleDataSetMessage encoded as the conteten of Messages jsonDecoder.PushStructure(kFieldMessages); messagesList = new List <object>(); } else { messagesListName = kFieldMessages; } } else if (jsonDecoder.ReadField(JsonDecoder.RootArrayName, out messagesToken)) { messagesList = messagesToken as List <object>; messagesListName = JsonDecoder.RootArrayName; } else { // this is a SingleDataSetMessage encoded as the conteten of json messagesList = new List <object>(); } if (messagesList != null) { // atempt decoding for each data set reader foreach (DataSetReaderDataType dataSetReader in dataSetReaders) { JsonDataSetReaderMessageDataType jsonMessageSettings = ExtensionObject.ToEncodeable(dataSetReader.MessageSettings) as JsonDataSetReaderMessageDataType; if (jsonMessageSettings == null) { // The reader MessageSettings is not set up corectly continue; } JsonNetworkMessageContentMask networkMessageContentMask = (JsonNetworkMessageContentMask)jsonMessageSettings.NetworkMessageContentMask; if ((networkMessageContentMask & NetworkMessageContentMask) != NetworkMessageContentMask) { // The reader MessageSettings.NetworkMessageContentMask is not set up corectly continue; } // initialize the dataset message JsonDataSetMessage jsonDataSetMessage = new JsonDataSetMessage(); jsonDataSetMessage.DataSetMessageContentMask = (JsonDataSetMessageContentMask)jsonMessageSettings.DataSetMessageContentMask; jsonDataSetMessage.SetFieldContentMask((DataSetFieldContentMask)dataSetReader.DataSetFieldContentMask); // set the flag that indicates if dataset message shall have a header jsonDataSetMessage.HasDataSetMessageHeader = (networkMessageContentMask & JsonNetworkMessageContentMask.DataSetMessageHeader) != 0; jsonDataSetMessage.DecodePossibleDataSetReader(jsonDecoder, messagesList.Count, messagesListName, dataSetReader); if (jsonDataSetMessage.DataSet != null) { m_uaDataSetMessages.Add(jsonDataSetMessage); } } } } catch (Exception ex) { // Unexpected exception in DecodeSubscribedDataSets Utils.Trace(ex, "JsonNetworkMessage.DecodeSubscribedDataSets"); } }