CallThrough-Funktion für Asterisk mit der Extensions.conf

15.2.2023

Was ist CallThrough? Der Anrufer wählt zunächst eine Einwahlnummer. Per Sprachaufforderung wird er danach aufgefordert die gewünschte Zielnummer einzugeben. In diesem Beispiel wird die Zielnummer erst nach Eingabe des Raute-Symbols abgeschickt. Der Anrufer bekommt dann den Sprachhinweis, dass die gewünschte Verbindung aufgebaut wird. CallThrough kommt zum Beispiel zum Einsatz, wenn aus technischen Gründen eine Durchwahl nicht möglich ist.

Ein Nachteil von Callthrough ist, dass die Nummer nicht über das Impulswahlverfahren gewählt werden kann. Somit sind Wählscheibentelefone und alte Tastentelefone nach dem Impulswahlverfahren nicht geeignet. Außerdem lassen sich die Nummern oft nicht abspeichern, da die notwendige Wählpause nicht abgespeichert werden kann. Manche Softphones können Wählpausen in Form von Kommas realisieren, wobei Komma zum Beispiel eine Pause von 100 Millisekunden erzeugen kann. Wie lange die Pause mindestens sein muss, hängt vom Einzelfall ab.

Dieser Tastenblock eines alten Telefons besitzt rechts unten kein Rautesymbol (#). Damit kann er nur Impulswahl generieren und ist für CallThrough nicht geeignet.
Dieses Tastenfeld besitzt die Raute-Taste (#) und erzeugt somit eine Tonwahl nach dem Mehrfrequenzwahlverfahren und ist für CallThrough geeignet.

CallThrough-Routinen kommen auf meinem Asterisk-Server mehrfach zum Einsatz. Mein Telefon-Server ist über Sipgate, Sipcall, und Voiphone aus den öffentlichen Netzen erreichbar. Die Inselnetze von  Opensips, Iptel, Antisip und Sip2Sip sind ebenfalls erreichbar, um nur einige Netze zu nennen. Da diese Einwahlnummern keine Durchwahlen ermöglichen, muss CallThrough zum Einsatz kommen. Nachfolgend Beispiele, wie sich CallThrough für Asterisk ohne AGI-Skripte realisieren lässt.

Callthrough für die Asterisk-Konfiguration: Nachfolgend eine CallThrough-Funktion für die extensions.conf, bei der aber die eingetippten Nummern immer mit der Raute abgeschlossen werden müssen:

[general]
autofallthrough=no
static=yes
writeprotect=no

[telefone] ; telefone context telefone
; HIer stehen die Extensions und so weiter

[callthrough]
; Prompt caller to key-in number to be dialed and to finish with #
; Nach der Ansage Nummer (ev. mit Vorwahl) waehlen und mit # bestaetigen
; Beim Vertippen * und von vorne anfangen
exten => s,1,Ringing()
exten => s,2,Answer()
exten => s,3,Set(NR=)
exten => s,4,Background(vm-enter-num-to-call)
exten => s,5,Background(vm-then-pound)
exten => s,6,Set(TIMEOUT(response)=20)
exten => s,7,WaitExten
exten => s,8,Playback(vm-dialout)
;
exten => _X,1,Set(NR=${NR}${EXTEN})
exten => _X,2,Goto(s,6)
exten => *,1,Goto(s,3)
exten => #,1,NoOp(${NR})
exten => #,2,Playback(vm-dialout)
exten => #,3,NoOP(Dialing Now)
exten => #,4,NoOp(Dialing ${NR})
exten => #,5,Dial(SIP/${NR},45,tT)    ; nur zu Sip-Telefonen, mit Rufweiterleitung
exten => #,6,Playback(beep)           ; macht Beep, wenn keine Nebenstellen gewaehlt
exten => #,7,Goto(telefone,${NR},1)   ; springt zum Context telefone
exten => #,n,HangUp()

; Beispiel, wie ein Aufruf der Callthrough erfolgen könnte:

[callcentric-in]
; von aussen 17771234567 waehlen (Nummer ist im Beispiel fiktiv)
exten => 17771234567,1,Goto(callthrough,s,1)

Wie die Funktion [callthrough] im obigen Beispiel funktioniert? Die gezeigte extensions.conf Datei definiert eine sogenannte „context“ für die Verarbeitung von Anrufen in Asterisk, die „callthrough“ heißt. Diese spezielle „context“ wird verwendet, um eine „callthrough“-Funktion zu implementieren, bei der der Anrufer eine Nummer eingeben kann, die er anrufen möchte, und das System wird ihn automatisch anrufen und mit der gewählten Nummer verbinden.

Die Funktionsweise der callthrough-Funktion ist wie folgt: „exten => s,1,Ringing()“ entspricht der 1. Zeile.

In den Zeilen 1-7 wird der Anrufer aufgefordert, die Nummer einzugeben, die er anrufen möchte, indem er die Nummer wählt und mit # bestätigt.

In Zeile 8 wird eine Audio-Ansage abgespielt, um den Anrufer darüber zu informieren, dass der Anruf durchgeführt wird.

In den Zeilen 9-13 wird die eingegebene Nummer ausgewertet, wobei der Anrufer eine Ziffer nach der anderen wählen kann. Wenn er eine falsche Ziffer wählt, kann er durch Drücken von * von vorne beginnen.

In den Zeilen 14-19 wird die eingegebene Nummer überprüft und der Anruf wird ausgeführt, wenn die Eingabe mit # bestätigt wird. Es wird versucht, die gewählte Nummer über das SIP-Protokoll zu erreichen, und wenn der Anruf erfolgreich ist, wird der Anrufer zur gewählten Nummer weitergeleitet. Wenn keine Nebenstelle gewählt wurde, wird der Anrufer durch ein Beep-Geräusch darauf aufmerksam gemacht und der Anruf wird beendet. Wenn der Anruf nicht erfolgreich ist, wird der Anrufer zur Telefonfunktion weitergeleitet.

Sip.conf: In der sip.conf muss dann folgendes  stehen, damit in diesem Beispiel über Callcentric reingerufen werden könnte:

[general]

register => 17771234567:passwortblabla@sip.callcentric.net:5060/17771234567 ; Callcentric

[callcentric]
type=peer
context=callcentric-in
host=sip.callcentric.net
fromdomain=sip.callcentric.net
defaultuser=17771234567
fromuser=17771234567
secret=passwortblabla
insecure=port,invite
disallowed_methods=UPDATE
directmedia=no
videosupport=no
disallow=all
allow=ulaw
port=5060

Mit Callcentric wollte ich hier nur das Prinzip zeigen. So kann es zum Beispiel auch mit Sipgate, Iptel, AntiSip und Opensips machen, um ein  paar Beispiele zu nennen. In der Praxis funktioniert das Einwählen über Callcentric bei mir leider nicht mehr. Pragmatische Lösung: Eintragen einer zweiten Callcentric-Nummer in die Fritzbox und eine Rufumleitung auf den Asterisk-Server mit Hilfe von zwei internen SIP-Nummern, wobei die eine davon auf der FritzBox registriert ist. Nicht elegant, aber es klappt einwandfrei. Man muss sich zu helfen wissen.

Der Vollständigkeit halber noch ein Beispiel aus der extensions.conf, wie man umgekehrt mit Vorwahlen über SIP ein ein externes Netz wie Callcentric telefonieren:

; Weiterleitung auf Callcentric
exten => _8866X.,1,Dial(SIP/${EXTEN:4}@callcentric,60,tT)       ; schneidet 8866 vorne ab
exten => _1777[0-9].,1,Dial(SIP/${EXTEN}@callcentric,60,tT)     ; alles was mit 1777 beginnt

Wichtig: Damit das Zusammenspiel von sip.conf und und extensions.conf funktioniert, ist für das Verständnis darauf zu achten, wo in diesem Beispiel die Strings „callcentric“ und „callcentric-in“  und „17771234567“ vorzufinden sind.

Es werden zwei Möglichkeiten mit Pattern Matching angeboten. 1. Über die  Vorwahl 8866. 2.  Da alle Callcentric-Nummern mit 1777 anfangen, bietet es sich an alle gewählten Nummern, die mit 1777 beginnen, auf Callcentric zu leiten.

CallThrough mit einem AGI-Script für Python: Der Vorteil ist, dass dieses Verfahren ohne die abschließende Eingabe der Raute auskommt. Wenn vier Sekunden lang keine Eingabe von Ziffern erfolgt, wird die bis dahin eingetippte Abfolge von Nummern abeschickt und an Asterisk übergeben.

Ausschnitt aus einem AGI-Skript in Python3
Asterisk AGI-Skript in Python für die Rufweiterleitung mit CallThrough – 14. Februar 2023: Wird dieses AGI-Skript für Python 2.7 oder Python 3 durch einen Telefonanruf aufgerufen, wird der Anrufer durch eine Sound-Datei aufgefordert seine gewünschte Zielnummer in seine Telefontastatur einzugeben. Das Skript wartet maximal vier Sekunden, bis die nächste Ziffer eingegeben wird. Wenn die 4 Sekunden ohne eine Aktion des Anrufers verstrichen sind, wird die bisher eingetippte Abfolge von Ziffern als Zahl an Asterisk übergeben, um damit in diesem Fall eine Nummer zu wählen. Es dient also dazu CallThrough zu ermöglichen. Dieser Artikel stellt auch eine Alternative für Callthrough ohne AGI-Skripte vor. – weiter

Auf einem Raspberry Pi lässt sich ein kompletter Telefonserver betreiben, der seinen Teilnehmern über Landesgrenzen hinweg kostenloses Telefonieren von unterwegs oder daheim ermöglicht.
Asterisk-Telefonserver auf einem Raspberry Pi – Installation, Konfiguration, Programmierung, SIP, IAX2, AGI-Skripte, Sicherheit und Tipps zum praktischen Betrieb – 2.11.2022: Diese Seite richtet sich an jene, welche einen Asterisk-Telefon-Server auf einem Raspberry Pi betreiben möchten und später ein kleines Netzwerk aus Asterisk-Servern planen, um ein eigenständiges Telefonnetz aufzubauen. Los geht es mit der Installation von Raspbian und Asterisk auf einem Raspberry Pi und dann nach Lust und Laune immer tiefer in die Programmierung von Asterisk. Die Themen werden laufend erweitert.

Selbstverständlich muss es nicht unbedingt ein Raspberry Pi sein. Andere Linux-Rechner gehen auch. – weiter