예제 #1
0
        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 = "Подключение к астериску отвалилось"
            });
        }