Crmgo Блог

AEL в asterisk

AEL в asterisk

в обычном формате: ; А вот так этот же контекст будет выглядеть в синтаксисе ael: Итак, различия налицо. Для меня одним из главных плюсов ael является удобство чтения конфига: даже на этом маленьком абстрактном примере видно, что читать и понимать…

AEL в asterisk

в обычном формате:
;

[internal]
exten => s,1,Answer
exten => s,n,Background(someivr)
exten => s,n,Read(intgroup,,3)
exten => s,n,Goto(${intgroup},1)
exten => XXX,1,Dial(SIP/${EXTEN})
exten => XXX,n,HangUp

А вот так этот же контекст будет выглядеть в синтаксисе ael:

context internal {
	s=> {
		Answer;
		Background(someivr);
		Read(intgroup,,3);
		Goto(${intgroup},1);
	}
	XXX => {
		Dial(SIP/${EXTEN});
		HangUp;
	}
}


Итак, различия налицо. Для меня одним из главных плюсов ael является удобство чтения конфига: даже на этом маленьком абстрактном примере видно, что читать и понимать конфиг проще. Хотя, допускаю, что это субъективно. Второе что сразу бросается в глаза — это отсутствие приоритета (s,n в коде выше, правда, как заметили в комментариях, приоритет и там уже не обязателен) в описании dialplan'a.
Почему их нет? Вернее, почему они есть в описании обычного dialplan'a?
Если вы не имели до этого дела с астериском и с его обычным dialplan'ом, то вы будете удивлены, узнав что в нем нет ни циклов, ни условий. Есть только лишь условный переход (gotoif), с помощью которого, в принципе, можно организовать даже циклы, но удобство этого подхода весьма сомнительно. Давайте представим себе простейший ael код, который будет выводить в консоль астериска true или false:

if(${var}=foo) {
	NoOp(true);
}
else {
	NoOp(false);
}

В обычном виде это условие будет выглядеть так:

exten=>1,1,GotoIf($[${var}=foo]?label1:label2)
exten=>1,n(label1),NoOp(true)
exten=>1,n,Goto(end_of_if)
exten=>1,n(label2),NoOp(false)
exten=>1,n(end_of_if),...

Мало того, что мы потеряли «читаемость», так еще и вынуждены либо статически прописывать везде приоритеты (и получить абсолютно нерасширяемый код), либо придумывать метки на каждый чих. Да, в ael тоже есть метки, только надобность в них практически пропадает, так как синтаксис позволяет уйти от goto как такового.

s=> {
	Answer;
	somelabel:
		HangUp;
}

Кроме непосредственно условий (if/else) в ael вы можете использовать и оператор switch с привычным синтаксисом:

 _777X => {
         switch (${EXTEN}) {
              pattern N11:
                   NoOp(You called a N11 number-- ${EXTEN});
                   break;
              case 7771:
                   NoOp(You called 7771!);
                   break;
              case 7772:
                   NoOp(You called 7772!);
                   break;
              case 7773:
                   NoOp(You called 7773!);
                   // fall thru-
              default:
                   NoOp(In the default clause!);
         };

Примечание: материал мог быть создан с помощью ИИ и затем отредактирован человеком. Ответственный: Dmytro Lomaka, Kaltenkirchen.