private string PduToXml(GXByteBuffer value, bool omitDeclaration, bool omitNameSpace) { if (value == null || value.Size == 0) { throw new ArgumentNullException("value"); } GXDLMSTranslatorStructure xml = new GXDLMSTranslatorStructure(OutputType, Hex, ShowStringAsHex, tags); GXDLMSSettings settings = new GXDLMSSettings(true); GXReplyData data = new GXReplyData(); byte cmd = value.GetUInt8(); switch (cmd) { case (byte)Command.Aarq: value.Position = 0; settings = new GXDLMSSettings(true); GXAPDU.ParsePDU(settings, settings.Cipher, value, xml); break; case 0x81://Ua value.Position = 0; GetUa(value, xml); break; case (byte)Command.Aare: value.Position = 0; settings = new GXDLMSSettings(false); GXAPDU.ParsePDU(settings, settings.Cipher, value, xml); break; case (byte)Command.GetRequest: GXDLMSLNCommandHandler.HandleGetRequest(settings, null, value, null, xml); break; case (byte)Command.SetRequest: GXDLMSLNCommandHandler.HandleSetRequest(settings, null, value, null, xml); break; case (byte)Command.ReadRequest: GXDLMSSNCommandHandler.HandleReadRequest(settings, null, value, null, xml); break; case (byte)Command.MethodRequest: GXDLMSLNCommandHandler.HandleMethodRequest(settings, null, value, null, null, xml); break; case (byte)Command.WriteRequest: GXDLMSSNCommandHandler.HandleWriteRequest(settings, null, value, null, xml); break; case (byte)Command.AccessRequest: GXDLMSLNCommandHandler.HandleAccessRequest(settings, null, value, null, xml); break; case (byte)Command.DataNotification: data.Xml = xml; data.Data = value; value.Position = 0; GXDLMS.GetPdu(settings, data); break; case (byte)Command.ReadResponse: case (byte)Command.WriteResponse: case (byte)Command.GetResponse: case (byte)Command.SetResponse: case (byte)Command.MethodResponse: case (byte)Command.AccessResponse: data.Xml = xml; data.Data = value; value.Position = 0; GXDLMS.GetPdu(settings, data); break; case (byte)Command.ReleaseRequest: case (byte)Command.ReleaseResponse: xml.AppendStartTag((Command)cmd); //Len. if (value.GetUInt8() != 0) { //BerType value.GetUInt8(); //Len. value.GetUInt8(); xml.AppendLine(TranslatorTags.Reason, "Value", ((ReleaseRequestReason)value.GetUInt8()).ToString()); } xml.AppendEndTag((Command)cmd); break; case (byte)Command.GloReadRequest: case (byte)Command.GloWriteRequest: case (byte)Command.GloGetRequest: case (byte)Command.GloSetRequest: case (byte)Command.GloReadResponse: case (byte)Command.GloWriteResponse: case (byte)Command.GloGetResponse: case (byte)Command.GloSetResponse: case (byte)Command.GloMethodRequest: case (byte)Command.GloMethodResponse: int cnt = GXCommon.GetObjectCount(value); xml.AppendLine(cmd, "Value", GXCommon.ToHex(value.Data, false, value.Position, value.Size - value.Position)); break; case (byte)Command.ConfirmedServiceError: data.Xml = xml; data.Data = value; GXDLMS.HandleConfirmedServiceError(data); break; default: xml.AppendLine("<Data=\"" + GXCommon.ToHex(value.Data, false, value.Position, value.Size - value.Position) + "\" />"); break; } if (OutputType == TranslatorOutputType.StandardXml) { StringBuilder sb = new StringBuilder(); if (!omitDeclaration) { sb.AppendLine("<?xml version=\"1.0\" encoding=\"utf-8\"?>"); } if (!omitNameSpace) { if (cmd != (byte)Command.Aare && cmd != (byte)Command.Aarq) { sb.AppendLine( "<x:xDLMS-APDU xmlns:x=\"http://www.dlms.com/COSEMpdu\">"); } else { sb.AppendLine( "<x:aCSE-APDU xmlns:x=\"http://www.dlms.com/COSEMpdu\">"); } } sb.Append(xml.ToString()); if (!omitNameSpace) { if (cmd != (byte)Command.Aare && cmd != (byte)Command.Aarq) { sb.AppendLine("</x:xDLMS-APDU>"); } else { sb.AppendLine("</x:aCSE-APDU>"); } } return sb.ToString(); } return xml.ToString(); }