private BacNetRawMessage ReassembleMessage(ArrayList messageList, byte invokeId)
{
bool firstMsg = true;
ArrayList resMsg = new ArrayList();
foreach (var message in messageList)
{
BacNetRawMessage msg = message as BacNetRawMessage;
if (msg == null || msg.Apdu[1] != invokeId) continue;
if (firstMsg)
{
resMsg.AddRange(msg.Bvlc);
resMsg.AddRange(msg.Npdu);
byte[] firstApdu = new byte[msg.Apdu.Length - 2];
firstApdu[0] = msg.Apdu[0];
firstApdu[1] = msg.Apdu[1];
for (int i = 4;i< msg.Apdu.Length; i++)
firstApdu[i - 2] = msg.Apdu[i];
resMsg.AddRange(firstApdu);
firstMsg = false;
}
else
{
byte[] anyApdu = new byte[msg.Apdu.Length - 5];
Array.Copy(msg.Apdu, 5, anyApdu, 0, anyApdu.Length);
resMsg.AddRange(anyApdu);
}
}
BacNetRawMessage res = new BacNetRawMessage();
byte[] length = ByteConverter.GetBytes((ushort)resMsg.Count);
resMsg[2] = length[0];
resMsg[3] = length.Length == 2 ? length[1] : (byte)0;
res.All = (byte[]) resMsg.ToArray(typeof (byte));
return res;
}