Asterisk erster Wählplan
Über den Asterisk-Rufnummernplan kann definiert werden, wie:
- einzelne Nebenstellen erreichbar sein sollen
- welche Applikationen eingebundenwerden sollen
- wie Amtsgespräche über den oder die Netzbetreiber geführt werden sollen
- wie Konferenzen und
- wie der Voicemailserver reagieren soll
- wann Nebenstellen erreichbar sein sollen
- und noch einge Punkte mehr.
Beim Dialplan werden wir uns im ersten Schritt der Konfiguarationsdatei /etc/asterisk/extensions.conf bedienen. In einem späteren Schritt werden wir dann diese Funktion in unsere zentrale MySQL-Datenbank verlagern.
Vorbereitungen
Zu eine der wenigen Konfigurationsdateien, die wir selbst von Grund auf aufbauen wollen, gehört der Wählplan.
Wir sichern also im ersten Schritt die mitgelieferte extensions.conf und extensions.ael, einer weiteren Form der Dialplan-Konfigurationsmöglichkeit.
# mv /etc/asterisk/extensions.conf /etc/asterisk/extensions.conf.orig # mv /etc/asterisk/extensions.ael /etc/asterisk/extensions.ael.orig
1. Anwendung "Ansagen-Demo"
Als erstes legen wir uns nun unsere erste extensions.conf an.
# vim /etc/asterisk/extensions.conf
[general] static=yes writeprotect=no
Mit static und writeprotect legen wir fest, ob der Dialplan über die Asterisk-Konsole aus, manipuliert werden können soll. Somit beschränken wir uns darauf den Wählplan ausschliesslich über die Konfigurationsdatei extension.conf zu pflegen und nach Änderungen dieser Date den Wählplan neu zu laden. Dies geschieht über einen Aufruf von dialplan reload auf der Asterisk-Kommandozeile.
Für den Echotest erweitern wir nun unsere Konfigurationsdatei wie folgt:
[general] static=yes writeprotect=no [ansagen-demo] exten => 601,1,Answer() exten => 601,n,Playback(tt-monkeysintro) exten => 601,n,Playback(tt-monkeys) [default] include => ansagen-demo
Für die einzelnen Beispiele definieren wir einzelne Kontexte, die wir in eckigen Klammern - im obigen Beispiel [ansagen-demo] - definieren. So können wir später einzelne anwendungen leicht (de)aktivieren.
Nach dem Abspeichern unserer Änderungen, verbinden wir uns nun mit der Asterisk-Kommandozeile und laden unseren geänderten Dialplan:
# asterisk -r
Verbosity is at least 3
dialplan reload Dialplan reloaded. == Parsing '/etc/asterisk/extensions.conf': == Found -- Registered extension context 'ansagen-demo'; registrar: pbx_config -- Added extension '601' priority 1 to ansagen-demo -- Added extension '601' priority 2 to ansagen-demo -- Added extension '601' priority 3 to ansagen-demo -- Registered extension context 'default'; registrar: pbx_config -- Including context 'ansagen-demo' in context 'default' == Parsing '/etc/asterisk/users.conf': == Found -- Registered extension context 'app_dial_gosub_virtual_context'; registrar: app_dial -- merging incls/swits/igpats from old(app_dial_gosub_virtual_context) to new(app_dial_gosub_virtual_context) context, registrar = pbx_config -- Added extension 's' priority 1 to app_dial_gosub_virtual_context -- Registered extension context 'parkedcalls'; registrar: features -- merging incls/swits/igpats from old(parkedcalls) to new(parkedcalls) context, registrar = pbx_config -- Added extension '700' priority 1 to parkedcalls -- Registered extension context 'app_queue_gosub_virtual_context'; registrar: app_queue -- merging incls/swits/igpats from old(app_queue_gosub_virtual_context) to new(app_queue_gosub_virtual_context) context, registrar = pbx_config -- Added extension 's' priority 1 to app_queue_gosub_virtual_context -- Time to scan old dialplan and merge leftovers back into the new: 0.000149 sec -- Time to restore hints and swap in new dialplan: 0.000001 sec -- Time to delete the old dialplan: 0.000019 sec -- Total time merge_contexts_delete: 0.000169 sec
Mit dem Befehl dialplan show können wir uns nun unseren geladenen dialplan bei Bedarf nochmals anzeigen lassen.
dialplan show [ Context 'app_queue_gosub_virtual_context' created by 'app_queue' ] 's' => 1. NoOp() [app_queue] [ Context 'parkedcalls' created by 'features' ] '700' => 1. Park() [features] [ Context 'app_dial_gosub_virtual_context' created by 'app_dial' ] 's' => 1. NoOp() [app_dial] [ Context 'default' created by 'pbx_config' ] Include => 'ansagen-demo' [pbx_config] [ Context 'ansagen-demo' created by 'pbx_config' ] '601' => 1. Answer() [pbx_config] 2. Playback(tt-monkeysintro) [pbx_config] 3. Playback(tt-monkeys) [pbx_config] -= 4 extensions (6 priorities) in 5 contexts. =-
Wählen wir nun von einem angemeldeten SIP-Apparat die Rufnummer 601 wird als erstes ein Hinweis und anschließend das Affengeschrei am Endgerät wiedergegeben. Auf der Asterisk-Konsole können wir den Ablauf verfolgen.
== Using SIP RTP CoS mark 5
[Nov 28 20:33:49] ERROR[18353]: chan_sip.c:27876 setup_srtp: No SRTP module loaded, can't setup SRTP session.
-- Executing [601@default:1] Answer("SIP/13-0000000a", "") in new stack
-- Executing [601@default:2] Playback("SIP/13-0000000a", "tt-monkeysintro") in new stack
-- <SIP/13-0000000a> Playing 'tt-monkeysintro.gsm' (language 'de')
[Nov 28 20:33:49] NOTICE[26631]: channel.c:4006 __ast_read: Dropping incompatible voice frame on SIP/13-0000000a of format ulaw since our native format has changed to 0x2 (gsm)
-- Executing [601@default:3] Playback("SIP/13-0000000a", "tt-monkeys") in new stack
-- <SIP/13-0000000a> Playing 'tt-monkeys.gsm' (language 'de')
== Spawn extension (default, 601, 3) exited non-zero on 'SIP/13-0000000a'
2. Anwendung "Echo-Test"
Im nächsten Schritt ergänzen wir nun unseren Dialplan mit folgenden Zeilen:
# vim /etc/asterisk/extensions.conf
[general] static=yes writeprotect=no [ansagen-demo] exten => 601,1,Answer() exten => 601,n,Playback(tt-monkeysintro) exten => 601,n,Playback(tt-monkeys) [echotest] exten => 602,1,answer exten => 602,n,Wait(1) exten => 602,n,playback(demo-echotest) exten => 602,n,echo exten => 602,n,playback(demo-echodone) exten => 602,n,hangup [default] include => ansagen-demo include => echotest
In Summe erhalten wir also nachfolgenden Dialplan, en wir auf der Asterisk-Konsole wieder mit dem Aufruf von dialplan reload laden.
dialplan reload Dialplan reloaded. == Parsing '/etc/asterisk/extensions.conf': == Found -- Registered extension context 'ansagen-demo'; registrar: pbx_config -- Added extension '601' priority 1 to ansagen-demo -- Added extension '601' priority 2 to ansagen-demo -- Added extension '601' priority 3 to ansagen-demo -- Registered extension context 'echotest'; registrar: pbx_config -- Added extension '602' priority 1 to echotest -- Added extension '602' priority 2 to echotest -- Added extension '602' priority 3 to echotest -- Added extension '602' priority 4 to echotest -- Added extension '602' priority 5 to echotest -- Added extension '602' priority 6 to echotest -- Registered extension context 'default'; registrar: pbx_config -- Including context 'ansagen-demo' in context 'default' -- Including context 'echotest' in context 'default' == Parsing '/etc/asterisk/users.conf': == Found -- Registered extension context 'app_dial_gosub_virtual_context'; registrar: app_dial -- merging incls/swits/igpats from old(app_dial_gosub_virtual_context) to new(app_dial_gosub_virtual_context) context, registrar = pbx_config -- Added extension 's' priority 1 to app_dial_gosub_virtual_context -- Registered extension context 'parkedcalls'; registrar: features -- merging incls/swits/igpats from old(parkedcalls) to new(parkedcalls) context, registrar = pbx_config -- Added extension '700' priority 1 to parkedcalls -- Registered extension context 'app_queue_gosub_virtual_context'; registrar: app_queue -- merging incls/swits/igpats from old(app_queue_gosub_virtual_context) to new(app_queue_gosub_virtual_context) context, registrar = pbx_config -- Added extension 's' priority 1 to app_queue_gosub_virtual_context -- Time to scan old dialplan and merge leftovers back into the new: 0.000164 sec -- Time to restore hints and swap in new dialplan: 0.000000 sec -- Time to delete the old dialplan: 0.000020 sec -- Total time merge_contexts_delete: 0.000184 sec
Bei Anwahl der Rufnummer 602 wird nun die Anwendung Echo-Test gestartet. Hierbei wird alles, was man sagt zum Endgerät zurückgeschickt. Man kann sich somit sehr einfach ein Bild von der Latenz des Asterisk-Servers machen. Auf der Asterisk-Konsole können wir den Ablauf verfolgen.
== Using SIP RTP CoS mark 5
[Nov 28 20:47:30] ERROR[18353]: chan_sip.c:27876 setup_srtp: No SRTP module loaded, can't setup SRTP session.
-- Executing [602@default:1] Answer("SIP/13-0000000b", "") in new stack
-- Executing [602@default:2] Wait("SIP/13-0000000b", "1") in new stack
[Nov 28 20:47:31] NOTICE[26657]: channel.c:4006 __ast_read: Dropping incompatible voice frame on SIP/13-0000000b of format ulaw since our native format has changed to 0x2 (gsm)
-- Executing [602@default:3] Playback("SIP/13-0000000b", "demo-echotest") in new stack
-- <SIP/13-0000000b> Playing 'demo-echotest.gsm' (language 'de')
-- Executing [602@default:4] Echo("SIP/13-0000000b", "") in new stack
-- Executing [602@default:5] Playback("SIP/13-0000000b", "demo-echodone") in new stack
-- <SIP/13-0000000b> Playing 'demo-echodone.gsm' (language 'de')
-- Executing [602@default:6] Hangup("SIP/13-0000000b", "") in new stack
== Spawn extension (default, 602, 6) exited non-zero on 'SIP/13-0000000b'
3. Anwendung "Asterisk-Demo"
Im nächsten Schritt ergänzen wir nun unseren Dialplan mit folgenden Zeilen:
# vim /etc/asterisk/extensions.conf
[asterisk-demo] exten => 603,1,answer exten => 603,n,wait(1) exten => 603,n,playback(demo-abouttotry) exten => 603,n,dial(IAX2/guest@misery.digium.com/s@default) exten => 603,n,playback(demo-nogo) exten => 603,n,goto(s,6) [default] include => asterisk-demo
In Summe erhalten wir also nachfolgenden Dialplan, den wir auf der Asterisk-Konsole wieder mit dem Aufruf von dialplan reload laden.
[general] static=yes writeprotect=no [ansagen-demo] exten => 601,1,Answer() exten => 601,n,Playback(tt-monkeysintro) exten => 601,n,Playback(tt-monkeys) [echotest] exten => 602,1,answer exten => 602,n,Wait(1) exten => 602,n,playback(demo-echotest) exten => 602,n,echo exten => 602,n,playback(demo-echodone) exten => 602,n,hangup [asterisk-demo] exten => 603,1,answer exten => 603,n,wait(1) exten => 603,n,playback(demo-abouttotry) exten => 603,n,dial(IAX2/guest@misery.digium.com/s@default) exten => 603,n,playback(demo-nogo) exten => 603,n,goto(s,6) [default] include => ansagen-demo include => echotest include => asterisk-demo
Nun haben wir unsere erste Außenanbindung geschaffen - mit Wahl der Rufnummer 603 wird eine Verbindung zum Asterisk-Demonstartionsserver bei Digium hergestellt. Die einzelnen Konfigurationsparameter dieser Dialplanerweiterung werden wir nun nachfolgend näher betrachten. Zuerst noch der Ablauf auf der Asterisk-Kommandozeile bei Anwahl der Rufnummer 603.
== Using SIP RTP CoS mark 5
[Nov 28 21:35:54] ERROR[18353]: chan_sip.c:27876 setup_srtp: No SRTP module loaded, can't setup SRTP session.
-- Executing [603@default:1] Answer("SIP/13-0000000e", "") in new stack
-- Executing [603@default:2] Wait("SIP/13-0000000e", "1") in new stack
[Nov 28 21:35:55] NOTICE[26752]: channel.c:4006 __ast_read: Dropping incompatible voice frame on SIP/13-0000000e of format ulaw since our native format has changed to 0x2 (gsm)
-- Executing [603@default:3] Playback("SIP/13-0000000e", "demo-abouttotry") in new stack
-- <SIP/13-0000000e> Playing 'demo-abouttotry.gsm' (language 'de')
-- Executing [603@default:4] Dial("SIP/13-0000000e", "IAX2/guest@misery.digium.com/s@default") in new stack
-- Called guest@misery.digium.com/s@default
-- Call accepted by 216.207.245.8 (format gsm)
-- Format for call is gsm
-- IAX2/216.207.245.8:4569-1019 answered SIP/13-0000000e
-- Hungup 'IAX2/216.207.245.8:4569-1019'
== Spawn extension (default, 603, 4) exited non-zero on 'SIP/13-0000000e'
4. Anwendung "interne Erreichbarkeit"
SIP Teilnehmer
Zur Erreichbarkeit unserer definierten Nebenstellen aus der /etc/asterisk/sip.conf erweitern wir unseren Dialplan nun wie folgt.
# vim /etc/asterisk/extensions.conf
[intern] ; interne Erreichbarkeit der Nebenstellen 11-99 untereinander herstellen exten => _XX,1,Dial(SIP/${EXTEN},55,TtrWw) [default] include => intern
Somit haben wir nun nach den ersten Konfigurationsbeispielen in Summe folgenden Dialplan, den wir auf der Asterisk-Konsole wieder mit dem Aufruf von dialplan reload laden.
[general] static=yes writeprotect=no [intern] ; interne Erreichbarkeit der Nebenstellen 11-99 untereinander herstellen exten => _XX,1,Dial(SIP/${EXTEN},55,TtrWw) [ansagen-demo] exten => 601,1,Answer() exten => 601,n,Playback(tt-monkeysintro) exten => 601,n,Playback(tt-monkeys) [echotest] exten => 602,1,answer exten => 602,n,Wait(1) exten => 602,n,playback(demo-echotest) exten => 602,n,echo exten => 602,n,playback(demo-echodone) exten => 602,n,hangup [asterisk-demo] exten => 603,1,answer exten => 603,n,wait(1) exten => 603,n,playback(demo-abouttotry) exten => 603,n,dial(IAX2/guest@misery.digium.com/s@default) exten => 603,n,playback(demo-nogo) exten => 603,n,goto(s,6) [default] include => intern include => ansagen-demo include => echotest include => asterisk-demo
Nunmehr haben wir auch die interne Erreichbarkeit unserer Nebenstellen sichergestellt. Im nachfolgenden Beispielt wird von der Nebenstelle 14 die Nebenstelle 13.
== Using SIP RTP CoS mark 5 [Nov 28 22:03:45] ERROR[18353]: chan_sip.c:27876 setup_srtp: No SRTP module loaded, can't setup SRTP session. -- Executing [13@default:1] Dial("SIP/14-00000010", "SIP/13,55,TtrWw") in new stack == Using SIP RTP CoS mark 5 -- Called 13 -- SIP/13-00000011 is ringing -- SIP/13-00000011 is ringing -- SIP/13-00000011 is ringing -- SIP/13-00000011 is ringing -- SIP/13-00000011 is ringing -- SIP/13-00000011 answered SIP/14-00000010 == Spawn extension (default, 13, 1) exited non-zero on 'SIP/14-00000010'
IAX2 Teilnehmer
Zur Erreichbarkeit unserer definierten Nebenstellen aus der /etc/asterisk/iax.conf erweitern wir unseren Dialplan nun wie folgt.
# vim /etc/asterisk/extensions.conf
[intern] ; interne Erreichbarkeit der Nebenstellen 11-99 untereinander herstellen exten => _XX,1,Dial(SIP/${EXTEN},55,TtrWw) ; interne Erreichbarkeit des IAX-Tielnehmers mit der Rufnummer 33 ermöglichen exten => 33,1,Dial(IAX2/33,55,TtrWw) [default] include => intern
Unseren Dialplan laden wir auf der Asterisk-Konsole wieder mit dem Aufruf von dialplan reload.
[general] static=yes writeprotect=no [intern] ; interne Erreichbarkeit der Nebenstellen 11-99 untereinander herstellen exten => _XX,1,Dial(SIP/${EXTEN},55,TtrWw) ; interne Erreichbarkeit des IAX-Tielnehmers mit der Rufnummer 33 ermöglichen exten => 33,1,Dial(IAX2/33,55,TtrWw) [ansagen-demo] exten => 601,1,Answer() exten => 601,n,Playback(tt-monkeysintro) exten => 601,n,Playback(tt-monkeys) [echotest] exten => 602,1,answer exten => 602,n,Wait(1) exten => 602,n,playback(demo-echotest) exten => 602,n,echo exten => 602,n,playback(demo-echodone) exten => 602,n,hangup [asterisk-demo] exten => 603,1,answer exten => 603,n,wait(1) exten => 603,n,playback(demo-abouttotry) exten => 603,n,dial(IAX2/guest@misery.digium.com/s@default) exten => 603,n,playback(demo-nogo) exten => 603,n,goto(s,6) [default] include => intern include => ansagen-demo include => echotest include => asterisk-demo
Rufen wir nun von unserem Testteilnehmer 14 unser IAX2-Softphone mit der Nummer 33, so wird uns dies auf dem Asterisk-CLI entsprechend angezeigt.
asterisk*CLI> == Using SIP RTP CoS mark 5 [Dec 2 16:56:02] ERROR[27402]: chan_sip.c:27876 setup_srtp: No SRTP module loaded, can't setup SRTP session. -- Executing [33@default:1] Dial("SIP/14-00000002", "IAX2/33,55,TtrWw") in new stack -- Called 33 -- Call accepted by 192.168.10.40 (format gsm) -- Format for call is gsm -- IAX2/33-2972 is ringing -- IAX2/33-2972 answered SIP/14-00000002 -- Hungup 'IAX2/33-2972' == Spawn extension (default, 33, 1) exited non-zero on 'SIP/14-00000002' asterisk*CLI>