Beispiel #1
0
 /// <summary>
 /// Perform event to message encoding
 /// </summary>
 /// <param name="message"></param>
 /// <returns></returns>
 public IEnumerable <NetworkMessageModel> EncodeAsUadp(DataSetMessageModel message)
 {
     foreach (var notification in message.Notifications)
     {
         using (var encoder = new BinaryEncoder(message.ServiceMessageContext)) {
             var value = new MonitoredItemMessage {
                 MessageContentMask = (message.Writer?.MessageSettings?
                                       .DataSetMessageContentMask).ToMonitoredItemMessageMask(
                     message.Writer?.DataSetFieldContentMask),
                 ApplicationUri  = message.ApplicationUri,
                 SubscriptionId  = message.SubscriptionId,
                 EndpointUrl     = message.EndpointUrl,
                 ExtensionFields = message.Writer?.DataSet?.ExtensionFields,
                 NodeId          = notification.NodeId.ToExpandedNodeId(message.ServiceMessageContext.NamespaceUris),
                 Timestamp       = message.TimeStamp ?? DateTime.UtcNow,
                 Value           = notification.Value,
                 DisplayName     = notification.DisplayName
             };
             value.Encode(encoder);
             var encoded = new NetworkMessageModel {
                 Body            = encoder.CloseAndReturnBuffer(),
                 ContentEncoding = "utf-8",
                 Timestamp       = DateTime.UtcNow,
                 ContentType     = ContentMimeType.UaBinary,
                 MessageId       = message.SequenceNumber.ToString(),
                 MessageSchema   = MessageSchemaTypes.MonitoredItemMessageBinary
             };
             yield return(encoded);
         }
     }
 }
 /// <summary>
 /// Perform event to message encoding
 /// </summary>
 /// <param name="message"></param>
 /// <returns></returns>
 public IEnumerable <NetworkMessageModel> Encode(DataSetMessageModel message)
 {
     foreach (var notification in message.Notifications)
     {
         var value = new MonitoredItemMessage {
             MessageContentMask = (message.Writer?.MessageSettings?
                                   .DataSetMessageContentMask).ToMonitoredItemMessageMask(
                 message.Writer?.DataSetFieldContentMask),
             ApplicationUri  = message.ApplicationUri,
             EndpointUrl     = message.EndpointUrl,
             ExtensionFields = message.Writer?.DataSet?.ExtensionFields,
             NodeId          = notification.NodeId,
             Value           = notification.Value,
             DisplayName     = notification.DisplayName
         };
         using (var writer = new StringWriter()) {
             using (var encoder = new JsonEncoderEx(writer, message.ServiceMessageContext)
             {
                 // TODO: Configure encoding further
                 UseUriEncoding = true
             }) {
                 value.Encode(encoder);
             }
             var encoded = new NetworkMessageModel {
                 Body            = Encoding.UTF8.GetBytes(writer.ToString()),
                 ContentEncoding = "utf-8",
                 Timestamp       = DateTime.UtcNow,
                 ContentType     = ContentMimeType.Json,
                 MessageId       = message.SequenceNumber.ToString(),
                 MessageSchema   = MessageSchemaTypes.MonitoredItemMessageJson
             };
             yield return(encoded);
         }
     }
 }
Beispiel #3
0
 /// <summary>
 /// Produce Monitored Item Messages from the data set message model for the specified encoding
 /// </summary>
 /// <param name="messages"></param>
 /// <param name="encoding"></param>
 private IEnumerable <MonitoredItemMessage> GetMonitoredItemMessages(
     IEnumerable <DataSetMessageModel> messages, MessageEncoding encoding)
 {
     foreach (var message in messages)
     {
         if (message.WriterGroup?.MessageType.GetValueOrDefault(MessageEncoding.Json) == encoding)
         {
             foreach (var notification in message.Notifications)
             {
                 var result = new MonitoredItemMessage {
                     MessageContentMask = (message.Writer?.MessageSettings?
                                           .DataSetMessageContentMask).ToMonitoredItemMessageMask(
                         message.Writer?.DataSetFieldContentMask),
                     ApplicationUri  = message.ApplicationUri,
                     EndpointUrl     = message.EndpointUrl,
                     ExtensionFields = message.Writer?.DataSet?.ExtensionFields,
                     NodeId          = notification.NodeId.ToExpandedNodeId(message.ServiceMessageContext.NamespaceUris),
                     Timestamp       = message.TimeStamp ?? DateTime.UtcNow,
                     Value           = notification.Value,
                     DisplayName     = notification.DisplayName,
                     SequenceNumber  = notification.SequenceNumber.GetValueOrDefault(0)
                 };
                 // force published timestamp into to source timestamp for the legacy heartbeat compatibility
                 if (notification.IsHeartbeat &&
                     ((result.MessageContentMask & (uint)MonitoredItemMessageContentMask.Timestamp) == 0) &&
                     ((result.MessageContentMask & (uint)MonitoredItemMessageContentMask.SourceTimestamp) != 0))
                 {
                     result.Value.SourceTimestamp = result.Timestamp;
                 }
                 yield return(result);
             }
         }
     }
 }
 /// <summary>
 /// Produce Monitored Item Messages from the data set message model for the specified encoding
 /// </summary>
 /// <param name="messages"></param>
 /// <param name="encoding"></param>
 /// <param name="context"></param>
 private IEnumerable <MonitoredItemMessage> GetMonitoredItemMessages(
     IEnumerable <DataSetMessageModel> messages, MessageEncoding encoding,
     ServiceMessageContext context)
 {
     if (context?.NamespaceUris == null)
     {
         // Declare all notifications in messages as dropped.
         int totalNotifications = messages.Sum(m => m?.Notifications?.Count() ?? 0);
         NotificationsDroppedCount += (uint)totalNotifications;
         _logger.Warning("Namespace is empty, dropped {totalNotifications} values");
         yield break;
     }
     foreach (var message in messages)
     {
         if (message.WriterGroup?.MessageType.GetValueOrDefault(MessageEncoding.Json) == encoding)
         {
             foreach (var notification in message.Notifications)
             {
                 var result = new MonitoredItemMessage {
                     MessageContentMask = (message.Writer?.MessageSettings?
                                           .DataSetMessageContentMask).ToMonitoredItemMessageMask(
                         message.Writer?.DataSetFieldContentMask),
                     ApplicationUri  = message.ApplicationUri,
                     EndpointUrl     = message.EndpointUrl,
                     ExtensionFields = message.Writer?.DataSet?.ExtensionFields,
                     NodeId          = notification.NodeId.ToExpandedNodeId(context.NamespaceUris),
                     Timestamp       = message.TimeStamp ?? DateTime.UtcNow,
                     Value           = notification.Value,
                     DisplayName     = notification.DisplayName,
                     SequenceNumber  = notification.SequenceNumber.GetValueOrDefault(0)
                 };
                 // force published timestamp into to source timestamp for the legacy heartbeat compatibility
                 if (notification.IsHeartbeat &&
                     ((result.MessageContentMask & (uint)MonitoredItemMessageContentMask.Timestamp) == 0) &&
                     ((result.MessageContentMask & (uint)MonitoredItemMessageContentMask.SourceTimestamp) != 0))
                 {
                     result.Value.SourceTimestamp = result.Timestamp;
                 }
                 yield return(result);
             }
         }
     }
 }
Beispiel #5
0
 /// <summary>
 /// Perform event to message encoding
 /// </summary>
 /// <param name="message"></param>
 /// <returns></returns>
 public IEnumerable <NetworkMessageModel> EncodeAsJson(DataSetMessageModel message)
 {
     foreach (var notification in message.Notifications)
     {
         using (var writer = new StringWriter()) {
             var value = new MonitoredItemMessage {
                 MessageContentMask = (message.Writer?.MessageSettings?
                                       .DataSetMessageContentMask).ToMonitoredItemMessageMask(
                     message.Writer?.DataSetFieldContentMask),
                 ApplicationUri  = message.ApplicationUri,
                 EndpointUrl     = message.EndpointUrl,
                 ExtensionFields = message.Writer?.DataSet?.ExtensionFields,
                 NodeId          = notification.NodeId.ToExpandedNodeId(message.ServiceMessageContext.NamespaceUris),
                 Timestamp       = message.TimeStamp ?? DateTime.UtcNow,
                 Value           = notification.Value,
                 DisplayName     = notification.DisplayName
             };
             using (var encoder = new JsonEncoderEx(writer, message.ServiceMessageContext)
             {
                 UseAdvancedEncoding = true,
                 UseUriEncoding = true,
                 UseReversibleEncoding = false
             }){
                 value.Encode(encoder);
             }
             var encoded = new NetworkMessageModel {
                 Body            = Encoding.UTF8.GetBytes(writer.ToString()),
                 ContentEncoding = "utf-8",
                 Timestamp       = DateTime.UtcNow,
                 ContentType     = ContentMimeType.UaLegacyPublisher,
                 MessageId       = message.SequenceNumber.ToString(),
                 MessageSchema   = MessageSchemaTypes.MonitoredItemMessageJson
             };
             yield return(encoded);
         }
     }
 }