Появилась необходимость реализовать систему звукового оповещения на случай чрезвычайных ситуаций. Т.к. на закупку и монтаж специализированного оборудования денег никто не дал — решили использовать под это дело IP телефонию (Asterisk 13 с аппаратами AudioCodes 420HD и Grandstream GPX-1625).
Суть экстренных оповещений проста — специально обученный человек по факту наступления определенных событий (пожар, потоп, приезд курьера с пиццей) набирает на VOIP-телефоне комбинацию клавиш, которая через Asterisk соединяется со всеми необходимыми номерами, а аппараты автоматически подхватывают вызов и включают громкую связь (speaker).
Технически распределение вызовов делается просто — в нужном контексте extensions.conf заводим необходимую комбинацию клавиш и направляем ее на нужный номер:
exten => 999,1,Dial(SIP/100)
В этом случае при наборе комбинации 999 звонок вызывающего абонента попадет на внутренний номер 100. Теперь нам нужно научить его автоматически поднимать трубку.
В большинстве VOIP-телефонов предусмотрена функция автоматического ответа (Auto Answer). Как правило, она отключена и нужно включить ее вручную.
Для AudioCodes 420HD это делается через меню Management — Manual Update — Configuration file. Нужно найти параметр voip/auto_answer/enabled и установить ему значение 1.
Для GrandStream GXP-1625 настройка немного проще: Accounts — Account X — Call Settings — Allow Auto Answer by Call-Info «YES».
Для того, чтобы телефон задействовал функцию Auto Answer необходимо модифицировать SIP-заголовок звонка — добавить к нему информацию о том, что данный вызов подлежит автоматическому ответу. Для AudioCodes это будет выглядеть так:
exten => 999,1,SIPAddHeader(Alert-Info: Ring Answer) exten => 999,n,Dial(SIP/100)
Для телефонных аппаратов разных вендоров нужно указывать разные SIP-заголовки. Варианты, которые мне удалось нагуглить:
SIPAddHeader(Alert-Info: Ring Answer) SIPAddHeader(Alert-Info: Info=Alert-Autoanswer) SIPAddHeader(Call-Info:\;Answer-After=0) SIPAddHeader(P-Auto-Answer: normal) SIPAddHeader(Answer-Mode: Auto)
Но простой Dial() подойдет, если оповещение надо проиграть только на одном аппарате. Если же требуется массовое оповещение, да еще и с помощью записанного сообщения — нужно использовать функцию Record(), call list и внешний shell-скрипт. Создаем файл /var/spool/asterisk/alarm.sh, делаем его исполняемым и даем соответствующие права. Листинг файла:
#!/bin/sh # Asterisk call from list script for FreePBX # Based on example at http://asterisk-support.ru/forum/topics/267/ pause=1 spooldir=/var/spool/asterisk diallist=/var/spool/asterisk/list.txt echo `date`": Dialing with $pause second pause" while read number; do echo "Channel: Local/$number@alarm-dialer MaxRetries: 0 RetryTime: 5 WaitTime: 30 Context: alarm-informer Extension: 222 Callerid: 222 Account: autodialer Priority: 1" > $spooldir/tmp/$number chmod 777 $spooldir/tmp/$number chown root:root $spooldir/tmp/$number mv $spooldir/tmp/$number $spooldir/outgoing echo "$number" sleep $pause done < $diallist echo "Done" exit 0
Скрипт берет номера из файла /var/spool/asterisk/list.txt (в нем просто список номеров, по одному в строчке) и начинает их прозванивать из контекста alarm-dialer, проигрывая сообщение из alarm-informer. Сам скрипт вызывается по заданному номеру из контекста alarm, который в свою очередь через include подключен к контексту внутренних телефонов. Листинг части файла /etc/asterisk/extensions.conf
[internal] exten => _1XX,1,Dial(SIP/${EXTEN}) include => alarm [alarm] exten => 999,1,Record(alarmmessage:gsm) exten => 999,n,System(/bin/sh /var/spool/asterisk/alarm.sh) [alarm-dialer] exten => _1XX,1,SIPAddHeader(Alert-Info: Ring Answer) exten => _1XX,n,Dial(SIP/${EXTEN}) exten => _1XX,n,Hangup [alarm-informer] exten => 222,1,Answer exten => 222,n,Wait(1) exten => 222,n,Playback(alarmmessage) exten => 222,n,Hangup
При наборе номера 999 с любого аппарата — сначала запишется файл (запись оканчивается по нажатию #), затем файл будет помещен в папку и начнется выполнение нашего скрипта, который будет обзванивать номера из списка list.txt, проигрывая записанное сообщение.
Частичный копипаст отсюда: https://habrahabr.ru/post/159503/
I used the translator and I have learned a lot for you! Thanks a lot for sharing.
Если телефонов будет более 300, как у меня, то процедура прозвонки затянется надолго, и система перестанет быть экстренной.
Прозвон займет одинаковое время независимо от количества телефонов, т.к. идёт параллельно, а не последовательно.