Skip to content
Опубликовано: 2014-04-28
Теги: asterisk sip voip

Early media или музыка вместо гудков в Asterisk

Обращение к читателям от автора: Это самая популярная статья в этом блоге. Если Вам не составит труда, то оставляйте комментарии, пожалуйста. Ведь хочется иметь обратную связь и понимать на сколько полезен описанный материал. А в качестве бонуса - появилось обновление, которое помогает устанавливать мелодии вызова без перезагрузки сервера.

Иногда хочется, чтобы во время звонка вместо длинных гудков проигрывалась мелодия. Как в рекламе говорится, “надоели гудки”? Такое возможно сделать с помощью Asterisk. Эта технология называется Early Media описанное в RFC3960.

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

Нам же необходимо сделать именно вызов абонента с мелодией. Для этого создаем свой MoH класс, в котором прописываем необходимую мелодию. В директории mymusic находится один файл, поэтому проигрываться всегда будет он. Пример musiconhold.conf:

[mymusic]
mode=files
directory=mymusic
sort=alpha

Не забыть перезапустить(!) Asterisk, т.к. он не умеет “на лету” считывать новые мелодии в директории, указанной в классе.

Далее в extensions.conf создаем макрос (но можно просто в диалплан на каждого, кому эту мелодию на вызов ставить):

[macro-music]
exten => s,1,SetMusicOnHold(mymusic)
exten => s,n,Progress()
exten => s,n,Dial(SIP/${ARG1},40,m)
exten => s,n,Hangup()

Сначала назначаем специальный класс MoH, потом запускаем Progress и запускаем вызов с ключом m. Без этого ключа в команде Dial не сработает мелодия. Этот ключ проигрывает мелодию MoH, пока абонент не ответит.

И наконец ставим абоненту/пользователю на вызов эту мелодию всё в том же extensions.conf:

exten => 444,1,Macro(music,${EXTEN})

Теперь при звонке на номер 444 будет проигрываться мелодия, которая указана для MoH класса mymusic. Проще простого.

UPD(27.10.2015): Коллега столкнулся с похожей задачей, но была необходимость не в мелодии вместо гудка, а в проигрывании сообщения-уведомления. Полученный результат более гибок в сравнении с установкой проигрываемого файла через MoH и позволяет воспроизводить любые файлы без перезагрузки сервера Asterisk PBX. И теперь само решение:

Для SIP-пира выставляется ключ progressinband в значение yes, что позволяет обойти обычные ТфОП сети (отправка 180 Ringing, если не был отправлен 183 Session Progress с последующей установкой аудио-канала):

...
progressinband=yes
...

А далее в extensions.conf такие строки, чтобы вызвать соответствующего SIP-пира:

exten => _X.,1,NoOp()
exten => _X.,n,Ringing()
exten => _X.,n,Progress()
exten => _X.,n,Wait(1)
exten => _X.,n,Playback(mediafile,noanswer)
exten => _X.,n,Dial(SIP/${EXTEN})
exten => _X.,n,HangUp()

С помощью Ringing() отправляем сигнал о том, что у нас пошел вызов абонента (для обхода обычных ТфОП сетей(привет ростелекомовским АТС)). Далее сообщаем с помощью Progress(), что у нас всё таки будет канал с аудио. Даем 1 секунду для установления канала и воспроизводим медиафайл. Для Playback обязательно надо указать ключ noanswer, чтобы эта команда самостоятельно не послала сигнал о том, что на вызов ответили.

В целом можно оформить этот диалплан в макрос, но пример приводить не буду.