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

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 подходит для «голого» астериска. Т.к. данный способ перекроет доступ в статичный диалплан из конфигов
 
avatar
  Подписаться  
Уведомление о

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

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

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

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

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

ONLINE

Why Choose HUGE?

Unlimited pre-designed elements

Each and every design element is designed for retina ready display on all kind of devices

User friendly interface and design

Each and every design element is designed for retina ready display on all kind of devices

100% editable layered PSD files

Each and every design element is designed for retina ready display on all kind of devices

Created using shape layers

Each and every design element is designed for retina ready display on all kind of devices