Skip to content

Commit

Permalink
PubSub fixes (#1394)
Browse files Browse the repository at this point in the history
  • Loading branch information
AlinMoldovean committed May 12, 2021
1 parent ab05d09 commit a5e1f4c
Show file tree
Hide file tree
Showing 14 changed files with 141 additions and 164 deletions.
54 changes: 17 additions & 37 deletions Libraries/Opc.Ua.PubSub/Encoding/JsonDataSetMessage.cs
Original file line number Diff line number Diff line change
Expand Up @@ -36,7 +36,7 @@ namespace Opc.Ua.PubSub.Encoding
{
/// <summary>
/// The JsonDataSetMessage class handler.
/// It handles the JsonDataSetMessage encoding
/// It handles the JsonDataSetMessage encoding
/// </summary>
public class JsonDataSetMessage : UaDataSetMessage
{
Expand All @@ -46,33 +46,23 @@ public class JsonDataSetMessage : UaDataSetMessage
#endregion

#region Constructors

/// <summary>
/// Create new instance of <see cref="JsonDataSetMessage"/>.
/// </summary>
public JsonDataSetMessage() : base()
{
}

/// <summary>
/// Create new instance of <see cref="JsonDataSetMessage"/> with DataSet parameter
/// </summary>
/// <param name="dataSet"></param>
public JsonDataSetMessage(DataSet dataSet = null) : this()
/// <param name="dataSet"></param>
public JsonDataSetMessage(DataSet dataSet = null)
{
DataSet = dataSet;
}

#endregion

#region Properties

/// <summary>
/// Get JsonDataSetMessageContentMask
/// The DataSetWriterMessageContentMask defines the flags for the content of the DataSetMessage header.
/// The Json message mapping specific flags are defined by the <see cref="JsonDataSetMessageContentMask"/> enum.
/// </summary>
public JsonDataSetMessageContentMask DataSetMessageContentMask { get; private set; }
public JsonDataSetMessageContentMask DataSetMessageContentMask { get; set; }

/// <summary>
/// Flag that indicates if the dataset message header is encoded
Expand All @@ -82,9 +72,8 @@ public JsonDataSetMessage(DataSet dataSet = null) : this()
#endregion Properties

#region Public Methods

/// <summary>
/// Set DataSetFieldContentMask
/// Set DataSetFieldContentMask
/// </summary>
/// <param name="fieldContentMask">The new <see cref="DataSetFieldContentMask"/> for this dataset</param>
public override void SetFieldContentMask(DataSetFieldContentMask fieldContentMask)
Expand All @@ -96,6 +85,12 @@ public override void SetFieldContentMask(DataSetFieldContentMask fieldContentMas
// 00 Variant Field Encoding
m_fieldTypeEncoding = FieldTypeEncodingMask.Variant;
}
else if ((FieldContentMask & DataSetFieldContentMask.RawData) != 0)
{
// If the RawData flag is set, all other bits are ignored.
// 01 RawData Field Encoding
m_fieldTypeEncoding = FieldTypeEncodingMask.RawData;
}
else if ((FieldContentMask & (DataSetFieldContentMask.StatusCode
| DataSetFieldContentMask.SourceTimestamp
| DataSetFieldContentMask.ServerTimestamp
Expand All @@ -105,20 +100,6 @@ public override void SetFieldContentMask(DataSetFieldContentMask fieldContentMas
// 10 DataValue Field Encoding
m_fieldTypeEncoding = FieldTypeEncodingMask.DataValue;
}
else if ((FieldContentMask & DataSetFieldContentMask.RawData) != 0)
{
// 01 RawData Field Encoding
m_fieldTypeEncoding = FieldTypeEncodingMask.RawData;
}
}

/// <summary>
/// Set MessageContentMask
/// </summary>
/// <param name="messageContentMask">The new <see cref="JsonDataSetMessageContentMask"/>.</param>
public void SetMessageContentMask(JsonDataSetMessageContentMask messageContentMask)
{
DataSetMessageContentMask = messageContentMask;
}

/// <summary>
Expand Down Expand Up @@ -148,7 +129,7 @@ public void Encode(JsonEncoder jsonEncoder, string fieldName = null)
/// <param name="jsonDecoder">The json decoder trhat contains the json stream.</param>
/// <param name="messagesCount">Number of Messages found in current jsonDecoder. If 0 then there is SingleDataSetMessage</param>
/// <param name="messagesListName">The name of the Messages list</param>
/// <param name="dataSetReader">The <see cref="DataSetReaderDataType"/> used to decode the data set.</param>
/// <param name="dataSetReader">The <see cref="DataSetReaderDataType"/> used to decode the data set.</param>
public void DecodePossibleDataSetReader(JsonDecoder jsonDecoder, int messagesCount, string messagesListName, DataSetReaderDataType dataSetReader)
{
if (messagesCount == 0)
Expand Down Expand Up @@ -374,7 +355,7 @@ private DataSet DecodePayloadContent(JsonDecoder jsonDecoder, DataSetReaderDataT
Field dataField = new Field();
dataField.FieldMetaData = dataSetMetaData?.Fields[i];
dataField.Value = dataValues[i];

if (targetVariablesData != null && targetVariablesData.TargetVariables != null
&& i < targetVariablesData.TargetVariables.Count)
{
Expand All @@ -395,15 +376,14 @@ private DataSet DecodePayloadContent(JsonDecoder jsonDecoder, DataSetReaderDataT
#endregion

#region Private Encode Methods

/// <summary>
/// Encode DataSet message header
/// </summary>
private void EncodeDataSetMessageHeader(JsonEncoder encoder)
private void EncodeDataSetMessageHeader(IEncoder encoder)
{
if ((DataSetMessageContentMask & JsonDataSetMessageContentMask.DataSetWriterId) != 0)
{
encoder.WriteString(nameof(DataSetWriterId), DataSetWriterId.ToString());
encoder.WriteUInt16(nameof(DataSetWriterId), DataSetWriterId);
}

if ((DataSetMessageContentMask & JsonDataSetMessageContentMask.SequenceNumber) != 0)
Expand Down Expand Up @@ -524,7 +504,7 @@ private void EncodeField(JsonEncoder encoder, Field field)
#region Private Decode Methods

/// <summary>
/// Decode RawData type
/// Decode RawData type
/// </summary>
/// <returns></returns>
private object DecodeRawData(JsonDecoder jsonDecoder, FieldMetaData fieldMetaData, string fieldName)
Expand Down Expand Up @@ -566,7 +546,7 @@ private void DecodeDataSetMessageHeader(JsonDecoder jsonDecoder)
{
if (jsonDecoder.ReadField(nameof(DataSetWriterId), out token))
{
DataSetWriterId = Convert.ToUInt16(jsonDecoder.ReadString(nameof(DataSetWriterId)));
DataSetWriterId = jsonDecoder.ReadUInt16(nameof(DataSetWriterId));
}
}

Expand Down
63 changes: 38 additions & 25 deletions Libraries/Opc.Ua.PubSub/Encoding/JsonNetworkMessage.cs
Original file line number Diff line number Diff line change
Expand Up @@ -29,7 +29,8 @@

using System;
using System.Collections.Generic;
using Opc.Ua.PubSub.PublishedData;
using System.IO;
using System.Text;

namespace Opc.Ua.PubSub.Encoding
{
Expand All @@ -49,17 +50,17 @@ public class JsonNetworkMessage : UaNetworkMessage
/// <summary>
/// Create new instance of <see cref="JsonNetworkMessage"/>
/// </summary>
public JsonNetworkMessage() : this(null, new List<UaDataSetMessage>())
public JsonNetworkMessage() : this(null, new List<JsonDataSetMessage>())
{

}

/// <summary>
/// Create new instance of <see cref="JsonNetworkMessage"/>
/// </summary>
/// <param name="writerGroupConfiguration">The <see cref="WriterGroupDataType"/> confguration object that produced this message.</param>
/// <param name="writerGroupConfiguration">The <see cref="WriterGroupDataType"/> confguration object that produced this message.</param>
/// <param name="jsonDataSetMessages"><see cref="JsonDataSetMessage"/> list as input</param>
public JsonNetworkMessage(WriterGroupDataType writerGroupConfiguration, List<UaDataSetMessage> jsonDataSetMessages) : base(writerGroupConfiguration, jsonDataSetMessages)
public JsonNetworkMessage(WriterGroupDataType writerGroupConfiguration, List<JsonDataSetMessage> jsonDataSetMessages)
: base(writerGroupConfiguration, jsonDataSetMessages?.ConvertAll<UaDataSetMessage>(x=> (UaDataSetMessage)x) ?? new List<UaDataSetMessage>())
{
MessageType = kDefaultMessageType;
DataSetClassId = string.Empty;
Expand All @@ -68,7 +69,7 @@ public JsonNetworkMessage(WriterGroupDataType writerGroupConfiguration, List<UaD

#region Properties
/// <summary>
/// NetworkMessageContentMask contains the mask that will be used to check NetworkMessage options selected for usage
/// NetworkMessageContentMask contains the mask that will be used to check NetworkMessage options selected for usage
/// </summary>
public JsonNetworkMessageContentMask NetworkMessageContentMask { get; private set; }

Expand All @@ -84,7 +85,7 @@ public bool HasNetworkMessageHeader
}

/// <summary>
/// Flag that indicates if the Network message contains a single dataset message
/// Flag that indicates if the Network message contains a single dataset message
/// </summary>
public bool HasSingleDataSetMessage
{
Expand Down Expand Up @@ -159,13 +160,29 @@ public void SetNetworkMessageContentMask(JsonNetworkMessageContentMask networkMe
/// <returns></returns>
public override byte[] Encode()
{
ServiceMessageContext messageContext = new ServiceMessageContext();
messageContext.NamespaceUris = ServiceMessageContext.GlobalContext.NamespaceUris;
messageContext.ServerUris = ServiceMessageContext.GlobalContext.ServerUris;
ServiceMessageContext messageContext = new ServiceMessageContext {
NamespaceUris = ServiceMessageContext.GlobalContext.NamespaceUris,
ServerUris = ServiceMessageContext.GlobalContext.ServerUris
};

using (MemoryStream stream = new MemoryStream())
using (var writer = new StreamWriter(stream, new UTF8Encoding(false)))
{
Encode(messageContext, writer);
return stream.ToArray();
}
}

/// <summary>
/// Encodes the object in the specified stream.
/// </summary>
/// <param name="messageContext">The context.</param>
/// <param name="writer">The stream to use.</param>
public override void Encode(ServiceMessageContext messageContext, StreamWriter writer)
{
bool topLevelIsArray = !HasNetworkMessageHeader && !HasSingleDataSetMessage;

using (JsonEncoder encoder = new JsonEncoder(messageContext, false, null, topLevelIsArray))
using (JsonEncoder encoder = new JsonEncoder(messageContext, true, writer, topLevelIsArray))
{
// handle no header
if (HasNetworkMessageHeader)
Expand All @@ -182,9 +199,9 @@ public override byte[] Encode()
{
if (!jsonDataSetMessage.HasDataSetMessageHeader)
{
// (UA Specs:) If the NetworkMessageHeader and the DataSetMessageHeader bits are not set
// and SingleDataSetMessage bit is set, the NetworkMessage
// is a JSON object containing the set of name/value pairs defined for a single DataSet.
// If the NetworkMessageHeader and the DataSetMessageHeader bits are not set
// and SingleDataSetMessage bit is set, the NetworkMessage is a JSON object
// containing the set of name/value pairs defined for a single DataSet.
jsonDataSetMessage.EncodePayload(encoder, false);
}
else
Expand All @@ -209,15 +226,11 @@ public override byte[] Encode()
}
}
}

byte[] bytes = System.Text.Encoding.ASCII.GetBytes(encoder.CloseAndReturnText());

return bytes;
}
}

/// <summary>
/// Decodes the message
/// Decodes the message
/// </summary>
/// <param name="message"></param>
/// <param name="dataSetReaders"></param>
Expand All @@ -241,8 +254,8 @@ public override void Decode(byte[] message, IList<DataSetReaderDataType> dataSet
}

/// <summary>
/// Decode the stream from decoder parameter and produce a Dataset
/// </summary>
/// Decode the stream from decoder parameter and produce a Dataset
/// </summary>
/// <param name="jsonDecoder"></param>
/// <param name="dataSetReaders"></param>
/// <returns></returns>
Expand Down Expand Up @@ -333,7 +346,7 @@ public void DecodeSubscribedDataSets(JsonDecoder jsonDecoder, IEnumerable<DataSe

// initialize the dataset message
JsonDataSetMessage jsonDataSetMessage = new JsonDataSetMessage();
jsonDataSetMessage.SetMessageContentMask((JsonDataSetMessageContentMask)jsonMessageSettings.DataSetMessageContentMask);
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;
Expand Down Expand Up @@ -376,7 +389,7 @@ private void Encode(JsonEncoder jsonEncoder)
/// <summary>
/// Encode Network Message Header
/// </summary>
private void EncodeNetworkMessageHeader(JsonEncoder jsonEncoder)
private void EncodeNetworkMessageHeader(IEncoder jsonEncoder)
{
jsonEncoder.WriteString(nameof(MessageId), MessageId);
jsonEncoder.WriteString(nameof(MessageType), MessageType);
Expand All @@ -401,7 +414,7 @@ private void EncodeMessages(JsonEncoder encoder)
{
if (HasSingleDataSetMessage)
{
// encode single dataset message
// encode single dataset message
JsonDataSetMessage jsonDataSetMessage = DataSetMessages[0] as JsonDataSetMessage;
if (jsonDataSetMessage != null)
{
Expand All @@ -427,7 +440,7 @@ private void EncodeMessages(JsonEncoder encoder)
/// <summary>
/// Encode ReplyTo
/// </summary>
private void EncodeReplyTo(JsonEncoder jsonEncoder)
private void EncodeReplyTo(IEncoder jsonEncoder)
{
if ((NetworkMessageContentMask & JsonNetworkMessageContentMask.ReplyTo) != 0)
{
Expand Down
13 changes: 6 additions & 7 deletions Libraries/Opc.Ua.PubSub/Encoding/UadpDataSetMessage.cs
Original file line number Diff line number Diff line change
Expand Up @@ -68,8 +68,7 @@ public UadpDataSetMessage(DataSet dataSet = null) : this()

#endregion

#region Properties

#region Properties
/// <summary>
/// Get UadpDataSetMessageContentMask
/// The DataSetWriterMessageContentMask defines the flags for the content of the DataSetMessage header.
Expand Down Expand Up @@ -134,6 +133,11 @@ public override void SetFieldContentMask(DataSetFieldContentMask fieldContentMas
// 00 Variant Field Encoding
fieldType = FieldTypeEncodingMask.Variant;
}
else if ((FieldContentMask & DataSetFieldContentMask.RawData) != 0)
{
// 01 RawData Field Encoding
fieldType = FieldTypeEncodingMask.RawData;
}
else if ((FieldContentMask & (DataSetFieldContentMask.StatusCode
| DataSetFieldContentMask.SourceTimestamp
| DataSetFieldContentMask.ServerTimestamp
Expand All @@ -143,11 +147,6 @@ public override void SetFieldContentMask(DataSetFieldContentMask fieldContentMas
// 10 DataValue Field Encoding
fieldType = FieldTypeEncodingMask.DataValue;
}
else if ((FieldContentMask & DataSetFieldContentMask.RawData) != 0)
{
// 01 RawData Field Encoding
fieldType = FieldTypeEncodingMask.RawData;
}

DataSetFlags1 |= (DataSetFlags1EncodingMask)((byte)fieldType << 1);

Expand Down

0 comments on commit a5e1f4c

Please sign in to comment.