Comments 41
В последнее время на хабре стало больше публикаций о Voip телефонии, это радует. +
Кто бы осветил другие решения, на Freeswitch, или Yate? Мне кажется что для програмиста со стажем намного больше подходит Freeswitch.
Кто бы осветил другие решения, на Freeswitch, или Yate? Мне кажется что для програмиста со стажем намного больше подходит Freeswitch.
+1
AEL радует только в процессе написания диалплана. Желательно простого и наглядного.
Как-то раз мы делали виртуальную АТС, где вся бизнес-логика была в mySQL базе. Пиры через RealTime, а вот диалплан вначале сделали на AEL. Логика обработки звонка в AEL.
Функция MySQL query, которая напрямую из диалплана лезет в базу, смотрит всякие там установки юзера типа call forward, dial timeout, etc. Так вот, получился такой не слабый диалплан на сотни строк (завтра прийду на работу, поищу).
Отладка такого диалплана — кошмар! Так как этот красивый код превращается во внутренний extension.conf! В общем, это надо видеть.
Как-то раз мы делали виртуальную АТС, где вся бизнес-логика была в mySQL базе. Пиры через RealTime, а вот диалплан вначале сделали на AEL. Логика обработки звонка в AEL.
Функция MySQL query, которая напрямую из диалплана лезет в базу, смотрит всякие там установки юзера типа call forward, dial timeout, etc. Так вот, получился такой не слабый диалплан на сотни строк (завтра прийду на работу, поищу).
Отладка такого диалплана — кошмар! Так как этот красивый код превращается во внутренний extension.conf! В общем, это надо видеть.
+1
Последнее мое увлечение — pbx_lua, но это было год назад, и я не успел на нем хоть что-то реализовать :-)
0
Пример диалплана на LUA — pastebin.com/vzWLMewH
+1
Действительно, гораздо читабельнее ael! Буду пробовать!
0
Автор, спасибо тебе! Я снова загорелся Asterisk GUI для embedded устройств — asteriskblog.ru/2011/07/5/asterisk-gui-dlya-embedded-ustrojstv/ :-)
+2
а оно тоже в обычный формат компилируется?
0
Было бы очень интересно посмотреть. Пиры у меня тоже realtime, а вот логика вся в ael. Несколько раз в голову приходила идея закинуть всю логику в mysql и нарисовать веб-морду к этому делу, чтобы менеджеры могли сами клиентские запросы решать, но со временем пришло понимание что запросы у клиентов часто специфические, и далеко не всегда эти вопросы можно будет решить без меня и смысл в затее теряется…
0
Мы делали IVR для сдачи показаний счетчиков, где нужно было в цикле делать SOAP запрос для каждого счетчика в квартире и в зависимости от результатов по-разному действовать и воспроизводить различные звуки…
\me рвет волосы на разных частях тела
Почему мы не знали тогда про ael! 50 строчек, а, кажется, проще было бы * переписать.
\me рвет волосы на разных частях тела
Почему мы не знали тогда про ael! 50 строчек, а, кажется, проще было бы * переписать.
0
И ведь самое главное — синтаксис практически тот же, только нагляднее и с новыми вкусными плюшками :).
0
А уж в случае с дерганием SOAP тем более надо было выносить обработку логики из extensions. В AGI например :-)
+1
Это точно, особенно учитывая то, что agi можно писать на любом удобном языке — не думаю что у кого-либо возникнут проблемы с освоением.
0
И это правильно. Просто скрипт разрастался постепенно в соответствии с ростом аппетитов заказчика. А с госзаказчиком в плане ТЗ спорить тяжело. Когда мы осознали что в диалплане больше кода чем в скриптах, которые он дергает, было уже поздно.
0
exten=>1,1,ExecIf($[${var}=foo]?Noop(true):Noop(false)) — не то?
0
Для одной команды в условии — то, только в реальной жизни команд обычно больше.
0
В реальной жизни достают именно GotoIf из за единственной команды :) Если их больше — GotoIf уже выглядит приемлемо. А ExecIf + GoSub вообще все решает.
Подтолкнуло взяться за статью «dialplan tricks».
Подтолкнуло взяться за статью «dialplan tricks».
0
Может это действительно субъективно, но мне кажется читаемость никакая. Посмотрите пример на LUA, который скинул litnimax: там уже вообще все походит на нормальный высокоуровневый ЯП.
0
Согласен, чтобы читать надо иметь определенный skill. Но у AEL все же есть проблемы с дебагом. Если уж хочется ЯП в телефонии — вооружайтесь FastAGI, прям на php или python можно писать.
0
Мне кажется AGI больше подходит для внешнего функционала — письма там отправлять или еще что подобное… У ael нет проблем с дебагом: дебажить все равно dialplan. Не будем спорить — как написано в топе, удобство и читаемость субъективны, и мое мнение, что ael удобнее, я знал что не для всех.
0
Я бы воздержался от использования AGI и не использовал бы его для обработки _всех_ звонков на астериске — проблемы со стабильностью у него были и, судя по всему, до сих пор есть — вот буквально только что словил с AGI дедлок на 1.6.0.26 (не припомню, когда с этой версией вообще проблемы были).
0
Если окажется полезным при написании статьи про триксы — вот пример нашего скрипта. По всей видимости, сплошной антипаттерн. Специально ничего не приукрашивал — как есть.
Буду благодарен, если ляпы укажете. Все вызываемые скрипты — коротулечки на Ruby+savon которые дергают большой сервер по SOAP.
Буду благодарен, если ляпы укажете. Все вызываемые скрипты — коротулечки на 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)
0
ух ты, в тему. спасибо
0
Существует ли конвертилка из обычного в AEL?
А то вот у меня более-менее сложный dialplan, который со временем разросся и расширился, добавился новый функционал, много условий, очередей и так далее.
И всё это на старом добром.
Ещё вопрос — как всю эту красоты отлаживать?
Меня в своё время смутило именно это.
А то вот у меня более-менее сложный dialplan, который со временем разросся и расширился, добавился новый функционал, много условий, очередей и так далее.
И всё это на старом добром.
Ещё вопрос — как всю эту красоты отлаживать?
Меня в своё время смутило именно это.
0
А выводить в лог консоли всёже уместнее Verbose(0, блабла) :)
+1
Большое спасибо за статью — действительно полезная информация. Удобочитаемость в разы лучше с AEL.
0
Sign up to leave a comment.
AEL в asterisk