コード例 #1
0
        public void MetaMessageLastChunk()
        {
            if (Debugger.IsAttached)
            {
                MetaMessageFirstChunk();
            }
            string chunkFilePath = Path.Combine(TestDataFolder, "02.meta.chunk.bin");

            byte[]         rawMessage = File.ReadAllBytes(chunkFilePath);
            NetworkMessage message    = null;

            Assert.DoesNotThrow(() => message = Decoder.ParseBinaryMessage(rawMessage));
            Assert.That(message, Is.Not.Null);
            Assert.That(message.NetworkMessageHeader.PublisherID.Value, Is.EqualTo(PublisherID));
            Assert.That(message, Is.InstanceOf(typeof(MetaFrame)));
            MetaFrame metaMessage = (MetaFrame)message;

            Assert.That(metaMessage.DataSetWriterID, Is.EqualTo(1000));
            Assert.That(metaMessage.FieldMetaDataList.Count, Is.EqualTo(138));

            // Check Namespaces
            // First entry must be null
            Assert.That(metaMessage.Namespaces[0], Is.EqualTo(new String(string.Empty)));
            Assert.That(metaMessage.Namespaces[1], Is.EqualTo(new String("http://siemens.com/energy/schema/opcua/ps/v2")));
            Assert.That(metaMessage.Namespaces[2], Is.EqualTo(new String("https://mindsphere.io/OPCUAPubSub/v3")));
        }
コード例 #2
0
        private static void CreateFieldMetaDataList(DataPointEntry entry, MetaFrame m_MetaFrame, EncodingOptions options)
        {
            if (m_MetaFrame.FieldMetaDataList == null)
            {
                m_MetaFrame.FieldMetaDataList = new List <FieldMetaData>();
            }
            FieldMetaData fieldMetaData = new FieldMetaData(options)
            {
                Index    = entry.DataPoint.Index,
                Name     = new String(entry.DataPoint.Name),
                Flags    = new DataSetFieldFlags(options),
                DataType = entry.DataPoint.NodeID,
                FieldID  = entry.DataPoint.FieldID
            };

            // all data points have a "Unit" and a "Prefix" key/value pair in the Properties
            // list of the FieldMetaData; if it is null here, then create an empty entry

            if (entry.DataPoint.Properties == null || entry.DataPoint.Properties.Count == 0)
            {
                fieldMetaData.Properties = new List <binary.Messages.Meta.KeyValuePair>
                {
                    new binary.Messages.Meta.KeyValuePair("Prefix", new String("")),
                    new binary.Messages.Meta.KeyValuePair("Unit", new String(""))
                };
            }
            else
            {
                fieldMetaData.Properties = entry.DataPoint.Properties;
            }

            // add the FieldMetaData for the given data object to the list of all FieldMetaData
            m_MetaFrame.FieldMetaDataList.Add(fieldMetaData);
        }
コード例 #3
0
        protected void CreateMeta(string name, EncodingOptions options, ushort sequenceNumber)
        {
            m_MetaFrame = new MetaFrame(options);
            ExtendedFlags1 extendedFlags1 = new ExtendedFlags1
            {
                RawValue = 0x84
            };
            ExtendedFlags2 extendedFlags2 = new ExtendedFlags2
            {
                RawValue = 8
            };
            NetworkMessageHeader networkMessageHeader = new NetworkMessageHeader
            {
                VersionAndFlags = 0x91,
                ExtendedFlags1  = extendedFlags1,
                ExtendedFlags2  = extendedFlags2,
                PublisherID     = new String(PublisherId)
            };

            m_MetaFrame.NetworkMessageHeader = networkMessageHeader;
            m_MetaFrame.SequenceNumber       = sequenceNumber;
            DateTime time = DateTime.UtcNow;

            m_MetaFrame.ConfigurationVersion.Minor = (uint)(time.Ticks & uint.MaxValue);
            m_MetaFrame.ConfigurationVersion.Major = (uint)(time.Ticks >> 32);
            m_MetaFrame.Name            = new String(name);
            m_MetaFrame.DataSetWriterID = m_WriterId;
            m_MetaFrame.Description     = Description;
            foreach (DataPointEntry entry in m_ProcessValues.Values)
            {
                CreateFieldMetaDataList(entry, m_MetaFrame, options);
                AddDataPointMeta(entry.DataPoint);
            }
        }
コード例 #4
0
        protected override void CreateMeta()
        {
            m_MetaFrame = new MetaFrame();
            ExtendedFlags1 extendedFlags1 = new ExtendedFlags1
            {
                RawValue = 0x84
            };
            ExtendedFlags2 extendedFlags2 = new ExtendedFlags2
            {
                RawValue = 0x08
            };

            m_MetaFrame.NetworkMessageHeader = new NetworkMessageHeader
            {
                VersionAndFlags = 0x91,
                ExtendedFlags1  = extendedFlags1,
                ExtendedFlags2  = extendedFlags2,
                PublisherID     = new String(m_PublisherID)
            };
            DateTime now  = DateTime.UtcNow;
            TimeSpan time = now - ConfigurationVersion.Base;

            m_MetaFrame.ConfigurationVersion.Major = (uint)time.TotalSeconds;
            m_MetaFrame.ConfigurationVersion.Minor = (uint)time.TotalSeconds;
            m_MetaFrame.Name            = new String("DataSet 002");
            m_MetaFrame.DataSetWriterID = 2000;
            AddFile("AssetFile.json");
            if (m_MetaFrame.EnumDataTypes == null)
            {
                m_MetaFrame.EnumDataTypes = new Dictionary <NodeID, EnumDescription>();
            }
        }
コード例 #5
0
        public static DeltaFrame Decode(Stream inputStream, DataFrame dataFrame, MetaFrame meta)
        {
            if (inputStream == null || !inputStream.CanRead || meta == null)
            {
                return(null);
            }
            DeltaFrame instance = new DeltaFrame(dataFrame);

            instance.MetaFrame = meta;
            instance.Timestamp = dataFrame.Timestamp;
            ushort?readuInt16 = BaseType.ReadUInt16(inputStream);

            if (readuInt16 != null)
            {
                instance.FieldCount = readuInt16.Value;
            }
            instance.Items          = new List <DataPointValue>(instance.FieldCount);
            instance.FieldIndexList = new List <ushort>(instance.FieldCount);
            for (int i = 0; i < instance.FieldCount; i++)
            {
                // Index
                ushort?indexFromStream = BaseType.ReadUInt16(inputStream);
                if (!indexFromStream.HasValue)
                {
                    throw new Exception("Decode DeltaFrame: Could not parse field index.");
                }
                instance.FieldIndexList.Add(indexFromStream.Value);
                DataPointValue item = ParseDataPoint(inputStream, meta, indexFromStream.Value);
                if (item != null)
                {
                    instance.Items.Add(item);
                }
            }
            return(instance);
        }
コード例 #6
0
        public static KeyFrame Decode(Stream inputStream, DataFrame dataFrame, MetaFrame meta)
        {
            if (inputStream == null || !inputStream.CanRead || meta == null)
            {
                return(null);
            }
            KeyFrame instance = new KeyFrame(dataFrame);

            instance.MetaFrame = meta;
            instance.Timestamp = dataFrame.Timestamp;
            ushort fieldCount = (ushort)(meta.FieldMetaDataList?.Count ?? 0);
            ushort?readUInt16 = BaseType.ReadUInt16(inputStream);

            if (readUInt16 == null)
            {
                return(null);
            }
            if (readUInt16.Value != fieldCount)
            {
                Logger.Error($"Number of fields from Meta: {meta.FieldMetaDataList.Count} vs. FieldCount: {readUInt16.Value}");
                return(null);
            }
            instance.Items = new List <DataPointValue>(fieldCount);
            for (ushort index = 0; index < fieldCount; index++)
            {
                DataPointValue item = ParseDataPoint(inputStream, meta, index);
                if (item != null)
                {
                    instance.Items.Add(item);
                }
            }
            return(instance);
        }
コード例 #7
0
        protected static DataPointValue ParseDataPoint(Stream inputStream, MetaFrame meta, ushort index)
        {
            if (index > meta.FieldMetaDataList.Count - 1)
            {
                throw new Exception("Decode DeltaFrame: Could not parse field as corresponding meta data is not present");
            }

            // Value
            FieldMetaData metaData = meta.FieldMetaDataList[index];

            if (metaData.Index != index)
            {
                Logger.Error($"Index does not match: FieldMetaData.Index {metaData.Index} != {index} read from Stream.");
            }
            if (Logger.IsDebugEnabled)
            {
                Logger.Debug($"Decoding item at position {index} in Meta Frame. Using FieldMetaData:");
                Logger.Debug(metaData);
            }
            DataPointValue item = null;

            if (metaData.DataType == File.PreDefinedNodeID)
            {
                item = new File();
                item.Decode(inputStream);
            }
            else
            {
                item            = ProcessValueFactory.CreateValue(metaData.DataType);
                item.Properties = metaData.Properties;
                if (meta.StructureDataTypes.TryGetValue(metaData.DataType, out StructureDescription desc))
                {
                    if (meta.EnumDataTypes != null &&
                        desc.Name.Name.ToString()
                        .Contains("EnumValue", StringComparison.InvariantCultureIgnoreCase))
                    {
                        string enumName = desc.Name.Name.Value
                                          .Substring(10);
                        item.EnumDescription = meta.EnumDataTypes.First(s => s.Value.Name.Name.Value == enumName)
                                               .Value;
                    }
                    item.Decode(inputStream);
                }
            }

            // ReSharper disable once ConditionIsAlwaysTrueOrFalse
            if (item == null)
            {
                Logger.Error($"Unable to decode value {metaData.DataType} at position {index} in message.");
                return(null);
            }
            item.Name       = metaData.Name.Value;
            item.Properties = metaData.Properties;
            item.Index      = index;
            return(item);
        }
コード例 #8
0
 public ProcessDataSet(string publisherId, string name, ushort writerId, DataSetType dataSetType)
 {
     PublisherId     = publisherId;
     m_ProcessValues = new Dictionary <string, DataPointEntry>();
     m_Name          = name;
     m_WriterId      = writerId;
     m_MetaFrame     = null;
     SetDataSetType(dataSetType);
     Description = new LocalizedText();
 }
コード例 #9
0
 internal static StructureDescription GetStructureDescription(MetaFrame meta, NodeID nodeID)
 {
     foreach (KeyValuePair <NodeID, StructureDescription> desc in meta.StructureDataTypes)
     {
         if (desc.Key == nodeID)
         {
             return(desc.Value);
         }
     }
     return(null);
 }
コード例 #10
0
 public void AddDataPoint(ProcessDataPointValue dataPoint)
 {
     if (!m_ProcessValues.ContainsKey(dataPoint.Name))
     {
         DataPointEntry entry = new DataPointEntry
         {
             DataPoint  = dataPoint,
             IsModified = true
         };
         m_ProcessValues.Add(dataPoint.Name, entry);
         m_MetaFrame = null;
     }
 }
コード例 #11
0
        private MetaFrame ParseMetaFrame(Stream inputStream, NetworkMessageHeader networkMessageHeader, EncodingOptions options)
        {
            MetaFrame metaFrame = MetaFrame.Decode(inputStream, options);

            if (metaFrame == null)
            {
                Logger.Error("Could not parse Meta Message.");
            }
            if (metaFrame != null)
            {
                metaFrame.NetworkMessageHeader = networkMessageHeader;
                m_LocalMetaStorage.StoreMetaMessageLocally(metaFrame);
                if (Logger.IsDebugEnabled)
                {
                    Logger.Debug($"Meta Message decoded with Configuration Version: {metaFrame.ConfigurationVersion}");
                    Logger.Debug(metaFrame.ToString());
                }
            }
            return(metaFrame);
        }
コード例 #12
0
        public void StoreMetaMessageLocally(MetaFrame metaFrame)
        {
            string pubID = metaFrame.NetworkMessageHeader.PublisherID.Value;
            ConfigurationVersion configVersion = metaFrame.ConfigurationVersion;
            ushort writerID = metaFrame.DataSetWriterID;

            if (IsMetaMessageAlreadyKnown(pubID, writerID, configVersion))
            {
                return;
            }
            if (Logger.IsInfoEnabled)
            {
                Logger.Info($"Storing meta message for {pubID} with version {configVersion}.");
            }
            if (!m_DeviceMetaMessages.TryGetValue(pubID, out ConcurrentDictionary <ushort, ConcurrentDictionary <ConfigurationVersion, MetaFrame> > publisherDictionary))
            {
                publisherDictionary = new ConcurrentDictionary <ushort, ConcurrentDictionary <ConfigurationVersion, MetaFrame> >();
                m_DeviceMetaMessages.TryAdd(pubID, publisherDictionary);
            }
            if (!publisherDictionary.TryGetValue(writerID, out ConcurrentDictionary <ConfigurationVersion, MetaFrame> cfgDictionary))
            {
                cfgDictionary = new ConcurrentDictionary <ConfigurationVersion, MetaFrame>();
                publisherDictionary.TryAdd(writerID, cfgDictionary);
            }
            if (cfgDictionary.Count > 10)
            {
                MetaFrame dummy;
                cfgDictionary.TryRemove(cfgDictionary.Keys.OrderBy(a => a)
                                        .First(),
                                        out dummy
                                        );
            }

            // Add the Meta Message if it doesn't exist yet or if it's already present, replace it.
            cfgDictionary.AddOrUpdate(configVersion, metaFrame, (existingVersion, existingFrame) => metaFrame);
        }
コード例 #13
0
        private DataFrame ParseDataSetFrame(Stream inputStream, DataFrame dataFrame)
        {
            if (dataFrame == null)
            {
                return(null);
            }
            ushort    writerID  = dataFrame.PayloadHeader.DataSetWriterID[0];
            MetaFrame metaFrame = null;

            if (dataFrame.Flags2.DataSetMessageType != DataSetMessageTypeEnum.KeepAlive)
            {
                metaFrame = m_LocalMetaStorage.RetrieveMetaMessageLocally(dataFrame.NetworkMessageHeader.PublisherID.Value, writerID, dataFrame.ConfigurationVersion);
                if (metaFrame == null)
                {
                    Logger.Warn($"Could not find MetaMessage for {dataFrame.NetworkMessageHeader.PublisherID.Value} [{dataFrame.ConfigurationVersion}]");
                    return(dataFrame);
                }
            }
            switch (dataFrame.Flags2.DataSetMessageType)
            {
            case DataSetMessageTypeEnum.DataKeyFrame:
                if (Logger.IsDebugEnabled)
                {
                    Logger.Debug("Starting decoding KeyFrame");
                }
                KeyFrame keyFrame = KeyFrame.Decode(inputStream, dataFrame, metaFrame);
                if (keyFrame == null)
                {
                    Logger.Error("Unable to decode KeyFrame");
                }
                if (Logger.IsDebugEnabled && keyFrame != null)
                {
                    Logger.Debug(keyFrame.ToString());
                }
                return(keyFrame);

            case DataSetMessageTypeEnum.DataDeltaFrame:
                if (Logger.IsDebugEnabled)
                {
                    Logger.Debug("Starting decoding DeltaFrame");
                }
                DeltaFrame deltaFrame = DeltaFrame.Decode(inputStream, dataFrame, metaFrame);
                if (deltaFrame == null)
                {
                    Logger.Error("Unable to decode DeltaFrame");
                }
                if (Logger.IsDebugEnabled && deltaFrame != null)
                {
                    Logger.Debug(deltaFrame.ToString());
                }
                return(deltaFrame);

            case DataSetMessageTypeEnum.KeepAlive:
                if (dataFrame.NetworkMessageHeader?.PublisherID != null)
                {
                    if (Logger.IsInfoEnabled)
                    {
                        Logger.Info($"KeepAlive from {dataFrame.NetworkMessageHeader.PublisherID}");
                    }
                    KeepAliveFrame keepAliveFrame = KeepAliveFrame.Decode(inputStream, dataFrame);
                    if (keepAliveFrame == null)
                    {
                        Logger.Error("Unable to decode keep alive frame");
                    }
                    if (Logger.IsDebugEnabled && keepAliveFrame != null)
                    {
                        Logger.Debug(keepAliveFrame.ToString());
                    }
                }
                return(dataFrame);
            }
            return(null);
        }
コード例 #14
0
        private void InitDetailsFromMeta(MetaFrame metaMessage)
        {
            if (m_VisualizerForm.InvokeRequired)
            {
                m_VisualizerForm.Invoke(new Action <MetaFrame>(InitDetailsFromMeta), metaMessage);
            }
            else
            {
                try
                {
                    string publisherID = metaMessage.NetworkMessageHeader.PublisherID.Value;
                    ushort writerID    = metaMessage.DataSetWriterID;
                    ConcurrentDictionary <ushort, BindingSource> writerDictionary =
                        m_Bindings.GetOrAdd(publisherID, pubID => new ConcurrentDictionary <ushort, BindingSource>());
                    BindingSource bs = writerDictionary.GetOrAdd(writerID, s => new BindingSource());
                    bs.Clear();
                    m_VisualizerForm.ResetGroupedTypeIndex(publisherID, writerID);

                    if (metaMessage.FieldMetaDataList != null)
                    {
                        for (int i = 0; i < metaMessage.FieldMetaDataList.Count; i++)
                        {
                            FieldMetaData fieldMetaData     = metaMessage.FieldMetaDataList[i];
                            bool          isOldEnum         = false,
                                          isGroupedDataType = false;
                            if (metaMessage.StructureDataTypes.TryGetValue(fieldMetaData.DataType, out StructureDescription structDesc))
                            {
                                if (metaMessage.EnumDataTypes != null &&
                                    structDesc.Name.Name.ToString()
                                    .Contains("EnumValue"))
                                {
                                    isOldEnum = true;
                                }
                            }
                            if (!isOldEnum)
                            {
                                isGroupedDataType = ProcessValueFactory.GetNodeIDType(fieldMetaData.DataType) == NodeIDType.GroupDataTypeTimeSeries;
                            }
                            DataPointBase dp = null;
                            if (fieldMetaData.DataType == File.PreDefinedNodeID)
                            {
                                dp = new FileDataPoint();
                            }
                            else
                            {
                                dp = new ProcessDataPoint();
                            }
                            dp.Index = fieldMetaData.Index;
                            dp.Name  = dp.GetType()
                                       .Name
                                       == "FileDataPoint"
                                              ? Path.GetFileName(fieldMetaData.Name.Value)
                                              : fieldMetaData.Name.Value;
                            bs.Add(dp);
                            if (isGroupedDataType)
                            {
                                m_VisualizerForm.AddGroupDataTypeIndex(publisherID, writerID, bs.Count - 1);
                                List <StructureField> fields = metaMessage.StructureDataTypes[fieldMetaData.DataType]
                                                               .Fields;
                                int count = fields.Count;
                                for (int k = 0; k < count; k++)
                                {
                                    string name = fields[k]
                                                  .Name.Value;
                                    if (name != "_time" && name.Contains("_qc") == false)
                                    {
                                        ProcessDataPoint dp1 = new ProcessDataPoint();
                                        dp1.Index = fieldMetaData.Index;
                                        dp1.Name  = fields[k]
                                                    .Name.Value;
                                        bs.Add(dp1);
                                    }
                                }
                            }
                        }
                    }
                }
                catch (Exception e)
                {
                    Console.WriteLine(e);
                    if (Debugger.IsAttached)
                    {
                        Debugger.Break();
                    }
                    else
                    {
                        throw;
                    }
                }
            }
        }