
Добрый день, уважаемые жители хаба Asterisk.
Не знаю, как вам, а мне в последнее время безумно интересно применение Asterisk не в качестве стандартной АТС.
В предыдущем посте Asterisk исполнял обязанности охранника на парковке. На этот раз Asterisk в моей конфигурации проигрывал фоновую музыку в торговом павильоне и в случае возникновения экстренной ситуации (или при необходимости сделать какое-то объявление) выступал в роли системы оповещения.
Подробности под катом.
Пару недель назад возникла у меня одна интересная задачка, а именно развернуть систему проигрывания фоновой музыки, одной из функций которой должна быть возможность «вклиниться» в проигрывание звукового файла, сделать объявление, после чего продолжить воспроизведение музыки с того же места.
Быстренько посмотрев в гугле существующие «коробочные» решения, я понял, что это не совсем то, что я хочу. Мне были предложены либо профессиональные системы оповещения (например, для стадионов), либо аналоговые устройства, безусловно, надежные, но абсолютно не кастомизируемые.
Также были рассмотрены существующие девайсы SIP-оповещения. Вот тут уже интереснее: они регистрируются на Asterisk как extension'ы, умеют вещать мультикаст, умеют выставлять приоритет разным звуковым потокам. В России можно найти IP-SIP динамики Cyberdata, которые были весьма подробно рассмотрены grigly в этом топике. У динамиков появилась новая прошивка, интерфейс немного освежили. Имея возможность «поиграться» с данным девайсом, грех было ей не воспользоваться:)
Итак, приступим.
Описывать установку 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):

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

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

Обратите внимание на надпись: «SIP calls are considered priority 4.5. Priority 9 is the highest and 0 is the lowest. » Для того чтобы мультикаст-вещание прерывалось при звонке на динамик, настройки мультикаст должны иметь приоритет 4 и ниже.
Теперь настроим мультикаст-вещание на сервере asterisk. Я пользовался утилитой ffmpeg.
И слушаем :)
У этого варианта реализации помимо очевидных преимуществ есть один большой недостаток, а именно цена, которая для данного динамика составляет порядка 400$ долларов за штуку.
Чтобы понизить стоимость системы, я решил использовать обычные колонки (у меня под рукой были

Итак, приступим.
Устанавливаем на raspberry дистрибутив raspbx, который представляет из себя готовый образ freepbx для архитектуры ARM. (Для установки понадобится флешка размеров от 4Gb.)
Установка тривиальна: скачиваем, берем подходящую флешку, отмонтируем партицию, пишем образ через dd:
sudo dd if=path_of_your_image.img of=/dev/diskn bs=1M

Находим в сети логин/пароль для ssh root/raspberry, для web — admin/admin.
Создаем транк до нашего «головного» Asterisk:
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 создаем такой же транк, только указываем ему 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'ом, с несколькими вариантами оконечных устройств. Варианты использования прочих устройств приветствуются в комментариях. Спасибо за внимание.
English version: Asterisk. This time as a system of broadcasting background music with the possibility of emergency notification.

