Asterisk call waiting настройка

Вызов на ожидании или функция 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, то сделайте следующие действия:

  1. Откройте графический интерфейс FreePBX. Перейдите в раздел SettingsAdvanced Settings;
  2. Найдите опцию Default Follow Me Ring Strategy в разделе Follow Me Module и выставьте ее как ringallv2;
  3. Повторите подобную итерацию для каждого экстеншена в разделе Follow Me;
  4. Дайте команду 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
2
3
4
5
6
7
8
9
10
11

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
2
3

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. На самом деле это не имеет особого значения, но решил все же уточнить.

И так, на момент чтения этой статьи у Вас должно быть следующее:

  1. установленный Asterisk
  2. настроена минимальная маршрутизация звонков в extensions.conf
  3. и как минимум пара внутренних номеров настроенных в 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

  1. Отредактируйте pjsip.endpoint_custom.conf путем добавления следующих данных

  1. Отредактируйте extensions_custom.conf

Настройка PBXAct

  1. Отредактируйте pjsip.endpoint_custom.conf добавив следующие данные

  1. Отредактируйте extensions_custom.conf

Чтобы показать хинты от каждой АТС соответственно вы можете ввести следующее

  1. В CLI на FreePBX: asterisk-rx ‘core show hints’ | grep-i (ext)

Как вы можете видеть, экземпляр FreePBX следит за расширениями 7200 и 4100 на PBXact

Когда пользователь находится в состоянии вызова — BLF изменится так же, как и хинт

  1. 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
2
3

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, [email protected]
1002 => 5678, dmosk2, [email protected]

* vmauth — контекст (его мы указали в диалплане); 1001/1002 — номера агентов; 1234/5678 — пароли.

Для применения настроек перечитываем диалплан:

asterisk -x «dialplan reload»

Заключение

Буду рад любым подсказкам и замечаниям к статье. Сам последнее время практически не занимаюсь телефонией. По привычке поддерживаю некоторые серверы, но отдалился от темы. Не слежу за ней и не делаю новых установок.

Другие материалы по asterisk:

Онлайн курс «DevOps практики и инструменты»

Если у вас есть желание научиться строить и поддерживать высокодоступные и надежные системы, научиться непрерывной поставке ПО, мониторингу и логированию web приложений, рекомендую познакомиться с онлайн-курсом «DevOps практики и инструменты» в OTUS. Курс не для новичков, для поступления нужны базовые знания по сетям и установке Linux на виртуалку. Обучение длится 5 месяцев, после чего успешные выпускники курса смогут пройти собеседования у партнеров.

Проверьте себя на вступительном тесте и смотрите программу детальнее по .

  • Установка и настройка астериск с нуля
  • Мониторинг asterisk в zabbix
  • Соединение двух серверов астериск
  • Анализ SIP трафика
  • Замена +7 на 8 и наоборот
  • Ограничение на звонки для группы номеров
Рейтинг
( Пока оценок нет )
Понравилась статья? Поделиться с друзьями:
Техноарена
Добавить комментарий

;-) :| :x :twisted: :smile: :shock: :sad: :roll: :razz: :oops: :o :mrgreen: :lol: :idea: :grin: :evil: :cry: :cool: :arrow: :???: :?: :!: