Система экстренного оповещения на базе 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 это делается через меню ManagementManual UpdateConfiguration file. Нужно найти параметр voip/auto_answer/enabled и установить ему значение 1.

Для GrandStream GXP-1625 настройка немного проще: AccountsAccount XCall SettingsAllow 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/

3 комментария

  1. Если телефонов будет более 300, как у меня, то процедура прозвонки затянется надолго, и система перестанет быть экстренной.

    1. Прозвон займет одинаковое время независимо от количества телефонов, т.к. идёт параллельно, а не последовательно.

Оставьте ответ

Ваш адрес email не будет опубликован.