- PVSM.RU - https://www.pvsm.ru -

Asterisk. На этот раз в качестве системы трансляции фоновой музыки с возможностью экстренного оповещения

image

Добрый день, уважаемые жители хаба Asterisk.

Не знаю, как вам, а мне в последнее время безумно интересно применение Asterisk не в качестве стандартной АТС.

В предыдущем посте [1] Asterisk исполнял обязанности охранника на парковке. На этот раз Asterisk в моей конфигурации проигрывал фоновую музыку в торговом павильоне и в случае возникновения экстренной ситуации (или при необходимости сделать какое-то объявление) выступал в роли системы оповещения.

Подробности под катом.

Пару недель назад возникла у меня одна интересная задачка, а именно развернуть систему проигрывания фоновой музыки, одной из функций которой должна быть возможность «вклиниться» в проигрывание звукового файла, сделать объявление, после чего продолжить воспроизведение музыки с того же места.

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

Также были рассмотрены существующие девайсы SIP-оповещения. Вот тут уже интереснее: они регистрируются на Asterisk как extension'ы, умеют вещать мультикаст, умеют выставлять приоритет разным звуковым потокам. В России можно найти IP-SIP динамики Cyberdata [2], которые были весьма подробно рассмотрены grigly [3] в этом [4] топике. У динамиков появилась новая прошивка, интерфейс немного освежили. Имея возможность «поиграться» с данным девайсом, грех было ей не воспользоваться:)

Итак, приступим.

Описывать установку Asterisk мы, разумеется, не будем: в сети полно качественных мануалов. Единственное, что добавлю: давно уже сделал для себя docker-compose с asterisk, mysql, php-apache, cdr-viewer, что делает деплой asterisk практически моментальным. Планирую описать это в следующем топике).

Создаем на Asterisk парочку extension'ов (по умолчанию /etc/asterisk/sip.conf):

Скрытый текст

[tmpl](!)
type = peer
host = dynamic
canreinvite=no
dtmfmode = rfc2833
insecure = invite
nat = force_rport,comedia
call-limit=2
qualify = yes
context = from-internal
disallow=all
allow=alaw
allow=ulaw
directmedia=no
[780](tmpl)
defaultuser=780
secret=780
callerid="Dispatcher" <780>
[790](tmpl)
defaultuser=790
secret=790
callerid="Speaker1" <790>
[800](tmpl)
defaultuser=800
secret=800
callerid="Speaker2" <800>

Пишем простейший диалплан Asterisk для тестов (по умолчанию /etc/asterisk/extensions.conf):

Скрытый текст

exten => _XXX,1,NoOp(Testing calls to speakers. Dialing ${EXTEN} from ${CALLERID})
same => n,Page(SIP/${EXTEN},qA(hello-world))
same => n,Hangup()

Переходим к настройке динамика.

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

Настраиваем sip extension (для входа на динамик логин/пароль по умолчанию admin/admin):

Asterisk. На этот раз в качестве системы трансляции фоновой музыки с возможностью экстренного оповещения - 3

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

И настраиваем мультикаст:

Asterisk. На этот раз в качестве системы трансляции фоновой музыки с возможностью экстренного оповещения - 4

Обратите внимание на надпись: «SIP calls are considered priority 4.5. Priority 9 is the highest and 0 is the lowest. » Для того чтобы мультикаст-вещание прерывалось при звонке на динамик, настройки мультикаст должны иметь приоритет 4 и ниже.

Теперь настроим мультикаст-вещание на сервере asterisk. Я пользовался утилитой ffmpeg.

Устанавливаем:

sudo apt-get install ffmpeg
Запускаем вещание (я взял плейлист с vocaltrance.fm (не реклама), разумеется, можно выбрать любой):

ffmpeg -re -i 176.9.36.203 [5]:8000/vocaltrance_128 -filter_complex 'aresample=8000,asetnsamples=n=160' -acodec pcm_alaw -ac 1 -vn -f rtp udp://236.0.0.1:2000?buffer_size=10000000?fifo_size=1000000

И слушаем:)

У этого варианта реализации помимо очевидных преимуществ есть один большой недостаток, а именно цена, которая для данного динамика составляет порядка 400$ долларов за штуку.
Чтобы понизить стоимость системы, я решил использовать обычные колонки (у меня под рукой были

вот такие

Asterisk. На этот раз в качестве системы трансляции фоновой музыки с возможностью экстренного оповещения - 5

и raspberry pi [6]. ( Стоимость динамика и raspberry составила ~ 50$).

Итак, приступим.

Устанавливаем на raspberry дистрибутив raspbx [7], который представляет из себя готовый образ freepbx для архитектуры ARM. (Для установки понадобится флешка размеров от 4Gb.)

Установка тривиальна: скачиваем, берем подходящую флешку, отмонтируем партицию, пишем образ через dd:

sudo dd if=path_of_your_image.img of=/dev/diskn bs=1M

Asterisk. На этот раз в качестве системы трансляции фоновой музыки с возможностью экстренного оповещения - 6

Находим в сети логин/пароль для ssh root/raspberry, для web — admin/admin.

Создаем транк до нашего «головного» Asterisk:

[rasp]

type=peer
host=192.168.1.254 ;;ip "головного" Asterisk
qualify=yes
insecure = port,invite
directmedia=no
context=speakers
canreinvite=no
disallow=all
allow=alaw
allow=ulaw

Asterisk. На этот раз в качестве системы трансляции фоновой музыки с возможностью экстренного оповещения - 7

На «головном» Asterisk создаем такой же транк, только указываем ему ip raspberry.

Звонки на raspberry будут отправляться в chan_alsa (module load chan_alsa.so, если по дефолту не загружен).

Для проигрывания музыки используем omxplayer (sudo apt-get -y install omxplayer).

Чтобы звонки прерывали воспроизведение музыки, напишем простенький диалплан:

Скрытый текст

[speakers]
exten => s,1,System(killall /usr/bin/omxplayer.bin)
same => n,Wait(2)
same => n,Dial(console/sdp)
same => n,Hangup()
exten => h,1,System(omxplayer -o local rtp://@236.0.0.1:2000)

Для звонка с «головного» Asterisk добавим к исходному диалплану:

exten => 1000,1,Dial(SIP/rasp/s,60,Tt)
same => n,Hangup()

И наслаждаемся результатом:)

Заключение

В результате мы имеем вполне работающую систему оповещения / трансляции фоновой музыки, контролируемую Asterisk'ом, с несколькими вариантами оконечных устройств. Варианты использования прочих устройств приветствуются в комментариях. Спасибо за внимание.

Автор: j3st3r

Источник [8]


Сайт-источник PVSM.RU: https://www.pvsm.ru

Путь до страницы источника: https://www.pvsm.ru/ffmpeg/260189

Ссылки в тексте:

[1] посте: http://habrahabr.ru/post/261391/

[2] IP-SIP динамики Cyberdata: http://www.cyberdata.net/voip/011393/

[3] grigly: https://habrahabr.ru/users/grigly/

[4] этом: https://habrahabr.ru/post/228921/

[5] 176.9.36.203: http://176.9.36.203

[6] raspberry pi: https://ru.wikipedia.org/wiki/Raspberry_Pi

[7] raspbx: http://www.raspberry-asterisk.org/downloads/

[8] Источник: https://habrahabr.ru/post/268047/