Дмитрий Рашевский
25.10.2019
4334

Asterisk Realtime Dialplan

Введение Метод Realtime. Настройка Asterisk Realtime Метод Realtime. Таблица для диалплана Метод Realtime. Добавление и редактирование диалплана Метод Static. Настройка Asterisk Realtime Метод Static. Таблица для Диалплана Метод Static. Добавление и редактирование диалплана Заключение Введение              В данной статье будет рассказано, как настроить механизм астериска Realtime, далплан, записанный в mysql. Метод Realtime. Настройка Asterisk Realtime […]

  1. Введение
  2. Метод Realtime. Настройка Asterisk Realtime
  3. Метод Realtime. Таблица для диалплана
  4. Метод Realtime. Добавление и редактирование диалплана
  5. Метод Static. Настройка Asterisk Realtime
  6. Метод Static. Таблица для Диалплана
  7. Метод Static. Добавление и редактирование диалплана
  8. Заключение

Введение

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

Все настройки проводятся в системе FreePBX 13.0.192.19, Asterisk 13.21.0 Centos 6.9,mysql  Ver 15.1 Distrib 10.1.33-MariaDB

Метод Realtime. Настройка Asterisk Realtime

Необходимо создать файл /etc/asterisk/extconfig.conf и добавить несколько параметров

Создадим файл

    vim /etc/asterisk/extconfig.conf   

Внесем изменения, предварительно нажав клавишу «i»

   [settings]   extensions   => odbc,asteriskcdrdb,extensions   
конфигурация extconfig.conf
конфигурация extconfig.conf
Если вы читали статью Asterisk_queue_log и Asterisk realtime sip_peers, то вам нужно будет добавить строку extensions => odbc,asteriskcdrdb,extensions
Чтобы выйти из режима редактирования в редакторе vim, используется клавиша «Esc» Сохраним конфигурацию и закроем файл комбинацией Shift+ZZ или :wq+Enter

Рассмотрим подробнее данные значения:

extensions — общее имя (family) для понимания для чего используется конфигурация

odbc — коннектор, через который астериск будет связан БД

asteriskcdrdb — db конфиг в /etc/asterisk/res_odbc_additional.conf

extensions – таблица с конфигурациями

Метод Realtime. Таблица для диалплана

Теперь создадим таблицу extensions в базе данных asteriskcdrdb

CREATE TABLE IF NOT EXISTS `extensions` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `context` varchar(20) NOT NULL DEFAULT '',
  `exten` varchar(20) NOT NULL DEFAULT '',
  `priority` tinyint(4) NOT NULL DEFAULT '0',
  `app` varchar(20) NOT NULL DEFAULT '',
  `appdata` varchar(128) NOT NULL DEFAULT '',
  UNIQUE (context, exten, priority),
  UNIQUE (id)
) ENGINE=InnoDB DEFAULT CHARSET=utf8
Таблица взята с официального документации в директории с исходниками асткриска, в моем случае /usr/src/asterisk/contrib/realtime/mysql/mysql_config.sql
  • context – контекст обработки вызова
  • exten – экстеншн или шаблон, для которого будет создаваться правило
  • priority – приоритет для обработки правила
  • app – приложение диалплана, которое будет выполняться на данном шаге
  • appdata – значения, данные которых будет принимать приложение диалплана

Также необходимо добавить в конекст вашего внетреннего номера следующее правило

[test-dial]
switch => Realtime/test-context@extensions
  • test-dial – конекст в котором находит ваш extensions
  • switch – команда для перенаправления обработки вызова на другой сервер / сервис
  • Realtime – технология, по которой будет обрабатываться вызов
  • test-context – контекст, который указан в заведенной ранее таблице extensions
  • extensions – значение параметра family, который указан в файле extcongig.conf
Правка диалплана
Правка диалплана

Метод Realtime. Добавление и редактирование диалплана

Для заведения диалплана, определим что мы для примера будем рассматривать.

Предположим, что это будет контекст для обработки вызовов из вне. По стандарту в freepbx это контекст from-trunk.

Иногда бывает что на АТС подключено несколько операторов связи и каждый присылает номер в  разных форматах (+7…, 8…, 495… и т.д.). Для этого в контексте обработки вызовов будем диалпланов «фиксить» приходящий номер.

Для этого в созданную ранее таблицу добавим несколько записей

insert into extensions values (1, 'test-context', '_X.', 1, 'NoOp', 'Приведение CID к виду 74959898533');
insert into extensions values (2, 'test-context', '_X.', 2, 'Set', 'CALLERID(num)=7${CALLERID(num):-10:10}');
insert into extensions values (3, 'test-context', '_X.', 3, 'Set', 'CALLERID(ANI-num)=${CALLERID(num):-10:10}')
insert into extensions values (4, 'test-context', '_X.', 4, 'Goto', 'from-trunk,${EXTEN},1');
Заполненная таблица  extensions
Заполненная таблица  extensions

Т.е. данный диалплан в привычном виде будет выглядеть следующим образом

[local-city-mobile-mg-mn]
exten => _X.,1,NoOp(Приведение CID к виду 74959898533)
exten  => _X.,2,Set(CALLERID(num)=7${CALLERID(num):-10:10})
exten  => _X.,3,Set(CALLERID(ANI-num)=${CALLERID(num):-10:10})
exten  => _X.,4,Goto(from-trunk,${EXTEN},1)

Применяем все изменения конфигураций командой module reload в asterisk CLI и проверяем вызов.

Проверка внесенных изменений
Проверка внесенных изменений

По скриншоту видно, что вызов обрабатывается в контексте local-city-mobile-mg-mn, но при этом учитывается написанный нами диалплан в таблице mysql

Это видно в логе по данным пунктам

CALLERID(num)=7102
CALLERID(ANI-num)=7102

Для обновления диалплана или добавления новых пунктов нужно также оперировать с созданной таблицей mysql. Для примера «завернем» вызов не в контекст from-trunk, как в примере выше, а в кастомный контекст, где будем производить запись методом Record.

  1. Командой mysql обновим запись в таблице.
update extensions set appdata = 'test,s,1' where id=4;
  • Добавим в таблицу новые данные для нового контекста
insert into extensions values (5, 'test-rec', 's', 1, 'NoOp', '============= Вы перешли в контекст для записи голоса =============');
insert into extensions values (6, 'test-rec', 's', 2, 'Record', 'custom/recvoice.wav');
insert into extensions values (7, 'test-rec', 's', 3, 'Hangup', '');
  • Добавим контекст, который будет связывать обращения к текущей таблице
[test]
switch => Realtime/test-rec@extensions
Связующий контекст
Связующий контекст

Применяем измененные конфигурации и проверяем

Проверка
Проверка

Метод Static. Настройка Asterisk Realtime

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

preload = res_odbc.so
preload = res_config_odbc.so

Необходимо создать файл /etc/asterisk/extconfig.conf и добавить несколько параметров

Создадим файл

vim /etc/asterisk/extconfig.conf

Внесем изменения, предварительно нажав клавишу «i»

[settings]
extensions.conf => odbc,asteriskcdrdb,dialplan_config

Рассмотрим подробнее данные значения

extensions.conf — общее имя (family) для понимания для чего используется конфигурация.

Для удобства можно использовать название файла конфигурации астериска. В данном случае extensions_conf.conf
  • odbc — коннектор, через который астериск будет связан БД
  • asteriskcdrdb — db конфиг в /etc/asterisk/res_odbc_additional.conf
  • dialplan_config – таблица с конфигурация

Метод Static. Таблица для диалплана.

Теперь создадим таблицу extensions в базе данных asteriskcdrdb

CREATE TABLE IF NOT EXISTS `dialplan_config` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `cat_metric` int(11) NOT NULL DEFAULT '0',
  `var_metric` int(11) NOT NULL DEFAULT '0',
  `commented` int(11) NOT NULL DEFAULT '0',
  `filename` varchar(128) NOT NULL DEFAULT '',
  `category` varchar(128) NOT NULL DEFAULT '',
  `var_name` varchar(128) NOT NULL DEFAULT '',
  `var_val` varchar(128) NOT NULL DEFAULT '',
  PRIMARY KEY (`id`),
Таблица взята с официального документации в директории с исходниками асткриска в моем случае /usr/src/asterisk-13.21.0/contrib/realtime/mysql/mysql_config.sql
  • cat_metric — задается приоритет категории для всего файла конфигурации
  • var_metric — указывается приоритет внутри категории
  • commented -указывается является ли строка комментарием. (0 — не является комментарием)
  • filename — файл кофигурации, которому относятся записи в таблице
  • category — контекст диалплана
  • var_name — параметр конфига
  • var_val — данные в конфиге после знака =>

Метод Static. Добавление и редактирование диалплана.

данная настройка перекрывает настройки статического диалплана. Поэтому диалплан freepbx работать не будет

Для примера, будем также рассматривать пример указанный выше

1. Добавим значения в таблицей

insert into dialplan_config values (1,0,0,0,'extensions_custom.conf', 'from-trunk-pre', 'exten', '_X.,1,NoOp(Приведение CID к виду 74959898533)');
insert into dialplan_config values (2,0,1,0,'extensions_custom.conf', 'from-trunk-pre', 'same', 'n,Set(CALLERID(num)=7${CALLERID(num):-10:10})');
insert into dialplan_config values (3,0,2,0,'extensions_custom.conf', 'from-trunk-pre', 'same', 'n,Set(CALLERID(ANI-num)=${CALLERID(num):-10:10})');
insert into dialplan_config values (4,0,1,0,'extensions_custom.conf', 'from-trunk-pre', 'same', 'n,Goto(from-trunk,${EXTEN},1)');
Таблица dialplan_config
Таблица dialplan_config

Т.е. данный диалплан в привычном виде будет выглядеть следующим образом

[from-trunk-pre]
exten => _X.,1,NoOp(Приведение CID к виду 74959898533)
exten  => _X.,2,Set(CALLERID(num)=7${CALLERID(num):-10:10})
exten  => _X.,3,Set(CALLERID(ANI-num)=${CALLERID(num):-10:10})
exten  => _X.,4,Goto(from-trunk,${EXTEN},1)

;exten => 1,1,NoOp(from-trunk,${EXTEN},1)

[from-internal]
25,1,Goto(from-trunk-pre,84959898533,1)

Применяем все изменения конфигураций командой core reload в asterisk CLI и проверяем вызов.

Проверка настроенного диалплана
Проверка настроенного диалплана
На скриншоте отчетливо видно, что вызов пытается уйти на контекст from-trunk, которого asterisk не видит. Т.е. заранее указанный FreePBXом контекст не распознается.

Так же из примера на рисунке 8 видно, что наш добавленный диалплан работает

CALLERID(num)=7102
CALLERID(ANI-num)=7102

А также виден вызов на экстеншн 25 в контексте from-internal, который указан в таблице на рисунке 7.

Executing [25@from-internal:1] Goto("SIP/102-00000011", "from-trunk-pre,84959898533,1") in new stack

Для обновления диалплана, также нужно изменять / добавлять новые значения в таблицу.

При изменении или добавлении строк / контекстов будьте внимательнее, не запутайтесь в значениях cat_metric и var_metric.

Теперь рассмотрим пример изменения текущего диалплана, логика звонка будет следующей, как и в примере для метода Realtime c с небольшими изменениями:

  1. Делаем вызов на ext 25
  2. Устанавливаем CALLERID 88003337533
  3. Переходим в контекст from-trunk-pre
  4. Проходим старые пункты по приведению CALLERID к единому виду
  5. Перейдем в контекст rec-voice
  6. Установим таймаут записи разговора
  7. Запишем голос оператора
  8. По истечению таймаута завершим вызов
Данная схема вызова дана в пример чтоб было понятно, для чего нужны параметры cat_metric и var_metric
  1. Устанавливаем CALLERID 88003337533
update ast_config set var_val='25,1,Set(CALLERID(num)=88003337533)' where id=6;
  • Переходим в контекст from-trunk-pre
insert into ast_config values (7,1,1,0,'extensions.conf', 'from-internal', 'same', 'n,Goto(from-trunk-pre,84959898533,1)');
  • Перейдем в контекст rec-voice
update ast_config set var_val='n,Goto(rec-voice,s,1)' where id=4;
  • Установим таймаут записи разговора
insert into ast_config values (8,2,0,0,'extensions.conf','rec-voice','exten','s,1,Set(TIMEOUT=3)');
  • Запишем голос оператора
insert into ast_config values (9,2,1,0,'extensions.conf','rec-voice','same','n,Record(custom/test.wav,1,${TIMEOUT})');
  • По истечению таймаута завершим вызов
insert into ast_config values (10,2,2,0,'extensions.conf','rec-voice','same','n,Hangup');

После внесения изменений применим настройки командой core reload и проверим нашу логику вызова.

Проверка измененного диалплана
Проверка измененного диалплана

Все работает.

Теперь наш диалплан выглядел бы в конфиге следующим образом.

[from-trunk-pre]
exten => _X.,1,NoOp(Приведение CID к виду 74959898533)
exten  => _X.,2,Set(CALLERID(num)=7${CALLERID(num):-10:10})
exten  => _X.,3,Set(CALLERID(ANI-num)=${CALLERID(num):-10:10})
exten  => _X.,4,Goto(rec-voice,s,1)
;exten => 1,1,NoOp(from-trunk,${EXTEN},1)
[from-internal]
exten => 25,1,Set(CALLERID(num)=88003337533)
same => n,Goto(from-trunk-pre,84959898533,1)
[rec-voice]
exten => s,1,Set(TIMEOUT=3)
same => n,Record(custom/test.wav,1,${TIMEOUT})
same => n,Hangup

Заключение

Таким образом из выше описанного можно сделать несколько выводов

  1. Настройка и редактирование диалплана (на мой взгляд) не удобно
  2. Метод Realtime можно встроить в текущий диалплан, не нарушая всю структуру
  3. Метод Static подходит для «голого» астериска. Т.к. данный способ перекроет доступ в статичный диалплан из конфигов
Подписаться
Уведомление о
guest
0 Комментарий
Inline Feedbacks
View all comments

Остались вопросы?

Я - Кондрашин Игорь, менеджер компании Voxlink. Хотите уточнить детали или готовы оставить заявку? Укажите номер телефона, я перезвоню в течение 3-х секунд.

VoIP оборудование

ближайшие курсы

ближайшие Вебинары

ONLINE

10 доводов в пользу Asterisk

Распространяется бесплатно.

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

Безопасен в использовании.

Любое программное обеспечение может стать объектом интереса злоумышленников, в том числе телефонная станция. Однако, сам Asterisk, а также операционная система, на которой он работает, дают множество инструментов защиты от любых атак. При грамотной настройке безопасности у злоумышленников нет никаких шансов попасть на станцию.

Надежен в эксплуатации.

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

Гибкий в настройке.

Зачастую возможности Asterisk ограничивает только фантазия пользователя. Ни один конструктор шаблонов не сравнится с Asterisk по гибкости настройки. Это позволяет решать с помощью Asterisk любые бизнес задачи, даже те, в которых выбор в его пользу не кажется изначально очевидным.

Имеет огромный функционал.

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

Интегрируется с любыми системами.

То, что Asterisk не умеет сам, он позволяет реализовать за счет интеграции. Это могут быть интеграции с коммерческими телефонными станциями, CRM, ERP системами, биллингом, сервисами колл-трекинга, колл-бэка и модулями статистики и аналитики.

Позволяет телефонизировать офис за считанные часы.

В нашей практике были проекты, реализованные за один рабочий день. Это значит, что утром к нам обращался клиент, а уже через несколько часов он пользовался новой IP-АТС. Безусловно, такая скорость редкость, ведь АТС – инструмент зарабатывания денег для многих компаний и спешка во внедрении не уместна. Но в случае острой необходимости Asterisk готов к быстрому старту.

Отличная масштабируемость.

Очень утомительно постоянно возвращаться к одному и тому же вопросу. Такое часто бывает в случае некачественного исполнения работ или выбора заведомо неподходящего бизнес-решения. С Asterisk точно не будет такой проблемы! Телефонная станция, построенная на Asterisk может быть масштабируема до немыслимых размеров. Главное – правильно подобрать оборудование.

Повышает управляемость бизнеса.

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

Снижает расходы на связь.

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