/// <summary> /// Send AARQ Request to the meter. /// </summary> public void AarqRequest() { GXReplyData reply = new GXReplyData(); //Generate AARQ request. //Split requests to multiple packets if needed. //If password is used all data might not fit to one packet. foreach (byte[] it in Client.AARQRequest()) { if (Trace > TraceLevel.Info) { Console.WriteLine("Send AARQ request", GXCommon.ToHex(it, true)); } reply.Clear(); ReadDataBlock(it, reply); } if (Trace > TraceLevel.Info) { Console.WriteLine("Parsing AARE reply" + reply.ToString()); } //Parse reply. Client.ParseAAREResponse(reply.Data); reply.Clear(); //Get challenge Is HLS authentication is used. if (Client.IsAuthenticationRequired) { foreach (byte[] it in Client.GetApplicationAssociationRequest()) { reply.Clear(); ReadDataBlock(it, reply); } Client.ParseApplicationAssociationResponse(reply.Data); } if (Trace > TraceLevel.Info) { Console.WriteLine("Parsing AARE reply succeeded."); } }
public void InitializeConnection() { try { log("Connection"); GXReplyData reply = new GXReplyData(); byte[] data; UpdateSettings(); //Read frame counter if GeneralProtection is used. if (!string.IsNullOrEmpty(parent.FrameCounter) && client.Ciphering != null && client.Ciphering.Security != Security.None) { reply.Clear(); int add = client.ClientAddress; Authentication auth = client.Authentication; Security security = client.Ciphering.Security; byte[] challenge = client.CtoSChallenge; try { client.ClientAddress = 16; client.Authentication = Authentication.None; client.Ciphering.Security = Security.None; data = SNRMRequest(); if (data != null) { try { ReadDataBlock(data, "Send SNRM request.", reply); } catch (TimeoutException) { reply.Clear(); ReadDataBlock(DisconnectRequest(), "Send Disconnect request.", reply); reply.Clear(); ReadDataBlock(data, "Send SNRM request.", reply); } catch (Exception e) { reply.Clear(); ReadDataBlock(DisconnectRequest(), "Send Disconnect request.", reply); throw e; } //GXLogWriter.WriteLog("Parsing UA reply succeeded."); //Has server accepted client. ParseUAResponse(reply.Data); } ReadDataBlock(AARQRequest(), "Send AARQ request.", reply); try { //Parse reply. ParseAAREResponse(reply.Data); //GXLogWriter.WriteLog("Parsing AARE reply succeeded."); reply.Clear(); GXDLMSData d = new GXDLMSData(parent.FrameCounter); ReadDLMSPacket(Read(d, 2), reply); client.UpdateValue(d, 2, reply.Value); client.Ciphering.InvocationCounter = parent.InvocationCounter = 1 + Convert.ToUInt32(d.Value); reply.Clear(); ReadDataBlock(DisconnectRequest(), "Disconnect request", reply); } catch (Exception Ex) { reply.Clear(); ReadDataBlock(DisconnectRequest(), "Disconnect request", reply); throw Ex; } } finally { client.ClientAddress = add; client.Authentication = auth; client.Ciphering.Security = security; client.CtoSChallenge = challenge; } } data = SNRMRequest(); if (data != null) { try { reply.Clear(); ReadDataBlock(data, "Send SNRM request.", reply); } catch (TimeoutException) { reply.Clear(); ReadDataBlock(DisconnectRequest(), "Send Disconnect request.", reply); reply.Clear(); ReadDataBlock(data, "Send SNRM request.", reply); } catch (Exception e) { reply.Clear(); ReadDataBlock(DisconnectRequest(), "Send Disconnect request.", reply); throw e; } //GXLogWriter.WriteLog("Parsing UA reply succeeded."); //Has server accepted client. ParseUAResponse(reply.Data); } if (!parent.PreEstablished) { //Generate AARQ request. //Split requests to multiple packets if needed. //If password is used all data might not fit to one packet. reply.Clear(); ReadDataBlock(AARQRequest(), "Send AARQ request.", reply); try { //Parse reply. ParseAAREResponse(reply.Data); //GXLogWriter.WriteLog("Parsing AARE reply succeeded."); } catch (Exception Ex) { reply.Clear(); ReadDLMSPacket(DisconnectRequest(), reply); throw Ex; } //If authentication is required. if (client.Authentication > Authentication.Low) { reply.Clear(); ReadDataBlock(client.GetApplicationAssociationRequest(), "Authenticating.", reply); client.ParseApplicationAssociationResponse(reply.Data); } } } catch (Exception ex) { throw ex; } }
public void InitializeConnection(GXManufacturer man) { Manufacturer = man; UpdateManufactureSettings(man.Identification); if (Media is GXSerial) { Console.WriteLine("Initializing serial connection."); InitSerial(); } else if (Media is GXNet) { Console.WriteLine("Initializing Network connection."); InitNet(); //Some Electricity meters need some time before first message can be send. System.Threading.Thread.Sleep(500); } else { throw new Exception("Unknown media type."); } GXReplyData reply = new GXReplyData(); byte[] data; data = Client.SNRMRequest(); if (data != null) { if (Trace) { Console.WriteLine("Send SNRM request." + GXCommon.ToHex(data, true)); } ReadDLMSPacket(data, reply); if (Trace) { Console.WriteLine("Parsing UA reply." + reply.ToString()); } //Has server accepted client. Client.ParseUAResponse(reply.Data); Console.WriteLine("Parsing UA reply succeeded."); } //Generate AARQ request. //Split requests to multiple packets if needed. //If password is used all data might not fit to one packet. reply.Clear(); ReadDataBlock(Client.AARQRequest(), reply); try { //Parse reply. Client.ParseAAREResponse(reply.Data); reply.Clear(); } catch (Exception Ex) { reply.Clear(); ReadDLMSPacket(Client.DisconnectRequest(), reply); throw Ex; } //Get challenge Is HLS authentication is used. if (Client.IsAuthenticationRequired) { foreach (byte[] it in Client.GetApplicationAssociationRequest()) { reply.Clear(); ReadDLMSPacket(it, reply); } Client.ParseApplicationAssociationResponse(reply.Data); } Console.WriteLine("Parsing AARE reply succeeded."); }
public void InitializeConnection() { if (!string.IsNullOrEmpty(parent.Manufacturer)) { UpdateManufactureSettings(parent.Manufacturer); } if (media is GXSerial) { GXLogWriter.WriteLog("Initializing serial connection."); InitSerial(); connectionStartTime = DateTime.Now; } else if (media is GXNet) { GXLogWriter.WriteLog("Initializing Network connection."); InitNet(); //Some Electricity meters need some time before first message can be send. System.Threading.Thread.Sleep(500); } else if (media is Gurux.Terminal.GXTerminal) { GXLogWriter.WriteLog("Initializing Terminal connection."); InitTerminal(); } else { media.Open(); } try { GXReplyData reply = new GXReplyData(); byte[] data; client.Limits.WindowSizeRX = parent.WindowSizeRX; client.Limits.WindowSizeTX = parent.WindowSizeTX; client.Limits.MaxInfoRX = parent.MaxInfoRX; client.Limits.MaxInfoTX = parent.MaxInfoTX; client.MaxReceivePDUSize = parent.PduSize; client.Priority = parent.Priority; client.ServiceClass = parent.ServiceClass; data = SNRMRequest(); if (data != null) { ReadDataBlock(data, "Send SNRM request.", reply); GXLogWriter.WriteLog("Parsing UA reply succeeded."); //Has server accepted client. ParseUAResponse(reply.Data); } //Generate AARQ request. //Split requests to multiple packets if needed. //If password is used all data might not fit to one packet. reply.Clear(); ReadDataBlock(AARQRequest(), "Send AARQ request.", reply); try { //Parse reply. ParseAAREResponse(reply.Data); GXLogWriter.WriteLog("Parsing AARE reply succeeded."); } catch (Exception Ex) { reply.Clear(); ReadDLMSPacket(DisconnectRequest(), 1, reply); throw Ex; } //If authentication is required. if (client.Authentication > Authentication.Low) { foreach (byte[] it in client.GetApplicationAssociationRequest()) { GXLogWriter.WriteLog("Authenticating", it); reply.Clear(); ReadDLMSPacket(it, reply); } client.ParseApplicationAssociationResponse(reply.Data); } } catch (Exception ex) { if (media is GXSerial && parent.StartProtocol == StartProtocolType.IEC) { ReceiveParameters <string> p = new ReceiveParameters <string>() { Eop = (byte)0xA, WaitTime = parent.WaitTime * 1000 }; lock (media.Synchronous) { string data = (char)0x01 + "B0" + (char)0x03 + "\r\n"; media.Send(data, null); media.Receive(p); } } throw ex; } parent.KeepAliveStart(); }