company_banner

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

    image

    Добрый день, уважаемые жители хаба 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.

    Устанавливаем:
    sudo apt-get install ffmpeg

    Запускаем вещание (я взял плейлист с vocaltrance.fm (не реклама), разумеется, можно выбрать любой):
    ffmpeg -re -i 176.9.36.203: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$ долларов за штуку.

    Чтобы понизить стоимость системы, я решил использовать обычные колонки (у меня под рукой были
    вот такие
    и raspberry pi. ( Стоимость динамика и raspberry составила ~ 50$).

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

    Устанавливаем на 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:

    [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 создаем такой же транк, только указываем ему 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.
    Метки:
    Southbridge 63,44
    Обеспечиваем стабильную работу серверов
    Поделиться публикацией
    Комментарии 7
    • 0
      Запускаем вещание (я взял плейлист с vocaltrance.fm (не реклама)

      В Эстонии ( И не только, не знаю как у вас.), к примеру, квоты на национальных исполнителей ( На Украине вроде тоже вводится такое. ), вы не можете взять и транслировать в общественные места свою музыку, ибо тогда не будете платить отчисления в торговых центрах за песни и музыку национальных авторов.
      • 0
        Не понятно как завязывается мультикаст поток и asterisk в обоих случаях. Может стоит получше описать?
        • 0
          Судя по тексту, практически никак. Музыкальный multicast-поток всегда генерируется через ffmpeg и c Asterisk'ом никак не связан.
          На IP-SIP динамиках переключение с музыки на вызов идёт за счёт приоритета канала.
          На raspberry музыка воспроизводится из multicast-потока отдельной программой omxplayer, а Asterisk просто эту программу прибивает при поступлении звонка и запускает после окончания вызова.
          • +1
            По большому счету вы правы. В случае с динамиком — показано как настроить мультикаст на него с нужными приоритетами. В случае raspberry — Asterisk контролирует работу omxplayer'a, однако для этого asterisk и нужен, он контролирует когда играть музыку, а когда говорить оператору.

            Цель статьи же в том, чтобы показать, насколько разноплановым может быть asterisk, не просто банальной звонилкой, лично мне было очень интересно это реализовывать, чей я и поделился с сообществом.
          • 0
            Все очень просто все время проигрывется музыка, если нужно сделать какое либо оповещение звоним на нужную колонку и делаем оповещение.
          • 0
            >>killall /usr/bin/omxplayer.bin
            Сурово конечно, а можно как-то «попросить» плеер плавно снизить громкость?
            • +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%)

            Только полноправные пользователи могут оставлять комментарии. Войдите, пожалуйста.

            Самое читаемое