Вопрос или проблема
Возможно ли настроить 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-платформ, которые могут предоставлять расширенные возможности работы с медиа до установления вызова.