void InitRead(object sender, GXPacket GXPacket)
        {
            LastNotifiedTransactionProgress = 0;
            parser = new Gurux.DLMS.GXDLMSClient();
            GXDLMSDevice device = sender as GXDLMSDevice;
            parser.UseLogicalNameReferencing = device.UseLogicalNameReferencing;
            Gurux.Common.IGXMedia media = device.GXClient.Media as Gurux.Common.IGXMedia;
            SupportNetworkSpecificSettings = device.SupportNetworkSpecificSettings && media is GXNet;            
            if (SupportNetworkSpecificSettings)
            {
                parser.InterfaceType = Gurux.DLMS.InterfaceType.Net;
            }
            else
            {
                media.Eop = (byte)0x7E;
            }
            if (device.Manufacturers == null)
            {
                device.Manufacturers = new GXManufacturerCollection();
                GXManufacturerCollection.ReadManufacturerSettings(device.Manufacturers);
            }
            GXManufacturer man = device.Manufacturers.FindByIdentification(device.Identification);
			if (man == null)
			{
				throw new Exception("Unknown DLMS manufacturer type: " + device.Identification);
			}
            if (!string.IsNullOrEmpty(man.Extension))
            {
                Type t = Type.GetType(man.Extension);
                Extension = Activator.CreateInstance(t) as IGXManufacturerExtension;
            }            
            if (media is GXSerial && device.StartProtocol == StartProtocolType.IEC)
            {                                
                byte Terminator = 0xA;
                GXSerial serial = media as GXSerial;
                serial.Eop = Terminator;
                ReceiveParameters<string> p = new ReceiveParameters<string>()
                {
                    Eop = Terminator,                    
                    WaitTime = device.WaitTime * 1000                    
                };
                lock (media.Synchronous)
                {
                    //Init IEC connection. This must done first with serial connections.
                    string data = "/?!\r\n";
                    if (device.HDLCAddressing == HDLCAddressType.SerialNumber)
                    {
                        data = "/?" + device.SerialNumber + "!\r\n";
                    }
                    media.Send(data, null);
                    if (!media.Receive(p))
                    {
                        //Try to move away from mode E.
                        //TODO: this.ReadDLMSPacket(this.DisconnectRequest());
                        data = "Failed to receive reply from the device in given time.";
                        GXLogWriter.WriteLog(data);
                        throw new Exception(data);
                    }
                    //If echo is used.
                    if (p.Reply == data)
                    {
                        p.Reply = null;
                        if (!media.Receive(p))
                        {
                            //Try to move away from mode E.
                            //TODO: this.ReadDLMSPacket(this.DisconnectRequest());
                            data = "Failed to receive reply from the device in given time.";
                            GXLogWriter.WriteLog(data);
                            throw new Exception(data);
                        }
                    }
                }    
                string manufactureID = p.Reply.Substring(1, 3);
                char baudrate = p.Reply[4];
                int bitrate = 0;
                switch (baudrate)
                {
                    case '0':
                        bitrate = 300;
                        break;
                    case '1':
                        bitrate = 600;
                        break;
                    case '2':
                        bitrate = 1200;
                        break;
                    case '3':
                        bitrate = 2400;
                        break;
                    case '4':
                        bitrate = 4800;
                        break;
                    case '5':
                        bitrate = 9600;
                        break;
                    case '6':
                        bitrate = 19200;
                        break;
                    default:
                        throw new Exception("Unknown baud rate.");
                }                
                //Send ACK
                //Send Protocol control character
                byte controlCharacter = (byte)'2';// "2" HDLC protocol procedure (Mode E)
                //Send Baudrate character
                //Mode control character 
                byte ModeControlCharacter = (byte)'2';//"2" //(HDLC protocol procedure) (Binary mode)
                //We are not receive anything.
                lock (media.Synchronous)
                {
                    media.Send(new byte[] { 0x06, controlCharacter, (byte)baudrate, ModeControlCharacter, 0x8D, 0x0A }, null);
                    System.Threading.Thread.Sleep(1000);
                    serial.BaudRate = bitrate;
                    ReceiveParameters<byte[]> args = new ReceiveParameters<byte[]>();
                    args.Eop = (byte)0x0A;
                    args.WaitTime = 500;
                    media.Receive(args);
                }
                serial.DataBits = 8;
                serial.Parity = System.IO.Ports.Parity.None;
                serial.StopBits = System.IO.Ports.StopBits.One;
                serial.ResetSynchronousBuffer();
                serial.Eop = (byte)0x7E;
            }            
        }
 void IGXDLMSBase.SetValue(GXDLMSSettings settings, ValueEventArgs e)
 {
     if (e.Index == 1)
     {
         LogicalName = GXCommon.ToLogicalName(e.Value);
     }
     else if (e.Index == 2)
     {
         if (Scaler != 1 && e.Value != null && !e.User)
         {
             SetDataType(2, GXCommon.GetDLMSDataType(e.Value.GetType()));
             try
             {
                 if (settings.IsServer)
                 {
                     Value = e.Value;
                 }
                 else
                 {
                     Value = Convert.ToDouble(e.Value) * Scaler;
                 }
             }
             catch (Exception)
             {
                 //Sometimes scaler is set for wrong Object type.
                 Value = e.Value;
             }
         }
         else
         {
             Value = e.Value;
         }
     }
     else if (e.Index == 3)
     {
         if (e.Value == null)
         {
             Scaler = 1;
             Unit   = Unit.None;
         }
         else
         {
             object[] arr = (object[])e.Value;
             if (arr.Length != 2)
             {
                 throw new Exception("setValue failed. Invalid scaler unit value.");
             }
             scaler = Convert.ToInt32(arr[0]);
             Unit   = (Unit)Convert.ToInt32(arr[1]);
         }
     }
     else if (e.Index == 4)
     {
         Status = e.Value;
     }
     else if (e.Index == 5)
     {
         if (e.Value is byte[])
         {
             e.Value = GXDLMSClient.ChangeType((byte[])e.Value, DataType.DateTime, settings.UseUtc2NormalTime);
         }
         else if (e.Value is string)
         {
             e.Value = new GXDateTime((string)e.Value);
         }
         //Actaris meters might return null.
         if (e.Value == null)
         {
             CaptureTime = new GXDateTime();
         }
         else
         {
             CaptureTime = ((GXDateTime)e.Value).Value.LocalDateTime;
         }
     }
     else
     {
         e.Error = ErrorCode.ReadWriteDenied;
     }
 }
Esempio n. 3
0
 void IGXDLMSBase.SetValue(GXDLMSSettings settings, ValueEventArgs e)
 {
     if (e.Index == 1)
     {
         if (e.Value is string)
         {
             LogicalName = e.Value.ToString();
         }
         else
         {
             LogicalName = GXDLMSClient.ChangeType((byte[])e.Value, DataType.OctetString).ToString();
         }
     }
     else if (e.Index == 2)
     {
         SynchronizationRegister.Clear();
         foreach (object it in (object[])e.Value)
         {
             object[] tmp = (object[])it;
             SynchronizationRegister.Add(new KeyValuePair <UInt16, UInt32>((UInt16)tmp[0], (UInt32)tmp[1]));
         }
     }
     else if (e.Index == 3)
     {
         object[] tmp = (object[])e.Value;
         PhysicalLayerDesynchronization       = (UInt32)tmp[0];
         TimeOutNotAddressedDesynchronization = (UInt32)tmp[1];
         TimeOutFrameNotOkDesynchronization   = (UInt32)tmp[2];
         WriteRequestDesynchronization        = (UInt32)tmp[3];
         WrongInitiatorDesynchronization      = (UInt32)tmp[4];
     }
     else if (e.Index == 4)
     {
         BroadcastFramesCounter.Clear();
         foreach (object it in (object[])e.Value)
         {
             object[] tmp = (object[])it;
             BroadcastFramesCounter.Add(new KeyValuePair <UInt16, UInt32>((UInt16)tmp[0], (UInt32)tmp[1]));
         }
     }
     else if (e.Index == 5)
     {
         RepetitionsCounter = (UInt32)e.Value;
     }
     else if (e.Index == 6)
     {
         TransmissionsCounter = (UInt32)e.Value;
     }
     else if (e.Index == 7)
     {
         CrcOkFramesCounter = (UInt32)e.Value;
     }
     else if (e.Index == 8)
     {
         CrcNOkFramesCounter = (UInt32)e.Value;
     }
     else
     {
         e.Error = ErrorCode.ReadWriteDenied;
     }
 }
 /// <summary>
 ///  Imports an X.509 v3 certificate of a public key.
 /// </summary>
 /// <param name="client">DLMS client that is used to generate action.</param>
 /// <param name="key">Public key.</param>
 /// <returns>Generated action.</returns>
 public byte[][] ImportCertificate(GXDLMSClient client, byte[] key)
 {
     return(client.Method(this, 6, key, DataType.OctetString));
 }
        /// <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, Standard standard)
        {
            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();
            GXDLMSConverter converter = new GXDLMSConverter(standard);

            while (translator.FindNextFrame(bb, pdu, server.InterfaceType))
            {
                String xml = translator.MessageToXml(bb);
                if (xml != "")
                {
                    doc.LoadXml(xml.Replace("&", "&amp;"));
                    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 ("other-reason".Equals(it) ||
                                        "read-write-denied".Equals(it) ||
                                        "scope-of-access-violated".Equals(it) ||
                                        "object-unavailable".Equals(it) ||
                                        "object-class-inconsistent".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.
                                                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);
                                                    }
                                                }
                                                if (ve.Target is IGXDLMSBase)
                                                {
                                                    ((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>
 /// Activate image.
 /// </summary>
 /// <param name="client">DLMS Client.</param>
 /// <returns>Bytes send to the meter.</returns>
 public byte[][] ImageActivate(GXDLMSClient client)
 {
     return(client.Method(this, 4, 0, DataType.Int8));
 }
 /// <summary>
 ///  Ask Server sends the Certificate Signing Request (CSR) data.
 /// </summary>
 /// <param name="client">DLMS client that is used to generate action.</param>
 /// <param name="type">identifies the key pair for which the certificate will be requested.</param>
 /// <returns>Generated action.</returns>
 public byte[][] GenerateCertificate(GXDLMSClient client, CertificateType type)
 {
     return(client.Method(this, 5, type, DataType.Enum));
 }
 /// <summary>
 /// Executes selected script.
 /// </summary>
 /// <param name="client">DLMS client.</param>
 /// <param name="script">Executed script.</param>
 /// <returns>Action bytes.</returns>
 public byte[][] Execute(GXDLMSClient client, GXDLMSScript script)
 {
     return(client.Method(this, 1, (UInt16)script.Id));
 }
 /// <summary>
 /// Executes selected script by id.
 /// </summary>
 /// <param name="client">DLMS client.</param>
 /// <param name="scriptId">Executed script id.</param>
 /// <returns>Action bytes.</returns>
 public byte[][] Execute(GXDLMSClient client, UInt16 scriptId)
 {
     return(client.Method(this, 1, scriptId));
 }
Esempio n. 10
0
 /// <summary>
 /// Deletes an entry in the table.
 /// </summary>
 /// <returns></returns>
 public byte[][] Delete(GXDLMSClient client, GXDLMSSpecialDay entry)
 {
     return(client.Method(this, 2, (UInt16)entry.Index));
 }
 void IGXDLMSBase.SetValue(GXDLMSSettings settings, ValueEventArgs e)
 {
     if (e.Index == 1)
     {
         LogicalName = GXCommon.ToLogicalName(e.Value);
     }
     else if (e.Index == 2)
     {
         if (Scaler != 1 && e.Value != null && !e.User)
         {
             try
             {
                 if (settings.IsServer)
                 {
                     CurrentAverageValue = e.Value;
                 }
                 else
                 {
                     CurrentAverageValue = Convert.ToDouble(e.Value) * Scaler;
                 }
             }
             catch (Exception)
             {
                 //Sometimes scaler is set for wrong Object type.
                 CurrentAverageValue = e.Value;
             }
         }
         else
         {
             CurrentAverageValue = e.Value;
         }
     }
     else if (e.Index == 3)
     {
         if (Scaler != 1 && e.Value != null && !e.User)
         {
             try
             {
                 if (settings.IsServer)
                 {
                     LastAverageValue = e.Value;
                 }
                 else
                 {
                     LastAverageValue = Convert.ToDouble(e.Value) * Scaler;
                 }
             }
             catch (Exception)
             {
                 //Sometimes scaler is set for wrong Object type.
                 LastAverageValue = e.Value;
             }
         }
         else
         {
             LastAverageValue = e.Value;
         }
     }
     else if (e.Index == 4)
     {
         if (e.Value == null)
         {
             Scaler = 1;
             Unit   = Unit.None;
         }
         else
         {
             object[] arr = (object[])e.Value;
             if (arr.Length != 2)
             {
                 throw new Exception("setValue failed. Invalid scaler unit value.");
             }
             scaler = Convert.ToInt32(arr[0]);
             Unit   = (Unit)Convert.ToInt32(arr[1]);
         }
     }
     else if (e.Index == 5)
     {
         Status = Convert.ToInt32(e.Value);
     }
     else if (e.Index == 6)
     {
         if (e.Value == null)
         {
             CaptureTime = new GXDateTime(DateTime.MinValue);
         }
         else
         {
             if (e.Value is byte[])
             {
                 e.Value = GXDLMSClient.ChangeType((byte[])e.Value, DataType.DateTime, settings.UseUtc2NormalTime);
             }
             CaptureTime = (GXDateTime)e.Value;
         }
     }
     else if (e.Index == 7)
     {
         if (e.Value == null)
         {
             StartTimeCurrent = new GXDateTime(DateTime.MinValue);
         }
         else
         {
             if (e.Value is byte[])
             {
                 e.Value = GXDLMSClient.ChangeType((byte[])e.Value, DataType.DateTime, settings.UseUtc2NormalTime);
             }
             StartTimeCurrent = (GXDateTime)e.Value;
         }
     }
     else if (e.Index == 8)
     {
         Period = Convert.ToUInt32(e.Value);
     }
     else if (e.Index == 9)
     {
         NumberOfPeriods = Convert.ToUInt16(e.Value);
     }
     else
     {
         e.Error = ErrorCode.ReadWriteDenied;
     }
 }
 void IGXDLMSBase.SetValue(GXDLMSSettings settings, ValueEventArgs e)
 {
     if (e.Index == 1)
     {
         LogicalName = GXCommon.ToLogicalName(e.Value);
     }
     else if (e.Index == 2)
     {
         if (e.Value is byte[])
         {
             CalendarNameActive = ASCIIEncoding.ASCII.GetString((byte[])e.Value);
         }
         else
         {
             CalendarNameActive = Convert.ToString(e.Value);
         }
     }
     else if (e.Index == 3)
     {
         SeasonProfileActive = SetSeasonProfile(settings, e.Value);
     }
     else if (e.Index == 4)
     {
         WeekProfileTableActive = SetWeekProfileTable(settings, e.Value);
     }
     else if (e.Index == 5)
     {
         DayProfileTableActive = SetDayProfileTable(settings, e.Value);
     }
     else if (e.Index == 6)
     {
         if (e.Value is byte[])
         {
             CalendarNamePassive = ASCIIEncoding.ASCII.GetString((byte[])e.Value);
         }
         else
         {
             CalendarNamePassive = Convert.ToString(e.Value);
         }
     }
     else if (e.Index == 7)
     {
         SeasonProfilePassive = SetSeasonProfile(settings, e.Value);
     }
     else if (e.Index == 8)
     {
         WeekProfileTablePassive = SetWeekProfileTable(settings, e.Value);
     }
     else if (e.Index == 9)
     {
         DayProfileTablePassive = SetDayProfileTable(settings, e.Value);
     }
     else if (e.Index == 10)
     {
         if (e.Value is byte[])
         {
             Time = (GXDateTime)GXDLMSClient.ChangeType((byte[])e.Value, DataType.DateTime, settings.UseUtc2NormalTime);
         }
         else
         {
             Time = new GXDateTime(Convert.ToDateTime(e.Value));
         }
     }
     else
     {
         e.Error = ErrorCode.ReadWriteDenied;
     }
 }
Esempio n. 13
0
 void IGXDLMSBase.SetValue(GXDLMSSettings settings, ValueEventArgs e)
 {
     if (e.Index == 1)
     {
         LogicalName = GXCommon.ToLogicalName(e.Value);
     }
     else if (e.Index == 2)
     {
         if (e.Value is string)
         {
             this.DataLinkLayerReference = e.Value.ToString();
         }
         else
         {
             this.DataLinkLayerReference = GXDLMSClient.ChangeType((byte[])e.Value, DataType.OctetString, settings.UseUtc2NormalTime).ToString();
         }
     }
     else if (e.Index == 3)
     {
         AddressConfigMode = (AddressConfigMode)Convert.ToInt32(e.Value);
     }
     else if (e.Index == 4)
     {
         List <IPAddress> data = new List <IPAddress>();
         if (e.Value != null)
         {
             foreach (object it in (Object[])e.Value)
             {
                 data.Add(new IPAddress((byte[])it));
             }
         }
         UnicastIPAddress = data.ToArray();
     }
     else if (e.Index == 5)
     {
         List <IPAddress> data = new List <IPAddress>();
         if (e.Value != null)
         {
             foreach (object it in (Object[])e.Value)
             {
                 data.Add(new IPAddress((byte[])it));
             }
         }
         MulticastIPAddress = data.ToArray();
     }
     else if (e.Index == 6)
     {
         List <IPAddress> data = new List <IPAddress>();
         if (e.Value != null)
         {
             foreach (object it in (Object[])e.Value)
             {
                 data.Add(new IPAddress((byte[])it));
             }
         }
         GatewayIPAddress = data.ToArray();
     }
     else if (e.Index == 7)
     {
         if (e.Value == null || ((byte[])e.Value).Length == 0)
         {
             PrimaryDNSAddress = null;
         }
         else
         {
             PrimaryDNSAddress = new IPAddress((byte[])e.Value);
         }
     }
     else if (e.Index == 8)
     {
         if (e.Value == null || ((byte[])e.Value).Length == 0)
         {
             SecondaryDNSAddress = null;
         }
         else
         {
             SecondaryDNSAddress = new IPAddress((byte[])e.Value);
         }
     }
     else if (e.Index == 9)
     {
         TrafficClass = Convert.ToByte(e.Value);
     }
     else if (e.Index == 10)
     {
         List <GXNeighborDiscoverySetup> data = new List <GXNeighborDiscoverySetup>();
         if (e.Value != null)
         {
             foreach (object it in (Object[])e.Value)
             {
                 object[] tmp = (object[])it;
                 GXNeighborDiscoverySetup v = new GXNeighborDiscoverySetup();
                 v.MaxRetry      = Convert.ToByte(tmp[0]);
                 v.RetryWaitTime = Convert.ToUInt16(tmp[1]);
                 v.SendPeriod    = Convert.ToUInt32(tmp[2]);
                 data.Add(v);
             }
         }
         NeighborDiscoverySetup = data.ToArray();
     }
     else
     {
         e.Error = ErrorCode.ReadWriteDenied;
     }
 }
Esempio n. 14
0
 void IGXDLMSBase.SetValue(GXDLMSSettings settings, ValueEventArgs e)
 {
     if (e.Index == 1)
     {
         LogicalName = GXCommon.ToLogicalName(e.Value);
     }
     else if (e.Index == 2)
     {
         MBusPortReference = GXCommon.ToLogicalName(e.Value);
     }
     else if (e.Index == 3)
     {
         CaptureDefinition.Clear();
         if (e.Value != null)
         {
             foreach (object tmp in (IEnumerable <object>)e.Value)
             {
                 List <object> it;
                 if (tmp is List <object> )
                 {
                     it = (List <object>)tmp;
                 }
                 else
                 {
                     it = new List <object>((object[])tmp);
                 }
                 CaptureDefinition.Add(new KeyValuePair <string, string>(GXDLMSClient.ChangeType((byte[])it[0], DataType.OctetString, settings.UseUtc2NormalTime).ToString(),
                                                                         GXDLMSClient.ChangeType((byte[])it[1], DataType.OctetString, settings.UseUtc2NormalTime).ToString()));
             }
         }
     }
     else if (e.Index == 4)
     {
         CapturePeriod = Convert.ToUInt32(e.Value);
     }
     else if (e.Index == 5)
     {
         PrimaryAddress = Convert.ToByte(e.Value);
     }
     else if (e.Index == 6)
     {
         IdentificationNumber = Convert.ToUInt32(e.Value);
     }
     else if (e.Index == 7)
     {
         ManufacturerID = Convert.ToUInt16(e.Value);
     }
     else if (e.Index == 8)
     {
         DataHeaderVersion = Convert.ToByte(e.Value);
     }
     else if (e.Index == 9)
     {
         DeviceType = Convert.ToByte(e.Value);
     }
     else if (e.Index == 10)
     {
         AccessNumber = Convert.ToByte(e.Value);
     }
     else if (e.Index == 11)
     {
         Status = Convert.ToByte(e.Value);
     }
     else if (e.Index == 12)
     {
         Alarm = Convert.ToByte(e.Value);
     }
     else if (Version > 0)
     {
         if (e.Index == 13)
         {
             Configuration = Convert.ToUInt16(e.Value);
         }
         else if (e.Index == 14)
         {
             EncryptionKeyStatus = (MBusEncryptionKeyStatus)Convert.ToInt32(e.Value);
         }
         else
         {
             e.Error = ErrorCode.ReadWriteDenied;
         }
     }
     else
     {
         e.Error = ErrorCode.ReadWriteDenied;
     }
 }
Esempio n. 15
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, listener.TraceLevel, 60000, 3, 0);
                    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,
                                                                    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          = dev.Security;
                                    UInt64 devId = 0;
                                    if (dev.TraceLevel != TraceLevel.Off)
                                    {
                                        devId = dev.Id;
                                    }
                                    reader = new GXDLMSReader(client, media, _logger, listener.TraceLevel, dev.WaitTime, dev.ResendCount, devId);
                                    reader.InitializeConnection();
                                }
                                List <GXValue> values = new List <GXValue>();
                                foreach (GXTask task in ret.Tasks)
                                {
                                    GXDLMSObject obj = GXDLMSClient.CreateObject((ObjectType)task.Object.ObjectType);
                                    obj.Version     = task.Object.Version;
                                    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, 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);
                                        }
                                    }
                                    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)
                    {
                    }
                }
                finally
                {
                    if (reader != null)
                    {
                        reader.Close();
                    }
                }
            }
        }
        void IGXDLMSBase.SetValue(GXDLMSSettings settings, ValueEventArgs e)
        {
            if (e.Index == 1)
            {
                LogicalName = GXCommon.ToLogicalName(e.Value);
            }
            else if (e.Index == 2)
            {
                Scripts.Clear();
                //Fix Xemex bug here.
                //Xemex meters do not return array as they shoul be according standard.
                if (e.Value is IEnumerable <object> )
                {
                    List <object> arr, arr1;
                    if (e.Value is List <object> )
                    {
                        arr1 = (List <object>)e.Value;
                    }
                    else
                    {
                        arr1 = new List <object>((object[])e.Value);
                    }
                    if (arr1[0] is IEnumerable <object> )
                    {
                        foreach (object tmp in (IEnumerable <object>)e.Value)
                        {
                            List <object> item;
                            if (tmp is List <object> )
                            {
                                item = (List <object>)tmp;
                            }
                            else
                            {
                                item = new List <object>((object[])tmp);
                            }
                            GXDLMSScript script = new GXDLMSScript();
                            script.Id = Convert.ToInt32(item[0]);
                            Scripts.Add(script);
                            foreach (object tmp2 in (IEnumerable <object>)item[1])
                            {
                                if (tmp2 is List <object> )
                                {
                                    arr = (List <object>)tmp2;
                                }
                                else
                                {
                                    arr = new List <object>((object[])tmp2);
                                }
                                GXDLMSScriptAction it = new GXDLMSScriptAction();
                                it.Type = (ScriptActionType)Convert.ToInt32(arr[0]);
                                ObjectType ot = (ObjectType)Convert.ToInt32(arr[1]);
                                String     ln = GXCommon.ToLogicalName(arr[2]);
                                it.Target = settings.Objects.FindByLN(ot, ln);
                                if (it.Target == null)
                                {
                                    it.Target             = GXDLMSClient.CreateObject(ot);
                                    it.Target.LogicalName = ln;
                                }
                                it.Index     = Convert.ToInt32(arr[3]);
                                it.Parameter = arr[4];
                                if (it.Parameter != null)
                                {
                                    it.ParameterDataType = GXDLMSConverter.GetDLMSDataType(it.Parameter);
                                }
                                script.Actions.Add(it);
                            }
                        }
                    }
                    else //Read Xemex meter here.
                    {
                        GXDLMSScript script = new GXDLMSScript();
                        if (e.Value is List <object> )
                        {
                            arr1 = (List <object>)e.Value;
                        }
                        else
                        {
                            arr1 = new List <object>((object[])e.Value);
                        }

                        script.Id = Convert.ToInt32(arr1[0]);
                        Scripts.Add(script);
                        if (arr1[1] is List <object> )
                        {
                            arr = (List <object>)arr1[1];
                        }
                        else
                        {
                            arr = new List <object>((object[])arr1[1]);
                        }
                        GXDLMSScriptAction it = new GXDLMSScriptAction();
                        it.Type = (ScriptActionType)Convert.ToInt32(arr[0]);
                        ObjectType ot = (ObjectType)Convert.ToInt32(arr[1]);
                        String     ln = GXCommon.ToLogicalName(arr[2]);
                        it.Target = settings.Objects.FindByLN(ot, ln);
                        if (it.Target == null)
                        {
#pragma warning disable CS0618
                            it.ObjectType  = ot;
                            it.LogicalName = ln;
#pragma warning restore CS0618
                        }

                        it.Index     = Convert.ToInt32(arr[3]);
                        it.Parameter = arr[4];
                        script.Actions.Add(it);
                    }
                }
            }
            else
            {
                e.Error = ErrorCode.ReadWriteDenied;
            }
        }
 /// <summary>
 /// Verify image.
 /// </summary>
 /// <param name="client">DLMS Client.</param>
 /// <returns>Bytes send to the meter.</returns>
 public byte[][] ImageVerify(GXDLMSClient client)
 {
     return(client.Method(this, 3, 0, DataType.Int8));
 }
 /// <summary>
 /// Forces the disconnect control object into the 'ready_for_reconnection'
 /// state if a direct remote reconnection is disabled(control_mode = 1, 3, 5, 6).
 /// Forces the disconnect control object into the 'connected' state if
 /// a direct remote reconnection is enabled(control_mode = 2, 4).
 /// </summary>
 /// <param name="client">DLMS client.</param>
 /// <returns>Action bytes.</returns>
 public byte[][] RemoteReconnect(GXDLMSClient client)
 {
     return(client.Method(this, 2, (sbyte)0));
 }
 /// <summary>
 /// Activates and strengthens the security policy.
 /// </summary>
 /// <param name="client">DLMS client that is used to generate action.</param>
 /// <param name="security">New security level.</param>
 /// <returns>Generated action.</returns>
 public byte[][] Activate(GXDLMSClient client, Gurux.DLMS.Enums.Security security)
 {
     return(client.Method(this, 1, GetSecurityValue(security), DataType.Enum));
 }
 /// <summary>
 /// Copies the values of the objects to capture into the buffer by reading each capture object.
 /// </summary>
 /// <param name="client">DLMS client.</param>
 /// <returns>Action bytes.</returns>
 public byte[][] Capture(GXDLMSClient client)
 {
     return(client.Method(this, 2, (sbyte)0));
 }
 /// <summary>
 ///  Imports an X.509 v3 certificate of a public key.
 /// </summary>
 /// <param name="client">DLMS client that is used to generate action.</param>
 /// <param name="key">Public key.</param>
 /// <returns>Generated action.</returns>
 public byte[][] Import(GXDLMSClient client, CngKey key)
 {
     return(ImportCertificate(client, key.Export(CngKeyBlobFormat.EccPublicBlob)));
 }
        private void SetBuffer(GXDLMSSettings settings, ValueEventArgs e)
        {
            List <GXKeyValuePair <GXDLMSObject, GXDLMSCaptureObject> > cols = null;

            if (e.Parameters is List <GXKeyValuePair <GXDLMSObject, GXDLMSCaptureObject> > )
            {
                cols = (List <GXKeyValuePair <GXDLMSObject, GXDLMSCaptureObject> >)e.Parameters;
            }
            if (cols == null)
            {
                cols = CaptureObjects;
            }
            if (e.Value != null && (e.Value as object[]).Length != 0)
            {
                int      index2   = 0;
                DateTime lastDate = DateTime.MinValue;
                foreach (object[] row in (e.Value as object[]))
                {
                    if ((row as object[]).Length != cols.Count)
                    {
                        throw new Exception("Number of columns do not match.");
                    }
                    for (int pos = 0; pos != row.Length; ++pos)
                    {
                        if (cols == null)
                        {
                            index2 = 0;
                        }
                        else
                        {
                            index2 = cols[pos].Value.AttributeIndex;
                        }
                        DataType type;
                        //Actaris SL 7000 and ACE 6000 returns 0.
                        if (index2 != 0)
                        {
                            type = cols[pos].Key.GetUIDataType(index2);
                        }
                        else
                        {
                            type = DataType.None;
                        }
                        if (row[pos] is byte[])
                        {
                            if (type != DataType.None && row[pos] is byte[])
                            {
                                row[pos] = GXDLMSClient.ChangeType(row[pos] as byte[], type, settings.UseUtc2NormalTime);
                                if (row[pos] is GXDateTime)
                                {
                                    GXDateTime dt = (GXDateTime)row[pos];
                                    lastDate = dt.Value.LocalDateTime;
                                }
                            }
                        }
                        else if (type == DataType.DateTime && row[pos] == null && CapturePeriod != 0)
                        {
                            if (lastDate == DateTime.MinValue && Buffer.Count != 0)
                            {
                                lastDate = ((GXDateTime)Buffer[Buffer.Count - 1].GetValue(pos)).Value.LocalDateTime;
                            }
                            if (lastDate != DateTime.MinValue)
                            {
                                lastDate = lastDate.AddSeconds(CapturePeriod);
                                row[pos] = new GXDateTime(lastDate);
                            }
                        }
                        if (cols[pos].Key is GXDLMSRegister && index2 == 2)
                        {
                            double scaler = (cols[pos].Key as GXDLMSRegister).Scaler;
                            if (scaler != 1)
                            {
                                try
                                {
                                    row[pos] = Convert.ToDouble(row[pos]) * scaler;
                                }
                                catch
                                {
                                    //Skip error
                                }
                            }
                        }
                        else if (cols[pos].Key is GXDLMSDemandRegister && (index2 == 2 || index2 == 3))
                        {
                            double scaler = (cols[pos].Key as GXDLMSDemandRegister).Scaler;
                            if (scaler != 1)
                            {
                                try
                                {
                                    row[pos] = Convert.ToDouble(row[pos]) * scaler;
                                }
                                catch
                                {
                                    //Skip error
                                }
                            }
                        }
                        else if (cols[pos].Key is GXDLMSRegister && index2 == 3)
                        {
                            try
                            {
                                GXDLMSRegister r = new GXDLMSRegister();
                                ValueEventArgs v = new ValueEventArgs(r, 3, 0, null);
                                v.Value = row[pos];
                                (r as IGXDLMSBase).SetValue(null, v);
                                row[pos] = new object[] { r.Scaler, r.Unit };
                            }
                            catch
                            {
                                //Skip error
                            }
                        }
                    }
                    Buffer.Add(row);
                }
                EntriesInUse = Buffer.Count;
            }
        }
Esempio n. 23
0
        void IGXDLMSBase.SetValue(GXDLMSSettings settings, ValueEventArgs e)
        {
            switch (e.Index)
            {
            case 1:
                LogicalName = GXCommon.ToLogicalName(e.Value);
                break;

            case 2:
            {
                ChangedParameter = new GXDLMSTarget();
                if (e.Value is Object[])
                {
                    Object[] tmp = (Object[])e.Value;
                    if (tmp.Length != 4)
                    {
                        throw new GXDLMSException("Invalid structure format.");
                    }
                    ObjectType type = (ObjectType)Convert.ToInt16(tmp[0]);
                    ChangedParameter.Target = settings.Objects.FindByLN(type, (byte[])tmp[1]);
                    if (ChangedParameter.Target == null)
                    {
                        ChangedParameter.Target             = GXDLMSClient.CreateObject(type);
                        ChangedParameter.Target.LogicalName = GXCommon.ToLogicalName((byte[])tmp[1]);
                    }
                    ChangedParameter.AttributeIndex = Convert.ToByte(tmp[2]);
                    ChangedParameter.Value          = tmp[3];
                }

                break;
            }

            case 3:
            {
                if (e.Value == null)
                {
                    CaptureTime = new GXDateTime(DateTime.MinValue);
                }
                else
                {
                    if (e.Value is byte[])
                    {
                        e.Value = GXDLMSClient.ChangeType((byte[])e.Value, DataType.DateTime, settings.UseUtc2NormalTime);
                    }
                    else if (e.Value is string)
                    {
                        e.Value = new GXDateTime((string)e.Value);
                    }
                    if (e.Value is GXDateTime)
                    {
                        CaptureTime = (GXDateTime)e.Value;
                    }
                    else if (e.Value is String)
                    {
                        DateTime tm;
                        if (!DateTime.TryParse((String)e.Value, out tm))
                        {
                            CaptureTime = DateTime.ParseExact((String)e.Value, CultureInfo.CurrentCulture.DateTimeFormat.ShortDatePattern + " " + CultureInfo.CurrentCulture.DateTimeFormat.LongTimePattern, CultureInfo.CurrentUICulture);
                        }
                        else
                        {
                            CaptureTime = tm;
                        }
                    }
                    else
                    {
                        CaptureTime = Convert.ToDateTime(e.Value);
                    }
                }

                break;
            }

            case 4:
            {
                Parameters.Clear();
                if (e.Value != null)
                {
                    foreach (object[] tmp in (e.Value as object[]))
                    {
                        if (tmp.Length != 3)
                        {
                            throw new GXDLMSException("Invalid structure format.");
                        }
                        GXDLMSTarget obj  = new GXDLMSTarget();
                        ObjectType   type = (ObjectType)Convert.ToInt16(tmp[0]);
                        obj.Target = settings.Objects.FindByLN(type, (byte[])tmp[1]);
                        if (obj.Target == null)
                        {
                            obj.Target             = GXDLMSClient.CreateObject(type);
                            obj.Target.LogicalName = GXCommon.ToLogicalName((byte[])tmp[1]);
                        }
                        obj.AttributeIndex = Convert.ToByte(tmp[2]);
                        Parameters.Add(obj);
                    }
                }

                break;
            }

            default:
                e.Error = ErrorCode.ReadWriteDenied;
                break;
            }
        }
        void IGXDLMSBase.SetValue(GXDLMSSettings settings, ValueEventArgs e)
        {
            if (e.Index == 1)
            {
                LogicalName = GXCommon.ToLogicalName(e.Value);
            }
            else if (e.Index == 2)
            {
                SetBuffer(settings, e);
            }
            else if (e.Index == 3)
            {
                Reset();
                //Clear file
                if (e.Server != null)
                {
                    ValueEventArgs[] list = new ValueEventArgs[] { new ValueEventArgs(this, 1, 0, null) };
                    e.Server.NotifyAction(list);
                    e.Server.NotifyPostAction(list);
                }
                CaptureObjects.Clear();
                if (e.Value != null)
                {
                    GetCaptureObjects(settings, CaptureObjects, e.Value as object[]);
                }
            }
            else if (e.Index == 4)
            {
                //Any write access to one of the attributes will automatically call a reset
                //and this call will propagate to all other profiles capturing this profile.
                if (settings.IsServer)
                {
                    Reset();
                }
                CapturePeriod = Convert.ToInt32(e.Value);
            }
            else if (e.Index == 5)
            {
                //Any write access to one of the attributes will automatically call a reset
                //and this call will propagate to all other profiles capturing this profile.
                if (settings.IsServer)
                {
                    Reset();
                }
                SortMethod = (SortMethod)Convert.ToInt32(e.Value);
            }
            else if (e.Index == 6)
            {
                //Any write access to one of the attributes will automatically call a reset
                //and this call will propagate to all other profiles capturing this profile.
                if (settings.IsServer)
                {
                    Reset();
                }

                if (e.Value is object[])
                {
                    object[] tmp = e.Value as object[];
                    if (tmp.Length != 4)
                    {
                        throw new GXDLMSException("Invalid structure format.");
                    }
                    ObjectType type = (ObjectType)Convert.ToInt16(tmp[0]);
                    string     ln   = GXCommon.ToLogicalName((byte[])tmp[1]);
                    SortAttributeIndex = Convert.ToInt16(tmp[2]);
                    SortDataIndex      = Convert.ToInt16(tmp[3]);
                    SortObject         = null;
                    foreach (var it in CaptureObjects)
                    {
                        if (it.Key.ObjectType == type && it.Key.LogicalName == ln)
                        {
                            SortObject = it.Key;
                            break;
                        }
                    }
                    if (SortObject == null)
                    {
                        SortObject             = GXDLMSClient.CreateObject(type);
                        SortObject.LogicalName = ln;
                    }
                }
                else
                {
                    SortObject = null;
                }
            }
            else if (e.Index == 7)
            {
                EntriesInUse = Convert.ToInt32(e.Value);
            }
            else if (e.Index == 8)
            {
                //Any write access to one of the attributes will automatically call a reset
                //and this call will propagate to all other profiles capturing this profile.
                if (settings.IsServer)
                {
                    Reset();
                }
                ProfileEntries = Convert.ToInt32(e.Value);
            }
            else
            {
                e.Error = ErrorCode.ReadWriteDenied;
            }
        }
Esempio n. 25
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);
                    }
                }
            }
        }
Esempio n. 26
0
 static public object ConvertFromDLMS(object data, DataType from, DataType type, bool arrayAsString)
 {
     if (type == DataType.Array)
     {
         return(data);
     }
     if (type == DataType.None)
     {
         if (arrayAsString && data != null && data.GetType().IsArray)
         {
             data = GXHelpers.GetArrayAsString(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));
             }
             return(GXDLMSClient.ChangeType((byte[])data, DataType.DateTime));
         }
         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));
     }
     //Convert DLMS date time to Windows Time.
     else if (type == DataType.Time)
     {
         if (data is byte[])
         {
             return(GXDLMSClient.ChangeType((byte[])data, type));
         }
         return(data);
     }
     else if (data is byte[])
     {
         if (type == DataType.String)
         {
             data = System.Text.Encoding.ASCII.GetString((byte[])data);
         }
         else
         {
             data = ToHexString(data);
         }
     }
     else if (data is Array)
     {
         data = ArrayToString(data);
     }
     return(data);
 }
Esempio n. 27
0
 /// <summary>
 /// Reset value.
 /// </summary>
 /// <param name="client">DLMS client.</param>
 /// <returns>Action bytes.</returns>
 public byte[][] Reset(GXDLMSClient client)
 {
     return(client.Method(this, 1, (sbyte)0));
 }
Esempio n. 28
0
 void IGXDLMSBase.SetValue(GXDLMSSettings settings, ValueEventArgs e)
 {
     if (e.Index == 1)
     {
         if (e.Value is string)
         {
             LogicalName = e.Value.ToString();
         }
         else
         {
             LogicalName = GXDLMSClient.ChangeType((byte[])e.Value, DataType.OctetString, settings.UseUtc2NormalTime).ToString();
         }
     }
     else if (e.Index == 2)
     {
         InitiatorElectricalPhase = (InitiatorElectricalPhase)Convert.ToInt32(e.Value);
     }
     else if (e.Index == 3)
     {
         DeltaElectricalPhase = (DeltaElectricalPhase)Convert.ToInt32(e.Value);
     }
     else if (e.Index == 4)
     {
         MaxReceivingGain = (byte)e.Value;
     }
     else if (e.Index == 5)
     {
         MaxTransmittingGain = (byte)e.Value;
     }
     else if (e.Index == 6)
     {
         SearchInitiatorThreshold = (byte)e.Value;
     }
     else if (e.Index == 7)
     {
         object[] tmp = (object[])e.Value;
         MarkFrequency  = (UInt32)tmp[0];
         SpaceFrequency = (UInt32)tmp[1];
     }
     else if (e.Index == 8)
     {
         MacAddress = (UInt16)e.Value;
     }
     else if (e.Index == 9)
     {
         List <ushort> list = new List <ushort>();
         if (e.Value != null)
         {
             foreach (object it in (object[])e.Value)
             {
                 list.Add((ushort)it);
             }
         }
         MacGroupAddresses = list.ToArray();
     }
     else if (e.Index == 10)
     {
         Repeater = (Repeater)Convert.ToInt32(e.Value);
     }
     else if (e.Index == 11)
     {
         RepeaterStatus = (bool)e.Value;
     }
     else if (e.Index == 12)
     {
         MinDeltaCredit = (byte)e.Value;
     }
     else if (e.Index == 13)
     {
         InitiatorMacAddress = (UInt16)e.Value;
     }
     else if (e.Index == 14)
     {
         SynchronizationLocked = (bool)e.Value;
     }
     else if (e.Index == 15)
     {
         TransmissionSpeed = (BaudRate)Convert.ToInt32(e.Value);
     }
     else
     {
         e.Error = ErrorCode.ReadWriteDenied;
     }
 }
 void IGXDLMSBase.SetValue(GXDLMSSettings settings, ValueEventArgs e)
 {
     if (e.Index == 1)
     {
         LogicalName = GXCommon.ToLogicalName(e.Value);
     }
     else if (e.Index == 2)
     {
         if (e.Value != null)
         {
             String ln = GXCommon.ToLogicalName(((List <object>)e.Value)[0]);
             Target = (GXDLMSScriptTable)settings.Objects.FindByLN(ObjectType.ScriptTable, ln);
             if (Target == null)
             {
                 Target = new GXDLMSScriptTable(ln);
             }
             ExecutedScriptSelector = Convert.ToUInt16(((List <object>)e.Value)[1]);
         }
         else
         {
             Target = null;
             ExecutedScriptSelector = 0;
         }
     }
     else if (e.Index == 3)
     {
         Type = (SingleActionScheduleType)Convert.ToInt32(e.Value);
     }
     else if (e.Index == 4)
     {
         ExecutionTime = null;
         if (e.Value != null)
         {
             List <GXDateTime> items = new List <GXDateTime>();
             foreach (List <object> it in (List <object>)e.Value)
             {
                 GXDateTime time;
                 if (it[0] is byte[])
                 {
                     time = (GXDateTime)GXDLMSClient.ChangeType((byte[])it[0], DataType.Time, settings.UseUtc2NormalTime);
                 }
                 else if (it[0] is GXDateTime)
                 {
                     time = (GXDateTime)it[0];
                 }
                 else
                 {
                     throw new Exception("Invalid time.");
                 }
                 time.Skip &= ~(DateTimeSkips.Year | DateTimeSkips.Month | DateTimeSkips.Day | DateTimeSkips.DayOfWeek);
                 GXDateTime date;
                 if (it[1] is byte[])
                 {
                     date = (GXDateTime)GXDLMSClient.ChangeType((byte[])it[1], DataType.Date, settings.UseUtc2NormalTime);
                 }
                 else if (it[1] is GXDateTime)
                 {
                     date = (GXDateTime)it[1];
                 }
                 else
                 {
                     throw new Exception("Invalid date.");
                 }
                 date.Skip &= ~(DateTimeSkips.Hour | DateTimeSkips.Minute | DateTimeSkips.Second | DateTimeSkips.Ms);
                 GXDateTime tmp = new DLMS.GXDateTime(date);
                 tmp.Value = tmp.Value.AddHours(time.Value.Hour);
                 tmp.Value = tmp.Value.AddMinutes(time.Value.Minute);
                 tmp.Value = tmp.Value.AddSeconds(time.Value.Second);
                 tmp.Skip  = date.Skip | time.Skip;
                 items.Add(tmp);
             }
             ExecutionTime = items.ToArray();
         }
     }
     else
     {
         e.Error = ErrorCode.ReadWriteDenied;
     }
 }
 public byte[][] ImageTransferInitiate(GXDLMSClient client, string imageIdentifier, long imageSize)
 {
     return(ImageTransferInitiate(client, ASCIIEncoding.ASCII.GetBytes(imageIdentifier), imageSize));
 }
Esempio n. 31
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);
        }
Esempio n. 32
0
 static GXDLMSDayProfile[] SetDayProfileTable(GXDLMSSettings settings, Object value)
 {
     if (value != null)
     {
         List <object> arr, item, it2;
         if (value is List <object> )
         {
             arr = (List <object>)value;
         }
         else
         {
             arr = new List <object>((object[])value);
         }
         List <GXDLMSDayProfile> items = new List <GXDLMSDayProfile>();
         foreach (object tmp in arr)
         {
             if (tmp is List <object> )
             {
                 item = (List <object>)tmp;
             }
             else
             {
                 item = new List <object>((object[])tmp);
             }
             GXDLMSDayProfile it = new GXDLMSDayProfile();
             it.DayId = Convert.ToInt32(item[0]);
             List <GXDLMSDayProfileAction> actions = new List <GXDLMSDayProfileAction>();
             if (item[1] is List <object> )
             {
                 item = (List <object>)item[1];
             }
             else
             {
                 item = new List <object>((object[])item[1]);
             }
             foreach (object tmp2 in item)
             {
                 if (tmp2 is List <object> )
                 {
                     it2 = (List <object>)tmp2;
                 }
                 else
                 {
                     it2 = new List <object>((object[])tmp2);
                 }
                 GXDLMSDayProfileAction ac = new GXDLMSDayProfileAction();
                 if (it2[0] is GXTime)
                 {
                     ac.StartTime = (GXTime)it2[0];
                 }
                 else if (it2[0] is GXDateTime)
                 {
                     ac.StartTime = new GXTime((GXDateTime)it2[0]);
                 }
                 else
                 {
                     ac.StartTime = (GXTime)GXDLMSClient.ChangeType((byte[])it2[0], DataType.Time, settings.UseUtc2NormalTime);
                 }
                 ac.ScriptLogicalName = GXCommon.ToLogicalName(it2[1]);
                 ac.ScriptSelector    = Convert.ToUInt16(it2[2]);
                 actions.Add(ac);
             }
             it.DaySchedules = actions.ToArray();
             items.Add(it);
         }
         return(items.ToArray());
     }
     return(null);
 }