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

  • 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 1.8 + VoiceMail RealTime(MySQL)

test

Что имеем?

Все тоже что в прошлой статье: Debian + Asterisk 1.8 + MySQL(SIP, CDR) = Asterisk Realtime

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

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

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

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

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

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

exten => 1234,1,Dial(SIP/ivan, 45) ;Звоним пользователю ivan в течении 45 секунд по SIP протоколу
exten => 1234,2,VoiceMail(777@mb_tutorial) ;Если он не отвечает или занята телефонная линия
;вы оставляете сообщение на ящик 777
exten => 1234,3,PlayBack(vm-goodbye) ;Проигрываем сообщение ‘goodbye’ который вежливо прощается со звонившим
exten => 1234,4,Wait(2) ; Ждем пару секунд
exten => 1234,5,HangUp() ; Закрываем соединение

Достаточно просто, не так ли? Но что нам для этого требуется? А требуется нам для этого уже существующий пользователь ivan и почтовый ящик 777. С пользователями мы разобрались в прошлый раз, они хранятся у нас в БД, в таблице sip_buddies. Хватает статей о том как добавлять почтовые ящики в voicemail.conf, но мы пойдем и дальше путем полного realtime, а значит все основное повешаем на MySQL. Сейчас нам нужно сделать таблицу с почтовыми ящиками. Делаем.

CREATE TABLE `voicemail_users` (
  `uniqueid` int(11) NOT NULL AUTO_INCREMENT,
  `customer_id` int(11) NOT NULL DEFAULT '0',
  `context` varchar(50) NOT NULL DEFAULT '',
  `mailbox` int(5) NOT NULL DEFAULT '0',
  `password` varchar(4) NOT NULL DEFAULT '0',
  `fullname` varchar(50) NOT NULL DEFAULT '',
  `email` varchar(50) NOT NULL DEFAULT '',
  `pager` varchar(50) NOT NULL DEFAULT '',
  `stamp` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
  PRIMARY KEY (`uniqueid`),
  KEY `mailbox_context` (`mailbox`,`context`)
);

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

Добавим наш первый почтовый ящик.

INSERT INTO `voicemail_users` VALUES (1,1,'default',1239,'1234','1','1239','0','');
Как видно почтовый ящик 1239, паролем 1234 и контекстом default. Почтовый ящик 1239 я поставил не случайно, а для того чтобы он соответствовал номеру нашего пользователя.

Обновим нашего пользователя, укажем в нем номер почтового ящика. Так как у меня всего один пользователь в базе то в SQL запросе не буду делать уточнений WHERE, вы же судите по тому что добавляли по своей базе.
update sip_buddies set mailbox=1239;

Подключаем MySQL VoiceMails в самом Asterisk.

Подключим сам Asterisk для работы с MySQL, чтобы работал в режиме realtime и считывал наши динамически создаваемые почтовые ящики по надобности. В файле extconfig.conf сразу после наших записей realtime пользователей(из прошлой статьи) добавим строку:
voicemail => mysql,general,voicemail_users

Проверка почтовых ящиков

Для проверки используем коротенький dialplan в extensions.conf, секции [default]

;это для того чтобы проверить свой почтовый ящик звоня со своего номера
exten => 11,1, VoiceMailMain(${CALLERID(num)}@default)
;в этой строке мы буквально говорим использовать почтовый ящик "наш_номер@контекст"
exten => 11,2, Hangup()
;а это для того чтобы проверить почту в ящике введя его номер и пароль
exten => 12,1, VoiceMailMain(@default)
exten => 12,2, Hangup()

Вот как выглядит описание использованной выше функции: VoiceMailMain([[[s]mailbox][@context])

В консоли Asterisk выполняем команду reload чтобы перезагрузить все конфиги и запускаем наш софтфон, к примеру Ekiga, как и в прошлой статье и звоним на номер 11 чтобы проверить сообщения в своем почтовом ящике и на номер 12 для того чтобы ввести номер почтового ящика и пароль от него и проверить наличие сообщений там. В последнем случае такую конструкцию можно использовать если вы звоните с другого номера или городского телефона, в первом же случае пользователю даже не обязательно знать номер своего почтового ящика.

Если у Вас что-то не получается, можете использовать функцию NoOP, к примеру в диалплане помещаем такой вызов:
exten => 11,1, NoOp(CALLID:${CALLERID(num)})
Результатом будет вывод в консоль Asterisk нашего номера, с которого мы делаем звонок.

Список и описание переменных(Английский)

Теперь воплотим наш пример в самом начале в жизнь, создадим такой тарифный план чтобы звонки осуществлялись на номер и если человек не отвечал некоторое время, к примеру 10 секунд, то система предлагала нам оставить голосовое сообщение. То есть адаптируем код:

exten => 1234,1,Dial(SIP/ivan, 45) ;Звоним пользователю ivan в течении 45 секунд по SIP протоколу
exten => 1234,2,VoiceMail(777@mb_tutorial) ;Если он не отвечает или занята телефонная линия
;вы оставляете сообщение на ящик 777
exten => 1234,3,PlayBack(vm-goodbye) ;Проигрываем сообщение ‘goodbye’ который вежливо прощается со звонившим
exten => 1234,4,Wait(2) ; Ждем пару секунд
exten => 1234,5,HangUp() ; Закрываем соединение

в более подходящий нам.

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

INSERT INTO `sip_buddies` VALUES (0,'g729;ilbc;gsm;ulaw;alaw','default','auto','dynamic','port,invite','1234',NULL,'no',
'1234','friend','1234','yes','1234','','','','','0',NULL,NULL);

Это будет пользователь 1234, с паролем 1234 и прочим 1234 чтобы сильно не париться.
И соответственно ему почтовый ящик:
insert into voicemail_users values(0,1234,'default',1234,'1234',1234,1234,0,0);

Внимание! Запомните что у конфигурационных файлов есть по всей видимости приоритет перед БД, таким образом если у вас в файле voicemail.conf есть почтовый ящик 1234 с настройками, то он будет прочтен оттуда, а не из базы.

Ну что же, основным у нас остается настроить тарифный план, чтобы не дозвонившись пользователь мог попасть в голосовую почту и оставить там свое сообщение. Немножко заморочимся и сделаем легкое ограничение на звонки только внутри сети, то есть соответствующих определенному формату, у нас это будет формат вида 1XXX( 4 цифры, начинаются с единицы).

exten => _1XXX/_1XXX,1,Dial(SIP/${CDR(dst)},10);звоним 10 секунд, если нет ответа или абонента в сети
;или он вообще не существует
exten => _1XXX/_1XXX,2,PlayBack(followme/sorry);извиняемся за невозможность связать
exten => _1XXX/_1XXX,3,Goto(2${MAILBOX_EXISTS(${CDR(dst)}@default)}1);если есть ящик переходим на код 211, иначе 201
exten => _1XXX/_1XXX,201,PlayBack(vm-goodbye);так как ящика нет, прощаемся
exten => _1XXX/_1XXX,202,Goto(230);и идем на выход
exten => _1XXX/_1XXX,211,Voicemail(${CDR(dst)}@default);если ящик есть, предлагаем оставить сообщение
exten => _1XXX/_1XXX,212,PlayBack(vm-goodbye);прощаемся
exten => _1XXX/_1XXX,213,Wait(2);ждем 2 секунды
exten => _1XXX/_1XXX,230,Hangup();разрываем соединение

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

INSERT INTO `sip_buddies` VALUES (0,'g729;ilbc;gsm;ulaw;alaw','default','auto','dynamic','port,invite','1237',NULL,'no','1237',
'friend','1237','yes','1237','','','','','0',NULL,NULL)

Переменная ${CDR(dst)} у нас передает адрес назначения. Использовать ${ARG1} у меня не получилось, он попросту пуст. Кратко комментируя, происходит звонок с внутреннего на внутренний номер в течении 10 секунд, если абонент не берет трубку проверяем есть ли у него почтовый ящик, если есть - включается голосовая почта, нет - извиняемся, прощаемся и через пару секунд ложим трубку. Все просто. Перечитываем диалплан командой:
dialplan reload

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

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

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

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

Share/Save

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