Разговор с АТС KX-NCP1000
Я могу установить TCP-соединение с УАТС. Он запрашивает, и я могу войти и получить несколько записей о вызовах. Но через очень короткое время АТС теряет связь без причины, которую я могу понять. Это определенно получает ACK, я проверил с Wireshark.
В этом связанном вопросе CharlesO говорит
Вы просто пишете прослушиватель TCP, чтобы принять соединение с УАТС и проанализировать входящие подробные записи вызовов (CDR).
Успешно справились с Avaya, Panasonic и другими продуктами PABX
Значит ли это, что проблема в том, что дизайн "не звоните нам, мы вам позвоним"?
1 ответ
Обнаружение трафика между PABX и коммерческим регистратором вызовов показывает, что PABX часто прерывает соединение без веской причины, и любое приложение, желающее регистрировать данные вызовов, должно отслеживать состояние соединения.
Поскольку TcpClient не будет обнаруживать изменение состояния до тех пор, пока не произойдет сбой записи, и это строго сокет прослушивания, требуется более прямой подход к состоянию соединения:
public static class Extensions
{
/// <summary>
/// Obtain the current state of the socket underpinning a TcpClient.
/// Unlike TcpClient.Connected this is reliable and does not require
/// capture of an exception resulting from a failed socket write.
/// </summary>
/// <param name="tcpClient">TcpClient instance</param>
/// <returns>Current state of the TcpClient.Client socket</returns>
public static TcpState GetState(this TcpClient tcpClient)
{
var foo = IPGlobalProperties.GetIPGlobalProperties().GetActiveTcpConnections()
.SingleOrDefault(x => x.LocalEndPoint.Equals(tcpClient.Client.LocalEndPoint));
return foo != null ? foo.State : TcpState.Unknown;
}
}
Также необходимо обрабатывать избыточные журналы вызовов, поскольку они часто повторяются при восстановлении соединения.