Как настроить Asterisk для отправки аудиосообщения до установления вызова

Вопрос или проблема

Возможно ли настроить Asterisk так, чтобы он отправлял RTP-пакеты с аудио от получателя до того, как удаленная сторона фактически поднимет трубку?

Кажется, это требуется для теста соответствия VoIP, который моя настройка должна пройти. Они используют симулятор для этого теста, и когда я звоню другой стороне, они поднимают трубку без отправки OK. Я слышу аудио с другой стороны, но они не слышат меня. Я изучал directmediasetup, progressinband, prematuremedia, но ни одно из них не дает того, что нужно. Это вообще возможно с Asterisk?

Среда:

Asterisk регистрируется на SIP-транке, аппаратные SIP-телефоны зарегистрированы в Asterisk. Исходящие звонки проходят через SIP-транк. Версия Asterisk: 1.8.11.

Ранняя медиа возможно с Asterisk, но только в определенных ситуациях и только при сотрудничестве/поддержке всех участвующих устройств и служб. Некоторые телефоны и/или провайдеры услуг не поддерживают раннюю медиа. Поддержка раннего голоса и раннего DTMF может варьироваться.

У вас есть SIP-телефон, зарегистрированный в Asterisk, который совершает звонок на внешний номер. Asterisk в свою очередь звонит по этому номеру через отдельный SIP-транк. Это два отдельных участка вызова. Asterisk может передавать раннюю медиа звонившему (например, собственный рингтон или музыка на удержании), и Asterisk может получать раннюю медиа от внешней стороны через SIP-транк. Однако стандартный оператор Dial() автоматически выполнит Answer() и соединит участки вызова вместе, когда внешняя сторона ответит.

Кажется, вы хотите избежать этого обычно желательного поведения и соединить участки вызова без Answer() их. Приложение Dial() позволяет отсрочить обычно автоматический Answer(), используя опции ‘d’ или ‘D’. Я не знаю о какой-либо опции Dial(), которая позволяет соединить участки вызова без Answer().

Пожалуйста, смотрите вики Asterisk для дальнейшего обсуждения и примеров ранней медиа с Asterisk.

Это невозможно с Asterisk.

Asterisk не открывает обратный путь медиа преждевременно, потому что это вызывает остановку работы некоторых устройств. Он делает преждевременную медиа только в одном направлении.

Вы, вероятно, можете изменить это, переписав код (оба конца должны поддерживать это), но в стандартном исходном коде это не поддерживается.

Почему бы просто не исключить Asterisk из пути медиа вообще? *

directmedia=yes
directrtpsetup=yes
prematuremedia=no ;это делает прямо противоположное тому, что все предполагают
progressinband=no

Asterisk отправит Invite на другую сторону с IP-адресом вашего телефона, указанным в SDP. Когда другая сторона даст 183 Session Progress, это будет отправлено Asterisk обратно на ваш телефон, с IP-адресом другой стороны в SDP.

Пока ваш телефон поддерживает это, у вас будет двусторонняя ранняя медиа без того, чтобы Asterisk имел возможность вмешаться и испортить это.

* ну, Asterisk всё равно переинициирует себя в конце вызова на мгновение, но в остальном остаётся вне процесса

Есть два способа. Либо 1 – используя 183 ранняя медиа.
Другой способ – используя приложение Answer().

В обоих случаях медиа будет от стороны Asterisk.

; 183 - метод прогресса сессии.
exten=> _X.,1,Progress()
exten=> _X.n,playback(tt-monkeys,noanswer)
; 200 - Ответ
exten=> _X.,1,Answer()
exten=> _X.,n,playback(tt-monkeys)

.

Ответ или решение

Настройка Asterisk для передачи аудиопотока до установления соединения является непростой задачей и требует глубокого понимания архитектуры и принципов работы самой платформы. Основная сложность заключается в том, что Asterisk по умолчанию не предоставляет возможность отправки аудиоданных до установления соединения, поскольку это может повлиять на совместимость и корректность работы различных устройств. Тем не менее, есть несколько методов и подходов, которые можно рассмотреть для решения этой задачи.

Теория

Прежде всего, важно понимать концепцию ранних медиа (early media) в SIP-протоколе. Early media — это мультимедийный поток, который передается между сторонами в SIP-сеансе до того, как соединение будет официально установлено и возвращен ответ 200 OK. Обычно этот поток содержит сигнализацию или приветственные мелодии, которые слышны вызывающему абоненту, в то время как соединение с вызываемым абонентом еще не установлено.

Asterisk имеет возможность работать с ранними медиа, но важно отметить, что оба конца (и SIP-телефон, регистрирующийся на Asterisk, и удаленный SIP-транк) должны поддерживать эту функцию. Кроме того, Asterisk действует как промежуточная точка между двумя сегментами вызова: от телефона до Asterisk и от Asterisk до SIP-транка. Каждый из этих сегментов нужно учитывать при настройке поддержки ранних медиа.

Пример

Пример конфигурации настроек, которые могут помочь в работе с ранними медиа, включает использование параметров Progress() и 183 Session Progress. Конфигурация может выглядеть следующим образом:

exten => _X.,1,Progress()
exten => _X.n,Playback(tt-monkeys,noanswer)

При использовании Progress(), Asterisk отправляет сигнал 183 Session Progress, указывая на возможность начала передачи медиа до установления вызова. Команда Playback() с опцией noanswer позволяет проигрывать аудио, не ожидая ответа от вызываемой стороны.

Альтернативный подход заключается в использовании параметра directmedia=yes, который позволяет Asterisk находиться вне медиапотока, установив прямое RTP-соединение между SIP-телефоном и удаленным SIP-транком. В ходе процесса Asterisk отправляет запрос INVITE, содержащий IP-адрес телефона в Session Description Protocol (SDP).

Применение

Чтобы применить эти концепции на практике, начните с анализа конфигурации вашего Asterisk. Убедитесь, что оба конца поддерживают ранние медиа и обладают необходимыми функциями. Затем, в конфигурационных файлах Asterisk, таких как extensions.conf, внесите правильные изменения, чтобы включить ранние медиа с использованием методов, описанных выше.

Можно также рассмотреть модификацию исходного кода Asterisk, но это требует глубоких знаний в программировании и понимании внутренней работы Asterisk. Если прямой доступ через конфигурационные файлы невозможен, вероятно, потребуется заменить программное окружение или использовать другой подход.

Заключение

Настройка Asterisk для отправки аудио до установления вызова сопряжена с множеством технических нюансов и ограничений, обусловленных протоколом SIP и возможностями применяемых устройств. В некоторых случаях возможно использовать прямое медиапрохождение или проигрывание аудио через ранние медиа, но для этого необходимо соответствие всех компонентов и тщательная настройка каждого из них. При внедрении предложенных решений обязательно учитывайте ограничения вашего оборудования и исключите вероятные проблемы, связанные с совместимостью.

Если все вышеописанные методы не решают задачу, возможно, следует рассмотреть альтернативные решения, такие как использование более современных версий Asterisk или других VoIP-платформ, которые могут предоставлять расширенные возможности работы с медиа до установления вызова.

Оцените материал
Добавить комментарий

Капча загружается...