Вопрос или проблема
Можно ли настроить Asterisk так, чтобы он посылал RTP-пакеты с аудио от принимающего устройства до того, как удалённая сторона фактически поднимет трубку?
Это, кажется, необходимо для прохождения теста на соответствие VoIP моему оборудованию. Они используют симулятор для тестирования этого, и когда я звоню другой стороне, они поднимают трубку, не отправляя OK. Я слышу аудио с другой стороны, но они меня не слышат. Я изучил directmediasetup
, progressinband
, prematuremedia
, но ни одно из них не достигло того, что мне нужно. Возможно ли это вообще с Asterisk?
Среда:
Asterisk регистрируется на SIP-транке, аппаратные SIP-телефоны зарегистрированы на Asterisk. Исходящие звонки проходят через SIP-транк. Версия Asterisk: 1.8.11.
Ранняя передача медиаконтента возможна с Asterisk, но только в определенных случаях и только при сотрудничестве/поддержке всех вовлеченных устройств и сервисов. Некоторые телефоны и/или провайдеры услуг не поддерживают раннюю передачу медиаконтента. Поддержка раннего звука и раннего DTMF может различаться.
У вас есть SIP-телефон, зарегистрированный на Asterisk, который совершает звонок на внешний номер. В свою очередь, Asterisk набирает этот номер через отдельный SIP-транк. Это два отдельных участка вызова. 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 Early media. Другой способ – использовать приложение 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 для передачи аудио до установки вызова является важной задачей в контексте выполнения тестов на соответствие VoIP. Решение этой задачи требует глубокого понимания концепции «ранних медиа» (early media) и способностей Asterisk в отношении обработки медиа-потоков до окончания сигнального процесса. Давайте подробней разберем, как можно попытаться достичь поставленной задачи в Asterisk, версии 1.8.11, с учетом ограничений и возможностей.
Теория
Ранние медиа — это медиа, передаваемые до того, как вызов считается установленным. Это может быть полезно, когда ваша система должна отправлять аудио еще до того, как ответ другой стороны будет подтвержден. Asterisk способен работать с ранними медиа, но с некоторыми ограничениями, так как оборудование или провайдеры VoIP могут не поддерживать данную функцию.
Две ноги вызова: В рассматриваемой конфигурации, SIP-телефон регистрируется на Asterisk, после чего вызывается внешний номер через SIP-транк. Таким образом, у нас есть две независимые «ноги» вызова: одна между телефоном и Asterisk, и вторая между Asterisk и SIP-транком. Независимое управление ими позволяет манипулировать потоками медиа.
Пример
Для того чтобы администрировать ранние медиа, Asterisk использует возможности ответа и прогрессирования сигнала, такие функции как Progress()
и Dial()
. Рассмотрим пример конфигурации:
exten => _X.,1,Progress()
exten => _X.n,Dial(SIP/${EXTEN}@siptrunk,30)
- Progress(): Эта команда используется для создания состояния “ранней сессии”, в которой можно передавать аудио до окончательного ответа.
- Dial(): Параметр к диалогу может включать такие опции, которые позволят изменять поведение Asterisk в отношениях медиа-потоков.
Применение
Рассмотрим несколько стратегий, которые могут использоваться для попытки передачи аудио до установления вызова:
-
Непосредственное медиа (Direct Media): Использование конфигурации
directmedia=yes
, чтобы минимизировать участие Asterisk в маршрутизации медиа. Здесь предполагается, что устройства (SIP телефоны и транк) поддерживают direct media. -
Настройка Progress(): Используйте
Progress()
для 183 ответа, чтобы попытаться включить передачу аудио до установки вызова. Однако, учтите, что это поведение зависит от поддержки устройства. -
Использование параметров SIP: Убедитесь, что SIP-устройства и провайдер поддерживают необходимые SDP искусности для реализации передачи ранних медиа.
-
Настройка приложения Answer(): Если цель кроется в симуляции начального аудио потока, оптимальным решением может быть немедленный ответ с аудио, хотя истинной передачи аудио до ответа требовать от Asterisk сложно.
Какие шаги предпринять:
-
Проанализируйте всех участников системы: Узнайте, поддерживают ли SIP-устройства и провайдер идею ранних медиа, так как это критично для успешного выполнения теста.
-
Проверьте вашу версию Asterisk: В версии 1.8.11 могут отсутствовать некоторые современные возможности, и возможно, рассмотреть обновление, если поддержка необходимого функционала критична.
-
Тестируйте с разными конфигурациями: Путем проб и ошибок с различными комбинациями параметров конфигурации можно достичь оптимального результата.
-
Изучите возможность обновления кода: Если стандартные возможности Asterisk не позволяют достичь цели, можно рассмотреть вариант с перепиской части кода для реализации нужного функционала.
Заключение
В итоге, реализация передачи аудио до установления вызова в Asterisk связано с пониманием и согласованностью всех компонентов системы, включая поддержку со стороны устройств и провайдера. Без гарантированной поддержки со стороны всех участвующих сторон, нет никакой гарантии на успешную реализацию функции. Если такие возможности отсутствуют, возможно, следует пересмотреть архитектуру или механизмы поддержки медиа, чтобы достичь поставленных целей.