Pull to refresh

Comments 41

В последнее время на хабре стало больше публикаций о Voip телефонии, это радует. +

Кто бы осветил другие решения, на Freeswitch, или Yate? Мне кажется что для програмиста со стажем намного больше подходит Freeswitch.
FreeSWITCH очень специфичное решение. Это еще более телефонный движок, чем Asterisk. Not user friendly. Хотя более надежное и архитектурно правильное решение.
>Not user friendly

Да ну? Что это там такого не friendly?
Тот же диалплан гораздо понятнее чем на *.
Вы робот? :-)
С каких пор XML конфиги юзабильнее конфига в формате [section] / [option]?
AEL радует только в процессе написания диалплана. Желательно простого и наглядного.

Как-то раз мы делали виртуальную АТС, где вся бизнес-логика была в mySQL базе. Пиры через RealTime, а вот диалплан вначале сделали на AEL. Логика обработки звонка в AEL.

Функция MySQL query, которая напрямую из диалплана лезет в базу, смотрит всякие там установки юзера типа call forward, dial timeout, etc. Так вот, получился такой не слабый диалплан на сотни строк (завтра прийду на работу, поищу).

Отладка такого диалплана — кошмар! Так как этот красивый код превращается во внутренний extension.conf! В общем, это надо видеть.
Последнее мое увлечение — pbx_lua, но это было год назад, и я не успел на нем хоть что-то реализовать :-)
Действительно, гораздо читабельнее ael! Буду пробовать!
а оно тоже в обычный формат компилируется?
Нет, Lua исполняется прямо в ядре. В консоли Asterisk вы увидите просто исполняемые команды. А в dialplan show будет пусто.
а дебужится как?
Ну как в обычном языке программирования :-)
app.dial
print «This is after dial»
app.hangup
Было бы очень интересно посмотреть. Пиры у меня тоже realtime, а вот логика вся в ael. Несколько раз в голову приходила идея закинуть всю логику в mysql и нарисовать веб-морду к этому делу, чтобы менеджеры могли сами клиентские запросы решать, но со временем пришло понимание что запросы у клиентов часто специфические, и далеко не всегда эти вопросы можно будет решить без меня и смысл в затее теряется…
Найду завтра на работе и покажу свой ael. Попробуйте pbx_lua, мне интересно, что у Вас получится ;-)
а как в рилтайм AEL засунуть?
Мне кажется, только через res_config, при помощи которого любой .conf файл помещается в базу.
ну, не любой, а в «обычном», построчном формате.
тоесть уже оттранслированный AEL.
слабо представляю как это можно сделать.
Мы делали IVR для сдачи показаний счетчиков, где нужно было в цикле делать SOAP запрос для каждого счетчика в квартире и в зависимости от результатов по-разному действовать и воспроизводить различные звуки…

\me рвет волосы на разных частях тела

Почему мы не знали тогда про ael! 50 строчек, а, кажется, проще было бы * переписать.
И ведь самое главное — синтаксис практически тот же, только нагляднее и с новыми вкусными плюшками :).
А уж в случае с дерганием SOAP тем более надо было выносить обработку логики из extensions. В AGI например :-)
Это точно, особенно учитывая то, что agi можно писать на любом удобном языке — не думаю что у кого-либо возникнут проблемы с освоением.
И это правильно. Просто скрипт разрастался постепенно в соответствии с ростом аппетитов заказчика. А с госзаказчиком в плане ТЗ спорить тяжело. Когда мы осознали что в диалплане больше кода чем в скриптах, которые он дергает, было уже поздно.
exten=>1,1,ExecIf($[${var}=foo]?Noop(true):Noop(false)) — не то?
Для одной команды в условии — то, только в реальной жизни команд обычно больше.
В реальной жизни достают именно GotoIf из за единственной команды :) Если их больше — GotoIf уже выглядит приемлемо. А ExecIf + GoSub вообще все решает.

Подтолкнуло взяться за статью «dialplan tricks».

Может это действительно субъективно, но мне кажется читаемость никакая. Посмотрите пример на LUA, который скинул litnimax: там уже вообще все походит на нормальный высокоуровневый ЯП.
Согласен, чтобы читать надо иметь определенный skill. Но у AEL все же есть проблемы с дебагом. Если уж хочется ЯП в телефонии — вооружайтесь FastAGI, прям на php или python можно писать.
Мне кажется AGI больше подходит для внешнего функционала — письма там отправлять или еще что подобное… У ael нет проблем с дебагом: дебажить все равно dialplan. Не будем спорить — как написано в топе, удобство и читаемость субъективны, и мое мнение, что ael удобнее, я знал что не для всех.
Я бы воздержался от использования AGI и не использовал бы его для обработки _всех_ звонков на астериске — проблемы со стабильностью у него были и, судя по всему, до сих пор есть — вот буквально только что словил с AGI дедлок на 1.6.0.26 (не припомню, когда с этой версией вообще проблемы были).

Относительно стабильности AGI согласен. Я рекомендовал FastAGI, т.к. по моему опыту его можно использовать на массовых, промышленных объемах.
Если окажется полезным при написании статьи про триксы — вот пример нашего скрипта. По всей видимости, сплошной антипаттерн. Специально ничего не приукрашивал — как есть.

Буду благодарен, если ляпы укажете. Все вызываемые скрипты — коротулечки на Ruby+savon которые дергают большой сервер по SOAP.

[test_meters]
exten => 333330,1,Background(14)
exten => 333330,2,WaitExten(1)
exten => *,1,GotoIf($["${phase2}" = "1"]?test_meters,333330,say_next_number:test_meters,333330,4)
exten => 333330,3,Set(numTries=0)
exten => 333330,4,Playback(15)
exten => 333330,5(auth),Read(account,,10,,1,60)
exten => 333330,n,System(/var/lib/asterisk/saracen/needed_digits.rb ${account} >> /tmp/needed.log 2>&1)
exten => 333330,n,Set(needed_digits=${SHELL(/var/lib/asterisk/saracen/needed_digits.rb ${account})})
exten => 333330,n,GotoIf($["${needed_digits}" = ""]?bad_try)

exten => 333330,n(next_meter),Set(next_meter_number=${SHELL(/var/lib/asterisk/saracen/next_line.rb ${account})})
exten => 333330,n,Set(next_number=${SHELL(/var/lib/asterisk/saracen/next_counter.rb ${account})})
exten => 333330,n,GotoIf($["${next_number}" = "all"]?all)
exten => 333330,n,GotoIf($["${next_number}" = "night"]?night)
exten => 333330,n,GotoIf($["${next_number}" = "day"]?day)
exten => 333330,n(normal),Playback(18)
exten => 333330,n(say_next_number),SayDigits(${next_number})
exten => 333330,n,Goto(input_data)

exten => 333330,n(night),Playback(25)
exten => 333330,n,Set(next_number=${SHELL(/var/lib/asterisk/saracen/next_counter.rb ${account})})
exten => 333330,n,Goto(say_next_number)

exten => 333330,n(day),Playback(24)
exten => 333330,n,Set(next_number=${SHELL(/var/lib/asterisk/saracen/next_counter.rb ${account})})
exten => 333330,n,Goto(say_next_number)

exten => 333330,n(input_data),Read(device_data,,5,,1,60)
exten => 333330,n,Playback(20)
exten => 333330,n,SayDigits(${device_data})
exten => 333330,n,Set(phase2=1)
exten => 333330,n,Background(19)
exten => 333330,n,WaitExten(4)
exten => #,1,Goto(test_meters,333330,submit_data)

;exten => 333330,30(submit_data),System(/var/lib/asterisk/saracen/submit_data.rb ${account} "${next_meter_number}" ${device_data})
exten => 333330,30(submit_data),Set(submit_result=${SHELL(/var/lib/asterisk/saracen/submit_data.rb ${account} "${next_meter_number}" ${device_data})})
exten => 333330,n,GotoIf($["${submit_result}" = "ok"]?submit_success:submit_failure)

exten => 333330,n(submit_success),Playback(22)
exten => 333330,n,Goto(next_meter)

exten => 333330,n(submit_failure), Playback(23)
exten => 333330,n,Goto(hangup)
Существует ли конвертилка из обычного в AEL?

А то вот у меня более-менее сложный dialplan, который со временем разросся и расширился, добавился новый функционал, много условий, очередей и так далее.
И всё это на старом добром.

Ещё вопрос — как всю эту красоты отлаживать?
Меня в своё время смутило именно это.

>>Существует ли конвертилка из обычного в AEL?
Насколько знаю, нет.

Повторюсь, что ael все равно преобразуется в обычный формат, функции и команды в dial plan'е и ael те же — поэтому процесс отлаживания такой же, отличается лишь процесс написания.
процесс отлаживания хоть и такойже, только отлаживается то уже оттранслированный AEL, в котором все прелести наглядности херятся нафик.
Все прелести наглядности — это осмысленные метки? При использовании ael вы с легкостью откажетесь от меток и отлаживать эту часть не понадобится.
А выводить в лог консоли всёже уместнее Verbose(0, блабла) :)
Большое спасибо за статью — действительно полезная информация. Удобочитаемость в разы лучше с AEL.
> А теперь представьте себе, что у вас более-менее сложный dialplan, который со временем будет расти и расширяться, будет добавляться новый функционал.
Вы прям как в воду глядите!
Sign up to leave a comment.

Articles