/// <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"); } }
/// <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 Connection 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; string brokerQueueName = "Json_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 DataSetReader1 'Simple' for PublisherId = (UInt16)2, 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 = (uint)DataSetFieldContentMask.None;// Variant encoding; dataSetReaderSimple.KeyFrameCount = 3; 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); BrokerDataSetReaderTransportDataType brokerTransportSettings = new BrokerDataSetReaderTransportDataType() { QueueName = brokerQueueName, RequestedDeliveryGuarantee = BrokerTransportQualityOfService.BestEffort, MetaDataQueueName = $"{brokerQueueName}/{brokerMetaData}", }; dataSetReaderSimple.TransportSettings = new ExtensionObject(brokerTransportSettings); // 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 DataSetReader2 'AllTypes' for PublisherId = (UInt16)2, DataSetWriterId = 2 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;// RawData encoding; dataSetReaderAllTypes.KeyFrameCount = 1; 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); brokerTransportSettings = new BrokerDataSetReaderTransportDataType() { QueueName = brokerQueueName, RequestedDeliveryGuarantee = BrokerTransportQualityOfService.BestEffort, MetaDataQueueName = $"{brokerQueueName}/{brokerMetaData}", }; dataSetReaderAllTypes.TransportSettings = new ExtensionObject(brokerTransportSettings); // 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); }