private void ParseComplexAck(BacNetRawMessage msg, IPEndPoint endPoint)
{
if (msg.Apdu.Length > 2)
{
//Сегментированный ответ
if ((msg.Apdu[0] >> 3 & 1) == 1)
{
/*BacNetRawMessage segmentedMsg = null;
foreach (object m in messagePool)
{
BacNetRawMessage ms = m as BacNetRawMessage;
//Если в пуле есть сообщение с таким же InvokeId как у поступившего используем его
if (ms != null && ms.Apdu[1] == msg.Apdu[1])
segmentedMsg = ms;
}
if (segmentedMsg == null) segmentedMsg = msg;*/
messagePool.Add(msg);
BacNetIpNpdu npdu = new BacNetIpNpdu(msg.Npdu);
BacNetDevice.Instance.Services.Acknowledgement.SegmentAck(endPoint, npdu.Source, msg.Apdu[1], msg.Apdu[2], msg.Apdu[3]);
//Если есть ещё сегменты
if ((msg.Apdu[0] >> 2 & 1) == 1)
{
return;
}
msg = ReassembleMessage(messagePool, msg.Apdu[1]);
}
switch (msg.Apdu[2])
{
case 12:
BacNetDevice.Instance.Response.ReceivedReadPropertyAck(msg);
break;
case 14:
BacNetDevice.Instance.Response.ReceivedReadPropertyMultipleAck(msg);
break;
}
}
}