Exemplo n.º 1
0
 void UpdateData(DataTable dt)
 {
     if (target.CaptureObjects.Count == 0)
     {
         return;
     }
     if (structures)
     {
         List <object[]> data = new List <object[]>();
         foreach (object[] r in target.Buffer)
         {
             List <object> row   = new List <object>();
             int           index = 0;
             foreach (var it in target.CaptureObjects)
             {
                 //If COSEM object is selected.
                 //Only few meters are supporting this.
                 if (it.Value.AttributeIndex == 0 && r[index] is List <object> )
                 {
                     //Values must be update to the list because there might be Register Scaler
                     //and it expects that scaler is read before value is updated.
                     GXDLMSObject obj = GXDLMSClient.CreateObject(it.Key.ObjectType);
                     byte         i2  = 1;
                     Dictionary <byte, object> list = new Dictionary <byte, object>();
                     foreach (object v in (r[index] as List <object>))
                     {
                         list.Add(i2, v);
                         ++i2;
                     }
                     //Update values first.
                     foreach (byte i in (obj as IGXDLMSBase).GetAttributeIndexToRead(true))
                     {
                         ValueEventArgs ve = new ValueEventArgs(obj, i, 0, null);
                         ve.Value = list[i];
                         (obj as IGXDLMSBase).SetValue(null, ve);
                     }
                     //Show values.
                     for (byte i = 0; i != (obj as IGXDLMSBase).GetAttributeCount(); ++i)
                     {
                         row.Add(GetValue(obj.GetValues()[i]));
                     }
                 }
                 else
                 {
                     row.Add(GetValue(r[index]));
                 }
                 ++index;
             }
             data.Add(row.ToArray());
         }
         for (int pos = dt.Rows.Count; pos < data.Count; ++pos)
         {
             object[] row = data[pos];
             dt.LoadDataRow(row, true);
         }
     }
     else
     {
         for (int pos = dt.Rows.Count; pos < target.Buffer.Count; ++pos)
         {
             object[] row = target.Buffer[pos];
             if (row != null)
             {
                 for (int col = 0; col != row.Length; ++col)
                 {
                     if (row[col] is byte[])
                     {
                         row[col] = GXDLMSTranslator.ToHex((byte[])row[col], true);
                     }
                     else if (row[col] is Object[])
                     {
                         row[col] = GXDLMSTranslator.ValueToXml(row[col]);
                     }
                     else if (row[col] is GXStructure || row[col] is GXArray)
                     {
                         if (target.CaptureObjects[col].Key is GXDLMSRegister && target.CaptureObjects[col].Value.AttributeIndex == 2)
                         {
                             GXDLMSRegister obj = new GXDLMSRegister();
                             ValueEventArgs ve  = new ValueEventArgs(obj, target.CaptureObjects[col].Value.AttributeIndex, 0, null);
                             ve.Value = row[col];
                             (obj as IGXDLMSBase).SetValue(null, ve);
                             row[col] = "{" + obj.Scaler + ", " + obj.Unit + "}";
                         }
                         else
                         {
                             StringBuilder sb = new StringBuilder();
                             GetArrayAsString(sb, row[col]);
                             row[col] = sb.ToString();
                         }
                     }
                     else
                     {
                         GXDLMSAttributeSettings att = target.CaptureObjects[col].Key.Attributes.Find(target.CaptureObjects[col].Value.AttributeIndex);
                         if (att != null && att.Values != null)
                         {
                             if (att.Type == DataType.BitString && row[col] is string)
                             {
                                 string str = (string)row[col];
                                 if (str.Length != 0 && (str[0] == '0' || str[0] == '1'))
                                 {
                                     StringBuilder sb   = new StringBuilder();
                                     int           pos2 = 0;
                                     foreach (char it in str)
                                     {
                                         if (it == '1')
                                         {
                                             if (sb.Length != 0)
                                             {
                                                 sb.Append(',');
                                             }
                                             sb.Append(att.Values[pos2].UIValue);
                                         }
                                         ++pos2;
                                         if (pos2 == att.Values.Count)
                                         {
                                             break;
                                         }
                                     }
                                     row[col] = sb.ToString();
                                 }
                             }
                             else
                             {
                                 foreach (GXObisValueItem it in att.Values)
                                 {
                                     if (IsNumber(row[col]) && it.Value == Convert.ToInt32(row[col]))
                                     {
                                         row[col] = it.UIValue;
                                         break;
                                     }
                                 }
                             }
                         }
                     }
                 }
                 dt.LoadDataRow(row, true);
             }
         }
     }
 }
Exemplo n.º 2
0
        static public object ChangeType(object value, DataType type, CultureInfo cultureInfo)
        {
            object ret;

            if (type == DataType.OctetString)
            {
                if (value is byte[])
                {
                    ret = value;
                }
                else
                {
                    ret = GXDLMSTranslator.HexToBytes((string)value);
                }
            }
            else if (type == DataType.DateTime)
            {
                if (value is GXDateTime)
                {
                    ret = value;
                }
                else
                {
                    ret = new GXDateTime((string)value, CultureInfo.InvariantCulture);
                }
            }
            else if (type == DataType.Date)
            {
                if (value is GXDateTime)
                {
                    ret = value;
                }
                else
                {
                    ret = new GXDate((string)value, CultureInfo.InvariantCulture);
                }
            }
            else if (type == DataType.Time)
            {
                if (value is GXDateTime)
                {
                    ret = value;
                }
                else
                {
                    ret = new GXTime((string)value, CultureInfo.InvariantCulture);
                }
            }
            else if (type == DataType.Enum)
            {
                if (value is GXEnum)
                {
                    ret = value;
                }
                else
                {
                    ret = new GXEnum((byte)Convert.ChangeType(value, typeof(byte)));
                }
            }
            else
            {
                ret = Convert.ChangeType(value, GXDLMSConverter.GetDataType(type));
            }
            return(ret);
        }
 /// <summary>
 /// Returns the public key as a hex string.
 /// </summary>
 /// <returns></returns>
 public string ToHex()
 {
     return(GXDLMSTranslator.ToHex(RawValue));
 }
Exemplo n.º 4
0
 static GXLogWriter()
 {
     translator        = new GXDLMSTranslator(TranslatorOutputType.SimpleXml);
     receivedTraceData = new GXByteBuffer();
 }
Exemplo n.º 5
0
 /// <summary>
 /// Constructor
 /// </summary>
 /// <param name="type">XML type.</param>
 public GXDLMSXmlClient(TranslatorOutputType type)
 {
     translator     = new GXDLMSTranslator(type);
     translator.Hex = false;
 }
 void IGXDLMSBase.Load(GXXmlReader reader)
 {
     SystemTitle  = GXDLMSTranslator.HexToBytes(reader.ReadElementContentAsString("SystemTitle"));
     MacAddress   = (UInt16)reader.ReadElementContentAsInt("MacAddress");
     LSapSelector = (byte)reader.ReadElementContentAsInt("LSapSelector");
 }
Exemplo n.º 7
0
        internal static void Read(ILogger _logger, HttpClient client, GXDLMSReader reader, GXTask task, IGXMedia net, GXDLMSObject obj)
        {
            AddValue            v;
            HttpResponseMessage response;

            if (_logger != null)
            {
                _logger.LogInformation("Reading: " + obj.ToString());
            }
            Console.WriteLine("Reading: " + obj.ToString());
            object val;

            if (obj.ObjectType == ObjectType.ProfileGeneric && task.Index == 2 && task.Object.Attributes[GetBufferIndex(task.Object)].Read != DateTime.MinValue)
            {
                //Read profile generic using range.
                DateTime now = DateTime.Now;
                now = now.AddSeconds(-now.Second);
                now = now.AddMinutes(-now.Minute);
                now = now.AddHours(1);
                val = reader.ReadRowsByRange((GXDLMSProfileGeneric)obj, task.Object.Attributes[GetBufferIndex(task.Object)].Read, now);
            }
            else
            {
                val = reader.Read(obj, task.Index);
            }
            if (val is Enum)
            {
                //Enum values are saved as interger.
                val = Convert.ToString(Convert.ToInt32(val));
            }
            else if (val is byte[])
            {
                DataType dt = (DataType)task.Object.Attributes[GetBufferIndex(task.Object)].UIDataType;
                if (dt == DataType.String)
                {
                    val = ASCIIEncoding.ASCII.GetString((byte[])val);
                }
                else if (dt == DataType.StringUTF8)
                {
                    val = ASCIIEncoding.UTF8.GetString((byte[])val);
                }
                else
                {
                    val = GXCommon.ToHex((byte[])val);
                }
            }
            else if (val is GXDateTime)
            {
                val = ((GXDateTime)val).ToFormatString();
            }
            if (obj.ObjectType == ObjectType.ProfileGeneric && task.Index == 2)
            {
                //Make own value from each row.
                if (val != null)
                {
                    UInt64         attributeId = task.Object.Attributes[GetBufferIndex(task.Object)].Id;
                    List <GXValue> list        = new List <GXValue>();
                    DateTime       latest      = task.Object.Attributes[GetBufferIndex(task.Object)].Read;
                    DateTime       first       = latest;
                    Boolean        read        = false;
                    foreach (GXStructure row in (GXArray)val)
                    {
                        DateTime dt = DateTime.MinValue;
                        task.Data = GXDLMSTranslator.ValueToXml(row);
                        for (int pos = 0; pos != row.Count; ++pos)
                        {
                            if (row[pos] is byte[])
                            {
                                row[pos] = GXDLMSClient.ChangeType((byte[])row[pos], DataType.DateTime);
                                if (pos == 0)
                                {
                                    dt = ((GXDateTime)row[pos]).Value.LocalDateTime;
                                    //If we have already read this row.
                                    if (dt <= first)
                                    {
                                        read = true;
                                        break;
                                    }
                                    if (dt > latest)
                                    {
                                        latest = dt;
                                    }
                                }
                            }
                            //Some meters are returning null as date time to save bytes...
                            if (pos == 0 && row[pos] == null)
                            {
                                row[pos] = latest.AddHours(1);
                            }
                        }
                        if (_logger != null)
                        {
                            _logger.LogInformation("Read: " + task.Data);
                        }
                        if (!read)
                        {
                            list.Add(new GXValue()
                            {
                                Read        = dt,
                                Value       = task.Data,
                                AttributeId = attributeId
                            });
                        }
                    }
                    if (list.Count != 0)
                    {
                        v = new AddValue()
                        {
                            Items = list.ToArray()
                        };
                        response = client.PostAsJsonAsync(Startup.ServerAddress + "/api/value/AddValue", v).Result;
                        Helpers.CheckStatus(response);
                        ListDevicesResponse r = response.Content.ReadAsAsync <ListDevicesResponse>().Result;
                    }
                }
            }
            else
            {
                if (!(val is string))
                {
                    val = Convert.ToString(val);
                }
                task.Data = (string)val;
                if (_logger != null)
                {
                    _logger.LogInformation("Read: " + (string)val);
                }
                int index = GetAttributeIndex(task.Object, task.Index);
                if (index != -1)
                {
                    UInt64 attributeId = task.Object.Attributes[index].Id;
                    v = new AddValue()
                    {
                        Items = new GXValue[] { new GXValue()
                                                {
                                                    AttributeId = attributeId,
                                                    Read        = DateTime.Now,
                                                    Value       = (string)val
                                                } }
                    };
                    response = client.PostAsJsonAsync(Startup.ServerAddress + "/api/value/AddValue", v).Result;
                    Helpers.CheckStatus(response);
                    AddValueResponse r = response.Content.ReadAsAsync <AddValueResponse>().Result;
                }
                else
                {
                    if (_logger != null)
                    {
                        _logger.LogInformation("Invalid task index: " + task.Index);
                    }
                }
            }
        }
Exemplo n.º 8
0
        public void OnValueChanged(GXDLMSViewArguments arg)
        {
            GXDLMSNtpSetup target = (GXDLMSNtpSetup)Target;

            if (arg.Index == 2)
            {
                ActivatedCb.Checked = target.Activated;
            }
            else if (arg.Index == 6)
            {
                KeysView.Items.Clear();
                foreach (KeyValuePair <UInt32, byte[]> it in target.Keys)
                {
                    ListViewItem li = new ListViewItem(new string[] { it.Key.ToString(), GXDLMSTranslator.ToHex(it.Value) });
                    KeysView.Items.Add(li).Tag = it;
                }
                ActivatedCb.Checked = target.Activated;
            }
            else
            {
                throw new IndexOutOfRangeException("index");
            }
        }
Exemplo n.º 9
0
        /// <summary>
        /// Convert message to XML.
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void TranslateBtn_Click(object sender, EventArgs e)
        {
            if (MessagePduTB.ReadOnly)
            {
                StatusLbl.Text = "Cancelling translate.";
                CancelTranslate.Set();
                return;
            }
            TranslateBtn.Checked  = true;
            MessagePduTB.ReadOnly = true;
            Follow       follow = (Follow)FollowmessagesCb.SelectedItem;
            ShowMessages show   = (ShowMessages)ShowCb.SelectedItem;

            MessageXmlTB.Text   = null;
            ProgressBar.Visible = true;
            object selectedInterface = InterfaceCb.SelectedItem;

            UpdateSecuritySettings();
            StatusLbl.Text = "Finding frames";
            GXByteBuffer bb = new GXByteBuffer();

            bb.Set(GXDLMSTranslator.HexToBytes(RemoveComments(string.Join(Environment.NewLine, MessagePduTB.Lines))));
            System.Threading.Tasks.Task.Run(async() =>
            {
                if (translator.BlockCipherKey != null)
                {
                    OnAppendMessage("BlockCipher key: " +
                                    GXDLMSTranslator.ToHex(translator.BlockCipherKey) + Environment.NewLine, Color.Green);
                }
                if (translator.AuthenticationKey != null)
                {
                    OnAppendMessage("Authentication Key:" +
                                    GXDLMSTranslator.ToHex(translator.AuthenticationKey) + Environment.NewLine, Color.Green);
                }
                StringBuilder sb = new StringBuilder();
                Security s       = translator.Security;
                int count        = 1;
                try
                {
                    translator.Clear();
                    translator.PduOnly = PduOnlyMnu.Checked;
                    GXByteBuffer pdu   = new GXByteBuffer();
                    UpdateProgress(0, 0);
                    UpdateMaxProgress(bb.Size, 0);
                    GXDLMSTranslatorMessage frame = new GXDLMSTranslatorMessage();
                    frame.Message = bb;
                    if (selectedInterface is string)
                    {
                        frame.InterfaceType = GXDLMSTranslator.GetDlmsFraming(bb);
                        BeginInvoke((Action)(() =>
                        {
                            InterfaceCb.SelectedItem = frame.InterfaceType;
                        }));
                    }
                    else
                    {
                        frame.InterfaceType = (InterfaceType)selectedInterface;
                    }
                    string last       = "";
                    int clientAddress = 0, serverAddress = 0;
                    while (translator.FindNextFrame(frame, pdu, clientAddress, serverAddress))
                    {
                        //Translate is cancelled.
                        if (CancelTranslate.WaitOne(1))
                        {
                            UpdateMaxProgress(0, 0);
                            BeginInvoke((Action)(() =>
                            {
                                MessagePduTB.ReadOnly = false;
                                TranslateBtn.Checked = false;
                            }));
                            CancelTranslate.Reset();
                            return;
                        }
                        int start = bb.Position;
                        UpdateProgress(start, count);
                        GXDLMSTranslatorMessage msg = new GXDLMSTranslatorMessage();
                        msg.Message = bb;
                        translator.MessageToXml(msg);
                        if (follow != Follow.None)
                        {
                            if ((follow & Follow.Client) != 0 && clientAddress == 0)
                            {
                                clientAddress = msg.SourceAddress;
                            }
                            if ((follow & Follow.Meter) != 0 && serverAddress == 0)
                            {
                                serverAddress = msg.TargetAddress;
                            }
                        }
                        //Remove duplicate messages.
                        if (RemoveDuplicatesMnu.Checked)
                        {
                            if (last == msg.Xml)
                            {
                                continue;
                            }
                        }
                        last = msg.Xml;
                        if (msg.Command == Command.Aarq)
                        {
                            if (msg.SystemTitle != null && msg.SystemTitle.Length == 8)
                            {
                                if (UpdateSystemTitle(this, "Current System title \"{0}\" is different in the parsed \"{1}\". Do you want to start using parsed one?",
                                                      msg.SystemTitle, translator.SystemTitle))
                                {
                                    translator.SystemTitle = msg.SystemTitle;
                                    BeginInvoke((Action)(() =>
                                    {
                                        Ciphering.SystemTitle = msg.SystemTitle;
                                    }));
                                }
                            }
                            if (msg.DedicatedKey != null && msg.DedicatedKey.Length == 16)
                            {
                                if (UpdateSystemTitle(this, "Current dedicated key \"{0}\" is different in the parsed \"{1}\". Do you want to start using parsed one?",
                                                      msg.DedicatedKey, translator.DedicatedKey))
                                {
                                    translator.DedicatedKey = msg.DedicatedKey;
                                    BeginInvoke((Action)(() =>
                                    {
                                        Ciphering.DedicatedKey = msg.DedicatedKey;
                                    }));
                                }
                            }
                        }
                        if (msg.Command == Command.Aare && msg.SystemTitle != null && msg.SystemTitle.Length == 8)
                        {
                            if (UpdateSystemTitle(this, "Current Server System title \"{0}\" is different in the parsed \"{1}\". Do you want to start using parsed one?",
                                                  msg.SystemTitle, translator.ServerSystemTitle))
                            {
                                translator.ServerSystemTitle = msg.SystemTitle;
                                BeginInvoke((Action)(() =>
                                {
                                    Ciphering.ServerSystemTitle = msg.SystemTitle;
                                }));
                            }
                        }
                        if (show != ShowMessages.All)
                        {
                            switch (msg.Command)
                            {
                            case Command.None:
                                break;

                            case Command.InitiateRequest:
                            case Command.ReadRequest:
                            case Command.WriteRequest:
                            case Command.GetRequest:
                            case Command.SetRequest:
                            case Command.MethodRequest:
                            case Command.Snrm:
                            case Command.Aarq:
                            case Command.ReleaseRequest:
                            case Command.DisconnectRequest:
                            case Command.AccessRequest:
                            case Command.GloGetRequest:
                            case Command.GloSetRequest:
                            case Command.GloMethodRequest:
                            case Command.GloInitiateRequest:
                            case Command.GloReadRequest:
                            case Command.GloWriteRequest:
                            case Command.DedInitiateRequest:
                            case Command.DedReadRequest:
                            case Command.DedWriteRequest:
                            case Command.DedGetRequest:
                            case Command.DedSetRequest:
                            case Command.DedMethodRequest:
                            case Command.GatewayRequest:
                                if (show == ShowMessages.Received)
                                {
                                    continue;
                                }
                                break;

                            case Command.InitiateResponse:
                            case Command.ReadResponse:
                            case Command.WriteResponse:
                            case Command.GetResponse:
                            case Command.SetResponse:
                            case Command.MethodResponse:
                            case Command.Ua:
                            case Command.Aare:
                            case Command.ReleaseResponse:
                            case Command.AccessResponse:
                            case Command.GloGetResponse:
                            case Command.GloSetResponse:
                            case Command.GloMethodResponse:
                            case Command.GloInitiateResponse:
                            case Command.GloReadResponse:
                            case Command.GloWriteResponse:
                            case Command.DedInitiateResponse:
                            case Command.DedReadResponse:
                            case Command.DedWriteResponse:
                            case Command.DedGetResponse:
                            case Command.DedSetResponse:
                            case Command.DedMethodResponse:
                            case Command.GatewayResponse:
                                if (show == ShowMessages.Sent)
                                {
                                    continue;
                                }
                                break;

                            case Command.DisconnectMode:
                            case Command.UnacceptableFrame:
                            case Command.ConfirmedServiceError:
                            case Command.ExceptionResponse:
                            case Command.GeneralBlockTransfer:
                            case Command.DataNotification:
                            case Command.GloEventNotification:
                            case Command.GloConfirmedServiceError:
                            case Command.GeneralGloCiphering:
                            case Command.GeneralDedCiphering:
                            case Command.GeneralCiphering:
                            case Command.GeneralSigning:
                            case Command.InformationReport:
                            case Command.EventNotification:
                            case Command.DedConfirmedServiceError:
                            case Command.DedUnconfirmedWriteRequest:
                            case Command.DedInformationReport:
                            case Command.DedEventNotification:
                                break;
                            }
                        }
                        if (Properties.Settings.Default.TranslatorFrame)
                        {
                            if (Properties.Settings.Default.FrameNumber)
                            {
                                sb.Append(count + ": ");
                            }
                            sb.AppendLine(bb.ToHex(true, start, bb.Position - start));
                        }
                        if (Properties.Settings.Default.TranslatorXml)
                        {
                            sb.Append(msg.Xml);
                        }
                        if (msg.Exception != null)
                        {
                            ++count;
                            OnAppendMessage(sb.ToString(), Color.Red);
                        }
                        else if (show != ShowMessages.Failed)
                        {
                            ++count;
                            OnAppendMessage(sb.ToString());
                        }
                        sb.Clear();
                        pdu.Clear();
                    }
                    OnAppendMessage(sb.ToString());
                    translator.Security = s;
                    //Update UI.
                    await System.Threading.Tasks.Task.Delay(1);
                }
                catch (Exception ex)
                {
                    translator.Security = s;
                    OnAppendMessage(sb.ToString());
                    OnAppendMessage(Environment.NewLine);
                    OnAppendMessage(bb.RemainingHexString(true));
                    MessageBox.Show(ex.Message);
                }
                //Count starts from 1.
                UpdateMaxProgress(0, count - 1);
                BeginInvoke((Action)(() =>
                {
                    MessagePduTB.ReadOnly = false;
                    TranslateBtn.Checked = false;
                }));
            });
        }
Exemplo n.º 10
0
        public DLMSTranslatorForm()
        {
            InitializeComponent();
            InterfaceCb.Items.Add("");
            foreach (InterfaceType it in Enum.GetValues(typeof(InterfaceType)))
            {
                if (it != InterfaceType.HdlcWithModeE &&
                    it != InterfaceType.LPWAN &&
                    it != InterfaceType.WiSUN &&
                    it != InterfaceType.PlcPrime)
                {
                    InterfaceCb.Items.Add(it);
                }
            }
            foreach (ShowMessages it in Enum.GetValues(typeof(ShowMessages)))
            {
                ShowCb.Items.Add(it);
            }
            foreach (Follow it in Enum.GetValues(typeof(Follow)))
            {
                FollowmessagesCb.Items.Add(it);
            }
            try
            {
                InterfaceCb.SelectedIndex = Properties.Settings.Default.TranslatorInterface;
            }
            catch (Exception)
            {
                InterfaceCb.SelectedIndex = 0;
            }
            ShowCb.SelectedIndex           = Properties.Settings.Default.TranslatorShow;
            ViewFrameMnu.Checked           = Properties.Settings.Default.TranslatorFrame;
            XmlMnu.Checked                 = Properties.Settings.Default.TranslatorXml;
            FrameNumberMnu.Checked         = Properties.Settings.Default.FrameNumber;
            FollowmessagesCb.SelectedIndex = Properties.Settings.Default.TranslatorFollow;
            translator.OnKeys             += Translator_OnKeys;
            translator.Comments            = true;
            DataPdu.Text = Properties.Settings.Default.Data;
            tabControl1_SelectedIndexChanged(null, null);
            StandardMnu.Checked = Properties.Settings.Default.TranslatorStandard;
            HexMnu.Checked      = Properties.Settings.Default.TranslatorHex;
            if (!string.IsNullOrEmpty(Properties.Settings.Default.Pdu))
            {
                PduTB.Text = Properties.Settings.Default.Pdu;
            }
            if (!string.IsNullOrEmpty(Properties.Settings.Default.Message))
            {
                MessagePduTB.Text = Properties.Settings.Default.Message;
            }
            string certificates = null, keys = null;

            try
            {
                string path = Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.MyDocuments), "GXDLMSDirector");
                if (!Directory.Exists(path))
                {
                    Directory.CreateDirectory(path);
                }
                certificates = Path.Combine(path, "Certificates");
                if (!Directory.Exists(certificates))
                {
                    Directory.CreateDirectory(certificates);
                }
                keys = Path.Combine(path, "Keys");
                if (!Directory.Exists(keys))
                {
                    Directory.CreateDirectory(keys);
                }
            }
            catch (Exception ex)
            {
                MessageBox.Show(ex.Message);
            }
            try
            {
                translator.SecuritySuite     = (SecuritySuite)Properties.Settings.Default.SecuritySuite;
                translator.Security          = (Security)Enum.Parse(typeof(Security), Properties.Settings.Default.Security);
                translator.SystemTitle       = GXDLMSTranslator.HexToBytes(Properties.Settings.Default.NotifySystemTitle);
                translator.ServerSystemTitle = GXDLMSTranslator.HexToBytes(Properties.Settings.Default.ServerSystemTitle);
                translator.BlockCipherKey    = GXDLMSTranslator.HexToBytes(Properties.Settings.Default.NotifyBlockCipherKey);
                translator.AuthenticationKey = GXDLMSTranslator.HexToBytes(Properties.Settings.Default.AuthenticationKey);
                translator.InvocationCounter = (UInt32)Properties.Settings.Default.InvocationCounter;
                translator.DedicatedKey      = GXDLMSTranslator.HexToBytes(Properties.Settings.Default.DedicatedKey);
            }
            catch (Exception)
            {
                //Set default settings if settings are corrupted.
                translator.Security          = Security.None;
                translator.SystemTitle       = GXDLMSTranslator.HexToBytes(Properties.Settings.Default.NotifySystemTitle);
                translator.ServerSystemTitle = GXDLMSTranslator.HexToBytes(Properties.Settings.Default.ServerSystemTitle);
                translator.BlockCipherKey    = GXDLMSTranslator.HexToBytes(Properties.Settings.Default.NotifyBlockCipherKey);
                translator.AuthenticationKey = GXDLMSTranslator.HexToBytes(Properties.Settings.Default.AuthenticationKey);
                translator.InvocationCounter = 0;
                translator.DedicatedKey      = GXDLMSTranslator.HexToBytes(Properties.Settings.Default.DedicatedKey);
            }
            Ciphering = new GXCipheringSettings(translator, keys, certificates,
                                                Properties.Settings.Default.ClientAgreementKey,
                                                Properties.Settings.Default.ClientSigningKey,
                                                Properties.Settings.Default.ServerAgreementKey,
                                                Properties.Settings.Default.ServerSigningKey);
            Ciphering.Challenge = GXDLMSTranslator.HexToBytes(Properties.Settings.Default.Challenge);
            tabControl1.TabPages.Add(Ciphering.GetCiphetingTab());
        }
 public GXDLMSKeyTableDlg(GXKeyValuePair <byte, byte[]> item)
 {
     InitializeComponent();
     IdTb.Text  = item.Key.ToString();
     KeyTb.Text = GXDLMSTranslator.ToHex(item.Value);
 }
Exemplo n.º 12
0
 private void TemplatesAdd_Click(object sender, EventArgs e)
 {
     try
     {
         OpenFileDialog dlg = new OpenFileDialog();
         dlg.Multiselect      = false;
         dlg.InitialDirectory = Directory.GetCurrentDirectory();
         dlg.Filter           = Properties.Resources.FilterTxt;
         dlg.DefaultExt       = ".gdr";
         dlg.ValidateNames    = true;
         if (dlg.ShowDialog(panel1.Parent) == DialogResult.OK)
         {
             if (File.Exists(dlg.FileName))
             {
                 List <GXDLMSDevice> devices;
                 using (XmlReader reader = XmlReader.Create(dlg.FileName))
                 {
                     List <Type> types = new List <Type>(Gurux.DLMS.GXDLMSClient.GetObjectTypes());
                     types.Add(typeof(GXDLMSAttributeSettings));
                     types.Add(typeof(GXDLMSAttribute));
                     //Version is added to namespace.
                     XmlSerializer x = new XmlSerializer(typeof(List <GXDLMSDevice>), null, types.ToArray(), null, "Gurux1");
                     if (!x.CanDeserialize(reader))
                     {
                         x = new XmlSerializer(typeof(List <GXDLMSDevice>), types.ToArray());
                     }
                     devices = (List <GXDLMSDevice>)x.Deserialize(reader);
                     reader.Close();
                 }
                 GXDeviceTemplate        m         = new GXDeviceTemplate();
                 List <GXDeviceTemplate> templates = new List <GXDeviceTemplate>();
                 foreach (GXDLMSDevice it in devices)
                 {
                     GXDeviceTemplate t = new GXDeviceTemplate();
                     GXDevice.Copy(t, it);
                     if (!string.IsNullOrEmpty(it.Password))
                     {
                         t.Password = ASCIIEncoding.ASCII.GetString(CryptHelper.Decrypt(it.Password, Password.Key));
                     }
                     else if (it.HexPassword != null)
                     {
                         t.Password = GXDLMSTranslator.ToHex(CryptHelper.Decrypt(it.HexPassword, Password.Key));
                     }
                     List <GXObjectTemplate> list = new List <GXObjectTemplate>();
                     foreach (GXDLMSObject value in it.Objects)
                     {
                         string[]         names = ((IGXDLMSBase)value).GetNames();
                         GXObjectTemplate obj   = new GXObjectTemplate();
                         obj.LogicalName = value.LogicalName;
                         obj.ObjectType  = (int)value.ObjectType;
                         obj.Name        = value.Description;
                         obj.Version     = value.Version;
                         obj.ShortName   = value.ShortName;
                         list.Add(obj);
                         for (int pos = 2; pos <= ((IGXDLMSBase)value).GetAttributeCount(); ++pos)
                         {
                             GXAttributeTemplate a = new GXAttributeTemplate();
                             a.Index       = pos;
                             a.AccessLevel = (int)value.GetAccess(pos);
                             a.DataType    = (int)((IGXDLMSBase)value).GetDataType(pos);
                             a.UIDataType  = (int)((GXDLMSObject)value).GetUIDataType(pos);
                             if (value.GetStatic(pos))
                             {
                                 a.ExpirationTime = 0xFFFFFFFF;
                             }
                             //Profile generic capture object read is not allowed.
                             if (value is GXDLMSProfileGeneric && pos == 3)
                             {
                                 a.ExpirationTime = 0xFFFFFFFF;
                             }
                             obj.Attributes.Add(a);
                         }
                         t.Objects = list;
                     }
                     templates.Add(t);
                 }
                 DBDevicePropertiesForm dlg2 = new DBDevicePropertiesForm(templates.ToArray(), m);
                 if (dlg2.ShowDialog(panel1.Parent) == DialogResult.OK)
                 {
                     {
                         ami.AddDeviceTemplates(new GXDLMSMeter[] { m });
                         ListViewItem li = TemplatesView.Items.Add(m.Name);
                         li.Tag      = m;
                         li.Selected = true;
                     }
                 }
             }
         }
     }
     catch (Exception Ex)
     {
         MessageBox.Show(panel1.Parent, Ex.Message, "Error", MessageBoxButtons.OK, MessageBoxIcon.Error);
     }
 }
Exemplo n.º 13
0
 static public object ConvertFromDLMS(object data, DataType from, DataType type, bool arrayAsString, bool useUtc)
 {
     if (type == DataType.Array)
     {
         return(data);
     }
     if (type == DataType.None)
     {
         if (arrayAsString && data != null && (data is List <object> || data.GetType().IsArray))
         {
             data = GXDLMSTranslator.ValueToXml(data);
         }
         return(data);
     }
     //Show Octet string...
     if (from == DataType.OctetString && type == DataType.OctetString)
     {
         if (data is byte[])
         {
             string str = "";
             byte[] arr = (byte[])data;
             if (arr.Length == 0)
             {
                 data = string.Empty;
             }
             else
             {
                 foreach (byte it in arr)
                 {
                     str += it.ToString() + ".";
                 }
                 data = str.Substring(0, str.Length - 1);
             }
         }
     }
     //Convert DLMS octect string to Windows string.
     else if (from == DataType.OctetString && type == DataType.String)
     {
         if (data is string)
         {
             return(data);
         }
         else if (data is byte[])
         {
             byte[] arr = (byte[])data;
             data = System.Text.Encoding.ASCII.GetString(arr);
         }
     }
     //Convert DLMS date time to Windows Time.
     else if (type == DataType.DateTime)
     {
         if (data is byte[])
         {
             if (((byte[])data).Length == 5)
             {
                 return(GXDLMSClient.ChangeType((byte[])data, DataType.Date, useUtc));
             }
             return(GXDLMSClient.ChangeType((byte[])data, DataType.DateTime, useUtc));
         }
         return(data);
     }
     //Convert DLMS date time to Windows Date.
     else if (type == DataType.Date)
     {
         if (data is DateTime)
         {
             return(data);
         }
         if (data is string)
         {
             return(data);
         }
         if (!data.GetType().IsArray || ((Array)data).Length < 5)
         {
             throw new Exception("DateTime conversion failed. Invalid DLMS format.");
         }
         return(GXDLMSClient.ChangeType((byte[])data, DataType.Date, useUtc));
     }
     //Convert DLMS date time to Windows Time.
     else if (type == DataType.Time)
     {
         if (data is byte[])
         {
             return(GXDLMSClient.ChangeType((byte[])data, type, useUtc));
         }
         return(data);
     }
     else if (data is byte[])
     {
         if (type == DataType.String)
         {
             data = System.Text.Encoding.ASCII.GetString((byte[])data);
         }
         else
         {
             data = GXDLMSTranslator.ToHex((byte[])data);
         }
     }
     else if (data is Array)
     {
         data = ArrayToString(data);
     }
     return(data);
 }
Exemplo n.º 14
0
        /// <summary>
        /// Update private and public keys to the translator.
        /// </summary>
        private void GetKeys()
        {
            if (updateUI)
            {
                if (ClientSigningKeysCb.SelectedItem is KeyValuePair <GXPkcs8, GXx509Certificate> cs)
                {
                    ClientSigningKey = cs.Key.ToDer();
                }
                else
                {
                    ClientSigningKey = null;
                }
                if (ClientAgreementKeysCb.SelectedItem is KeyValuePair <GXPkcs8, GXx509Certificate> ca)
                {
                    ClientAgreementKey = ca.Key.ToDer();
                }
                else
                {
                    ClientAgreementKey = null;
                }
                if (ServerSigningKeysCb.SelectedItem is KeyValuePair <GXPkcs8, GXx509Certificate> ss)
                {
                    ServerSigningKey = ss.Value.ToDer();
                }
                else
                {
                    ServerSigningKey = null;
                }
                if (ServerAgreementKeysCb.SelectedItem is KeyValuePair <GXPkcs8, GXx509Certificate> sa)
                {
                    ServerAgreementKey = sa.Value.ToDer();
                }
                else
                {
                    ServerAgreementKey = null;
                }
                bool check = _checkSystemTitle;
                if (check)
                {
                    string st;
                    if (SystemTitleAsciiCb.Checked)
                    {
                        st = GXDLMSTranslator.ToHex(ASCIIEncoding.ASCII.GetBytes(SystemTitleTb.Text), false);
                    }
                    else
                    {
                        st = SystemTitleTb.Text.Replace(" ", "");
                    }
                    if (check && (ClientSigningKeysCb.SelectedItem is KeyValuePair <GXPkcs8, GXx509Certificate> cv) && cv.Value != null)
                    {
                        string certificateSt = GXDLMSTranslator.ToHex(GXAsn1Converter.SystemTitleFromSubject(cv.Value.Subject), false);
                        if (st != certificateSt)
                        {
                            if (MessageBox.Show(Parent, string.Format("System title '{0}' of the client is different than in the certificate '{1}'. Do you want to update the system title from the certificate?", SystemTitleTb.Text, certificateSt), "", MessageBoxButtons.YesNoCancel, MessageBoxIcon.Question) == DialogResult.Yes)
                            {
                                SystemTitleAsciiCb.Checked = false;
                                SystemTitleTb.Text         = certificateSt;
                                check = false;
                            }
                        }
                    }
                    if (check && (ClientAgreementKeysCb.SelectedItem is KeyValuePair <GXPkcs8, GXx509Certificate> ck) && ck.Value != null)
                    {
                        string certificateSt = GXDLMSTranslator.ToHex(GXAsn1Converter.SystemTitleFromSubject(ck.Value.Subject), false);
                        if (st != certificateSt)
                        {
                            if (MessageBox.Show(Parent, string.Format("System title '{0}' of the client is different than in the certificate '{1}'. Do you want to update the system title from the certificate?", SystemTitleTb.Text, certificateSt), "", MessageBoxButtons.YesNoCancel, MessageBoxIcon.Question) == DialogResult.Yes)
                            {
                                SystemTitleAsciiCb.Checked = false;
                                SystemTitleTb.Text         = certificateSt;
                                check = false;
                            }
                        }
                    }

                    if (check && ServerSigningKeysCb.SelectedItem is KeyValuePair <GXPkcs8, GXx509Certificate> sv)
                    {
                        string certificateSt = GXDLMSTranslator.ToHex(GXAsn1Converter.SystemTitleFromSubject(sv.Value.Subject), false);
                        if (ServerSystemTitleTb.Text.Replace(" ", "") != certificateSt)
                        {
                            if (MessageBox.Show(Parent, string.Format("System title '{0}' of the server is different than in the certificate '{1}'. Do you want to update the system title from the certificate?", ServerSystemTitleTb.Text, certificateSt), "", MessageBoxButtons.YesNoCancel, MessageBoxIcon.Question) == DialogResult.Yes)
                            {
                                ServerSystemTitleTb.Text = certificateSt;
                                check = false;
                            }
                        }
                    }
                    if (check && ServerAgreementKeysCb.SelectedItem is KeyValuePair <GXPkcs8, GXx509Certificate> sk)
                    {
                        string certificateSt = GXDLMSTranslator.ToHex(GXAsn1Converter.SystemTitleFromSubject(sk.Value.Subject), false);
                        if (ServerSystemTitleTb.Text.Replace(" ", "") != certificateSt)
                        {
                            if (MessageBox.Show(Parent, string.Format("System title '{0}' of the server is different than in the certificate '{1}'. Do you want to update the system title from the certificate?", ServerSystemTitleTb.Text, certificateSt), "", MessageBoxButtons.YesNoCancel, MessageBoxIcon.Question) == DialogResult.Yes)
                            {
                                ServerSystemTitleTb.Text = certificateSt;
                                check = false;
                            }
                        }
                    }
                }
            }
        }
Exemplo n.º 15
0
 /// <summary>
 /// Constructor.
 /// </summary>
 /// <param name="media"></param>
 public GXSettingsDlg(GXNet media, GXDLMSTranslator eventsTranslator)
 {
     _eventsTranslator = eventsTranslator;
     InitializeComponent();
     try
     {
         //Show notification settings.
         notifications = media.PropertiesForm;
         (notifications as IGXPropertyPage).Initialize();
         Move2(notifications.Controls, NotificationsView.Controls, !media.IsOpen);
         //Show custom settings.
         MediaPropertiesForm = new List <IGXSettingsPage>();
         foreach (Assembly a in AppDomain.CurrentDomain.GetAssemblies())
         {
             try
             {
                 foreach (Type type in a.GetTypes())
                 {
                     if (!type.IsAbstract && type.IsClass && typeof(IGXSettingsPage).IsAssignableFrom(type))
                     {
                         MediaPropertiesForm.Add(Activator.CreateInstance(type) as IGXSettingsPage);
                     }
                 }
             }
             catch (Exception)
             {
                 //It's OK if this fails.
             }
         }
         foreach (Form it in MediaPropertiesForm)
         {
             TabPage page = new TabPage((it as IGXSettingsPage).Caption);
             Tabs.TabPages.Add(page);
             (it as IGXSettingsPage).Initialize();
             Move2(it.Controls, page.Controls, true);
         }
         //Show external medias.
         foreach (string it in Properties.Settings.Default.ExternalMedias.Split(new char[] { ';' }, StringSplitOptions.RemoveEmptyEntries))
         {
             AddMedia(it);
         }
         if (IsAscii(eventsTranslator.SystemTitle))
         {
             SystemTitleAsciiCb.CheckedChanged -= SystemTitleAsciiCb_CheckedChanged;
             SystemTitleAsciiCb.Checked         = true;
             SystemTitleAsciiCb.CheckedChanged += SystemTitleAsciiCb_CheckedChanged;
             SystemTitleTB.Text = ASCIIEncoding.ASCII.GetString(eventsTranslator.SystemTitle);
         }
         else
         {
             SystemTitleAsciiCb.CheckedChanged -= SystemTitleAsciiCb_CheckedChanged;
             SystemTitleAsciiCb.Checked         = false;
             SystemTitleAsciiCb.CheckedChanged += SystemTitleAsciiCb_CheckedChanged;
             SystemTitleTB.Text = GXCommon.ToHex(eventsTranslator.SystemTitle);
         }
         if (IsAscii(eventsTranslator.BlockCipherKey))
         {
             BlockCipherKeyAsciiCb.CheckedChanged -= BlockCipherKeyAsciiCb_CheckedChanged;
             BlockCipherKeyAsciiCb.Checked         = true;
             BlockCipherKeyAsciiCb.CheckedChanged += BlockCipherKeyAsciiCb_CheckedChanged;
             BlockCipherKeyTB.Text = ASCIIEncoding.ASCII.GetString(eventsTranslator.BlockCipherKey);
         }
         else
         {
             BlockCipherKeyAsciiCb.CheckedChanged -= BlockCipherKeyAsciiCb_CheckedChanged;
             BlockCipherKeyAsciiCb.Checked         = false;
             BlockCipherKeyAsciiCb.CheckedChanged += BlockCipherKeyAsciiCb_CheckedChanged;
             BlockCipherKeyTB.Text = GXCommon.ToHex(eventsTranslator.BlockCipherKey);
         }
         if (IsAscii(eventsTranslator.AuthenticationKey))
         {
             AuthenticationKeyAsciiCb.CheckedChanged -= AuthenticationKeyAsciiCb_CheckedChanged;
             AuthenticationKeyAsciiCb.Checked         = true;
             AuthenticationKeyAsciiCb.CheckedChanged += AuthenticationKeyAsciiCb_CheckedChanged;
             AuthenticationKeyTB.Text = ASCIIEncoding.ASCII.GetString(eventsTranslator.AuthenticationKey);
         }
         else
         {
             AuthenticationKeyAsciiCb.CheckedChanged -= AuthenticationKeyAsciiCb_CheckedChanged;
             AuthenticationKeyAsciiCb.Checked         = false;
             AuthenticationKeyAsciiCb.CheckedChanged += AuthenticationKeyAsciiCb_CheckedChanged;
             AuthenticationKeyTB.Text = GXCommon.ToHex(eventsTranslator.AuthenticationKey);
         }
     }
     catch (Exception Ex)
     {
         GXDLMS.Common.Error.ShowError(this, Ex);
     }
 }
 /// <summary>
 /// Get translator tags.
 /// </summary>
 /// <param name="type"></param>
 /// <param name="list"></param>
 internal static void GetTranslatorTags(TranslatorOutputType type, SortedList <int, string> list)
 {
     GXDLMSTranslator.AddTag(list, TranslatorTags.Wrapper, "Wrapper");
     GXDLMSTranslator.AddTag(list, TranslatorTags.Hdlc, "Hdlc");
     GXDLMSTranslator.AddTag(list, TranslatorTags.PduDlms, "Pdu");
     GXDLMSTranslator.AddTag(list, TranslatorTags.TargetAddress, "TargetAddress");
     GXDLMSTranslator.AddTag(list, TranslatorTags.SourceAddress, "SourceAddress");
     GXDLMSTranslator.AddTag(list, TranslatorTags.ListOfVariableAccessSpecification, "ListOfVariableAccessSpecification");
     GXDLMSTranslator.AddTag(list, TranslatorTags.ListOfData, "ListOfData");
     GXDLMSTranslator.AddTag(list, TranslatorTags.Success, "Ok");
     GXDLMSTranslator.AddTag(list, TranslatorTags.DataAccessError, "DataAccessError");
     GXDLMSTranslator.AddTag(list, TranslatorTags.AttributeDescriptor, "AttributeDescriptor");
     GXDLMSTranslator.AddTag(list, TranslatorTags.ClassId, "ClassId");
     GXDLMSTranslator.AddTag(list, TranslatorTags.InstanceId, "InstanceId");
     GXDLMSTranslator.AddTag(list, TranslatorTags.AttributeId, "AttributeId");
     GXDLMSTranslator.AddTag(list, TranslatorTags.MethodInvocationParameters, "MethodInvocationParameters");
     GXDLMSTranslator.AddTag(list, TranslatorTags.Selector, "Selector");
     GXDLMSTranslator.AddTag(list, TranslatorTags.Parameter, "Parameter");
     GXDLMSTranslator.AddTag(list, TranslatorTags.LastBlock, "LastBlock");
     GXDLMSTranslator.AddTag(list, TranslatorTags.BlockNumber, "BlockNumber");
     GXDLMSTranslator.AddTag(list, TranslatorTags.RawData, "RawData");
     GXDLMSTranslator.AddTag(list, TranslatorTags.MethodDescriptor, "MethodDescriptor");
     GXDLMSTranslator.AddTag(list, TranslatorTags.MethodId, "MethodId");
     GXDLMSTranslator.AddTag(list, TranslatorTags.Result, "Result");
     GXDLMSTranslator.AddTag(list, TranslatorTags.ReturnParameters, "ReturnParameters");
     GXDLMSTranslator.AddTag(list, TranslatorTags.AccessSelection, "AccessSelection");
     GXDLMSTranslator.AddTag(list, TranslatorTags.Value, "Value");
     GXDLMSTranslator.AddTag(list, TranslatorTags.AccessSelector, "AccessSelector");
     GXDLMSTranslator.AddTag(list, TranslatorTags.AccessParameters, "AccessParameters");
     GXDLMSTranslator.AddTag(list, TranslatorTags.AttributeDescriptorList, "AttributeDescriptorList");
     GXDLMSTranslator.AddTag(list, TranslatorTags.AttributeDescriptorWithSelection, "AttributeDescriptorWithSelection");
     GXDLMSTranslator.AddTag(list, TranslatorTags.ReadDataBlockAccess, "ReadDataBlockAccess");
     GXDLMSTranslator.AddTag(list, TranslatorTags.WriteDataBlockAccess, "WriteDataBlockAccess");
     GXDLMSTranslator.AddTag(list, TranslatorTags.Data, "Data");
     GXDLMSTranslator.AddTag(list, TranslatorTags.InvokeId, "InvokeIdAndPriority");
     GXDLMSTranslator.AddTag(list, TranslatorTags.LongInvokeId, "LongInvokeIdAndPriority");
     GXDLMSTranslator.AddTag(list, TranslatorTags.DateTime, "DateTime");
     GXDLMSTranslator.AddTag(list, TranslatorTags.CurrentTime, "CurrentTime");
     GXDLMSTranslator.AddTag(list, TranslatorTags.Time, "DateTime");
     GXDLMSTranslator.AddTag(list, TranslatorTags.Reason, "Reason");
     GXDLMSTranslator.AddTag(list, TranslatorTags.NotificationBody, "NotificationBody");
     GXDLMSTranslator.AddTag(list, TranslatorTags.DataValue, "DataValue");
     GXDLMSTranslator.AddTag(list, TranslatorTags.CipheredService, "CipheredService");
     GXDLMSTranslator.AddTag(list, TranslatorTags.SystemTitle, "SystemTitle");
     GXDLMSTranslator.AddTag(list, TranslatorTags.DataBlock, "DataBlock");
     GXDLMSTranslator.AddTag(list, TranslatorTags.TransactionId, "TransactionId");
     GXDLMSTranslator.AddTag(list, TranslatorTags.OriginatorSystemTitle, "OriginatorSystemTitle");
     GXDLMSTranslator.AddTag(list, TranslatorTags.RecipientSystemTitle, "RecipientSystemTitle");
     GXDLMSTranslator.AddTag(list, TranslatorTags.OtherInformation, "OtherInformation");
     GXDLMSTranslator.AddTag(list, TranslatorTags.KeyInfo, "KeyInfo");
     GXDLMSTranslator.AddTag(list, TranslatorTags.CipheredContent, "CipheredContent");
     GXDLMSTranslator.AddTag(list, TranslatorTags.AgreedKey, "AgreedKey");
     GXDLMSTranslator.AddTag(list, TranslatorTags.KeyParameters, "KeyParameters");
     GXDLMSTranslator.AddTag(list, TranslatorTags.KeyCipheredData, "KeyCipheredData");
     GXDLMSTranslator.AddTag(list, TranslatorTags.AttributeValue, "AttributeValue");
     GXDLMSTranslator.AddTag(list, TranslatorTags.MaxInfoRX, "MaxInfoRX");
     GXDLMSTranslator.AddTag(list, TranslatorTags.MaxInfoTX, "MaxInfoTX");
     GXDLMSTranslator.AddTag(list, TranslatorTags.WindowSizeRX, "WindowSizeRX");
     GXDLMSTranslator.AddTag(list, TranslatorTags.WindowSizeTX, "WindowSizeTX");
     GXDLMSTranslator.AddTag(list, TranslatorTags.ValueList, "ValueList");
     GXDLMSTranslator.AddTag(list, TranslatorTags.DataAccessResult, "DataAccessResult");
     GXDLMSTranslator.AddTag(list, TranslatorTags.BlockControl, "BlockControl");
     GXDLMSTranslator.AddTag(list, TranslatorTags.BlockNumberAck, "BlockNumberAck");
     GXDLMSTranslator.AddTag(list, TranslatorTags.BlockData, "BlockData");
 }
Exemplo n.º 17
0
 public override string ToString()
 {
     return(GXDLMSTranslator.ToHex(Name) + " " + Start.ToFormatString() + " " + GXDLMSTranslator.ToHex(WeekName));
 }
Exemplo n.º 18
0
        static public object ChangeType(object value, DataType type, CultureInfo cultureInfo)
        {
            object ret;

            if (type == DataType.OctetString)
            {
                if (value is byte[])
                {
                    ret = value;
                }
                else
                {
                    ret = GXDLMSTranslator.HexToBytes((string)value);
                }
            }
            else if (type == DataType.DateTime)
            {
                if (value is GXDateTime)
                {
                    ret = value;
                }
                else
                {
                    ret = new GXDateTime((string)value, CultureInfo.InvariantCulture);
                }
            }
            else if (type == DataType.Date)
            {
                if (value is GXDateTime)
                {
                    ret = value;
                }
                else
                {
                    ret = new GXDate((string)value, CultureInfo.InvariantCulture);
                }
            }
            else if (type == DataType.Time)
            {
                if (value is GXDateTime)
                {
                    ret = value;
                }
                else
                {
                    ret = new GXTime((string)value, CultureInfo.InvariantCulture);
                }
            }
            else if (type == DataType.Enum)
            {
                if (value is GXEnum)
                {
                    ret = value;
                }
                else
                {
                    ret = new GXEnum((byte)Convert.ChangeType(value, typeof(byte)));
                }
            }
            else if (type == DataType.Structure || type == DataType.Array)
            {
                ret = GXDLMSTranslator.XmlToValue((string)value);
            }
            else if (type == DataType.BitString)
            {
                ret = new GXBitString((string)value);
            }
            else if (type == DataType.None && value is string && string.IsNullOrEmpty((string)value))
            {
                ret = null;
            }
            else
            {
                ret = Convert.ChangeType(value, GXDLMSConverter.GetDataType(type), cultureInfo);
            }
            return(ret);
        }
        /// <summary>
        /// Get LN tags.
        /// </summary>
        /// <param name="type"></param>
        /// <param name="list"></param>
        internal static void GetLnTags(TranslatorOutputType type, SortedList <int, string> list)
        {
            GXDLMSTranslator.AddTag(list, Command.GetRequest, "get-request");
            list.Add((int)Command.GetRequest << 8 | (int)GetCommandType.Normal,
                     "get-request-normal");
            list.Add((int)Command.GetRequest << 8 | (int)GetCommandType.NextDataBlock,
                     "get-request-next");
            list.Add((int)Command.GetRequest << 8 | (int)GetCommandType.WithList,
                     "get-request-with-list");
            GXDLMSTranslator.AddTag(list, Command.SetRequest, "set-request");
            list.Add((int)Command.SetRequest << 8 | (int)SetRequestType.Normal,
                     "set-request-normal");
            list.Add((int)Command.SetRequest << 8 | (int)SetRequestType.FirstDataBlock,
                     "set-request-first-data-block");
            list.Add((int)Command.SetRequest << 8 | (int)SetRequestType.WithDataBlock,
                     "set-request-with-data-block");
            list.Add((int)Command.SetRequest << 8 | (int)SetRequestType.WithList,
                     "set-request-with-list");
            GXDLMSTranslator.AddTag(list, Command.MethodRequest,
                                    "action-request");
            list.Add((int)Command.MethodRequest << 8 | (int)ActionRequestType.Normal,
                     "action-request-normal");
            list.Add((int)Command.MethodRequest << 8 | (int)ActionRequestType.NextBlock,
                     "ActionRequestForNextDataBlock");
            list.Add((int)Command.MethodRequest << 8 | (int)ActionRequestType.WithList,
                     "action-request-with-list");
            GXDLMSTranslator.AddTag(list, Command.MethodResponse,
                                    "action-response");
            list.Add((int)Command.MethodResponse << 8 | (int)ActionResponseType.Normal,
                     "action-response-normal");
            list.Add((int)Command.MethodResponse << 8 | (int)ActionResponseType.WithFirstBlock,
                     "action-response-with-first-block");
            list.Add((int)Command.MethodResponse << 8 | (int)ActionResponseType.WithList,
                     "action-response-with-list");
            list.Add((int)TranslatorTags.SingleResponse, "single-response");
            list.Add((int)Command.DataNotification, "data-notification");
            GXDLMSTranslator.AddTag(list, Command.GetResponse, "get-response");
            list.Add((int)Command.GetResponse << 8 | (int)GetCommandType.Normal,
                     "get-response-normal");
            list.Add((int)Command.GetResponse << 8 | (int)GetCommandType.NextDataBlock,
                     "get-response-with-data-block");
            list.Add((int)Command.GetResponse << 8 | (int)GetCommandType.WithList,
                     "get-response-with-list");
            GXDLMSTranslator.AddTag(list, Command.SetResponse, "set-response");
            list.Add((int)Command.SetResponse << 8 | (int)SetResponseType.Normal,
                     "set-response-normal");
            list.Add((int)Command.SetResponse << 8 | (int)SetResponseType.DataBlock,
                     "set-response-data-block");
            list.Add((int)Command.SetResponse << 8 | (int)SetResponseType.LastDataBlock,
                     "set-response-with-last-data-block");
            list.Add((int)Command.SetResponse << 8 | (int)SetResponseType.WithList,
                     "set-response-with-list");

            GXDLMSTranslator.AddTag(list, Command.AccessRequest,
                                    "access-request");
            list.Add((int)Command.AccessRequest << 8 | (int)AccessServiceCommandType.Get,
                     "access-request-get");
            list.Add((int)Command.AccessRequest << 8 | (int)AccessServiceCommandType.Set,
                     "access-request-set");
            list.Add((int)
                     Command.AccessRequest << 8 | (int)AccessServiceCommandType.Action,
                     "access-request-action");
            GXDLMSTranslator.AddTag(list, Command.AccessResponse,
                                    "access-response");
            list.Add((int)Command.AccessResponse << 8 | (int)AccessServiceCommandType.Get,
                     "access-response-get");
            list.Add((int)Command.AccessResponse << 8 | (int)AccessServiceCommandType.Set,
                     "access-response-set");
            list.Add((int)Command.AccessResponse << 8 | (int)AccessServiceCommandType.Action,
                     "access-response-action");

            list.Add((int)TranslatorTags.AccessRequestBody, "access-request-body");
            list.Add((int)TranslatorTags.ListOfAccessRequestSpecification,
                     "access-request-specification");
            list.Add((int)TranslatorTags.AccessRequestSpecification,
                     "Access-Request-Specification");
            list.Add((int)TranslatorTags.AccessRequestListOfData,
                     "access-request-list-of-data");

            list.Add((int)TranslatorTags.AccessResponseBody, "access-response-body");
            list.Add((int)TranslatorTags.ListOfAccessResponseSpecification,
                     "access-response-specification");
            list.Add((int)TranslatorTags.AccessResponseSpecification,
                     "Access-Response-Specification");
            list.Add((int)TranslatorTags.AccessResponseListOfData,
                     "access-response-list-of-data");

            list.Add((int)TranslatorTags.Service, "service");
            list.Add((int)TranslatorTags.ServiceError, "service-error");
        }
Exemplo n.º 20
0
        /// <summary>
        /// Import server settings and COSEM objects from GXDLMSDirector trace.
        /// </summary>
        /// <param name="server">Server where settings are updated.</param>
        /// <param name="data">GXDLMSDirector trace in byte array.</param>
        public static void Import(GXDLMSServer server, byte[] data)
        {
            GXDLMSTranslator translator = new GXDLMSTranslator(TranslatorOutputType.StandardXml);

            translator.CompletePdu      = true;
            translator.PduOnly          = true;
            translator.OmitXmlNameSpace = translator.OmitXmlDeclaration = true;
            XmlDocument           doc      = new XmlDocument();
            List <ValueEventArgs> targets  = new List <ValueEventArgs>();
            GXDLMSSettings        settings = new GXDLMSSettings(true);
            GXByteBuffer          pdu      = new GXByteBuffer();
            GXByteBuffer          bb       = new GXByteBuffer(data);

            server.InterfaceType = GXDLMSTranslator.GetDlmsFraming(bb);
            bool         lastBlock = true;
            GXByteBuffer val       = new DLMS.GXByteBuffer();

            while (translator.FindNextFrame(bb, pdu, server.InterfaceType))
            {
                string xml = translator.MessageToXml(bb);
                if (xml != "")
                {
                    doc.LoadXml(xml);
                    foreach (XmlNode node in doc.ChildNodes[doc.ChildNodes.Count - 1].ChildNodes)
                    {
                        string name = doc.ChildNodes[doc.ChildNodes.Count - 1].Name;
                        if (name == "Ua" || name == "aarq" || name == "aare")
                        {
                            break;
                        }
                        else if (name == "get-request")
                        {
                            server.UseLogicalNameReferencing = true;
                            GetLN(settings.Objects, targets, node.ChildNodes);
                        }
                        else if (name == "readRequest")
                        {
                            List <short> items = GetSN(node.ChildNodes);

                            server.UseLogicalNameReferencing = false;
                            foreach (short it in items)
                            {
                                GXSNInfo i = GXDLMSSNCommandHandler.FindSNObject(settings.Objects, Convert.ToUInt16((it) & 0xFFFF));
                                targets.Add(new ValueEventArgs(i.Item, i.Index, 0, null));
                            }
                        }
                        else if (name == "readResponse" ||
                                 name == "get-response")
                        {
                            if (targets != null)
                            {
                                List <string> items;
                                if (server.UseLogicalNameReferencing)
                                {
                                    items = GetLNValues(doc.ChildNodes[doc.ChildNodes.Count - 1].ChildNodes);
                                }
                                else
                                {
                                    items = GetSNValues(doc.ChildNodes[doc.ChildNodes.Count - 1].ChildNodes);
                                }

                                int pos = 0;
                                foreach (string it in items)
                                {
                                    if ("read-write-denied".Equals(it) ||
                                        "scope-of-access-violated".Equals(it) ||
                                        "object-unavailable".Equals(it))
                                    {
                                        ValueEventArgs ve = targets[pos];
                                        ve.Target.SetAccess(ve.Index, AccessMode.NoAccess);
                                        continue;
                                    }
                                    try
                                    {
                                        if (server.UseLogicalNameReferencing)
                                        {
                                            lastBlock = IsLastBlock(doc.ChildNodes[doc.ChildNodes.Count - 1].ChildNodes);
                                        }
                                        val.Set(translator.XmlToData(it));
                                        if (lastBlock)
                                        {
                                            if (settings.Objects.Count == 0)
                                            {
                                                GXDLMSClient c = new GXDLMSClient();
                                                c.UseLogicalNameReferencing = server.UseLogicalNameReferencing;
                                                settings.Objects            = c.ParseObjects(val, true);
                                                //Update OBIS code description.
                                                GXDLMSConverter converter = new GXDLMSConverter();
                                                converter.UpdateOBISCodeInformation(settings.Objects);
                                            }
                                            else
                                            {
                                                ValueEventArgs ve   = targets[pos];
                                                GXDataInfo     info = new GXDataInfo();
                                                ve.Value = GXCommon.GetData(server.Settings, val, info);
                                                if (ve.Value is byte[])
                                                {
                                                    DataType tp = ve.Target.GetUIDataType(ve.Index);
                                                    if (tp != DataType.None)
                                                    {
                                                        ve.Value = GXDLMSClient.ChangeType((byte[])ve.Value, tp, false);
                                                        ve.Target.SetDataType(ve.Index, DataType.OctetString);
                                                    }
                                                }
                                                ((IGXDLMSBase)ve.Target).SetValue(settings, ve);
                                            }
                                            val.Clear();
                                        }
                                    }
                                    catch (Exception)
                                    {
                                        ValueEventArgs ve = targets[pos];
                                        ve.Target.SetAccess(ve.Index, AccessMode.NoAccess);
                                    }
                                    ++pos;
                                }
                                if (lastBlock)
                                {
                                    targets.Clear();
                                    break;
                                }
                            }
                        }
                    }
                }
            }
            server.Items.Clear();
            server.Items.AddRange(settings.Objects);
        }
 /// <summary>
 /// Get translator tags.
 /// </summary>
 /// <param name="type"></param>
 /// <param name="list"></param>
 internal static void GetTranslatorTags(TranslatorOutputType type, SortedList <int, string> list)
 {
     GXDLMSTranslator.AddTag(list, TranslatorTags.Wrapper, "Wrapper");
     GXDLMSTranslator.AddTag(list, TranslatorTags.Hdlc, "Hdlc");
     GXDLMSTranslator.AddTag(list, TranslatorTags.PduDlms, "xDLMS-APDU");
     GXDLMSTranslator.AddTag(list, TranslatorTags.PduCse, "aCSE-APDU");
     GXDLMSTranslator.AddTag(list, TranslatorTags.TargetAddress,
                             "TargetAddress");
     GXDLMSTranslator.AddTag(list, TranslatorTags.SourceAddress,
                             "SourceAddress");
     GXDLMSTranslator.AddTag(list,
                             TranslatorTags.ListOfVariableAccessSpecification,
                             "variable-access-specification");
     GXDLMSTranslator.AddTag(list, TranslatorTags.ListOfData,
                             "list-of-data");
     GXDLMSTranslator.AddTag(list, TranslatorTags.Success, "Success");
     GXDLMSTranslator.AddTag(list, TranslatorTags.DataAccessError,
                             "data-access-result");
     GXDLMSTranslator.AddTag(list, TranslatorTags.AttributeDescriptor,
                             "cosem-attribute-descriptor");
     GXDLMSTranslator.AddTag(list, TranslatorTags.ClassId, "class-id");
     GXDLMSTranslator.AddTag(list, TranslatorTags.InstanceId,
                             "instance-id");
     GXDLMSTranslator.AddTag(list, TranslatorTags.AttributeId,
                             "attribute-id");
     GXDLMSTranslator.AddTag(list,
                             TranslatorTags.MethodInvocationParameters,
                             "method-invocation-parameters");
     GXDLMSTranslator.AddTag(list, TranslatorTags.Selector, "selector");
     GXDLMSTranslator.AddTag(list, TranslatorTags.Parameter, "parameter");
     GXDLMSTranslator.AddTag(list, TranslatorTags.LastBlock, "LastBlock");
     GXDLMSTranslator.AddTag(list, TranslatorTags.BlockNumber,
                             "block-number");
     GXDLMSTranslator.AddTag(list, TranslatorTags.RawData, "RawData");
     GXDLMSTranslator.AddTag(list, TranslatorTags.MethodDescriptor,
                             "cosem-method-descriptor");
     GXDLMSTranslator.AddTag(list, TranslatorTags.MethodId, "method-id");
     GXDLMSTranslator.AddTag(list, TranslatorTags.Result, "result");
     GXDLMSTranslator.AddTag(list, TranslatorTags.ReturnParameters,
                             "return-parameters");
     GXDLMSTranslator.AddTag(list, TranslatorTags.AccessSelection,
                             "access-selection");
     GXDLMSTranslator.AddTag(list, TranslatorTags.Value, "value");
     GXDLMSTranslator.AddTag(list, TranslatorTags.AccessSelector,
                             "access-selector");
     GXDLMSTranslator.AddTag(list, TranslatorTags.AccessParameters,
                             "access-parameters");
     GXDLMSTranslator.AddTag(list, TranslatorTags.AttributeDescriptorList,
                             "AttributeDescriptorList");
     GXDLMSTranslator.AddTag(list,
                             TranslatorTags.AttributeDescriptorWithSelection,
                             "AttributeDescriptorWithSelection");
     GXDLMSTranslator.AddTag(list, TranslatorTags.ReadDataBlockAccess,
                             "ReadDataBlockAccess");
     GXDLMSTranslator.AddTag(list, TranslatorTags.WriteDataBlockAccess,
                             "WriteDataBlockAccess");
     GXDLMSTranslator.AddTag(list, TranslatorTags.Data, "data");
     GXDLMSTranslator.AddTag(list, TranslatorTags.InvokeId,
                             "invoke-id-and-priority");
     GXDLMSTranslator.AddTag(list, TranslatorTags.LongInvokeId,
                             "long-invoke-id-and-priority");
     GXDLMSTranslator.AddTag(list, TranslatorTags.DateTime, "date-time");
     GXDLMSTranslator.AddTag(list, TranslatorTags.CurrentTime, "current-time");
     GXDLMSTranslator.AddTag(list, TranslatorTags.Time, "time");
     GXDLMSTranslator.AddTag(list, TranslatorTags.Reason, "Reason");
     GXDLMSTranslator.AddTag(list,
                             TranslatorTags.VariableAccessSpecification,
                             "Variable-Access-Specification");
     GXDLMSTranslator.AddTag(list, TranslatorTags.Choice, "CHOICE");
     GXDLMSTranslator.AddTag(list, TranslatorTags.NotificationBody, "notification-body");
     GXDLMSTranslator.AddTag(list, TranslatorTags.DataValue, "data-value");
     GXDLMSTranslator.AddTag(list, TranslatorTags.InitiateError, "initiateError");
     GXDLMSTranslator.AddTag(list, TranslatorTags.CipheredService, "ciphered-content");
     GXDLMSTranslator.AddTag(list, TranslatorTags.SystemTitle, "system-title");
     GXDLMSTranslator.AddTag(list, TranslatorTags.DataBlock, "DataBlock");
     GXDLMSTranslator.AddTag(list, TranslatorTags.TransactionId, "TransactionId");
     GXDLMSTranslator.AddTag(list, TranslatorTags.OriginatorSystemTitle, "OriginatorSystemTitle");
     GXDLMSTranslator.AddTag(list, TranslatorTags.RecipientSystemTitle, "RecipientSystemTitle");
     GXDLMSTranslator.AddTag(list, TranslatorTags.OtherInformation, "OtherInformation");
     GXDLMSTranslator.AddTag(list, TranslatorTags.KeyInfo, "KeyInfo");
     GXDLMSTranslator.AddTag(list, TranslatorTags.CipheredContent, "CipheredContent");
     GXDLMSTranslator.AddTag(list, TranslatorTags.AgreedKey, "AgreedKey");
     GXDLMSTranslator.AddTag(list, TranslatorTags.KeyParameters, "KeyParameters");
     GXDLMSTranslator.AddTag(list, TranslatorTags.KeyCipheredData, "KeyCipheredData");
     GXDLMSTranslator.AddTag(list, TranslatorTags.AttributeValue, "attribute-value");
 }
 void IGXDLMSBase.Save(GXXmlWriter writer)
 {
     writer.WriteElementString("SystemTitle", GXDLMSTranslator.ToHex(SystemTitle));
     writer.WriteElementString("MacAddress", MacAddress);
     writer.WriteElementString("LSapSelector", LSapSelector);
 }
        /// <summary>
        /// Get general tags.
        /// </summary>
        /// <param name="type"></param>
        /// <param name="list"></param>
        internal static void GetGeneralTags(TranslatorOutputType type, SortedList <int, string> list)
        {
            GXDLMSTranslator.AddTag(list, Command.Snrm, "Snrm");
            GXDLMSTranslator.AddTag(list, Command.UnacceptableFrame, "UnacceptableFrame");
            GXDLMSTranslator.AddTag(list, Command.DisconnectMode, "DisconnectMode");
            GXDLMSTranslator.AddTag(list, Command.Ua, "Ua");
            GXDLMSTranslator.AddTag(list, Command.Aarq, "aarq");
            GXDLMSTranslator.AddTag(list, Command.Aare, "aare");
            GXDLMSTranslator.AddTag(list,
                                    TranslatorGeneralTags.ApplicationContextName,
                                    "application-context-name");
            GXDLMSTranslator.AddTag(list, Command.InitiateResponse,
                                    "InitiateResponse");
            GXDLMSTranslator.AddTag(list, Command.InitiateRequest,
                                    "user-information");
            GXDLMSTranslator.AddTag(list,
                                    TranslatorGeneralTags.NegotiatedQualityOfService,
                                    "negotiated-quality-of-service");
            GXDLMSTranslator.AddTag(list,
                                    TranslatorGeneralTags.ProposedQualityOfService,
                                    "proposed-quality-of-service");
            GXDLMSTranslator.AddTag(list,
                                    TranslatorGeneralTags.ProposedDlmsVersionNumber,
                                    "proposed-dlms-version-number");
            GXDLMSTranslator.AddTag(list,
                                    TranslatorGeneralTags.ProposedMaxPduSize,
                                    "client-max-receive-pdu-size");
            GXDLMSTranslator.AddTag(list,
                                    TranslatorGeneralTags.ProposedConformance,
                                    "proposed-conformance");
            GXDLMSTranslator.AddTag(list, TranslatorGeneralTags.VaaName,
                                    "VaaName");
            GXDLMSTranslator.AddTag(list,
                                    TranslatorGeneralTags.NegotiatedConformance,
                                    "NegotiatedConformance");
            GXDLMSTranslator.AddTag(list,
                                    TranslatorGeneralTags.NegotiatedDlmsVersionNumber,
                                    "NegotiatedDlmsVersionNumber");
            GXDLMSTranslator.AddTag(list,
                                    TranslatorGeneralTags.NegotiatedMaxPduSize,
                                    "NegotiatedMaxPduSize");
            GXDLMSTranslator.AddTag(list, TranslatorGeneralTags.ConformanceBit,
                                    "ConformanceBit");
            GXDLMSTranslator.AddTag(list,
                                    TranslatorGeneralTags.SenderACSERequirements,
                                    "sender-acse-requirements");
            GXDLMSTranslator.AddTag(list,
                                    TranslatorGeneralTags.ResponderACSERequirement,
                                    "responder-acse-requirements");
            GXDLMSTranslator.AddTag(list,
                                    TranslatorGeneralTags.RespondingMechanismName,
                                    "mechanism-name");
            GXDLMSTranslator.AddTag(list,
                                    TranslatorGeneralTags.CallingMechanismName,
                                    "mechanism-name");
            GXDLMSTranslator.AddTag(list,
                                    TranslatorGeneralTags.CallingAuthentication,
                                    "calling-authentication-value");
            GXDLMSTranslator.AddTag(list,
                                    TranslatorGeneralTags.RespondingAuthentication,
                                    "responding-authentication-value");
            GXDLMSTranslator.AddTag(list, Command.ReleaseRequest,
                                    "ReleaseRequest");
            GXDLMSTranslator.AddTag(list, Command.ReleaseResponse,
                                    "ReleaseResponse");
            GXDLMSTranslator.AddTag(list, Command.DisconnectRequest, "Disc");
            GXDLMSTranslator.AddTag(list, TranslatorGeneralTags.AssociationResult,
                                    "result");
            GXDLMSTranslator.AddTag(list,
                                    TranslatorGeneralTags.ResultSourceDiagnostic,
                                    "result-source-diagnostic");
            GXDLMSTranslator.AddTag(list, TranslatorGeneralTags.ACSEServiceUser,
                                    "acse-service-user");
            GXDLMSTranslator.AddTag(list, TranslatorGeneralTags.CallingAPTitle,
                                    "CallingAPTitle");
            GXDLMSTranslator.AddTag(list, TranslatorGeneralTags.RespondingAPTitle,
                                    "RespondingAPTitle");
            GXDLMSTranslator.AddTag(list, TranslatorGeneralTags.CharString,
                                    "charstring");

            GXDLMSTranslator.AddTag(list, Command.ConfirmedServiceError, "confirmedServiceError");
            GXDLMSTranslator.AddTag(list, Command.InformationReport, "InformationReport");
            GXDLMSTranslator.AddTag(list, Command.EventNotification, "event-notification-request");
        }
Exemplo n.º 24
0
        /// <summary>
        /// Read data from the meter.
        /// </summary>
        private static void ReadMeter(object parameter)
        {
            GXDLMSReader reader = null;

            System.Net.Http.HttpClient httpClient = Helpers.client;
            using (GXNet media = (GXNet)parameter)
            {
                try
                {
                    var config = new ConfigurationBuilder()
                                 .SetBasePath(Directory.GetCurrentDirectory())
                                 .AddJsonFile("appsettings.json", optional: true)
                                 .Build();
                    ListenerOptions        listener = config.GetSection("Listener").Get <ListenerOptions>();
                    GXDLMSObjectCollection objects  = new GXDLMSObjectCollection();
                    GXDLMSSecureClient     client   = new GXDLMSSecureClient(listener.UseLogicalNameReferencing, listener.ClientAddress, listener.ServerAddress, (Authentication)listener.Authentication, listener.Password, (InterfaceType)listener.Interface);
                    reader = new GXDLMSReader(client, media, _logger);
                    GXDLMSData ldn = new GXDLMSData("0.0.42.0.0.255");
                    ldn.SetUIDataType(2, DataType.String);
                    reader.InitializeConnection();
                    reader.Read(ldn, 2);
                    Console.WriteLine("Meter connected: " + ldn.Value);
                    //Find device.
                    GXDevice            dev  = null;
                    ListDevicesResponse devs = null;
                    {
                        using (System.Net.Http.HttpResponseMessage response = httpClient.PostAsJsonAsync(Startup.ServerAddress + "/api/device/ListDevices", new ListDevices()
                        {
                            Name = (string)ldn.Value
                        }).Result)
                        {
                            Helpers.CheckStatus(response);
                            devs = response.Content.ReadAsAsync <ListDevicesResponse>().Result;
                        }
                        //If device is unknown.
                        if (devs.Devices.Length == 0)
                        {
                            if (listener.DefaultDeviceTemplate == 0)
                            {
                                string str = "Unknown Meter try to connect to the Gurux.DLMS.AMI server: " + ldn.Value;
                                Console.WriteLine(str);
                                AddSystemError info = new AddSystemError();
                                info.Error = new GXSystemError()
                                {
                                    Error = str
                                };
                                using (System.Net.Http.HttpResponseMessage response = httpClient.PostAsJsonAsync(Startup.ServerAddress + "/api/SystemError/AddSystemError", info).Result)
                                {
                                    Helpers.CheckStatus(response);
                                }
                                return;
                            }
                            ListDeviceTemplates lt = new ListDeviceTemplates()
                            {
                                Ids = new UInt64[] { listener.DefaultDeviceTemplate }
                            };
                            using (System.Net.Http.HttpResponseMessage response = httpClient.PostAsJsonAsync(Startup.ServerAddress + "/api/template/ListDeviceTemplates", lt).Result)
                            {
                                Helpers.CheckStatus(response);
                                ListDeviceTemplatesResponse ret = response.Content.ReadAsAsync <ListDeviceTemplatesResponse>().Result;
                                if (ret.Devices.Length != 1)
                                {
                                    throw new Exception("DefaultDeviceTemplate value is invalid: " + listener.DefaultDeviceTemplate);
                                }
                                dev = new GXDevice();
                                GXDevice.Copy(dev, ret.Devices[0]);
                                dev.Name         = Convert.ToString(ldn.Value);
                                dev.TemplateId   = listener.DefaultDeviceTemplate;
                                dev.Manufacturer = ret.Devices[0].Name;
                            }
                            dev.Dynamic = true;
                            UpdateDevice update = new UpdateDevice();
                            update.Device = dev;
                            using (System.Net.Http.HttpResponseMessage response = httpClient.PostAsJsonAsync(Startup.ServerAddress + "/api/device/UpdateDevice", update).Result)
                            {
                                Helpers.CheckStatus(response);
                                UpdateDeviceResponse r = response.Content.ReadAsAsync <UpdateDeviceResponse>().Result;
                                dev.Id = r.DeviceId;
                            }
                            using (System.Net.Http.HttpResponseMessage response = httpClient.PostAsJsonAsync(Startup.ServerAddress + "/api/device/ListDevices", new ListDevices()
                            {
                                Ids = new UInt64[] { dev.Id }
                            }).Result)
                            {
                                Helpers.CheckStatus(response);
                                devs = response.Content.ReadAsAsync <ListDevicesResponse>().Result;
                            }
                        }
                        else if (devs.Devices.Length != 1)
                        {
                            throw new Exception("There are multiple devices with same name: " + ldn.Value);
                        }
                        else
                        {
                            dev = devs.Devices[0];
                            if (dev.Security != Security.None)
                            {
                                Console.WriteLine("Reading frame counter.");
                                GXDLMSData fc = new GXDLMSData(listener.InvocationCounter);
                                reader.Read(fc, 2);
                                dev.InvocationCounter = 1 + Convert.ToUInt32(fc.Value);
                                Console.WriteLine("Device ID: " + dev.Id + " LDN: " + (string)ldn.Value);
                                Console.WriteLine("Frame counter: " + dev.FrameCounter);
                            }
                            GetNextTaskResponse ret;
                            using (System.Net.Http.HttpResponseMessage response = httpClient.PostAsJsonAsync(Startup.ServerAddress + "/api/task/GetNextTask", new GetNextTask()
                            {
                                Listener = true, DeviceId = dev.Id
                            }).Result)
                            {
                                Helpers.CheckStatus(response);
                                ret = response.Content.ReadAsAsync <GetNextTaskResponse>().Result;
                            }
                            if (ret.Tasks == null || ret.Tasks.Length == 0)
                            {
                                Console.WriteLine("No tasks to execute");
                            }
                            else
                            {
                                Console.WriteLine("Task count: " + ret.Tasks.Length);
                                if (client.ClientAddress != dev.ClientAddress || dev.Security != Security.None)
                                {
                                    reader.Release();
                                    reader.Disconnect();
                                    client = new GXDLMSSecureClient(dev.UseLogicalNameReferencing, dev.ClientAddress, dev.PhysicalAddress, (Authentication)dev.Authentication, dev.Password, dev.InterfaceType);
                                    client.UseUtc2NormalTime = dev.UtcTimeZone;
                                    client.Standard          = (Standard)dev.Standard;
                                    if (dev.Conformance != 0)
                                    {
                                        client.ProposedConformance = (Conformance)dev.Conformance;
                                    }
                                    client.Priority                    = dev.Priority;
                                    client.ServiceClass                = dev.ServiceClass;
                                    client.Ciphering.SystemTitle       = GXCommon.HexToBytes(dev.ClientSystemTitle);
                                    client.Ciphering.BlockCipherKey    = GXCommon.HexToBytes(dev.BlockCipherKey);
                                    client.Ciphering.AuthenticationKey = GXCommon.HexToBytes(dev.AuthenticationKey);
                                    client.ServerSystemTitle           = GXCommon.HexToBytes(dev.DeviceSystemTitle);
                                    client.Ciphering.InvocationCounter = dev.InvocationCounter;
                                    client.Ciphering.Security          = (Security)dev.Security;
                                    reader = new GXDLMSReader(client, media, _logger);
                                    reader.InitializeConnection();
                                }
                                List <GXValue> values = new List <GXValue>();
                                foreach (GXTask task in ret.Tasks)
                                {
                                    GXDLMSObject obj = GXDLMSClient.CreateObject((ObjectType)task.Object.ObjectType);
                                    obj.LogicalName = task.Object.LogicalName;
                                    try
                                    {
                                        if (task.TaskType == TaskType.Write)
                                        {
                                            if (obj.LogicalName == "0.0.1.1.0.255" && task.Index == 2)
                                            {
                                                client.UpdateValue(obj, task.Index, GXDateTime.ToUnixTime(DateTime.UtcNow));
                                            }
                                            else
                                            {
                                                client.UpdateValue(obj, task.Index, GXDLMSTranslator.XmlToValue(task.Data));
                                            }
                                            reader.Write(obj, task.Index);
                                        }
                                        else if (task.TaskType == TaskType.Action)
                                        {
                                            reader.Method(obj, task.Index, GXDLMSTranslator.XmlToValue(task.Data), DataType.None);
                                        }
                                        else if (task.TaskType == TaskType.Read)
                                        {
                                            //Reading the meter.
                                            if (task.Object.Attributes[0].DataType != 0)
                                            {
                                                obj.SetDataType(task.Index, (DataType)task.Object.Attributes[0].DataType);
                                            }
                                            if (task.Object.Attributes[0].UIDataType != 0)
                                            {
                                                obj.SetUIDataType(task.Index, (DataType)task.Object.Attributes[0].UIDataType);
                                            }
                                            Reader.Reader.Read(null, httpClient, reader, task, media, obj);
                                            if (task.Object.Attributes[0].DataType == 0)
                                            {
                                                task.Object.Attributes[0].DataType = (int)obj.GetDataType(task.Index);
                                                if (task.Object.Attributes[0].UIDataType == 0)
                                                {
                                                    task.Object.Attributes[0].UIDataType = (int)obj.GetUIDataType(task.Index);
                                                }
                                                UpdateDatatype u = new UpdateDatatype()
                                                {
                                                    Items = new GXAttribute[] { task.Object.Attributes[0] }
                                                };
                                                using (System.Net.Http.HttpResponseMessage response = httpClient.PostAsJsonAsync(Startup.ServerAddress + "/api/Object/UpdateDatatype", u).Result)
                                                {
                                                    Helpers.CheckStatus(response);
                                                }
                                            }
                                        }
                                    }
                                    catch (Exception ex)
                                    {
                                        task.Result = ex.Message;
                                        AddError error = new AddError();
                                        error.Error = new GXError()
                                        {
                                            DeviceId = dev.Id,
                                            Error    = "Failed to " + task.TaskType + " " + task.Object.LogicalName + ":" + task.Index + ". " + ex.Message
                                        };
                                        using (System.Net.Http.HttpResponseMessage response = httpClient.PostAsJsonAsync(Startup.ServerAddress + "/api/error/AddError", error).Result)
                                        {
                                            Helpers.CheckStatus(response);
                                            response.Content.ReadAsAsync <AddErrorResponse>();
                                        }
                                    }
                                    using (System.Net.Http.HttpResponseMessage response = httpClient.PostAsJsonAsync(Startup.ServerAddress + "/api/task/TaskReady", new TaskReady()
                                    {
                                        Tasks = new GXTask[] { task }
                                    }).Result)
                                    {
                                        Helpers.CheckStatus(response);
                                    }
                                }
                            }
                        }
                    }
                }
                catch (Exception ex)
                {
                    try
                    {
                        AddSystemError info = new AddSystemError();
                        info.Error = new GXSystemError()
                        {
                            Error = ex.Message
                        };
                        using (System.Net.Http.HttpResponseMessage response = httpClient.PostAsJsonAsync(Startup.ServerAddress + "/api/SystemError/AddSystemError", info).Result)
                        {
                            Helpers.CheckStatus(response);
                        }
                    }
                    catch (Exception ex2)
                    {
                    }
                }
                finally
                {
                    if (reader != null)
                    {
                        reader.Close();
                    }
                }
            }
        }
Exemplo n.º 25
0
        /// <summary>
        /// Client has send data.
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        void OnReceived(object sender, Gurux.Common.ReceiveEventArgs e)
        {
            try
            {
                lock (this)
                {
                    if (trace)
                    {
                        Console.WriteLine("<- " + Gurux.Common.GXCommon.ToHex((byte[])e.Data, true));
                    }
                    reply.Set((byte[])e.Data);
                    //Example handles only notify messages.
                    GXReplyData data = new GXReplyData();
                    client.GetData(reply, data, notify);
                    // If all data is received.
                    if (notify.IsComplete && !notify.IsMoreData)
                    {
                        try
                        {
                            //Show data as XML.
                            string           xml;
                            GXDLMSTranslator t = new GXDLMSTranslator(TranslatorOutputType.SimpleXml);
                            t.DataToXml(notify.Data, out xml);
                            Console.WriteLine(xml);

                            // Print received data.
                            PrintData(notify.Value, 0);

                            //Example is sending list of push messages in first parameter.
                            if (notify.Value is List <object> )
                            {
                                List <object> tmp = notify.Value as List <object>;
                                List <KeyValuePair <GXDLMSObject, int> > objects = client.ParsePushObjects((List <object>)tmp[0]);
                                //Remove first item because it's not needed anymore.
                                objects.RemoveAt(0);
                                //Update clock.
                                int Valueindex = 1;
                                foreach (KeyValuePair <GXDLMSObject, int> it in objects)
                                {
                                    client.UpdateValue(it.Key, it.Value, tmp[Valueindex]);
                                    ++Valueindex;
                                    //Print value
                                    Console.WriteLine(it.Key.ObjectType + " " + it.Key.LogicalName + " " + it.Value + ":" + it.Key.GetValues()[it.Value - 1]);
                                }
                            }
                            Console.WriteLine("Server address:" + notify.ServerAddress + " Client Address:" + notify.ClientAddress);
                        }
                        catch (Exception ex)
                        {
                            Console.WriteLine(ex.Message);
                        }
                        finally
                        {
                            notify.Clear();
                        }
                    }
                }
            }
            catch (Exception ex)
            {
                Console.WriteLine(ex.Message);
            }
        }
Exemplo n.º 26
0
 /// <summary>
 /// Constructor
 /// </summary>
 /// <param name="type">XML type.</param>
 public GXDLMSXmlClient(TranslatorOutputType type)
 {
     translator                = new GXDLMSTranslator(type);
     translator.Hex            = false;
     UseLogicalNameReferencing = true;
 }
Exemplo n.º 27
0
 private void OKBtn_Click(object sender, EventArgs e)
 {
     try
     {
         //Check security settings.
         if ((Security)SecurityCB.SelectedItem != Security.None ||
             ((GXAuthentication)AuthenticationCB.SelectedItem).Type == Authentication.HighGMAC)
         {
             if (SystemTitleTB.Text.Trim().Length == 0)
             {
                 throw new ArgumentException("Invalid system title.");
             }
             if (AuthenticationKeyTB.Text.Trim().Length == 0)
             {
                 throw new ArgumentException("Invalid authentication key.");
             }
             if (BlockCipherKeyTB.Text.Trim().Length == 0)
             {
                 throw new ArgumentException("Invalid block cipher key.");
             }
         }
         GXServerAddress server = (GXServerAddress)ServerAddressTypeCB.SelectedItem;
         if (server.HDLCAddress == HDLCAddressType.SerialNumber && PhysicalServerAddressTB.Value == 0)
         {
             throw new Exception("Invalid Serial Number.");
         }
         GXManufacturer man = (GXManufacturer)ManufacturerCB.SelectedItem;
         Target.client.Authentication = ((GXAuthentication)this.AuthenticationCB.SelectedItem).Type;
         if (Target.client.Authentication != Authentication.None)
         {
             if (PasswordAsciiCb.Checked)
             {
                 Target.client.Password = ASCIIEncoding.ASCII.GetBytes(PasswordTB.Text);
             }
             else
             {
                 Target.client.Password = GXDLMSTranslator.HexToBytes(this.PasswordTB.Text);
             }
         }
         else
         {
             Target.client.Password = null;
         }
         Target.media = SelectedMedia;
         if (SelectedMedia is GXSerial)
         {
             if (this.SerialPortCB.Text.Length == 0)
             {
                 throw new Exception("Invalid serial port.");
             }
             ((GXSerial)SelectedMedia).PortName = this.SerialPortCB.Text;
         }
         else if (SelectedMedia is GXNet)
         {
             if (this.HostNameTB.Text.Length == 0)
             {
                 throw new Exception("Invalid host name.");
             }
             ((GXNet)SelectedMedia).HostName = this.HostNameTB.Text;
             int port;
             if (!Int32.TryParse(this.PortTB.Text, out port))
             {
                 throw new Exception("Invalid port number.");
             }
             ((GXNet)SelectedMedia).Port     = port;
             ((GXNet)SelectedMedia).Protocol = (NetworkType)NetProtocolCB.SelectedItem;
         }
         Properties.Settings.Default.Media                = SelectedMedia.MediaType;
         Properties.Settings.Default.MediaSettings        = SelectedMedia.Settings;
         Properties.Settings.Default.SelectedManufacturer = man.Identification;
         Properties.Settings.Default.WaitTime             = Convert.ToInt32(WaitTimeTB.Value);
         Target.WaitTime = Properties.Settings.Default.WaitTime * 1000;
         GXAuthentication authentication = (GXAuthentication)AuthenticationCB.SelectedItem;
         HDLCAddressType  HDLCAddressing = ((GXServerAddress)ServerAddressTypeCB.SelectedItem).HDLCAddress;
         Properties.Settings.Default.HDLCAddressing = (int)HDLCAddressing;
         Properties.Settings.Default.ClientAddress  = Target.client.ClientAddress = Convert.ToInt32(ClientAddTB.Value);
         if (HDLCAddressing == HDLCAddressType.SerialNumber)
         {
             int address = Convert.ToInt32(PhysicalServerAddressTB.Value);
             Properties.Settings.Default.PhysicalServerAddress = address;
             Target.client.ServerAddress = GXDLMSClient.GetServerAddress(address);
         }
         else if (HDLCAddressing == HDLCAddressType.Default)
         {
             Properties.Settings.Default.PhysicalServerAddress = Convert.ToInt32(PhysicalServerAddressTB.Value);
             Properties.Settings.Default.LogicalServerAddress  = Convert.ToInt32(LogicalServerAddressTB.Value);
             Target.client.ServerAddress = GXDLMSClient.GetServerAddress(Properties.Settings.Default.LogicalServerAddress,
                                                                         Properties.Settings.Default.PhysicalServerAddress);
         }
         Target.client.UseLogicalNameReferencing = this.UseLNCB.Checked;
         Target.iec = (StartProtocolType)this.StartProtocolCB.SelectedItem == StartProtocolType.IEC;
         Target.client.Ciphering.Security          = (Security)SecurityCB.SelectedItem;
         Target.client.Ciphering.SystemTitle       = GetAsHex(SystemTitleTB.Text, SystemTitleAsciiCb.Checked);
         Target.client.Ciphering.BlockCipherKey    = GetAsHex(BlockCipherKeyTB.Text, BlockCipherKeyAsciiCb.Checked);
         Target.client.Ciphering.AuthenticationKey = GetAsHex(AuthenticationKeyTB.Text, AuthenticationKeyAsciiCb.Checked);
         Target.client.Ciphering.InvocationCounter = UInt32.Parse(InvocationCounterTB.Text);
         Target.client.CtoSChallenge = GXCommon.HexToBytes(ChallengeTB.Text);
         if (man.UseIEC47)
         {
             Target.client.InterfaceType = InterfaceType.WRAPPER;
         }
         UpdateConformance();
         Properties.Settings.Default.Save();
     }
     catch (Exception Ex)
     {
         this.DialogResult = DialogResult.None;
         MessageBox.Show(this, Ex.Message, Properties.Resources.CTT, MessageBoxButtons.OK, MessageBoxIcon.Error);
     }
 }
Exemplo n.º 28
0
        /// <summary>
        /// Read DLMS Data from the device.
        /// </summary>
        /// <param name="data">Data to send.</param>
        /// <returns>Received data.</returns>
        public void ReadDLMSPacket(byte[] data, GXReplyData reply)
        {
            if (data == null && !reply.IsStreaming())
            {
                return;
            }
            GXReplyData notify = new GXReplyData();

            reply.Error = 0;
            object eop = (byte)0x7E;

            //In network connection terminator is not used.
            if (Client.InterfaceType == InterfaceType.WRAPPER)
            {
                eop = null;
            }
            int  pos       = 0;
            bool succeeded = false;
            ReceiveParameters <byte[]> p = new ReceiveParameters <byte[]>()
            {
                Eop      = eop,
                WaitTime = WaitTime,
            };

            if (eop == null)
            {
                p.Count = 8;
            }
            else
            {
                p.Count = 5;
            }
            GXByteBuffer rd = new GXByteBuffer();

            lock (Media.Synchronous)
            {
                while (!succeeded && pos != 3)
                {
                    if (!reply.IsStreaming())
                    {
                        WriteTrace("TX:\t" + DateTime.Now.ToLongTimeString() + "\t" + GXCommon.ToHex(data, true));
                        Media.Send(data, null);
                    }
                    succeeded = Media.Receive(p);
                    if (!succeeded)
                    {
                        if (++pos >= RetryCount)
                        {
                            throw new Exception("Failed to receive reply from the device in given time.");
                        }
                        //If Eop is not set read one byte at time.
                        if (p.Eop == null)
                        {
                            p.Count = 1;
                        }
                        //Try to read again...
                        System.Diagnostics.Debug.WriteLine("Data send failed. Try to resend " + pos.ToString() + "/3");
                    }
                }
                rd = new GXByteBuffer(p.Reply);
                try
                {
                    pos = 0;
                    //Loop until whole COSEM packet is received.
                    while (!Client.GetData(rd, reply, notify))
                    {
                        p.Reply = null;
                        if (notify.IsComplete && notify.Data.Data != null)
                        {
                            //Handle notify.
                            if (!notify.IsMoreData)
                            {
                                //Show received push message as XML.
                                string           xml;
                                GXDLMSTranslator t = new GXDLMSTranslator(TranslatorOutputType.SimpleXml);
                                t.DataToXml(notify.Data, out xml);
                                Console.WriteLine(xml);
                                notify.Clear();
                                continue;
                            }
                        }
                        if (p.Eop == null)
                        {
                            p.Count = Client.GetFrameSize(rd);
                        }
                        while (!Media.Receive(p))
                        {
                            if (++pos >= RetryCount)
                            {
                                throw new Exception("Failed to receive reply from the device in given time.");
                            }
                            //If echo.
                            if (rd == null || rd.Size == data.Length)
                            {
                                Media.Send(data, null);
                            }
                            //Try to read again...
                            System.Diagnostics.Debug.WriteLine("Data send failed. Try to resend " + pos.ToString() + "/3");
                        }
                        rd.Set(p.Reply);
                    }
                }
                catch (Exception ex)
                {
                    WriteTrace("RX:\t" + DateTime.Now.ToLongTimeString() + "\t" + rd);
                    throw ex;
                }
            }
            WriteTrace("RX:\t" + DateTime.Now.ToLongTimeString() + "\t" + rd);
            if (reply.Error != 0)
            {
                if (reply.Error == (short)ErrorCode.Rejected)
                {
                    Thread.Sleep(1000);
                    ReadDLMSPacket(data, reply);
                }
                else
                {
                    throw new GXDLMSException(reply.Error);
                }
            }
        }
 void IGXDLMSBase.Save(GXXmlWriter writer)
 {
     writer.WriteElementString("Secret", GXDLMSTranslator.ToHex(Secret));
     writer.WriteElementString("SecuritySetupReference", SecuritySetupReference);
 }
Exemplo n.º 30
0
        /// <summary>
        /// Import server settings and COSEM objects from GXDLMSDirector trace.
        /// </summary>
        /// <param name="server">Server where settings are updated.</param>
        /// <param name="data">GXDLMSDirector trace in byte array.</param>
        public static void Import(GXDLMSServer server, byte[] data)
        {
            GXDLMSTranslator translator = new GXDLMSTranslator(TranslatorOutputType.StandardXml);
            translator.CompletePdu = true;
            translator.PduOnly = true;
            XmlDocument doc = new XmlDocument();
            List<ValueEventArgs> targets = new List<ValueEventArgs>();
            GXDLMSSettings settings = new GXDLMSSettings(true);
            GXByteBuffer pdu = new GXByteBuffer();
            GXByteBuffer bb = new GXByteBuffer(data);
            server.InterfaceType = GXDLMSTranslator.GetDlmsFraming(bb);
            bool lastBlock = true;
            GXByteBuffer val = new DLMS.GXByteBuffer();
            while (translator.FindNextFrame(bb, pdu, server.InterfaceType))
            {
                String xml = translator.MessageToXml(bb);
                if (xml != "")
                {
                    doc.LoadXml(xml);
                    foreach (XmlNode node in doc.ChildNodes[doc.ChildNodes.Count - 1].ChildNodes)
                    {
                        if (node.Name == "x:get-request")
                        {
                            server.UseLogicalNameReferencing = true;
                            GetLN(settings.Objects, targets, node.ChildNodes);
                        }
                        else if (node.Name == "x:readRequest")
                        {
                            List<short> items = GetSN(node.ChildNodes);

                            server.UseLogicalNameReferencing = false;
                            foreach (short it in items)
                            {
                                GXSNInfo i = GXDLMSSNCommandHandler.FindSNObject(settings.Objects, Convert.ToUInt16((it) & 0xFFFF));
                                targets.Add(new ValueEventArgs(i.Item, i.Index, 0, null));
                            }
                        }
                        else if (node.Name == "x:readResponse" ||
                                 node.Name == "x:get-response")
                        {
                            if (targets != null)
                            {
                                List<string> items;
                                if (server.UseLogicalNameReferencing)
                                {
                                    items = GetLNValues(node.ChildNodes);
                                }
                                else
                                {
                                    items = GetSNValues(node.ChildNodes);
                                }

                                int pos = 0;
                                foreach (string it in items)
                                {
                                    if ("read-write-denied".Equals(it) ||
                                            "scope-of-access-violated".Equals(it) ||
                                            "object-unavailable".Equals(it))
                                    {
                                        ValueEventArgs ve = targets[pos];
                                        ve.Target.SetAccess(ve.Index, AccessMode.NoAccess);
                                        continue;
                                    }
                                    try
                                    {
                                        if (server.UseLogicalNameReferencing)
                                        {
                                            lastBlock = IsLastBlock(node.ChildNodes);
                                        }
                                        val.Set(translator.XmlToData(it));
                                        if (lastBlock)
                                        {
                                            if (settings.Objects.Count == 0)
                                            {
                                                GXDLMSClient c = new GXDLMSClient();
                                                c.UseLogicalNameReferencing = server.UseLogicalNameReferencing;
                                                settings.Objects = c.ParseObjects(val, true);
                                                //Update OBIS code description.
                                                GXDLMSConverter converter = new GXDLMSConverter();
                                                converter.UpdateOBISCodeInformation(settings.Objects);
                                            }
                                            else
                                            {
                                                ValueEventArgs ve = targets[pos];
                                                GXDataInfo info = new GXDataInfo();
                                                ve.Value = GXCommon.GetData(server.Settings, val, info);
                                                if (ve.Value is byte[])
                                                {
                                                    DataType tp = ve.Target.GetUIDataType(ve.Index);
                                                    if (tp != DataType.None)
                                                    {
                                                        ve.Value = GXDLMSClient.ChangeType((byte[])ve.Value, tp);
                                                    }
                                                }
                                                ((IGXDLMSBase)ve.Target).SetValue(settings, ve);
                                            }
                                            val.Clear();
                                        }
                                    }
                                    catch (Exception)
                                    {
                                        ValueEventArgs ve = targets[pos];
                                        ve.Target.SetAccess(ve.Index, AccessMode.NoAccess);

                                    }
                                    ++pos;
                                }
                                if (lastBlock)
                                {
                                    targets.Clear();
                                }
                            }

                        }
                    }
                }
            }
            server.Items.Clear();
            server.Items.AddRange(settings.Objects);
        }
Exemplo n.º 31
0
 /// <summary>
 /// Update certificates with server and client system title.
 /// </summary>
 /// <param name="sender"></param>
 /// <param name="e"></param>
 private void UpdateBtn_Click(object sender, EventArgs e)
 {
     try
     {
         _checkSystemTitle = false;
         SecuritySuite ss     = (SecuritySuite)SecuritySuiteCb.SelectedItem;
         Ecc           scheme = ss == SecuritySuite.Suite1 ? Ecc.P256 : Ecc.P384;
         byte[]        tmp    = GXDLMSTranslator.HexToBytes(SystemTitle);
         if (tmp.Length != 0 && tmp.Length != 8)
         {
             throw new Exception("Client system title is invalid.");
         }
         string clientST = null;
         if (tmp.Length != 0)
         {
             clientST = "CN=" + GXDLMSTranslator.ToHex(tmp, false);
         }
         tmp = GXDLMSTranslator.HexToBytes(ServerSystemTitle);
         if (tmp.Length != 0 && tmp.Length != 8)
         {
             throw new Exception("Server system title is invalid.");
         }
         string serverST = null;
         if (tmp.Length != 0)
         {
             serverST = "CN=" + GXDLMSTranslator.ToHex(tmp, false);
         }
         ClientAgreementKeysCb.SelectedItem = null;
         ServerAgreementKeysCb.SelectedItem = null;
         ClientSigningKeysCb.SelectedItem   = null;
         ServerSigningKeysCb.SelectedItem   = null;
         if (clientST != null)
         {
             foreach (object tmp2 in ClientAgreementKeysCb.Items)
             {
                 if (tmp2 is KeyValuePair <GXPkcs8, GXx509Certificate> it)
                 {
                     if (it.Value != null && it.Value.PublicKey.Scheme == scheme && it.Value.Subject.Contains(clientST))
                     {
                         ClientAgreementKeysCb.SelectedItem = it;
                         break;
                     }
                 }
             }
             foreach (object tmp2 in ClientSigningKeysCb.Items)
             {
                 if (tmp2 is KeyValuePair <GXPkcs8, GXx509Certificate> it)
                 {
                     if (it.Value != null && it.Value.PublicKey.Scheme == scheme && it.Value.Subject.Contains(clientST))
                     {
                         ClientSigningKeysCb.SelectedItem = it;
                         break;
                     }
                 }
             }
         }
         if (serverST != null)
         {
             foreach (object tmp2 in ServerAgreementKeysCb.Items)
             {
                 if (tmp2 is KeyValuePair <GXPkcs8, GXx509Certificate> it)
                 {
                     if (it.Value != null && it.Value.PublicKey.Scheme == scheme && it.Value.Subject.Contains(serverST))
                     {
                         ServerAgreementKeysCb.SelectedItem = it;
                         break;
                     }
                 }
             }
             foreach (object tmp2 in ServerSigningKeysCb.Items)
             {
                 if (tmp2 is KeyValuePair <GXPkcs8, GXx509Certificate> it)
                 {
                     if (it.Value != null && it.Value.PublicKey.Scheme == scheme && it.Value.Subject.Contains(serverST))
                     {
                         ServerSigningKeysCb.SelectedItem = it;
                         break;
                     }
                 }
             }
         }
     }
     catch (Exception ex)
     {
         MessageBox.Show(Parent, ex.Message);
     }
     finally
     {
         _checkSystemTitle = true;
     }
 }