Crmgo Blog

AEL in Asterisk

AEL in Asterisk

Im normalen Format sieht es so aus: ; Und so würde derselbe Kontext im ael-Syntax aussehen: Die Unterschiede sind also offensichtlich. Für mich ist einer der Hauptvorteile von ael die gute Lesbarkeit der Konfigurationsdatei: Selbst an diesem kleinen abstrakten Beispiel ist deutlich zu erkennen, dass man sie lesen und verstehen kann…

AEL in Asterisk

im normalen Format:
;

[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

So sieht derselbe Kontext in der ael-Syntax aus:

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


Die Unterschiede liegen also auf der Hand. Für mich ist einer der Hauptvorteile von ael die gute Lesbarkeit der Konfigurationsdatei: Selbst an diesem kleinen abstrakten Beispiel ist deutlich zu erkennen, dass die Konfiguration einfacher zu lesen und zu verstehen ist. Ich gebe zwar zu, dass dies subjektiv ist. Das zweite, was sofort ins Auge fällt, ist das Fehlen von Prioritäten (s,n im obigen Code; wie in den Kommentaren angemerkt, sind Prioritäten dort jedoch ebenfalls nicht zwingend erforderlich) in der Beschreibung des Dialplans.
Warum gibt es sie nicht? Oder vielmehr: Warum gibt es sie in der Beschreibung des herkömmlichen Dialplans?
Wenn Sie sich bisher noch nicht mit Asterisk und seinem herkömmlichen Dialplan beschäftigt haben, werden Sie überrascht sein zu erfahren, dass dieser weder Schleifen noch Bedingungen unterstützt. Es gibt lediglich bedingte Sprünge (gotoif), mit denen sich theoretisch sogar Schleifen realisieren lassen, wobei die Praktikabilität dieses Ansatzes jedoch stark in Frage steht. Stellen wir uns nun den einfachsten ael-Code vor, der in der Asterisk-Konsole true oder false ausgibt:

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

In der herkömmlichen Form würde diese Bedingung wie folgt aussehen:

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),...

Nicht nur, dass wir dabei die „Lesbarkeit“ verlieren, wir sind auch gezwungen, überall statisch Prioritäten zu vergeben (was zu einem absolut nicht erweiterbaren Code führt) oder bei jeder Gelegenheit Labels zu definieren. Ja, in ael gibt es ebenfalls Labels, doch deren Notwendigkeit entfällt praktisch, da die Syntax es ermöglicht, auf goto als solches zu verzichten.

s=> {
	Answer;
	somelabel:
		HangUp;
}

Neben den üblichen Bedingungen (if/else) können Sie in ael auch den switch-Operator mit der vertrauten Syntax verwenden:

 _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!);
         };

Hinweis: Dieser Beitrag kann KI-unterstützt erstellt und anschließend redaktionell geprüft worden sein. Verantwortlich: Dmytro Lomaka, Kaltenkirchen.