TNEWS... статьи из мира инноваций и телекоммуникаций

Как настроить IP АТС Asterisk с нуля

Выбор аппаратного обеспечения и пошаговая инструкция по настройке и конфигурации IP-АТС Asterisk

Модернизация офисной АТС

В связи с расширением фирмы и направлений деятельности, возник вопрос организации связи между всеми подразделениями и филиалами. Офисная АТС не справлялась с нагрузкой, поэтому решено было добавить к ней IP АТС на базе Asterisk.

Старая схема связи:

Организация фиксированной телефонной связи предприятия офисной АТС

Рис 1. Сетевая схема организации телефонной связи предприятия до модернизации офисной АТС.

Реализованная схема телефонной связи:

Схема организация телефонной связи предприятия офисной IP АТС Asterisk после модернизации

Рис 2. Сетевая схема организации телефонной связи предприятия после модернизации офисной АТС.

PSTN – Телефонная сеть общего пользования.

PBX – Офисная АТС.

E1 – Цифровой поток.

SIP – (протокол инициализации сеанса связи) является протоколом обмена сигналами IP-телефонии, используемый для установки, изменения и завершения телефонных вызовов.

Asterisk – программный сервер для управления компьютерной телефонией (АТС).

LAN – локальная сеть.

Asterisk-интерфейс – специализированный протокол между Asterisk и SFP-E1 модулем.

IP АТС на базе Asterisk это связь нового поколения для современного бизнеса. По возможностям она полностью покрывают функционал офисных мини АТС, а в некоторых случаях даже превосходит.

Выбор аппаратного обеспечения с интерфейсом E1

Учитывая, что реализация данного проекта была построена на использовании платформы IP АТС Asterisk, то все использующееся аппаратное обеспечение должно быть  программно совместимым с ПО Asterisk.

Asterisk — доступное приложение для организации VoIP телефонии с открытым исходным кодом, работающее на операционный системе Linux.

Для установки программной платформы IP АТС Asterisk использовался персональный компьютер (ПК) с предварительно установленной ОС Linux, в котором был свободный PCI слот.

В данный PCI слот была установлена цифровая телефонная плата Terratel 4E1 с модулем аппаратного эхоподавления (до 128 голосовых каналов).

фото цифровой платы до 4 Е1 телефонии для Asterisk c модулем аппаратного эхоподавления

Рис 3. Цифровая плата телефонии в конфигурации 4 Е1 и PCI форм-фактор

Краткие технические характеристики Цифровой платы Е1:

  • До 120 одновременных вызовов на порт 4E1;
  • Поддержка протоколов TDM: ISDN PRI, CAS, SS7;
  • Форм-фактор PCI;
  • Поддержка модуля аппаратного эхоподавления.

Данный программно аппаратный комплекс был размещен в помещении аналоговой АТС, где в дальнейшем были проведены все пуско-наладочные работы.

Для модернизации офисной АТС с 1 Е1, использующейся для телефонизации удаленного офиса, было выбрано оригинальное решение того же производителя – Terratel SFP VoIP Converter.

Фото цифрового телефонного модуля SFP-E1 для Asterisk

Рис 4. Цифровой модуль SFP VoIP Converter для проекта Asterisk

Основные технические характеристики SFP VoIP Converter для проекта Asterisk:

  • До 30 одновременных вызовов на порт 1E1;
  • Поддержка протоколов TDM: ISDN PRI, CAS;
  • Форм-фактор SFP.

Основным преимуществом стала минимальная стоимость решения, в основном за счет того, что не требовалось установки еще одного ПК для инсталляции сервера Asterisk.

SFP VoIP Converter с помощью специализированного драйвера был подключен к серверу IP АТС Asterisk, размещенному на территории основного офиса.

Данная схема позволила минимальными ресурсами модернизировать и объединить существующую телефонную сеть, а также внедрить VoIP телефонию и расширить абонентскую емкость.

Установка операционной системы

Поскольку требования к железу у Asterisk минимальные, был выбран один из свободных компьютеров с процессором Celeron, памятью 2 Гб и винчестером на 80 Гб.

Первым делом необходимо установить операционную систему. Мы остановились на Ubuntu. Версию образа ISO Ubuntu возможно скачать на официальной странице http://www.ubuntu.com.

Мы использовали версию 16.04.

Для быстрой подготовки загрузочной флешки с Ubuntu из под Windows, мы воспользовались бесплатной программой Unetbootin.

Скачиваем с сайта, и запускаем программу unetbootin-windows-647.exe. Появится окно, в котором выбираем дистрибутив UBUNTU и версию 16.04_Live.

Окно выбора дистрибутива UBUNTU и версии 16.04_Live

Рис 5. Окно выбора дистрибутив UBUNTU.

Программа начинает процесс инсталляции.

Другой вариант создания загрузочной флешки: выбрать образ диска с системой UBUNTU (расширение .ISO) например по адресу http://releases.ubuntu.com/14.04/.

После создания загрузочной флешки вставляем её в выбранный комп. В BIOSе указываем загрузку с USB-HDD0. Сохраняем изменения и перегружаем. В процессе загрузки комп автоматически загрузится с флешки и начнется установка системы на жесткий диск.

В процессе установки необходимо выполнить некоторые настройки (язык, часовой пояс и т.д.).

Во время загрузки Ubuntu запускаются семь полноэкранных консолей, у каждой свой независимый сеанс, с первой по шестую с интерфейсом командной строки, в седьмой запускается графический режим. Пользователь во время загрузки видит только графический режим.

Переключиться на одну из виртуальных консолей можно нажав сочетание клавиш:

Ctrl+Alt+F1 – первая виртуальная консоль;


Ctrl+Alt+F7 – седьмая виртуальная консоль, возврат в графический режим.

Запускаем терминал нажав комбинацию клавиш: Ctrl+Alt+T

Установка программного обеспечения ASTERISK и драйверов

Установка программного обеспечения сервера ASTERISK происходит следующим образом.

root                      // Установка под root-ом          
apt-get update            // Проверка и установка обновлений        
apt-get install ntp       // Установка службы синхронизации времени       
apt-get install asterisk  // Установка Asterisk             
asterisk –r               // Информация об Asterisk

Установка DAHDI

Драйвер DAHDI отвечает за работу плат интерфейсов телефонии устанавливаемых непосредственно в сервер, или работающих по TDM over IP, от различных производителей: Digium, Openvox, Terratel, Sangoma, Parabel, Cronyx и др..

Установка дополнительного модуля из исходных текстов для Linux ядра в Ubuntu не нарушая пакетной структуры дистрибутива, происходит при помощи приложения module-assistant.

Собираем нужный модуль, который после сборки будет автоматически установлен (a-i = auto-install):

m-a a-i dahdi

Просмотр состояния модулей ядра.

lsmod

dpkg – это пакетный менеджер для Debian систем. Он может устанавливать, удалять и создавать пакеты, но, в отличие от других систем управления пакетами, он не может автоматически загружать и устанавливать пакеты или их зависимости.

Выполняем:

dpkg -L dahdi-modules-4.8.0-36-generic   // выводит список файлов, установленых пакетом

Просмотрим информацию о модуле wct4xxp ядра Linux.

modinfo wct4xxp

Загрузим модуля ядра  в память и активируем его.

modprobe wct4xxp

Просмотрим состояние модулей ядра.

lsmod                             // покажет списокк загруженных модулей
apt search dahdi                  // выполняет поиск пакетов
apt install dahdi asterisk-dahdi  // устанавливает пакет dahdi

Проверяем, что модуль запустился.

Lsmod | grep dahdi

Ответ.

dahdi 221184 2 oct612x,wct4xxp

Если модуль не запустился, повторяем установку модуля dahdi.

Параметры командной строки при запуске сервера Asterisk

Фактически, запустить сервер Asterisk можно просто без аргументов. Сервер Asterisk, если запускается без параметров, работает в фоновом режиме:
/usr/sbin/asterisk
Вы можете соединиться с уже запущенным в фоновом режиме сервером Asterisk и получить доступ к его консоли, набрав команду:
/usr/sbin/asterisk -r
на той же машине, где запущен сервер Asterisk. К одному и тому же запущенному серверу Asterisk может быть подключено несколько CLI консолей одновременно.

Остановка и перезапуск Asterisk

Для остановки и перезагрузки Asterisk, есть несколько команд:

core stop now         // останавливает Asterisk немедленно, заканчивая
                      // все текущие вызовы
core stop gracefully  // предотвращает новые вызовы, но позволяет закончить
                      // текущие звонки

Когда все звонки закончились, Asterisk останавливается.

core stop when convenient    // ждет, пока в Asterisk не будет вызовов, а затем
                             // останавливает службу.

Это не мешает новым вызовам.

Для перезапуска аналогично:

core restart now        // перегружает Asterisk немедленно, заканчивая все
                        // текущие вызовы.
core restart gracefully   // предотвращает новые вызовы, но позволяет закончить текущие звонки.

Когда все звонки закончились, Asterisk перегружается.

core restart when convenient   // ждет, пока в Asterisk не будет вызовов, а затем перегружает службу.

Это не мешает новым вызовам.

Существует также команда, если вы измените свое мнение.

core abort shutdown     // отменяет выключения или перезагрузки, которые вы ранее запустили.

Настройка телефонной платы Terratel D-401E c Asterisk

Включить сервер, выполнить команду которая отображает PCI устройств и шины:

lspci -v

В полученном списке можно увидеть параметры установленной телефонной платы Е1.

Если информации о плате Е1 нет, необходимо попробовать переставить на другие разъемы PCI или проверить переключатель на плате, который должен быть установлен на цифру 1.

После успешной регистрации телефонной платы Е1, её параметры автоматически пропишутся в конфигурации: /etc/dahdi/ и /etc/asterisk/dahdi-channels.conf.

Если возникают ошибки при команде dahdi_cfg, то возможно не установлен dahdi.

В файле /etc/dahdi/system.conf изменим зону на свою (она может сброситься после выполнения команды dahdi_genconf):

loadzone=ua
defaultzone=ua

В файле /etc/asterisk/modules.conf, в блоке [modules] должна быть строка для автозагрузки модуля chan_dahdi:

load => chan_dahdi.so

Перезапустить dahdi можно из консоли Asterisk командой:

dahdi restart

Проверить статус платы можно командой:

dahdi show status

Команды dahdi в CLI Asterisk

Для настройки и конфигурации DAHDI используются следующие команды:

core show help dahdi     // Показывает все команды dahdi
dahdi destroy channel    // Уничтожение канала
dahdi restart            // Перезапуск dahdi
dahdi set dnd            // Активирует/деактивирует функцию DND (не беспокоить)
dahdi set hwgain         // Установка аппаратного усиления канала
dahdi set swgain         // Установка программного усиления канала
dahdi show channels [group|con  // Показать активные каналы
dahdi show channel       // Показать информацию о канале
dahdi show status        // Показать состояние всех DAHDI карт
dahdi show version       // Показать версию используемого DAHDI

Настройка программного приложения ASTERISK

Общие настройки Asterisk (/etc/asterisk/asterisk.conf)

В файле конфигурации asterisk.conf необходимо проверить следующее:

  • местоположение, права доступа и владельца сокета, который используется для подключения удаленной консоли управления сервером.
  • местоположение различных директорий, используемых сервером Asterisk для определения местоположения файлов конфигурации, библиотек, скриптов и место, где будут создаваться лог-файлы.

Настройка потока E1 (/etc/dahdi/system.conf)

Указываем зоновую (региональную) принадлежность.

loadzone=ua
defaultzone=ua

Настраиваем согласование потока E1 между АТС оператора и Asterisk.

1,0,0,CCS,HDB3,CRC4  // Задается источник синхронизации, тип кодирования и
                     // необходимость проверки четности
bchan=1-15,17-31     // Задаются тайм-слоты для голоса                       
dchan=16             // Задаются сигнальные тайм-слоты для данных
                     // (0-й — по умолчанию)
echocanceller=mg2,1-15,17-31 // Указывается тип эхоподавителя и тайм-слоты,
                     // на которых он будет задействован. Если строка закомментирована,
                     // устройства используют аппаратное эхоподавление.

Для применения новой конфигурации system.conf обязательно нужно ввести команду

dahdi_cfg -v

Настройка DAHDI (/etc/asterisk/chan_dahdi.conf)

Файл chan_dahdi.conf определяет параметры каналов TDM интерфейса DAHDI.

context             // привязка канала к диалплану
channel             // назначает канал или несколько каналов
group               // назначает каналы в группу

Для исходящей связи будет выбираться первый свободный канал. Для назначения в несколько групп, необходимо перечислить значения через запятую. Чтобы не назначать в группу – оставьте значение пустым. Группы предназначены для выбора стратегии исходящих и правил обработки входящих звонков.

group = 1
group = 2,3
group =
      switchtype    // устанавливает тип сигнализации для PRI.
      national      // National ISDN type 2 (Американский)
      ni1           // National ISDN type 1
      euroisdn      // EuroISDN
      qsig          // Протокол с минимальной функциональностью, используемый
                    // для построения сети между двумя или более АТС.
switchtype => euroisdn

signalling – Параметр устанавливает тип соединения и/или сигнализации. Эти параметры должны соответствовать тому, что описано в конфигурации драйвера DAHDI (/etc/dahdi/system.conf). Значение этого параметра частично зависит от типа используемой Вами интерфейсной карты.

Сервер Asterisk не запустится в таких случаях: если определение типа соединения для канала неправильное или нерабочее, если значение не совпадает с тем, что описано в конфигурации Zaptel драйвера или, если устройство не установлено или сконфигурировано не должным образом.

Во многих случаях, правильное значение этого параметра – это одно из следующих четырех значений: fxs_ks, fxo_ks, pri_cpe or pri_net. Этот параметр не имеет значения по умолчанию, Вы обязательно должны определить его значение перед описанием какого-либо канала.

fxo_ks: Используется для сигнализации FXS устройств.

fxs_ks: Используется для сигнализации FXO устройств.

ВНИМАНИЕ! Эти аналоговые интерфейсы могут стать источником путаницы в Asterisk.
Для FXS интерфейсов используется fxo_ks, а для FXO – fxs_ks.

pri_cpe: Сигнализация PRI. Клиентская сторона оборудования (user)

pri_net: Сигнализация PRI, network side.

priindication: Этот параметр устанавливает то, как сервер Asterisk должен сигнализировать состояние Busy() и Congestion() для удаленного коммутатора или пользователя. По умолчанию: inband. Доступные значения следующие:

inband: Сервер Asterisk будет сам проигрывать тональные сигналы без перевода канала в ответное состояние; недоступно для всех соединений PRI/BRI.

outofband: Сервер Asterisk будет разрывать связь с информационным кодом busy/congestion, при этом уже сам телефонный коммутатор будет проигрывать тональные сигналы пользователю. Busy(), в этом случае, это то же самое, что установка: PRI_CAUSE=17 и выполнение команды: Hangup().

pridialplan – устанавливает тип диалплана для ISDN PRI. Игнорируется в большинстве случаев. Может понадобиться для корректной работы CallerID. Доступные значения: unknown, local, private, national, international.

pridialplan => national

overlapdial: если – yes, то набранные цифры будут сразу отправляться в поток. По умолчанию: no. (enblock)

overlapdial => yes

Параметры качества аудио

echocancel включить эхо-подавление. По умолчанию всегда включен.

echocancelwhenbridged – включает или выключает эхо-подавление в режиме моста между TDM интерфейсами. В принципе в этом режиме не требуется эхо-подавление, но иногда позволяет улучшить качество связи. Значение (yes / no).

rxgain – регулировка усиления приемника.
txgain – регулировка усиления передатчика.

echocancel = yes
echocancelwhenbridged = no
rxgain = 20%
dahdi restart          // перезагрузка dahdi

Подключения пользователей (/etc/asterisk/sip.conf)

В Asterisk существует два пути подключения пользователей – через файл users.conf, который является общим для всего Asterisk или через выделенные файлы – sip.conf и iax.conf – соответственно, для протоколов SIP и IAX2.

Второй вариант с раздельными файлами, позволит более тонко конфигурировать разные разделы.

В раздел [general] для начала внести минимально необходимые настройки.

[general]
context=internal_phones  // Этот контекст будет использоваться
                         // для звонков с/на внутренние телефоны
allowoverlap=no          // Отключение набора по мере поступления номера, т.е.
                         // система будет ждать полного номера и лишь
                         // затем начнет набирать.
srvlookup=no             // Функция позволяет набирать номер
                         // по доменному имени пользователя

Теперь необходимо прописать сам телефон.

[300]                  // номер клиента
type=friend            // пользователь может и принимать звонки, и звонить
secret=300             // пароль для подключения телефона.
username=300           // для простоты имя пользователя совпадает с его номером
host=dynamic           // т.к. телефоны получают IP по
                       // DHCP, то нужно поставить значение dynamic
dtmfmode=rfc2833       // метод передачи dtmf–тонов набора номера
disallow=all           // запрещаем все кодеки
allow=ulaw             // разрешаем кодек ulaw, кодек должен быть такой,
                       // который поддерживается клиентом
context=default        // контекст описывает через какую секцию диалплана
                       // будут проходить звонки клиента
callerid=300           // устанавливаем номер для отображения. При исходящих
                       // звонках будет высвечиваться этот номер.
deny=0.0.0.0/0         // ограничения по IP адресу для клиента.
permit=192.168.110.25  // разрешить IP адрес для клиента.

Откроем в редакторе файл extensions.conf:

sudo nano /etc/asterisk/extensions.conf

И укажем в его конце следующие строки, чтобы пользователи могли звонить друг другу:

[sip-dialout]
exten => 300,1,Dial(SIP/300)
exten => 301,1,Dial(SIP/301)

Перезапустим Asterisk чтобы применить изменения:

sudo service asterisk restart

В результате этих действий мы добавили двух пользователей и они могут звонить друг другу.

Перезагружаем конфигурацию SIP и смотрим на результат.

asterisk*CLI> sip reload
asterisk*CLI> sip show users

Username    Secret    Accountcode    Def.Context    ACL Forcerport
300           300       default          Yes              No
301           301       default          Yes              No

Оба телефона подключены.

Файл диалпланов (extensions.conf)

Файл диалпланов extensions.conf определяет, как будет вести себя Asterisk при входящих и исходящих вызовах. По сути, он состоит из списка инструкций или шагов, которым будет следовать Asterisk. Диалплан состоит из четырех основных элементов: контекстов, добавочных номеров, приоритетов и приложений.

Контексты

Диалпланы разбиты на разделы, называемые контекстами. Контексты – это именованные группы добавочных номеров, которые выполняют несколько функций.

Контексты изолируют разные части диалплана, предотвращая возможность их взаимодействия. Добавочный номер, определенный в одном контексте, полностью изолирован от добавочных номеров другого контекста, если только взаимодействие не разрешено специально.

Контексты различаются по именам. Все инструкции, размещаемые после описания контекста и до описания следующего контекста, являются частью данного контекста. В начале диалплана находятся два специальных контекста, [general] – содержит список общих настроек диалплана и [globals] – глобальные переменные.

Другое важное применение контекстов (возможно, самое важное) – обеспечение безопасности.

Добавочные номера

При вызове конкретного добавочного номера (входящим или внутренним звонком) Asterisk будет выполнять шаги, определенные для этого добавочного номера.

Синтаксис добавочного номера:

exten =>

Далее указывается имя (или номер).

Полный добавочный номер состоит из трех компонентов:

  • Имени (или номера).
  • Приоритета (каждый добавочный номер может включать множество шагов; порядковый номер шага называется его приоритетом).
  • Приложения (или команды), которое выполняет некоторое действие над вызовом.

Эти три компонента разделяются запятыми:

exten => имя,приоритет,приложение()

Вот пример того, как выглядит добавочный номер:

exten => 123,1,Answer()

Добавочный номер s

Когда в контекст поступают вызовы, для которых не указан конкретный добавочный номер, они передаются на добавочный номер s.

Для каждого вызова будет выполняться три действия (ответ на него, воспроизведение звукового файла и разъединение):

[incoming]
exten => s,1,приложение()
exten => s,n,приложение()
exten => s,n,приложение()

Приоритеты

Каждый добавочный номер может включать множество шагов, называемых приоритетами. Каждый приоритет пронумерован последовательно, начиная с 1, и выполняет одно определенное приложение. Например, следующий добавочный номер отвечает на звонок (в приоритете под номером 1) и затем выполняет разъединение (в приоритете под номером 2):

exten => 123,1,Answer()
exten => 123,n,выполнить что-то
exten => 123,n,выполнить что-то еще
exten => 123,n,выполнить последнее
exten => 123,n,Hangup()

Приложения

Каждое приложение выполняет определенное действие над данным каналом, например воспроизведение звука, прием тонального ввода, вызов канала, разрыв соединения и т. д.

Для выполнения некоторых приложений, таких как Answer() и Hangup(), не требуется никаких дополнительных инструкций. Некоторым приложениям необходима дополнительная информация.

Приложения Answer(), Playback() и Hangup()

Приложение Answer() (Ответ) используется для ответа каналу, по которому выполняется звонок. Оно выполняет исходную настройку для канала, получающего входящий вызов.

Приложение Playback() (Воспроизведение) воспроизводит в канале предварительно записанный звуковой файл. Звуковые файлы, по умолчанию, находятся в директории /var/lib/asterisk/sounds (Этот путь может быть изменен в файле asterisk.conf).

Приложение Hangup() (Разъединение) выполняет разъединение активного канала.

Приложения Background(), WaitExten() и Goto()

Background()(Фон) – приложение воспроизводит записанный звуковой файл.

Приложение Background() используется для создания голосовых меню (в нашем случае мы использовали его в качестве автоответчика или интерактивного секретаря).

Синтаксис Background():

exten => 123,1,Answer()
exten => 123,n,Background(main-menu)

Приложение WaitExten() (Ожидание добавочного номера):

exten => 123,1,Answer()
exten => 123,n,Background(main-menu)
exten => 123,n,WaitExten()

Если требуется, чтобы приложение WaitExten() ожидало ответа в течение определенного времени (вместо использования времени ожидания по умолчанию), просто укажите число, соответствующее необходимому количеству секунд, в качестве первого аргумента в WaitExten():

exten => 123,n,WaitExten(5)

И Background(), и WaitExten() позволяют абоненту производить набор номера.

Приложение Goto() используется для перенаправления вызова в другую часть диалплана.

Обработка ошибочных вводов и времени ожидания

Теперь введем специальные добавочные номера. Во-первых, нам необходим добавочный номер для недействительных вводов; когда абонент нажимает не ту кнопку, вызов направляется на добавочный номер k. Во-вторых, необходим добавочный номер для обработки ситуаций, когда абонент не производит ввод вовремя (время ожидания по умолчанию – 10 с). Если абонент слишком долго не нажимает кнопку после запуска приложения WaitExten(), вызовы направляются на добавочный номер m. Использование добавочных номеров k и m делает диалплан более надежным и практичным.

Внешние абоненты не имеют возможности соединения с реальным живым человеком. Для соединения внешнего абонента с реальным человеком отвечает приложение – Dial() (Звонить).

Dial() принимает четыре аргумента. Первый – получатель вызова. Он состоит (в самой простой форме) из названия технологии (или транспортного протокола), с помощью которой выполняется вызов, символа слэш (/) и имени удаленной конечной точки или ресурса. Самыми широко используемыми типами технологий являются Zap (для аналоговых каналов и каналов E1), SIP и IAX2.

Также можно звонить по нескольким каналам одновременно, объединяя получателей вызова с помощью символа амперсанда (&):

exten => 123,1,Dial(Zap/1&Zap/2&SIP/Jane)

Приложение Dial() также позволяет устанавливать связь с удаленной конечной точкой VoIP, которая не была предварительно описана в конфигурационных файлах канала. Вот полный синтаксис такого типа соединения:

Второй аргумент приложения Dial() – время ожидания, задаваемое в секундах.

Третий аргумент Dial() – строка опций. Она может содержать один или более символов, влияющих на поведение приложения Dial().

Четвертый аргумент приложения Dial() – URL, например

exten => s,1,Dial(Zap/4/2317154,,tTm,1)

Введение в расширения (extensions) и контексты (context)

Каналам назначаются контексты. Контексты определяют правила набора для каналов
План набора состоит из одного или нескольких контекстов. Каждый контекст это просто набор расширений (екстеншенов). Каждый екстеншен в контексте имеет уникальное имя.

Контексты используются для выполнения основных функций АТС:

  • Безопасность: Можно разрешить междугородные/международные вызовы только конкретным абонентам.
  • Маршрутизация вызовов: Маршрутизация вызовов в зависимости от номера абонента.
  • Автосекретарь: Проигрывание приветствия и приглашение ввести добавочный номер.
  • Многоуровневые голосовые меню: Голосовые меню для службы поддержки, отдела продаж и т.д.
  • Авторизация: Запрос пароля для доступа к некоторым екстеншенам.
  • Обратный вызов: Позволяет уменьшить затраты на междугородние/международные вызовы.
  • Списки доступа: Занесение в черные списки надоедливых абонентов, не давая им возможности связаться с Вами.
  • Виртуальные АТС: Вы можете создать виртуальную АТС в пределах Вашей основной АТС.
  • Дневной/Ночной режим работы: Вы можете изменять поведение Вашей АТС в зависимости от времени суток.
  • Макросы: Можно создавать скрипты для решения повторяющихся задач в плане набора.

Что такое екстеншен?

В Asterisk екстеншен определяется как перечень приложений (applications) и их аргументов, выполняемых в определённом порядке. Порядок выполнения определяется приоритетами (priority).

Набор номера

Чаще всего вызывается другой интерфейс. Вызов осуществляется командой Команда Asterisk Dial.

[default]
exten => 100,1,Dial(DAHDI/1,20)
exten => 100,2,Voicemail(u100@default)
exten => 100,102,Voicemail(b100@default)

Этот пример иллюстрирует разные варианты действий в случае, если на вызов не ответили. Сначала вызывается канал DAHDI/1, если через 20 секунд никто не ответил вызов перенаправляется на VoiceMail() с объявлением «Абонент не отвечает» (u100). Если же абонент занят, вызов перейдет на приоритет N+101, в нашем случае это приоритет 102.

Маршрутизация по CallerID

Пример маршрутизации по номеру вызывающего абонента.

[default]
exten => 100/1234567,1,Congestion
exten => 100,1,Dial(DAHDI/1,20)
exten => 100,2,Voicemail(u100)
exten => 100,102,Voicemail(b100)

Если вызывается екстеншен 100 вызов направляется на интерфейс DAHDI/1, кроме случая если вызов осуществляет абонент 1234567. В этом случае вызов отклоняется. На примере видно, что идентификатор вызывающего абонента задается формой ‘/1234567’.

Если отсутствует CallerID, пример маршрутизации будет иметь вид:

[default]
exten => 100/,1,Zapateller
exten => 100,1,Wait(0)
exten => 100,2,Dial(DAHDI/1)

В данном примере если поступает звонок без CallerID, вызов блокируется с помощью приложения Zapateller().

Вызов группы телефонов

Часто требуется чтобы вызов по «не ответу» перешел на другой телефон. Пример выглядит следующим образом.

[operator]
exten => 0,1,Dial(DAHDI/1,10)
exten => 0,2,Dial(DAHDI/1&DAHDI/2&DAHDI/3,10)
exten => 0,3,Playback(companymailbox)
exten => 0,4,Voicemail(100)
exten => 0,5,Hangup

Вызов поступает на DAHDI/1, в случае если телефон занят или не отвечает в течение 10 секунд, звонок переходит на группу телефонов, включая и DAHDI/1. Если и на этот раз никто не поднимает трубку, вызов переходит на голосовую почту.

Для обработки и распределения множества вызовов существует специальный механизм – очередь, которая вызывается командой Queue().

Asterisk IVR

Пример создания голосового меню:

[sales]
exten => s,1,Background(welcome-sales)
exten => 1,1,Goto(default,100,1)
exten => 2,1,Goto(default,101,1)
[mainmenu]
exten => s,1,Background(welcome-mainmenu)
exten => 1,1,Goto(sales,s,1)
exten => 2,1,Dial,DAHDI/2
exten => 9,1,Directory(default)
exten => 0,1,Dial,DAHDI/3

Объявление проигрывается на расширении ‘s’. В объявлении предлагается набрать ‘1’ для вызова, например отдела продаж (производится переход в контекст ‘sales’). Набрать ‘2’ – вызов DAHDI/2. Набор ‘9’ – вызов каталога (смотри Directory) и ‘0’ вызов DAHDI/3.

Использование переменных

В Asterisk существуют глобальные переменные, используемые в качестве аргументов для команд. Переменные записываются в диалплане в виде ${foo}, где ‘foo’ это имя переменной. Имена должны начинаться с буквы и могут состоять из любых цифр и букв, но существуют предопределенные имена, вот некоторые из них:

  • ${CONTEXT} Текущий контекст.
  • ${EXTEN} Текущий екстеншен.
  • ${EXTEN:x} Текущий екстеншен с удалением первых цифр(где х кол-во удаляемых цифр)
  • ${PRIORITY} Текущий приоритет
  • ${CALLERID} Текущий CallerID (имя и номер)
  • ${CALLERIDNUM} Текущий номер Caller ID
  • ${CALLERIDNAME} Текущее имя Caller ID
  • ${RDNIS} перенаправление DNIS

Глобальные переменные назначаются в секции [globals] диалплана.

Организуя диалплан таким образом, можно быстро и легко переназначать физические интерфейсы для конкретных пользователей, часто используемых в контекстах.

Маршрутизация по времени – Дневной и Ночной режимы

Вложенные контексты можно использовать для реализации дневного, ночного и праздничного режимов. Рассмотрим следующий пример:

[newyears]
exten => s,1,Playback(happy-new-years)
[daytime]
exten => s,1,Dial(DAHDI/1,20)
[nighttime]
exten => s,1,Playback(after-hours-msg)
[default]
include => newyears||||1|jan
include => daytime|9:00-17:00|mon-fri
include => nighttime

В этом примере заданы дневной, ночной и праздничный режимы обработки звонков.

Исходящие вызовы

Направление исходящей связи можно реализовать определением короткого кода доступа (например ‘9’), или определить полностью шаблон набираемых номеров.

[international]
ignorepat => 9        // не отключать тон готовности после набора заданной цифры
exten => _9810.,1,Dial(DAHDI/g2/${EXTEN:1})
exten => _9810.,2,Congestion
include => longdistance

[longdistance]
ignorepat => 9
exten => _98[02-9]XXXXXXXXX,1,Dial(DAHDI/g2/${EXTEN:1})
exten => _98[02-9]XXXXXXXXX,2,Congestion
include => local

[local]
ignorepat => 9
exten => _9[02-79]XXXXXX,1,Dial(DAHDI/g2/${EXTEN:1})
exten => _9[02-79]XXXXXX,2,Congestion
include => default

В этом примере рассматриваются 3 контекста с различными правами доступа к Телефонной сети Общего Пользования.

Контекст [international] позволяет набрать международный номер с любым количеством цифр.

Контекст [longdistance] – междугородний номер до 11-ти цифр.

Контекст [local] – городской номер длиной до 7-ми цифр.

Переменная ${EXTEN:1} удаляет префикс.

Шаблоны Patterns

Екстеншены могут сопоставляться шаблону, вместо однозначно заданных цифр. Шаблон должен начинаться с символа подчеркивания ( _ ) и может использовать любой из следующих символов:

X – любая цифра от 0-9

Z – любая цифра от 1-9

N – любая цифра от 2-9

[14-6] – цифры 1,4, 5 и 6

. – любые возможные символы.

Резервные транки и LCR (выбор направления с наименьшей стоимостью)

Настройка LCR (Least Coast Routing) отвечает за оптимальный маршрут относительно стоимости и правила перенаправления в случае отказа внешней линии.

Запись разговоров Asterisk

[macro-mixmonitor]
exten => s,1,Set(RECORD_FILENAME=${STRFTIME(${EPOCH},,%Y%m%d-%H%M%S)}-${CALLERID(num)})
same => n,MixMonitor(${RECORD_FILENAME}.wav,b)
same =>  n,Dial(${ARG1},180,)
[outbound_route1]
exten => _9.,1,Macro(mixmonitor,PJSIP/sipprovider/${EXTEN:1})

В данном примере вызов с префиксом ‘9’, должен быть скоммутирован через SIP транк ITSP. Разговор будет записан в формате ‘wav’ и сохранен в директорию по умолчанию /var/lib/asterisk/monitor/ГодМесяцДень-ЧасыМинутыСекунды-НомерВызывающего Абонента.wav

Структура same ⇒ позволяет сократить код, избежав многочисленных повторений exten ⇒ s, в данном случае.

Настройка Voicemail.conf, queues.conf

Данные файлы отвечают за настройку голосовой почты.

Перезагрузка Asterisk

После окончательной настройки программного приложения Asterisk желательно произвести перезапуск системы одной из комманд:

core restart now             // перегружает Asterisk немедленно, заканчивая все
                             // текущие вызовы.
core restart gracefully      // предотвращает новые вызовы, но позволяет закончить текущие звонки.
core restart when convenient // ждет, пока в Asterisk не будет вызовов, а затем перегружает службу.