///<summary> /// Get packet from received data. ///</summary> ///<param name="buff"> /// Received data. </param> ///<returns> ///Reply if any. ///</returns> private byte[] GetPacket(byte[] buff) { GXByteBuffer receivedFrame = new GXByteBuffer(buff); // Save position where data was. This is used if data is not sent to // this server. ushort offset = Reply.Data.Size; GXDLMS.GetData(Settings, receivedFrame, Reply); // If all data is not received yet. if (!Reply.IsComplete) { return(null); } byte[] data; // If client sends keepalive or get next frame request. if ((Reply.MoreData & RequestTypes.Frame) != 0) { if (Frames != null && Frames.Length > FrameIndex) { data = Frames[FrameIndex++]; return(data); } FrameIndex = 0; data = GXDLMS.SplitToHdlcFrames(Settings, Settings.KeepAlive(), null)[0]; return(data); } // Check is data sent to this server. if (ConnectedServerAddress == 0 || ConnectedClientAddress == 0) { // Check is data send to this server. if (!IsTarget(Settings.ServerAddress, Settings.ClientAddress)) { Reply.Data.Size = offset; Reply.IsComplete = false; } ConnectedServerAddress = Settings.ServerAddress; ConnectedClientAddress = Settings.ClientAddress; } else if (Settings.ServerAddress != ConnectedServerAddress || Settings.ClientAddress != ConnectedClientAddress) { Reply.Data.Size = offset; Reply.IsComplete = false; } // Clear received data. receivedFrame.Clear(); ServerReply.Data = Reply.Data; FrameIndex = 0; return(null); }