Книга: ELASTIX – общайтесь свободно
Назад: Сохранение в CDR рекламного номера
Дальше: Подключение Elastix к глобальным телекоммуникационным сетям

Подпрограмма соединения звонящего с последним собеседником (SmartCallback)

Не редко мы пытаемся с офисного телефона позвонить кому-то на мобильный, но абонент оказывается не доступен или занят. Когда искомый нами человек перезванивает по пропущенному вызову, он слышит в ответ название компании, из которой ему звонили, но не всегда может догадаться кому он был нужен. В то же время, Elastix хранит информацию о вызовах и знает разгадку – кто и когда пытался с ним связаться. Если мы, получив такой звонок, соединим абонента с последним, кто ему звонил, скорее всего окажем услугу – сэкономим время обоих. Такой функционал не входит в стандартный набор функций, но может быть относительно просто реализован нами самостоятельно. Для этого потребуется:
• настроить подпрограмму (которую мы назовем SmartCallback) и присвоить ей номер 661234 (файл «extensions_custom.conf»)
• настроить запрос к статистике соединений и назвать его «LASTCALL» (файл «func_odbc.conf»)
• настроить подключение к базе данных CDR со статистикой соединений (файлы «res_odbc.conf» и «/etc/odbc.ini»)
• настроить Собственную функцию (Misc Destination) «SmartCallback» и присвоить ей вызов подпрограммы «661234»
• настроить Внутреннюю функцию (Misc Application) «NoSmartCallback», присвоив ей номер «601234», чтобы переключать на нее вызовы, не обработанные функцией «SmartCallback»
• настроить в правилах входящей связи (Inbound Routes) вызов Собственной функции (Misc Destination) «SmartCallback»

Настройка подпрограммы (контекста) SmartCallback

Собственные функции можно писать разными способами:
• в синтаксисе настраиваемого плана набора (файл «extensions_custom.conf»)
• на языке AEL (Asterisk Extension Language) (файл «extensions.ael»)
• на PHP или на другом языке, используя функцию AGI (Asterisk Gateway Interface)
Наша задача легко решается использованием файла «extensions_custom.conf». Для редактирования требуется открыть меню PBX / Tools / Asterisk File Editor:

 

 

открыть для редактирования «extensions_custom.conf» и добавить в него подпрограмму (контекст) [SmartCallback] с номером «661234»:
[SmartCallback]
exten => 661234,1,SET(CALL2B=${ODBC_LASTCALL(${CALLERID(number)})})
exten => 661234,n,Set(DIAL=${DB(DEVICE/${CALL2B}/dial)})
exten => 661234,n,GotoIf($["${DIAL}" = ""]?nfound)
exten => 661234,n,Set(CDR(accountcode)=B:${CDR(accountcode)})
exten => 661234,n,DIAL(${DIAL},12,)
exten => 661234,n,GotoIf($["s${DIALSTATUS}" = "sANSWER"]?endcon)
exten => 661234,n(nfound),Goto(601234,1)
exten => 661234,n(endcon),Hangup()

 

[ext-did-custom]
include => SmartCallback
Наша функция:
• вызывает еще не созданный нами запрос к статистике вызовов под названием «LASTCALL» (запросу передаем номер звонящего – «CALLERID(number)»)
• находит как следует сделать набор абонента, который вызывал звонящего последним
• добавляет к полю «accountcode» префикс «B:», чтобы в статистике сохранилась информация, что вызов был переключен на сотрудника нашей подпрограммой «SmartCallback»
• пытается в течение 12 секунд вызвать найденного абонента
• если абонент не найден или не ответил, переключает на еще не созданный номер «601234»

Создание запроса к CDR

Описания запросов хранятся в файле «func_odbc.conf», который по аналогии открываем через меню PBX / Tools / Asterisk File Editor и добавляем следующий текст:
[LASTCALL]
dsn=getcdr
readsql=SELECT src FROM cdr WHERE calldate > CURDATE() – 2 AND RIGHT(dst,10) = RIGHT('${SQL_ESC(${ARG1})}',10) ORDER BY calldate DESC LIMIT 0,1
Здесь «getcdr» – название еще не созданного источника данных, ARG1 – номер звонящего абонента. Чтобы учесть разные способы набора номера, используем последние 10 цифр от номера абонента («RIGHT(…,10)»). Поскольку в статистике могут храниться очень старые вызовы, ограничиваем поиск последними двумя днями («CURDATE() – 2»). Сортируем историю вызовов от последнего звонка к более старым («ORDER BY calldate DESC») и возвращаем первую из найденных записей («LIMIT 0,1»).

Настройка источника данных в Asterisk

Описание подключений к ресурсам баз данных Asterisk хранит в файле «res_odbc.conf». В этот файл следует добавить следующие строки:
[getcdr]
enabled => yes
dsn => asterisk-getcdr
pre-connect => yes
isolation => read_uncommitted
Таким образом мы сообщаем Asterisk, что:
• источник активен и может быть использован («enabled => yes»)
• в операционной системе следует найти подключение с именем «asterisk-getcdr»
• для ускорения доступа следует всегда держать открытым соединение с базой данных («pre-connect => yes»)
• для исключения блокировок и для ускорения доступа следует читать данные из базы не дожидаясь завершения других транзакций («isolation => read_uncommitted»)

Настройка источника данных в CentOS

Описание подключений к ресурсам баз данных CentOS, на которой работает Elastix, хранит в файле «/etc/odbc.ini». Для редактирования этого файла требуется подключиться к Elastix по протоколу SSH от имени пользователя «root». В Windows для этого можно использовать бесплатную программу Putty. После подключения к Elastix по SSH следует открыть файл «/etc/odbc.ini», используя, например, редактор «nano»:
nano /etc/odbc.ini

 

В этот файл следует добавить следующие строки:
[asterisk-getcdr]
Description=MySQL ODBC Driver for CDR DB
Driver=MySQL
Server=localhost
User=asteriskuser
Password=VeryStrongPassword
Database=asteriskcdrdb
Option=3
Port=3306
Вместо «VeryStrongPassword» укажите созданный при установке Elastix пароль подключения к базе данных mySQL. Если уже не помните его, подсмотрите его в файле «/etc/amportal.conf» в строке «AMPDBPPASS=».

Настройка Собственной функции (Misc Destination) «SmartCallback»

Чтобы использовать созданную подпрограмму «SmartCallback» требуется настроить Собственную функцию (Misc Destination) «SmartCallback»:
• открыть меню «PBX / Misc Destinations»
• добавить ссылку на подпрограмму:
• Destination – удобное для администратора Elastix название функции, можно назвать как и подпрограмму – «SmartCallback»
• Dial – номер «661234», присвоенный подпрограмме «SmartCallback»

 

Настройка Внутренней функции (Misc Application) «NoSmartCallback»

Чтобы при невозможности обнаружить абонента для соединения можно было направить звонок по другому направлению, необходимо создать функцию, имеющую цифровой код, чтобы ее было легко вызвать из подпрограммы «SmartCallback». Для этого следует:
• открыть меню «PBX / Misc Applications»
• присвоить функции цифровой номер:
• Description – удобное для администратора Elastix название функции, можно назвать как «NoSmartCallback»
• Feature Code – цифровой номер «601234», который может быть вызван из подпрограммы «SmartCallback»
• Destination – направление, куда будет направлен вызов

 

Настройка правила входящей связи для «SmartCallback»

Чтобы Elastix могла соединить звонящего с абонентом, который вызывал его последним, необходимо настроить с правилах входящей связи (Inbound Routes) вызов Собственной функции (Misc Destination) «SmartCallback»:

 

 

Проделайте аналогичные изменения во всех правилах входящей связи, в которых необходимо использование функции «SmartCallabck», и примените сделанные в Elastix изменения, нажав сверху ссылку «Apply Configuration Changes Here».

 

Попробуйте позвонить с офисного телефона на свой мобильный, не снимайте трубку на мобильном, затем перезвоните с мобильного на пропущенный вызов. Elastix сразу же соединит вызов с тем телефоном, с которого Вы звонили на свой мобильный. Если что-то не сработало, проверьте работу функции ODBC_LASTCALL (описано дальше). Если функция ODBC_LASTCALL работает исправно, варианты следующие:
• для номера, на который Вы звоните с мобильного, не настроено правило входящей связи
• номер вашего мобильного номера не передается в Elastix оператором связи (проверьте историю звонков в меню «Reports / CDR Report»)

Проверка функции ODBC_LASTCALL

После проделанных выше изменений в Elastix можно проверить работу функции LASTCALL:
• перезагрузите настройки Asterisk:
• откройте меню «PBX / Tools»
• наберите команду «core reload», чтобы применить сделанные изменения

 

 

• выполните поиск абонента, который последним звонил из офиса, например, по номеру «74999686408», выполнив команду «odbc read ODBC_LASTCALL 74999686408 exec»:

 

 

Если запрос вернул желаемый результат, когда из города позвонят с номера «74999686408», станция сможет его соединить с абонентом «7724».
Назад: Сохранение в CDR рекламного номера
Дальше: Подключение Elastix к глобальным телекоммуникационным сетям