Добрый день, уважаемые жители хаба 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'ом, с несколькими вариантами оконечных устройств. Варианты использования прочих устройств приветствуются в комментариях. Спасибо за внимание.
Комментарии (7)
beho1der
12.07.2017 11:33Не понятно как завязывается мультикаст поток и asterisk в обоих случаях. Может стоит получше описать?
Rsa97
12.07.2017 13:41Судя по тексту, практически никак. Музыкальный multicast-поток всегда генерируется через ffmpeg и c Asterisk'ом никак не связан.
На IP-SIP динамиках переключение с музыки на вызов идёт за счёт приоритета канала.
На raspberry музыка воспроизводится из multicast-потока отдельной программой omxplayer, а Asterisk просто эту программу прибивает при поступлении звонка и запускает после окончания вызова.j3st3r
12.07.2017 13:45+1По большому счету вы правы. В случае с динамиком — показано как настроить мультикаст на него с нужными приоритетами. В случае raspberry — Asterisk контролирует работу omxplayer'a, однако для этого asterisk и нужен, он контролирует когда играть музыку, а когда говорить оператору.
Цель статьи же в том, чтобы показать, насколько разноплановым может быть asterisk, не просто банальной звонилкой, лично мне было очень интересно это реализовывать, чей я и поделился с сообществом.
procfg
12.07.2017 14:06Все очень просто все время проигрывется музыка, если нужно сделать какое либо оповещение звоним на нужную колонку и делаем оповещение.
mihmig
12.07.2017 12:52>>killall /usr/bin/omxplayer.bin
Сурово конечно, а можно как-то «попросить» плеер плавно снизить громкость?j3st3r
12.07.2017 14:06+2Да, можно, используя флаг «vol».
Вот описание:
on starting command line, param --vol YYY, double millibels, default 0, range [-6000:0]
by stdin interface, sending ± to omxplayer will increase/decrease volume for 300 dmbels
with DBUS interface, cmd 'set volume', value double:XXX, default 1, range [0:1]
xxx to yyy relation is: XXX = 10 ^ (YYY / 2000)… according to omxplayer.cpp source code, reverse formula would be: YYY = 2000 * (log XXX).
so if we need:
volume 1%, XXX=0.01 and YYY=-4000 (10^(-4000/2000)=10^-2=0.01
volume 10%, XXX=0.1 and YYY=-2000 (10^(-2000/2000)=10^-1=0.1
volume 50%, XXX=0.5 and YYY=-602 (10^(-602/2000))~=0.5
volume 100%, XXX=1 and YYY=0 (10^(0/2000)=10^0=1)
volume 150%, XXX=1.5 and YYY=352… (for boost test, normal values are <=100%)
frees2
В Эстонии ( И не только, не знаю как у вас.), к примеру, квоты на национальных исполнителей ( На Украине вроде тоже вводится такое. ), вы не можете взять и транслировать в общественные места свою музыку, ибо тогда не будете платить отчисления в торговых центрах за песни и музыку национальных авторов.