Вызов на ожидании или функция Call Waiting в FreePBX
Функция Call Waiting (CW) по умолчанию включена в FreePBX, что позволяет использовать так называемую «вторую линию», то есть ставить вызов на удержание и принимать параллельно ещё один входящий звонок на одном телефоне. Несмотря на то, что данная функция видна в разделе Applications модуля Module Admin, её настройку можно выполнить либо глобально, либо локально для каждого экстеншена. Подробнее расскажем об этом ниже.
Локальная настройка для экстеншенов и конечных пользователей
В первую очередь, данный параметр устанавливается отдельно в настройках каждого экстеншена, что отображается следующим образом:
Для отключения данной опции необходимо зайти в настройки экстеншена, далее выбрать вкладку Advanced, и в разделе Extension Options выставить Disable напротив опции Call Waiting.
Ещё одним способом управления данной опцией является использование сервисных кодов – по умолчанию установлены *70 на активацию и *71 на деактивацию данной опции. Удобство данного способа заключается в том, что каждый юзер может управлять данной настройкой на своём телефоне без обращения к администратору АТС.
Способы глобальной настройки Call Waiting
Первый способ является, по сути, автоматизированным способом настройки экстеншена – с помощью модуля Bulk Extensions – то есть вам необходимо выгрузить .csv файл со всеми экстеншенами, найти в файле нужную опцию (она обозначается как ENABLED) и просто стереть её (отсутствие значения = отключению опции).
Вторым способом является выключение CW Enabled by Default в положение No – но для этого необходимо пересоздавать экстеншены, так что данной опцией пользоваться не рекомендуется:
Уведомление о занятости при настройке Call Waiting в Asterisk
Функция Call Waiting при настройке в Asterisk или через FreePBX позволяет внутреннему номера принимать второй параллельный вызов, во время текущего разговора. Основной проблемой Call Waiting является то, что звонящий занятому абоненту слышит стандартный КПВ (Контроль посылки вызова, или просто гудок) в телефонной трубке, что создает ложное ощущение игнорирования.
Звонящий думает, что вызываемый абонент не взял трубку по причине обеда, перекура, невнимательности или похищения пришельцами.
Нас такой вариант не устраивает и мы предлагаем решение: звуковое уведомление звонящего о том, что вызываемый абонент сейчас разговаривает и не может принять вызов. Предложим звонящему подождать или позвонить попозже. Приступаем к реализации.
Настройка extensions_custom.conf
Как можно понять по названию заголовка, настройку мы будем производить в одноименном файле extensions_custom.conf , который находится в директории /etc/asterisk/: . Открываем для редактирования:
После чего, добавляем в файл следующую конфигурацию:
Разберемся с каждой строчкой контекста macro-dialout-one-predial-hook :
- exten => s,1,Noop(HINT STATUS — $)>) — выводим в консоль сервера состояние хинта. Здесь может быть : UNKNOWN, NOT_INUSE, INUSE, BUSY, UNAVAILABLE, RINGING, RINGINUSE, HOLDINUSE, ONHOLD
- exten => s,n,ExecIf($?Playback(/var/lib/asterisk/sounds/ru/custom/busytest)) — проверяем статус хинта: если он равен INUSE (находится в разговоре), то проигрываем для него заранее записанный файл (/var/lib/asterisk/sounds/ru/custom/busytest, где сообщаем звонящему о занятости и просим подождать;
- exten => s,n,ExecIf($?Set(D_OPTIONS=Ttm)) — сразу после озвучивания нашего аудио, играем MoH (Music On Hold) звонящему;
Аналогичным способом, как показано выше, мы проводим проверку для состояния хинта равному RINGINUSE. Готово. Перегружаем диалплан командой:
Не работает с Follow Me
Если вы столкнулись с проблемой того, что данный функционал не работает на внутренних номерах, в настройках которых включена опция Follow Me, то сделайте следующие действия:
- Откройте графический интерфейс FreePBX. Перейдите в раздел Settings → Advanced Settings;
- Найдите опцию Default Follow Me Ring Strategy в разделе Follow Me Module и выставьте ее как ringallv2;
- Повторите подобную итерацию для каждого экстеншена в разделе Follow Me;
- Дайте команду asterisk -rx «dialplan reload» в консоль вашего сервера;
- Call Waiting Busy Tone
- Уведомление о занятости
- 1780
- 10
Уведомление о занятости или недоступности абонента в Asterisk
Функция Call Waiting при настройке в Asterisk или через FreePBX позволяет внутреннему номера принимать второй (или больше) параллельный вызов, во время текущего разговора. Основной проблемой Call Waiting является то, что звонящий занятому абоненту слышит стандартный КПВ (Контроль посылки вызова, или просто гудок) в телефонной трубке, что создает ложное ощущение игнорирования. Звонящий думает, что вызываемый абонент не взял трубку по причине обеда, перекура, невнимательности или похищения пришельцами. Тоже самое происходит если вдруг телефон абонента отключен (или «вылетел») звонящий слышит гудки «занято».
Настроим звуковое уведомление звонящего о том, что вызываемый абонент сейчас разговаривает и не может принять вызов или о том, что телефон недоступен. Предложим звонящему подождать или позвонить попозже. Приступаем к реализации.
НАСТРОЙКА EXTENSIONS_CUSTOM.CONF
Как можно понять по названию заголовка, настройку мы будем производить в одноименном файле extensions_custom.conf, который находится в директории /etc/asterisk/.
Открываем для редактирования:
mcedit /etc/asterisk/extensions_custom.conf
1 | mcedit/etc/asterisk/extensions_custom.conf |
После чего, добавляем в начало файла следующий контекст:
include => macro-dialout-one-predial-hook
exten => s,1,Noop(HINT STATUS — ${EXTENSION_STATE(${DEXTEN})})
exten => s,n,ExecIf($?Playback(/var/lib/asterisk/sounds/ru/custom/Abonent-razgovarivaet))
exten => s,n,ExecIf($?Set(D_OPTIONS=Ttm))
exten => s,n,ExecIf($?Playback(/var/lib/asterisk/sounds/ru/custom/Abonent-razgovarivaet))
exten => s,n,ExecIf($?Set(D_OPTIONS=Ttm))
exten => s,n,ExecIf($?Playback(/var/lib/asterisk/sounds/ru/custom/Abonent-nedostupen))
exten => s,n,ExecIf($?Hangup())
1 |
from-internal-custom include=>macro-dialout-one-predial-hook macro-dialout-one-predial-hook exten=>s,1,Noop(HINTSTATUS-${EXTENSION_STATE(${DEXTEN})}) exten=>s,n,ExecIf($»${EXTENSION_STATE(${DEXTEN})}»=»INUSE»?Playback(/var/lib/asterisk/sounds/ru/custom/Abonent-razgovarivaet)) exten=>s,n,ExecIf($»${EXTENSION_STATE(${DEXTEN})}»=»INUSE»?Set(D_OPTIONS=Ttm)) exten=>s,n,ExecIf($»${EXTENSION_STATE(${DEXTEN})}»=»RINGINUSE»?Playback(/var/lib/asterisk/sounds/ru/custom/Abonent-razgovarivaet)) exten=>s,n,ExecIf($»${EXTENSION_STATE(${DEXTEN})}»=»RINGINUSE»?Set(D_OPTIONS=Ttm)) exten=>s,n,ExecIf($»${EXTENSION_STATE(${DEXTEN})}»=»UNAVAILABLE»?Playback(/var/lib/asterisk/sounds/ru/custom/Abonent-nedostupen)) exten=>s,n,ExecIf($»${EXTENSION_STATE(${DEXTEN})}»=»UNAVAILABLE»?Hangup()) |
Разберемся с каждой строчкой контекста macro-dialout-one-predial-hook:
- exten => s,1,Noop(HINT STATUS — ${EXTENSION_STATE(${DEXTEN})}) — выводим в консоль сервера состояние хинта. Здесь может быть : UNKNOWN, NOT_INUSE, INUSE, BUSY, UNAVAILABLE, RINGING, RINGINUSE, HOLDINUSE, ONHOLD
- exten => s,n,ExecIf($?Playback(/var/lib/asterisk/sounds/ru/custom/Abonent-razgovarivaet)) — проверяем статус хинта: если он равен INUSE (находится в разговоре), то проигрываем для него заранее записанный файл (/var/lib/asterisk/sounds/ru/custom/busytest, где сообщаем звонящему о занятости и просим подождать;
- exten => s,n,ExecIf($?Set(D_OPTIONS=Ttm)) — сразу после озвучивания нашего аудио, играем MoH (Music On Hold) звонящему;
Аналогичным способом, как показано выше, мы проводим проверку для состояния хинта равному RINGINUSE и UNAVAILABLE (но в UNAVAILABLE мы проигрываем аудиофайл и кладем трубку). Готово!
Перегружаем диалплан командой:
asterisk -rx «dialplan reload»
1 | asterisk-rx»dialplan reload» |
/etc/asterisk/asterisk.conf
В файле конфигурации asterisk.conf Вы определяете следующее:
- Местоположение, права доступа и владельца сокета, которые используется для подключения удаленной консоли управления сервером.
- Местоположение различных директорий, используемых сервером Asterisk для определения местоположения файлов конфигурации, библиотек, скриптов и место, где будут создаваться лог фалы.
- Параметры командной строки запуска сервера, используемые по умолчанию.
Пример конфигурации.
Директории
Директории используемые в Asterisk.
directories
(!) astetcdir => /etc/asterisk astmoddir => /usr/lib/asterisk/modules astvarlibdir => /var/lib/asterisk astdbdir => /var/lib/asterisk astkeydir => /var/lib/asterisk astdatadir => /var/lib/asterisk astagidir => /var/lib/asterisk/agi-bin astspooldir => /var/spool/asterisk astrundir => /var/run/asterisk astlogdir => /var/log/asterisk astsbindir => /usr/sbin
astetcdir => /etc/asterisk
astmoddir => /usr/lib(64)/asterisk/modules
astvarlibdir => /var/lib/asterisk
astspooldir => /var/spool/asterisk
Директории для файлов создаваемых Asterisk в процессе работы. Например: Записи разговоров, принятые факсы, голосовая почта, call-файлы итд.
ls -1 /var/spool/asterisk/ /fax /meetme /monitor /outgoing /sysadmin /system /tmp /voicemail
astrundir => /var/run/asterisk
Место куда Asterisk записывает UNIX control socket файл (asterisk.ctl) и файл ID процесса (asterisk.pid)
ls -1 /var/run/asterisk/ asterisk.ctl asterisk.pid
astlogdir => /var/log/asterisk
Файлы логов Asterisk. Настройки вывода логов производятся в файле /etc/asterisk/logger.conf
ls -1 /var/log/asterisk /cdr-csv ;директории CDR файлов /cdr-custom full queue_log
а также могут быть:
fail2ban ; freepbx_debug freepbx.log
astsbindir => /usr/sbin
Исполняемые файлы Asterisk.
ls /usr/sbin | grep asterisk asterisk rasterisk safe_asterisk
Параметр | Значение по умолчанию / Пример | Описание |
---|---|---|
verbose | Устанавливает уровень детализации (verbose) консоли и лога . Это значние также может быть установлено в консоли коммандой ‘core set verbose <0-9> или off. | |
debug | Залает значение уровня отладки (debug). по умолчанию — 0 | |
alwaysfork | no | всегда в фоновом режиме, даже с опциями -v или -d |
nofork | no | Отключить фоновое выполнение. |
quiet | no | Работать тихо (-q). Уменьшает выхлоп консоли. |
timestamp | no | Временные отметки в выводе консоли(-T) CLI verbose output |
execincludes | no | Разрешить #EXEC записи в файлах конфигурации |
console | no | Всегда запускать в консольном режиме, с приглашением CLI. |
highpriority | no | Запускать Asterisk c наивысшим приоритетом в режиме реального времени. |
initcrypto | no | Загружать ключи из ../astkeydir при старте. |
nocolor | no | Цветная консоль. |
dontwarn | no | Отключить предупреждения (warning messages). |
dumpcore | no | Делать дамп (содержимое рабочей памяти процесса, ядра)при падении |
languageprefix | yes | Как находится путь к звуковому файлу с языковым префиксом. По умолчанию, ‘yes’ — перфикс языка в пути к файлу перед подкаталогов, например ../ru/digits/1.gsm. Если ‘no’ то префикс после имени каталога, например: (digits/ru/1.gsm). |
internal_timing | yes | Включить внутренний источник синхронизации для аудио |
systemname | not set | Уникальное имя Asterisk. Используется как часть UNIQUEID в CDR. По умолчанию не задано |
autosystemname | no | Автоматом задавать ‘systemname’ на основании имени хоста |
maxcalls | not set | Максимальное кол-во одновременных входящих вызовов. По умолчанию не ограничено |
maxload | not set/0.9 | Максимальная нагрузка на процессор, при которой Asterisk прекратит новые соединения. |
minmemfree | not set /256 | |
cache_record_files | yes / no | Кэшировать записи |
record_cache_dir | <dir> | директория кэша записей |
transmit_silence | no | Транслировать тишину, если нет другог источника звука |
transcode_via_sln | yes | перекодировать кодеки через SLINEAR |
runuser | asterisk | Владелец Asterisk. |
rungroup | asterisk | Группа Asterisk. |
documentation_language | en / es / ru | Язык документации |
hideconnect | no | Не показывать сообщения о подключении удаленных консолей |
Уведомление о звонках, пропущенных в нерабочее время.
У меня стояла задача настроить уведомление на почту о пропущенных вызовах в нерабочее время(вечерние часы и выходные). Так как у меня используется специально созданное голосовое меню(IVR) с сообщением перезвонить в рабочие часы, то настраивать отправку уведомлений нужно именно на этом IVR. Если нужно настроить отправку уведомлений о пропущенных звонках на других IVR, то настройка будет аналогичной.
Итак, для начала, нужно выяснить номер этого IVR. Сделать это удобнее через консоль, выполнив команду:
Shell
cat /etc/asterisk/extensions_additional.conf | grep <название ivr>
1 | catetcasteriskextensions_additional.conf|grep<названиеivr> |
где <название ivr> — название(или его часть) ivr, которым вы обозвали ваше голосовое меню. В нашем примере IVR называется «Нерабочее время». Вот вывод команды:
Как видим, интерактивное меню имеет номер 2.
Теперь нужно отредактировать файл /etc/asterisk/extensions_override_freepbx.conf
Shell
nano /etc/asterisk/extensions_override_freepbx.conf
1 | nanoetcasteriskextensions_override_freepbx.conf |
Добавляем туда следующее:
;
exten => h,1,System(echo «${CDR(start)} пропущен звонок в ivr Нерабочее время от ${CDR(clid)} | На номер: ${CDR(did)} | Звонок длился: ${CDR(duration)} сек. | Дата звонка: ${STRFTIME(${EPOCH},,%l:%M:%S %p %Z on %A %B %e)}» | mail -s «Пропущен звонок от ${CDR(clid)}» info@mail)
exten => h,2,Macro(hangupcall,)
1 |
ivr-2; exten=>h,1,System(echo»${CDR(start)} пропущен звонок в ivr Нерабочее время от ${CDR(clid)} | На номер: ${CDR(did)} | Звонок длился: ${CDR(duration)} сек. | Дата звонка: ${STRFTIME(${EPOCH},,%l:%M:%S %p %Z on %A %B %e)}»|mail-s»Пропущен звонок от ${CDR(clid)}»info@mail) exten=>h,2,Macro(hangupcall,) |
где <info@mail> — почтовый адрес, на который нужно отправить уведомление. Для отправки оповещений на несколько адресов просто допишите их через запятую.
Собственно, содержимое Дата звонка: ${STRFTIME(${EPOCH},,%l:%M:%S %p %Z on %A %B %e)} можно удалить, так как уже есть время начала звонка(${CDR(start)}).
После этого сохраняем файл и перечитываем конфиг Asterisk командой core reload
Теперь после того, как звонящий положит трубку во время работы IVR, на указанный почтовый адрес придет письмо примерно следующего вида:
Asterisk. Голосовое меню своими руками
Всем привет. Постараюсь без нудятины рассказать о том, как создать голосовое меню приветствие на Asterisk.
Буду рассказывать на своем примере голосового меню. У меня оно было следующего вида:
Здравствуйте! Вы позвонили в КОМПАНИЮ, выберите пункт меню, введите внутренний номер или дождитесь ответа секретаря
- один — первый отдел
- два — второй отдел
- …
- шесть — шестой отдел
- для повтора нажмите НОЛЬ
При этом если человек ничего не вводил его должно было перенаправить на секретаря, если человек ввел не то что надо, его тоже перенаправляет на секретаря.
Я разворачивал свой Asterisk в связке с CentOS. На самом деле это не имеет особого значения, но решил все же уточнить.
И так, на момент чтения этой статьи у Вас должно быть следующее:
- установленный Asterisk
- настроена минимальная маршрутизация звонков в extensions.conf
- и как минимум пара внутренних номеров настроенных в sip.conf
Настройка голосового меню для Asterisk
Создаем файл company.tree в корне папки Asterisk. В этом файле будет прописан алгоритм работы голосового меню.
Идем в extensions.conf и в самое начало файла вставляем следующее
#include «company.tree»
этим самым мы подгружаем недавно созданный файл в общий план маршрутизации Asterisk. Там же в extensions.conf ищем где у вас настроены входящие звонки (у меня раздел назван , у вас может быть другое название) и вставляем в самое начало следующую строчку
exten => 84951234567,1,Goto(company_tree,s,1)
здесь вместо 84951234567 указываете Ваш внешний номер при звонке на который будет проигрываться голосовое меню. В моем же случае я просто указывал свой SIP-идентификатор, под которым зарегистрирован у провайдера. Если кратко, то Asterisk переведет нас в контекст company_tree на первую строку «s», который находится в файле company.tree, который мы благополучно подгрузили в общий план маршрутизации выше.
Теперь переходим в файл company.tree и заполняем наш алгоритм голосового меню. Ниже весь код с комментариями:
На этом все. Голосовое меню c приветствием для Asterisk настроено. Осталось только перезагрузить план обзвона из консоли
asterisk -r dialplan reload
Аудиофайлы для голосового меню в Asterisk
Выше в структуре файла company.tree есть строчка
exten => s,2,Background(/etc/IVR/menu)
здесь
- Background — это команда на проигрывание фоном вашей записи
- /etc/IVR/ — путь для папки с аудиофайлом
- menu — название самой записи. Указывается без расширения. Астер сам знает какой файл забрать.
Конвертация WAV в ULAW
В консоли вашей ОС Linux пишем следующее
sox -V /etc/IVR/menu.wav -r 8000 -c 1 -t ul /etc/IVR/menu.ulaw
здесь
- /etc/IVR/menu.wav — полный путь до вашего файла с расширением, который нужно конвертировать
- /etc/IVR/menu.ulaw — полный путь и имя файла с расширением, который получите на выходе
После выполнения команды увидите примерно следующее
Качаете WinSCP с ОФИЦИАЛЬНОГО САЙТА При запуске создаете новое подключение к вашему Linux и далее увидите что-то на подобие интерфейса TotalCommander. Ну а дальше копирует файлы, создаете папки и так далее. В моем случае я создал папку IVR в каталоге etc где у меня и лежит мое голосовое меню.
Попытался кратко резюмировать то, что нарыл в интернете, когда разбирался с настройкой голосового меню для Asterisk. В итоге Вам представлена рабочая схема, которой можете пользоваться
Спасибо за внимание
Основные параметры конфигурации NAT для Asterisk
sip.conf
Поддержка NAT в Asterisk 12
localnet
параметр ‘localnet’ список сетевых адресов, которые считаются «внутренними».
localnet=192.168.0.0/255.255.0.0 - RFC 1918 адреса localnet=10.0.0.0/255.0.0.0 - Также RFC1918 localnet=172.16.0.0/12 - Другое RFC1918 с CIDR обозначением localnet=169.254.0.0/255.255.0.0 - Zeroconf локальная сеть
externaddr
Внешний адрес щлюза (маршрутизатора) во внешнюю сеть. «externaddr = hostname» указывает статический адрес который будет использован в SIP и SDP сообщениях. Имя хоста (hostname) поднимается каждый раз, когда загружается sip.conf. Если порт не назначен, используется значение указанное в параметре «udpbindaddr». примеры:
externaddr = 123.34.56.78: - использовать этот адрес. externaddr = 123.34.56.78:9900 - использовать этот адрес и порт.
externtcpport = 9900 - отображаемый наружу tcp порт externtlsport = 12600 - отображаемый наружу tcp порт; 'externtlsport' по рекомендации RFC назначенный порт 5061.
media_address
IP адрес используемый для медиа (аудио, видео и текста) в SDP может быть переназначен параметром ‘media_address’. Данный параметр может быть использован только в секции .
media_address = 172.16.42.1
icesupport
ICE/STUN/TURN использование может быть включено глобально или для конкретного пира с помощью ‘icesupport’ опции.
icesupport = yes
directmedia
Для отключения прямых RTP потоков (peer-to-peer) используйте опцию:
directmedia=nonat
rtp.conf
rtpstart=10000
Задает первый порт диапазона для приема и оправки голосовых пакетов RTP.
rtpend=10100
Задает последний порт диапазона для приема и оправки голосовых пакетов RTP.
stunaddr=sip.stun.tld
В Asterisk начиная с версии 11 появилась поддержка stun. icesupport должно быть включено.
Отключение SIP ALG на роутерах
Если вы хотите что бы SIP телефония работала корректно, при условии что ваш сервер с астериск находится за NATом, вам необходимо выполнить следующие на своем роутере:
- Проброс UDP порта 5060 (SIP) отвечающий за сигнализацию вызова
- Проброс диапазона UDP портов 10000-20000 (RTP) отвечающий за голос
В качестве dst.address должен быть указан ip астериска, а в качестве dst.port аналогичные порты из пункта выше.
Если после этого вы испытываете проблемы с SIP регистрацией и прочим, то необходимо проверить наличие на вашем роутере SIP ALG и отключить его.
Так как определенные модели роутеров и сетевых экранов имеют встроенную технологию передачи SIP протокола (прозрачное изменение SIP сообщений), которые призваны упростить работу с NAT, то использование стандартного порта 5060 при такой конфигурации будет не упрощать работу, а наоборот, усложнять, т.к. нужно использовать либо проброс, либо sip alg.
Отключение SIP ALG для CISCO роутеров:
no ip nat service sip udp port 5060
PBXact
Настройка FreePBX Config
-
Отредактируйте pjsip.endpoint_custom.conf путем добавления следующих данных
-
Отредактируйте extensions_custom.conf
Настройка PBXAct
-
Отредактируйте pjsip.endpoint_custom.conf добавив следующие данные
-
Отредактируйте extensions_custom.conf
Чтобы показать хинты от каждой АТС соответственно вы можете ввести следующее
-
В CLI на FreePBX: asterisk-rx ‘core show hints’ | grep-i (ext)
Как вы можете видеть, экземпляр FreePBX следит за расширениями 7200 и 4100 на PBXact
Когда пользователь находится в состоянии вызова — BLF изменится так же, как и хинт
-
DND так же можно контролировать
SIP клиенты и Asterisk за NAT
Все усложняется если и Asterisk, и клиенты, находятся за NAT. Клиенты с внешней стороны не смогут получать SIP сообщения и принимать звонки. Или в SIP сообщении будет указан локальный IP адрес телефона, что приведет к потере звука.
Чтобы избежать потери звука запретите re-invite в файле sip.conf
canreinvite => no
Опция canreinvite устарела. Используйте ‘directmedia’.
- directmedia=yes
- directmedia=nonat
- directmedia=update
- directmedia=outgoing
Но клиенты находящиеся за NAT, все равно не смогут инициировать соединение с Asterisk и направить голосовые пакеты RTP на требуемый екстеншен. Для того чтобы это работало, надо пробросить требуемые порты через брандмауер на Asterisk. Диапазон RTP портов используемых Asterisk, назначается в файле rtp.conf.
rtpstart=10000 rtpend=10100
По умолчанию задан диапазон от 10000 до 20000. Измените диапазон в соответсвии с вашими потребностями (по два порта на каждый конкурирующий вызов).
Для нормальной работы за NAT, потребуется пробросить диапазон RTP портов в соответсвии с настройками в файле rtp.conf и порт SIP(обычно 5060). В iptables это будет выглядеть так:
iptables -t nat -A PREROUTING -i eth0 -p udp \ -m udp --dport 10000:10100 -j DNAT \ --to-destination 192.168.1.10 iptables -t nat -A PREROUTING -i eth0 -p udp \ -m udp --dport 5060 -j DNAT \ --to-destination 192.168.1.10
Где eth0 — внешний интерфейс, а 192.168.1.10 — IP адрес Asterisk.
Уведомление о звонках, пропущенных в очереди.
Если нужно уведомлять о звонках, которые дошли до очереди, но звонящий не дождался ответа агента очереди, нужно проделать аналогичные манипуляции. Только вместо будет . То есть, в файл нужно добавить примерно следующее:
;
exten => h,1,System(echo «${CDR(start)} пропущен звонок от ${CDR(clid)} | На номер: ${CDR(did)} | Звонок длился: ${CDR(duration)} сек. | Дата звонка: ${STRFTIME(${EPOCH},,%l:%M:%S %p %Z on %A %B %e)} | Очередь ${NODEST}» | mail -s «Пропущен звонок от ${CDR(clid)}» info@mail)
exten => h,2,Macro(hangupcall,)
1 |
ext-queues; exten=>h,1,System(echo»${CDR(start)} пропущен звонок от ${CDR(clid)} | На номер: ${CDR(did)} | Звонок длился: ${CDR(duration)} сек. | Дата звонка: ${STRFTIME(${EPOCH},,%l:%M:%S %p %Z on %A %B %e)} | Очередь ${NODEST}»|mail-s»Пропущен звонок от ${CDR(clid)}»info@mail) exten=>h,2,Macro(hangupcall,) |
Здесь можно добавить номер очереди(переменная ${NODEST})
Чтобы сделать то же для групп вызова нужно заменить на
При написании статьи использовались идеи с сайтов https://voxlink.ru/kb/freepbx/missed-call-freepbx/ и https://smirnov-alexey.ru/asterisk-missed-calls
Настройка оповещений о состоянии транков описана в статье.
Добавление операторов к очереди (агентов)
Пользователей, которые отвечают на звонки очереди называют агентами или операторами. Есть два типа агентов — статические и динамические. Первые прописываются в конфигурационном файле queues.conf, вторые — могут присоединятся к очереди, становясь на некоторое время оператором.
Статические агенты
Для создания статического оператора, открываем конфигурационный файл очереди:
vi /etc/asterisk/queues.conf
В настройках очереди добавляем:
strategy = ringall
member => SIP/101,1
* в данном примере, мы добавили оператора к нашей очереди. Это sip агент с именем 101. 1 на конце — пенальти (используется для выставления приоритета при использовании некоторых стратегий).
Перечитываем все конфигурационные файлы:
asterisk -x «core reload»
Динамические агенты
Динамические агенты могут присоединиться к очереди в любой момент набором специального сочетания кнопок на телефонном аппарате. Настройка сервера выполняется в конфигурационном файле диалплана:
vi /etc/asterisk/extensions.conf
exten => *999#,1,Verbose(2,Adding dynamic member to support queue)
same => n,Set(MemberInfo=${CHANNEL(channeltype)}/${CHANNEL(peername)})
same => n,AddQueueMember(support,${MemberInfo})
same => n,Playback(agent-loginok)
same => n,Hangup()
exten => *888#,1,Verbose(2,Removing dynamic member from support queue.)
same => n,Set(MemberInfo=${CHANNEL(channeltype)}/${CHANNEL(peername)})
same => n,RemoveQueueMember(support,${MemberInfo})
same => n,Playback(agent-loggedoff)
same => n,Hangup()
* в данном примере, если агент набирает *999#, он присоединяется к очереди и может принимать вызовы. При наборе *888# агент выходит из очереди.
* Verbose — вывод в консоль информации; Set — задает значение переменной, в данном примере, MemberInfo; AddQueueMember/RemoveQueueMember — соответственно, добавляет к очереди агента и удаляет из нее; Playback — проигрывает голосовой сигнал; Hangup — дает сигнал отбоя.
Аутентификация агентов
1. Общий пароль для всех агентов
Можно сделать так, чтобы Asterisk требовал от агентов ввод пароля для присоединения к очереди. Для этого наш диалплан приводим к такому виду:
vi /etc/asterisk/extensions.conf
exten => *999#,1,Verbose(2,Adding dynamic member to support queue)
same => n,Authenticate(1234)
same => n,Set(MemberInfo=${CHANNEL(channeltype)}/${CHANNEL(peername)})
same => n,AddQueueMember(support,${MemberInfo})
same => n,Playback(agent-loginok)
same => n,Hangup()
* где Authenticate — запрос пароля, в данном примере, 1234.
2. Индивидуальные пароли для каждого агента
Если необходимо, чтобы каждый агент перед входом вводил свои номер и пароль, необходимо воспользоваться приложением VMAuthenticate (аутентификация по электронному почтовому ящику). Настройку начнем с правки диалплана:
vi /etc/asterisk/extensions.conf
exten => *999#,1,Verbose(2,Adding a member to the cc_ege_support queue.)
same => n,Read(AGENT_USERID,agent-user)
same => n,VMAuthenticate(${AGENT_USERID}@vmauth)
same => n,Set(MemberInfo=${CHANNEL(channeltype)}/${CHANNEL(peername)})
same => n,AddQueueMember(support,${MemberInfo})
same => n,Playback(agent-loginok)
same => n,Hangup()
* Read — запрашиваем данные у агента (agent-user — голосовой файл), и записываем в переменную AGENT_USERID; VMAuthenticate — запрашиваем пароль для почтового ящика ${AGENT_USERID} с контекстом vmauth.
Добавляем почтовые ящики:
1001 => 1234, dmosk, dmosk@example.com
1002 => 5678, dmosk2, dmosk2@example.com
* vmauth — контекст (его мы указали в диалплане); 1001/1002 — номера агентов; 1234/5678 — пароли.
Для применения настроек перечитываем диалплан:
asterisk -x «dialplan reload»
Заключение
Буду рад любым подсказкам и замечаниям к статье. Сам последнее время практически не занимаюсь телефонией. По привычке поддерживаю некоторые серверы, но отдалился от темы. Не слежу за ней и не делаю новых установок.
Другие материалы по asterisk:
Онлайн курс «DevOps практики и инструменты»
Если у вас есть желание научиться строить и поддерживать высокодоступные и надежные системы, научиться непрерывной поставке ПО, мониторингу и логированию web приложений, рекомендую познакомиться с онлайн-курсом «DevOps практики и инструменты» в OTUS. Курс не для новичков, для поступления нужны базовые знания по сетям и установке Linux на виртуалку. Обучение длится 5 месяцев, после чего успешные выпускники курса смогут пройти собеседования у партнеров.
Проверьте себя на вступительном тесте и смотрите программу детальнее по .
- Установка и настройка астериск с нуля
- Мониторинг asterisk в zabbix
- Соединение двух серверов астериск
- Анализ SIP трафика
- Замена +7 на 8 и наоборот
- Ограничение на звонки для группы номеров