Сообщение об ошибке

  • Deprecated function: Function create_function() is deprecated в функции _geshifilter_prepare() (строка 126 в файле /var/www/lsoft/sites/all/modules/geshifilter/geshifilter.pages.inc).
  • Deprecated function: Function create_function() is deprecated в функции _geshifilter_prepare() (строка 131 в файле /var/www/lsoft/sites/all/modules/geshifilter/geshifilter.pages.inc).
  • Deprecated function: Function create_function() is deprecated в функции _geshifilter_process() (строка 231 в файле /var/www/lsoft/sites/all/modules/geshifilter/geshifilter.pages.inc).

VoIP: Asterisk RealTime Extensions(dialplans), Интерактивное голосовое меню

test

VoIP

Содержание.

Если Вы еще не выбрали VPS/VDS

Список неплохих конфигураций можно найти и заказать тут.

Постоянный контроль доступности вашего сервера

Для контроля на работоспособность вашего сервера используйте следующий сервис ping-admin

Предшествующие статьи из цикла

Что мы будем делать?

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

Что из себя представляет интерактивное голосовое меню(IVR)?

IVR (англ. Interactive Voice Response) — система предварительно записанных голосовых сообщений, выполняющая функцию маршрутизации звонков внутри call-центра, пользуясь информацией, вводимой клиентом на клавиатуре телефона с помощью тонального набора. Озвучивание IVR — важная составляющая успеха call-центра. Правильно подобранное сочетание музыкального сопровождения, голоса диктора и используемой лексики создаёт благоприятное впечатление от звонка в организацию. Маршрутизация, выполняемая с помощью IVR-системы, обеспечивает правильную загрузку операторов продуктов и услуг компании.(с)Википедия.

Создаем таблицу

CREATE TABLE `extensions` (
  `id` int(10) unsigned NOT NULL AUTO_INCREMENT,
  `context` varchar(20) NOT NULL DEFAULT '',
  `exten` varchar(20) NOT NULL DEFAULT '',
  `priority` int(6) NOT NULL DEFAULT '0',
  `app` varchar(20) NOT NULL DEFAULT '',
  `appdata` varchar(128) NOT NULL DEFAULT '',
  PRIMARY KEY (`context`,`exten`,`priority`),
  UNIQUE KEY `id` (`id`))

context - сам контекст, которому принадлежит данный exten.
exten - номер/правило набора
priority - как понятно из названия наш приоритет
app - выполняемая функция
appdata - данные что передаем в выполняемую функцию

Введем тестовый контекст

INSERT INTO extensions VALUES (1, 'default', '312', 1, 'Playback', 'demo-congrats')
Добавили проигрывания поздравления с установкой и настройкой Asterisk в контексте default при звонке на номер 312.

Подключаемся к базе данных

  • В extconfig.conf добавляем наше подключение к базе в виде строки extensions => mysql,general,extensions
  • В файле extensions.conf указываем что читать будем из базы строкой в секции [default]switch => Realtime/@extensions

Формат switch указывает Realtime/контекст@таблица. Контекст мы опустили.
Перечитываем конфигурацию сервера командой reload

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

Голосовое меню

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

Проще, для начала, меню набросать текстом и только потом ввести его в базу. Так проще и наглядней. Ошибки не отлавливал, наверняка имеются, но как рабочий пример двухуровневого достаточно сложного примера меню вполне сгодиться.
Меню по звонку на номер 91. Расписано в комментариях.
ПримечаниеУ вас должны быть соответствующие звуки, welcome, MenuVoiceEntry и т.д. иначе не будет озвучены данные файлы.

[default]
exten => 91,1,Answer();отвечаем
exten => 91,2,Playback(welcome);приветствуем
exten => 91,3,Goto(menu-choise,s,1);переходим в  меню
exten => 91,4,Hangup();на всякий случай если что-то не так
[menu-choise];наше меню
exten => s,1,Playback(MenuVoiceEntry);описываем что можно делать
exten => s,2,WaitExten();ждем ввода
exten => 1,1,Playback(digits/1);озвучиваем цифру 1
exten => 1,2,Goto(1,1${MAILBOX_EXISTS(${CALLERID(num)}@default)}1);проверяем существование
;почтового ящика у звонящего
exten => 1,101,Playback(not-exist);говорим что почтовый ящик не существует
exten => 1,102,Goto(default,91,1);возвращаемся в меню
exten => 1,111,VoiceMailMain(${CALLERID(num)}@default);если ящик есть, переключаем пользователя на
;меню управления ящиком
exten => 1,112,Goto(default,91,1);возвращаемся в меню
exten => 2,1,Playback(digits/2);говорим о выбранной цифре 2
exten => 2,2,HangUp();завершаем звонок
exten => _1XXX/_1XXX,1,Playback(Dialling);если введено 4 цифры начиная
;с 1 считаем внутренним номером. Говорим о том что вызываем
exten => _1XXX/_1XXX,2,Dial(SIP/${CDR(dst)},10);вызываем 10 секунд
exten => _1XXX/_1XXX,3,PlayBack(followme/sorry);если не ответил отправляем на звуковой почтовый ящик
exten => _1XXX/_1XXX,4,Goto(2${MAILBOX_EXISTS(${CDR(dst)}@default)}1);проверяем наличие
;почтового ящика
exten => _1XXX/_1XXX,201,PlayBack(vm-goodbye);Если нету - прощаемся
exten => _1XXX/_1XXX,202,Hangup();сбрасываем соединение
exten => _1XXX/_1XXX,211,Voicemail(${CDR(dst)}@default);Если есть - предлагаем оставить сообщение
exten => _1XXX/_1XXX,212,PlayBack(vm-goodbye);прощаемся
exten => _1XXX/_1XXX,213,Wait(2);ждем пару секунд
exten => _1XXX/_1XXX,214,Hangup();сбрасываем соединение
exten => i,1,PlayBack(sorry);если ни одна комбинация не совпала, извиняемся
exten => i,2,Hangup();сбрасываем соединение

Переводим код в запросы.

INSERT INTO extensions VALUES (0, 'default', '91', 1, 'Answer', '');
INSERT INTO extensions VALUES (0, 'default', '91', 2, 'Playback', 'welcome');
INSERT INTO extensions VALUES (0, 'default', '91', 3, 'Goto', 'menu-choise,s,1');
INSERT INTO extensions VALUES (0, 'menu-choise', 's', 1, 'Playback', 'MenuVoiceEntry');
INSERT INTO extensions VALUES (0, 'menu-choise', 's', 2, 'WaitExten', '');
INSERT INTO extensions VALUES (0, 'menu-choise', '1', 1, 'Playback', 'digits/1');
INSERT INTO extensions VALUES (0, 'menu-choise', '1', 2, 'Goto', '1${MAILBOX_EXISTS(${CALLERID(num)}@default)}1');
INSERT INTO extensions VALUES (0, 'menu-choise', '1', 101, 'Playback', 'not-exist');
INSERT INTO extensions VALUES (0, 'menu-choise', '1', 102, 'Goto', 'default,91,1');
INSERT INTO extensions VALUES (0, 'menu-choise', '1', 111, 'VoiceMailMain', '${CALLERID(num)}@default');
INSERT INTO extensions VALUES (0, 'menu-choise', '1', 112, 'Goto', 'default,91,1');
INSERT INTO extensions VALUES (0, 'menu-choise', '2', 1, 'Playback', 'digits/2');
INSERT INTO extensions VALUES (0, 'menu-choise', '2', 2, 'Hangup', '');
INSERT INTO extensions VALUES (0, 'menu-choise', '_1XXX/_1XXX', 1, 'Playback', 'Dialling');
INSERT INTO extensions VALUES (0, 'menu-choise', '_1XXX/_1XXX', 2, 'Dial', 'SIP/${CDR(dst)},10');
INSERT INTO extensions VALUES (0, 'menu-choise', '_1XXX/_1XXX', 3, 'Playback', 'followme/sorry');
INSERT INTO extensions VALUES (0, 'menu-choise', '_1XXX/_1XXX', 4, 'Goto', '2${MAILBOX_EXISTS(${CDR(dst)}@default)}1');
INSERT INTO extensions VALUES (0, 'menu-choise', '_1XXX/_1XXX', 201, 'Playback', 'vm-goodbye');
INSERT INTO extensions VALUES (0, 'menu-choise', '_1XXX/_1XXX', 202, 'Hangup', '');
INSERT INTO extensions VALUES (0, 'menu-choise', '_1XXX/_1XXX', 211, 'Voicemail', '${CDR(dst)}@default');
INSERT INTO extensions VALUES (0, 'menu-choise', '_1XXX/_1XXX', 212, 'Playback', 'vm-goodbye');
INSERT INTO extensions VALUES (0, 'menu-choise', '_1XXX/_1XXX', 213, 'Wait', '2');
INSERT INTO extensions VALUES (0, 'menu-choise', '_1XXX/_1XXX', 214, 'Hangup', '');
INSERT INTO extensions VALUES (0, 'menu-choise', 'i', 1, 'Playback', 'sory');
INSERT INTO extensions VALUES (0, 'menu-choise', 'i', 2, 'Hangup', '');

Да, кстати, сообщаем Asterisk о том что у нас есть еще контекст [menu-choise] путем добавления в файл extensions.conf строк:

[menu-choise]
switch => Realtime/@extensions

И делаем мы это для каждого контекста, которые хотим читать из базы, иначе Asterisk не находит контекст.

Итог

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

Категория: 
Share/Save

Делитесь с друзьями в социальных сетях! Оставляйте комментарии!

Share/Save

Это Вам так же может быть интересно!