Example #1
0
        /// <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);
            }
        }
Example #2
0
        /// <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;
                        }
                    }
                }
            }
        }