public void Listen() { try { //вытаскиваем параметры подключения к астериску var asteriskConfiguration = mPbxConfigurationService.GetPbxConfiguration(); var loginCommand = mPbxConfigurationService.GetLoginCommand(asteriskConfiguration); using (ISocketAdapter socket = mSocketAdapterFactory.CreateSocketAdapter()) { //Создаём сокет для подключения к астериску и подключаемся к нему socket.Connect(asteriskConfiguration.IpAddress, asteriskConfiguration.Port); //авторизуемся socket.Send(Encoding.ASCII.GetBytes(loginCommand)); //читаем cSocketReadBufer байт из сокета var bytesRead = 1; while (bytesRead != 0) { var asteriskAnswer = new byte[cSocketReadBufer]; bytesRead = socket.Receive(asteriskAnswer); OnFullMessageRecived(new PbxRawMessageEventArgs { Message = Encoding.ASCII.GetString(asteriskAnswer, 0, asteriskAnswer.Length) }); //Полученный массив байт преобразуем к строке var asteriskMessage = ParseFullAsteriskMessage(asteriskAnswer); var messages = mPbxMessagesParser.ExtractPbxMessages(asteriskMessage); var parsedMessages = messages .Select ( t => mPbxMessagesParser.ParseMessage(t) ) .Where ( r => r.ContainsKey("Event") && mValueableEvents.Contains(r["Event"]) ) .ToList(); //Если нашли события, запускаем событие полученного сообщения if (parsedMessages.Any()) { OnPbxMessageRecived(new PbxMessagesEventArgs { Messages = parsedMessages }); } //Читаем следующее сообщение //asteriskAnswer = socket.Receive(cSocketReadBufer); } } } catch (Exception ex) { var errorMessage = String.Format("Подключение к астериску отвалилось с ошибкой. \r\n {0}", ex); OnPbxConnectionLost(new PbxErrorEventArgs { ErrorMessage = errorMessage }); } OnPbxConnectionLost(new PbxErrorEventArgs { ErrorMessage = "Подключение к астериску отвалилось" }); }