Возможности программирования Elastix практически безграничны. Можно создавать собственные алгоритмы обработки вызовов, использующие обращения к базам данных, к веб-страницам, к внешним программам на PHP и на других языках. Разработчиками Elastix приветствуется написание бесплатных и коммерческих модулей (Addons), после сертификации доступных другим пользователям платформы.
Примеры этой главы описывают как простейшие примеры создания собственных алгоритмов обработки вызовов на примере добавления функции автодозвона, так и более сложные изменения, использующие базу данных вызовов (CDR) для снижения нагрузки на секретарей.
Доступ к Очередям и Группам звонков при входящих звонках из города
По умолчанию номера, присвоенные Очередям (Queues) и Группам звонков (Ring Groups) не доступны извне. Абонент, позвонивший из города, не сможет в IVR набрать номер Очереди или Группы звонков и соединиться с ней. Можно для каждой Очереди и Группы звонков создать Виртуальные номера (Virtual Extension), но это непрактично – придется не только поддерживать записи в актуальном состоянии, но и помнить разные номера для звонков из города и с офисного телефона. Это недоразумение легко исправить:
• открыть меню PBX / Tools / Asterisk File Editor
• открыть файл extensions_custom.conf
• добавить три строки
[from-did-direct-ivr-custom]
include => ext-queues
include => ext-group
• сохранить изменения, нажав кнопку Save
• применить настройки, нажав кнопку Reload Asterisk
Определить, что добавить эти строки нужно именно в [from-did-direct-ivr-custom], можно просмотрев файл extensions_additional.conf, создаваемый Elastix после изменения настроек системы – номера всех созданных телефонов прописываются в контексте [from-did-direct-ivr], который включает в себя контекст [from-did-direct-ivr-custom]:
Настройка функции Автодозвона
Следует иметь в виду, что автоматический дозвон до занятого/не доступного абонента создает повышенную нагрузку как на вашу станцию Elastix, так и на сети провайдеров связи (если вызываемый абонент находится вне Elastix). Лучше всего найти способ известить абонента другими способами о необходимости с ним переговорить. Однако, если собеседник не слишком заинтересован в беседе, сотрудникам может помочь функция автодозвона:
• откройте меню PBX / Tools / Asterisk File Editor
• откройте файл extensions_custom.conf
• добавите строки
[from-internal-custom]
include => autoredial
[autoredial]
exten => _99.,1,Dial(Local/${EXTEN:2}@from-internal,40,tr)
exten => _99.,n,GotoIF($["${DIALSTATUS}" == "ANSWER"]?end)
exten => _99.,n,GotoIF($["${DIALSTATUS}" == "ANSWERED"]?end)
exten => _99.,n,GotoIF($[${CDR(billsec)} >0]?end)
exten => _99.,n,Wait(10)
exten => _99.,n,Goto(${EXTEN},1)
exten => _99.,n(end),Hangup
• сохраните изменения, нажав кнопку Save
• примените настройки, нажав кнопку Reload Asterisk
Теперь ваши сотрудники могут набрать префикс «99» перед требуемым номером, нажать «#» и ждать пока абонент поднимет трубку. Elastix будет бесконечно вызывать абонента, ожидать ответа 40 секунд, при отсутствии ответа или при ошибке соединения ждать 10 секунд и повторять набор.
Например:
• «9984956881001#» – поможет дозвониться до техподдержки 1С
• «994123#» – поможет дозвониться до абонента Elastix 4123, если абонент долго висит на трубке, очень нужен, но лишен других, известных Вам, средств связи
Сохранение в CDR рекламного номера
Оплачивая городские номера полезно знать насколько часто каждый из них используется. По умолчанию Elastix сохраняет информацию о том кто звонил и с кем разговаривал, но информация об использованном для входящей связи номере нигде не сохраняется, хотя зачастую известна системе. Один из способов сохранять эту информацию – создать свою подпрограмму (контекст) для обработки входящих вызовов, заполняя в ней поле accountcode, которое сохраняется в CDR (Call Detail Records – детальная информация о звонках). Сделать это достаточно просто:
• откройте меню PBX / Tools / Asterisk File Editor
• откройте файл extensions_custom.conf
• добавьте строки
[from-trunk-accountcode]
exten => _.,1,Set(CDR(accountcode)=i:${EXTEN})
exten => _.,n,Goto(from-trunk,${EXTEN},1)
exten => h,1,Macro(hangupcall,)
• сохраните изменения, нажав кнопку Save
• откройте каждую Внешнюю линию (Trunk) и укажите «from-trunk-accountcode» в поле «USER Context»
• примените настройки, нажав «Apply Configuration Changes Here»
Теперь в CDR будет сохраняться информация об используемых для входящей связи городских номерах, которые можно увидеть в меню Reports \ CDR Report:
В целях анализа статистики использования городских линий можно выгрузить информацию из CDR в Excel:
Также можно предварительно обработать данные из CDR примерно так:
чтобы выгрузить только по одной записи о каждом входящем звонке, тем самым упростив анализ:
Для подключения к базе CDR указанным выше способом требуется установить phpmyadmin, подключившись по SSH с правами root, выполнить команды:
sudo yum install phpmyadmin
sudo service httpd restart
Подпрограмма соединения звонящего с последним собеседником (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».