/// <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); } } }
/// <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); } } } }
/// <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); } } }