///<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);
}