/// <summary> /// Sends an APDU to the connected device /// </summary> /// <param name="apdu">The APDU to send</param> // Revision History // MM/DD/YY who Version Issue# Description // -------- --- ------- ------ --------------------------------------- // 05/21/13 RCG 2.80.32 N/A Created public void SendAPDU(xDLMSAPDU apdu) { if (IsOpen && apdu != null) { WPDU Wrapper = new WPDU(ClientPort, ServerPort, apdu.Data); m_Logger.WriteLine(Logger.LoggingLevel.Detailed, "Sending APDU. Type: " + EnumDescriptionRetriever.RetrieveDescription(apdu.Tag)); Send(Wrapper.Data); } }
/// <summary> /// Parses any WPDU's found in the data /// </summary> // Revision History // MM/DD/YY who Version Issue# Description // -------- --- ------- ------ --------------------------------------- // 02/04/12 RCG 2.70.63 N/A Created private void ParseWPDUData() { lock (m_LowLevelDataBuffer) { while (m_LowLevelDataBuffer.Count > 0) { int WPDUStart = WPDU.FindStartOfWPDU(ServerPort, ClientPort, m_LowLevelDataBuffer); if (WPDUStart > 0) { // We have some extra data at the start that we can go ahead and throw out m_LowLevelDataBuffer.RemoveRange(0, WPDUStart); // Set the start index to 0 since we got rid of the extra data WPDUStart = 0; } if (WPDUStart == 0) { try { MemoryStream DataStream = new MemoryStream(m_LowLevelDataBuffer.ToArray()); WPDU NewWPDU = new WPDU(); NewWPDU.Parse(DataStream); // The High Level Buffer contains the raw APDU data lock (m_HighLevelDataBuffer) { m_HighLevelDataBuffer.AddRange(NewWPDU.Payload); } m_LowLevelDataBuffer.RemoveRange(0, (int)DataStream.Position); m_Logger.WriteLine(Logger.LoggingLevel.Detailed, "WPDU Received."); } catch (Exception ex) { // We failed to parse the WPDU which must mean we don't have enough data so we can break out of the loop m_Logger.WriteLine(Logger.LoggingLevel.Detailed, "WPDU Parse failure. Reason: " + ex.Message); break; } } } } }