
Система экстренного оповещения
на базе Asterisk
Появилась необходимость реализовать систему звукового оповещения на случай чрезвычайных ситуаций. Т.к. на закупку и монтаж специализированного оборудования денег никто не дал — решили использовать под это дело 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/