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); } } } }
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)); }
static GXLogWriter() { translator = new GXDLMSTranslator(TranslatorOutputType.SimpleXml); receivedTraceData = new GXByteBuffer(); }
/// <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"); }
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); } } } }
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"); } }
/// <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; })); }); }
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); }
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); } }
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); }
/// <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; } } } } } }
/// <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"); }
public override string ToString() { return(GXDLMSTranslator.ToHex(Name) + " " + Start.ToFormatString() + " " + GXDLMSTranslator.ToHex(WeekName)); }
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"); }
/// <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"); }
/// <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(); } } } }
/// <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); } }
/// <summary> /// Constructor /// </summary> /// <param name="type">XML type.</param> public GXDLMSXmlClient(TranslatorOutputType type) { translator = new GXDLMSTranslator(type); translator.Hex = false; UseLogicalNameReferencing = true; }
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); } }
/// <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); }
/// <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); }
/// <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; } }