Talen en automaten/2011-12/producten/Asterisk
Asterisk
Gerdriaan Mulder, Bas de Leeuw
Talen en automaten 2011-12
13:40 A |
Inhoud
Beschrijving
Asterisk is een open-source VoIP-platform. Het wordt wereldwijd gebruikt door zowel kleine als grote bedrijven voor telefonie-oplossingen. Het bestaat uit verschillende modulaire bouwstenen (vergelijkbaar met Lego) die samen, bijvoorbeeld, een telefoniecentrale, interactive voice response of ander communicatiemiddel kunnen vormen.
In deze case study wordt gekeken naar een van deze bouwstenen: het dial plan. Dit kan op verschillende manieren worden gebruikt. Bij een inkomende call kan, bijvoorbeeld, een script worden afgewerkt, de call doorgeschakeld worden of een voicemailsysteem worden geactiveerd.
Voorbeeld 1
[user] exten => 500,1,Progress() exten => 500,n,Wait(1) exten => 500,n,Playback(WeAreClosedGoAway,noanswer) exten => 500,n,Hangup()
Uitleg
Op de eerste regel staat de zgn. context. Een dial plan kan meerdere contexts hebben, deze hoeven niet in een bepaalde volgorde te staan. De naam van de context is niet vooraf gedefinieerd en mag dus vanalles zijn (een aantal namen is gereserveerd voor speciale configuratie). Het is wel vereist dat deze binnen blokhaken staat.
De regels die daarna volgen zijn de extensies. Elke extensie heeft een nummer, een prioriteit en een applicatie met eventueel een aantal parameters.
Voorbeeld 2
[mainmenu] exten => s,1,Answer exten => s,n,Background(thanks) ; "Thanks for calling press 1 for sales, 2 for support, ..." exten => s,n,WaitExten exten => 1,1,Goto(submenu,s,1) exten => 2,1,Hangup
[submenu] exten => s,1,Ringing ; Make them comfortable with 2 seconds of ringback exten => s,n,Wait,2 exten => s,n,Background(submenuopts) ; "Thanks for calling the sales ;department. Press 1 for steve, 2 for..." exten => s,n,WaitExten exten => 1,1,Goto(default,steve,1) exten => 2,1,Goto(default,mark,2)
Regulier?
Asterisk is niet regulier. Dit valt te bewijzen door aan te nemen dat Asterisk wél regulier is en vervolgens door het pomplemma toe te passen bewijzen dat dat tot een contradictie leidt. Neem aan dat Asterisk wél regulier is. Dan moet er een getal n zijn waarvoor geldt dat elk woord langer dan n tekens kan worden gesplitst in gedeeltes u, v en w, waarbij de volgende regels gelden:
Parsen mislukt (MathML met SVG- of PNG-terugval (aanbevolen voor moderne browsers en toegankelijkheidshulpmiddelen): Ongeldig antwoord ("Math extension cannot connect to Restbase.") van server "https://en.wikipedia.org/api/rest_v1/":): {\displaystyle |uv|\leq n}
Parsen mislukt (MathML met SVG- of PNG-terugval (aanbevolen voor moderne browsers en toegankelijkheidshulpmiddelen): Ongeldig antwoord ("Math extension cannot connect to Restbase.") van server "https://en.wikipedia.org/api/rest_v1/":): {\displaystyle v\neq0}
Parsen mislukt (MathML met SVG- of PNG-terugval (aanbevolen voor moderne browsers en toegankelijkheidshulpmiddelen): Ongeldig antwoord ("Math extension cannot connect to Restbase.") van server "https://en.wikipedia.org/api/rest_v1/":): {\displaystyle \forall k \in N | uv^kw \in L} waarbij L Asterisk voorstelt.
Binnen elke context moeten de priority numbers voor elk id elkaar opvolgen. Gesimplificeerd kan een context dan als volgt worden beschreven:
e= "exten => *id*," waarbij *id* het id is waarbinnen de priority numbers moeten oplopen.
p= het priority number.
b= ",*command*" waarbij *command* het uit te voeren commando is.
De beschrijving van de taal wordt dan:
{Parsen mislukt (MathML met SVG- of PNG-terugval (aanbevolen voor moderne browsers en toegankelijkheidshulpmiddelen): Ongeldig antwoord ("Math extension cannot connect to Restbase.") van server "https://en.wikipedia.org/api/rest_v1/":): {\displaystyle (epb)^k} | per waarde van e loopt de waarde van p op}
Dit schrijven we als volgt om in de uvw-notatie die voor het pomplemma wordt gebruikt:
Parsen mislukt (MathML met SVG- of PNG-terugval (aanbevolen voor moderne browsers en toegankelijkheidshulpmiddelen): Ongeldig antwoord ("Math extension cannot connect to Restbase.") van server "https://en.wikipedia.org/api/rest_v1/":): {\displaystyle u=\emptyset}
Parsen mislukt (MathML met SVG- of PNG-terugval (aanbevolen voor moderne browsers en toegankelijkheidshulpmiddelen): Ongeldig antwoord ("Math extension cannot connect to Restbase.") van server "https://en.wikipedia.org/api/rest_v1/":): {\displaystyle v=(epb)^k}
Parsen mislukt (MathML met SVG- of PNG-terugval (aanbevolen voor moderne browsers en toegankelijkheidshulpmiddelen): Ongeldig antwoord ("Math extension cannot connect to Restbase.") van server "https://en.wikipedia.org/api/rest_v1/":): {\displaystyle w=\emptyset}
Gezien er maar één element is, en y niet leeg mag zijn, moet dit dus in y komen.
Hierbij moet v gepompt kunnen worden.
Dit is echter niet mogelijk, dezelfde waarde van p dan vaker per waarde van e voor zou komen.
Dit weerspreekt de stelling dat Asterisk regulier is, en dus is bewezen dat Asterisk een niet-reguliere taal is.
Contextvrij?
Om aan te tonen dat het dialplan van Asterisk een contextvrije taal is, hebben we een contextvrije grammatica voor deze taal opgesteld:
Dialplan :: Section+. Section :: "[" Name "]", Exten+ Exten :: ExtenStr, [ExactNumber,Pattern], ",", "1", ",", Application, [NextExten, SameExten, Exten] NextExten :: ExtenStr, [ExactNumber,Pattern], ",", Priority, ",", Application, [NextExten, SameExten, Exten] SameExten :: ExtenStrSame, Priority, ",", Application,. [SameExten, Exten] Application :: Name, "(", [Parameters,Parameter], ")" Parameters :: (Parameter ",")*, Parameter Parameter :: String ExactNumber :: {0..9}+ Pattern :: "_", [{0..9}+,X,N,Z]+ Priority :: {2..} | "n" ExtenStr :: "exten => " ExtenStrSame :: "same => " Name :: String
De grammatica bevat een aantal elementen die uitleg behoeven.
- [a,b,c]: op deze plek kan ofwel a, ofwel b, ofwel c ingevuld worden
- [a,b,c]+: analoog aan bovenstaand, met de uitbreiding dat dit 1 of meer keer gebeuren kan
- "string": exact string komt voor in de taal
- a, b, ",", c: De komma zonder aanhalingstekens is een scheiding van elementen uit de taal. "," is letterlijk de komma (zie ook bovenstaand)
- (Parameter ",")*: de samenstelling van Parameter en de letterlijke komma kunnen nul of meer keer voorkomen.
- {0..9}: de verzameling van cijfers van 0 tot en met 9 inclusief
- {2..}: de verzameling van getallen vanaf 2