Eine einfache Asterisk-Konfiguration für einen SIP-Server als Telefonanlage

15.10.2020 (aktualisiert am 29.10.2020, 25.09.2021)

Die hier vorgestellte Asterisk-Konfiguration dient als Muster für einen einfachen SIP-Server, der als Telefonanlage hinter einem Router arbeitet. Die Nebenstellen des SIP-Servers sind sowohl innerhalb des eigenen LANs als auch über das Internet erreichbar. Außerdem ermöglicht dieses Konfigurationsbeispiel Zugänge aus anderen Netzen über zwei fremde Provider. Über diese beiden Provider kann mit Hilfe von Vorwahlen das Einwählen in andere Netze stattfinden.

Mit der Zeit haben sich hier noch mehr Programmier-Beispiele für Asterisk angesammelt, die ich hier nach und nach dokumentiere.

Getestet wurde alles unter Asterisk 16.2.1 auf einem Raspberry 3 B+ und Raspbian vom Februar 2020. Der kleine Sip-Server läuft stabil und zuverlässig. Nach Stromausfällen bootet er automatisch und läuft wie vorher.

Wer seinen SIP-Server so konfigurieren möchte, dass man auch Telefonverbindungen von und nach außerhalb seines eigenen LANs aufbauen kann, darf das Portforwarding im Router und die Konfiguration in der rtp.conf nicht vergessen. Dies ist an entsprechender Stelle beschrieben. Wer keine feste öffentliche IP hat, sollte in seinem Router außerdem einen kostenlosen DynDNS-Anbieter einrichten.

Die notwendige Hardware u. Installation v. Asterisk
Wie finde ich den leichten Einstieg?
CLI-Befehle für Asterisk
Die Konfigurations-Dateien
AntiSip
Die Sip.conf
Was muss ich in die FritzBox oder einem Endgerät eintragen?
Die Extensions.conf
Weiterleitung nach 20 Sekunden
Beispiel Echo-Test
Vertreibung von lästigen Anrufern
Herauswählen aus dem SIP-Server in das Netz von AntiSip
Gespräche an eine andere Telefonnummer übergeben
Portforwarding in der rtp.conf
Die logger.conf
Anrufbeanworter (AB) hinzufügen
Luxus-Sprachhinweise
Anpassung für die schwedische Wählscheibe
Rufumleitung als Sonderbehandlung für wichtige Anrufer
Zeit- und Datumsansage
Was ist meine eigene Nummer?
Telefon-Konferenzschaltungen mit Confbridge
Abspielen von MP3-Streaming-Adressen
Macros verwenden
Eigene Sprachdateien erzeugen
Universelle Testnummer mit automatischem Rückruf
Verschicken von Textnachrichten über Asterisk
Video-Telefonate mit Asterisk
Konfigurationen für die wichtigsten SIP-Provider
Anmerkungen zu Asterisk
Anmerkungen zu meinem Asterisk-Server
Teilnehmerseite meines Asterisk-Servers
– 

Außerdem sind im SIP-Server noch verschiedene Testnummern integriert. Der hier vorgestellte Code dient als erweiterbares Schema und er wurde auf Asterisk 1.4.2.2 und auf Asterisk 16.2.1  über ein Jahr lang in einem realistischen Dauereinsatz getestet. Die Asterisk-Software steht kostenlos zur Verfügung.


Zum Testen der Asterisk-Konfiguration ist eine kleine Haustelefonanlage hilfreich. Zum Einsatz kommen neben einem SIP-Telefon noch ein paar alte Fritzboxen, die sich hinter dem Hauptrouter befinden und nur dazu da sind die analogen Telefone über das LAN zu betreiben. Wenn die FritzBox DECT verarbeiten kann, können DECT-Telefone zum Einsatz kommen.

Die notwendige Hardware und die Installation von Asterisk: Der Asterisk-Server läuft bei mir auf einem Raspberry Pi 3 B+. Ältere Raspberry Pi erfüllen auch ihre Aufgabe. Vorher kam eine FritzBox 7170 zum Einsatz. Die Installation und Konfiguration für den Raspberry Pi  ist unter

https://elektronikbasteln.pl7.de/asterisk-und-fail2ban-auf-dem-raspberry-pi

beschrieben. Die Nebenstellen lassen sich zum Beispiel mit FritzBoxen, Softphones und IP-Telefonen verwirklichen. Wo sich diese Endgeräte befinden, spielt keine Rolle. Sie können sich innerhalb des eigenen LANS befinden oder sie sind außerhalb über das Internet erreichbar. Der Betrieb von analogen Telefonen ist an einer FritzBox über den FON-Anschluss mit einer Zweidrahtleitung möglich. Ältere FritzBoxen erlauben sogar den Anschluss von Telefonen, die mit dem Impulswahlverfahren arbeiten. Dies ist bei Wählscheibentelefonen der Fall. Die FritzBox kann als Router dienen oder sie darf sich hinter einem Router befinden.

Der SIP-Server läuft auf einem Raspberry Pi 3 B+ hinter einem Router.
Die Nebenstellen können zum Beispiel in einer FritzBox als neue “Telefonanbieter” eingetragen werden. Manche FritzBoxen erlauben den drahtlosen Anschluss von DECT-Telefonen nach dem DECT-Standard. Die FritzBox kann sich im eigenen LAN oder in einem andern LAN  irgendwo in der Welt befinden. Sie kann als Router dienen oder sich hinter einem Router befinden.
Über den analogen Anschluss funktionieren an älteren FritzBoxen sogar Wählscheibentelefone.
IP-Telefone sind gebraucht günstig erhältlich und bieten jede Menge Komfortfunktionen. Das Thomson TB-30 bewältigt sogar Konferenzen mit drei Teilnehmern.

Wie finde ich den leichten Einstieg? Der hier vorgestellte Entwurf und das Schema orientieren sich an dem didaktischen Aufbau, welcher unter  http://das-asterisk-buch.de/1.6/ leicht verständlich erklärt ist.  Bei dieser Gelegenheit besten Dank an den Autor. Die Lektüre des Asterisk-Buches ist unbedingt für das weitere Verständnis zu empfehlen. Ich versuche nach Möglichkeit Fachwörter zu vermeiden, da sie für den Anfänger verwirrend sind und ihm die korrekten Bezeichnungen noch keinen Nutzen liefern. Deshalb arbeite ich lieber mit Beispielen. Einen weiteren leicht verständlichen Einstieg in die Asterisk-Programmierung bietet die locker und unterhaltsam geschriebene Serie

https://www.linux-magazin.de/ausgaben/2008/01/zeit-fuer-was-neues/

https://www.linux-magazin.de/ausgaben/2008/02/erweiterte-gespraechskultur/.

Beide Einführungen liefern einen Einstieg, der sich auf das Wesentliche konzentriert. Asterisk bietet eine Vielzahl von Möglichkeiten, die selbst für Fachleute nicht zu überblicken sind. Wer tiefer einsteigen möchte, findet unter

http://asterisk-service.com/downloads/Asterisk-%20The%20Definitive%20Guide,%204th%20Edition.pdf

einen umfassenden Einblick. Ansonsten lassen sich zahlreiche Beispiele im Web finden.

CLI-Befehle für Asterisk: Im nachfolgenden Kasten die wichtigsten Befehle für die Bedienung von Asterisk als SIP-Server im LX-Terminal auf der Kommandozeilenebene. Die Bedienung von Asterisk erfolgt kommt also ohne grafische Benutzeroberfläche daher, was sich als vollkommen ausreichend erweist.

Die wichtigsten Befehle für die Bedienung von Asterisk

Starten von Asterisk. Die Anzahl der Vs hinter dem -r bestimmt den
Verbose-Level von 0 bis 10. Je höher der Level, desto
mehr Hinweise werden dargestellt:
sudo asterisk -rvvv

Setzt zum Beispiel Verbose-Level auf 3. Statt drei gehen Zahlen von 0 bi 10.
core set verbose 3

Liste der peers, um festzustellen, welche Endgeräte
angemeldet ist:
sip show peers

Zeigt Informationen über die 1001:
sip show peer 1001

Welche Telefone telefonieren gerade:
sip show channels

Sip.conf neu laden:
sip reload

Alle Conf-Dateien neu laden:
reload

Dialplan (extension.conf) neu laden:
dialplan reload

Die Konfigurations-Dateien: Die für einen SIP-Server notwendige Konfiguration verteilt sich auf die Dateien

sip.conf (Sip-Konfiguration)

extensions.conf (Wahlregeln, Dialplan)

rtp.conf (RTP-Ports für die Audio und Video-Übertragung)

features.conf (Rufweiterleitung)

und logger.conf (Log-Datei festlegen)

Diese liegen hier für eine Muster-Konfiguration als

AsteriskMusterKonfiguration14.10.2020.zip

vor. Für eine Wiederherstellung reicht es aus diese fünf Konfiguration-Dateien zu sichern. Die Hauptarbeit der Programmierung liegt in der Sip.conf und in der Extensions.conf. Die Konfigurationsdateien befinden sich alle unter einem Ordner, zum Beispiel auf Linux oft unter /etc/asterisk.

Es gibt noch eine Vielzahl weiterer Konfigurationsdateien, die uns vorerst nicht zu interessieren brauchen. Wir konzentrieren uns zudem nur auf das SIP-Protokoll.

AntiSip: Das Beispiel arbeitet mit einem Account von AntiSip, den wir uns auf

https://www.antisip.com/service/register.html

beschaffen können. Wichtig ist, dass der Username nur aus Ziffern besteht, denn der Username entspricht der Telefonnummer.

Die Sip.conf: Sie enthält die Grundeinstellungen, damit der SIP-Server überhaupt mit der Außenwelt kommunizieren kann und sich die Nebenstellen unterhalten können. Im Beispiel sind drei Nebenstellen mit den Nummern 1001, 1002 und 1003 definiert. Außerdem kann der SIP-Server im Beispiel zu den fremden Providern Sipgate und AntiSip Telefonate aufbauen.

Der SIP-Server befindet sich für diese Konfiguration hinter einem Router, auf dem ein DynDNS-Dienst von noip.com eingerichet ist, der die Web-Adresse blabla.hopto.org liefert. Hat der Internetzugang immer die gleiche öffentliche IP, brauchen wir keinen DynDNS-Dienst und können die öffentliche IP verwenden, die unter externip einzutragen ist.

Der Sip-Server selbst ist zum Beispiel auf einem Raspberry Pi untergebracht, welcher im Beispiel die statische IP 192.168.1.111 besitzt. Normalerweise lautet der Standardport für SIP 5060. Da die 5060 oft schon durch andere SIP-Zugänge im LAN vergeben ist, wurde auf die 5064 ausgewichen.

sip.conf:

; Musterknonfiguration einer sip.conf vom 14.10.2020


[general]
port=5064 ; ueblich ist der port 5060. aber da Fritzboxen
; bereits den Port 5060 belegt haben, kommt hier immer 5064
; zum Einsatz
bindport=5064 ; siehe oben
context=telefone ; unter diesem context stehen die "Telefonnummern" in der extensions.conf
bindaddr=0.0.0.0
allowguest=no
disallow=all
allow=alaw
allow=ulaw
allow=gsm
allow=g722
srvlookup=yes ; muss auf yes stehen

externhost=blabla.hopto.org ; Hier eine Webadresse eintragen, die wir uns
; zum  Beispiel bei https://www.noip.com/ besorgen und im Router eintragen.
; externip=xx.xxx.xx.xxx ; Alternative: IP-Adresse deines Internetanschlusses, falls sich
; diese nicht ändert. Siehe https://www.wieistmeineip.de/ oder https://www.meine-aktuelle-ip.de/
; Wenn wir externe ip wählen, dann externhost auskommentieren.
localnet=192.168.1.111/255.255.255.0 ; das ist die statische IP des SIP-Servers im LAN
; hinter dem Router. Diese IP entsprechend anpassen.
nat=comedia ; damit die IP-Adresse des LAN für das Internet umgesetzt wird.
insecure=invite
qualify=yes ; war auf 3000 https://www.voip-info.org/asterisk-variable-dialstatus/
maxexpirey=36000
defaultexpirey=600

; tos=0x04 veraltet
; https://www.voip-info.org/asterisk-sip-tos/
tos_sip=cs3 ; Sets TOS for SIP packets.
tos_audio=ef ; Sets TOS for RTP audio packets.

registerattempts=0 ; versucht sich ewig zu connecten.
registertimeout=1 ; kontrolliert jede Sekunde die Internet-Verbindung

localnet=192.168.0.0/255.255.0.0
localnet=10.0.0.0/255.0.0.0
localnet=172.16.0.0/12
localnet=169.254.0.0/255.255.0.0

call-limit=10
busylevel=10
allowsubscribe=no
; https://www.voip-forum.com/asterisk/2008-01/sip-subscriptions/


; Als Beispiel die Zugänge zu den externen Providern Sipgate und und Anti-SIP
; Notwendig um Anrufe vom SIP provider anzunehmen

; http://das-asterisk-buch.de/1.6/sip-ins-oeffentliche-netz.html
; https://www.voip-info.org/asterisk-config-sipconf/#AsteriskasaSIPclient
; 
register => 1234567e0:Passwort@sipgate.de/1234567e0 ; Sipgate
; Die Sipgate-Nummern bei Sipgate besorgen. Die 1234567e0 ist die SIP-ID.

register => 1234567890:Passwort@antisip.com/1234567890 ; Antisip
; Registrierung einer AntiSip-Nummer unter https://www.antisip.com/service/register.html
; Als Username unbedingt die gewünschte Telefonnummer angeben, die nur aus Ziffern
; bestehen darf, damit sie auf normalen Telefonen verwendbar ist.


; Externe Provider Herausgehende Telefonate

; ausgehende Sipgate Leitung 
[sipgate1]
context=sipgate-in
host=sipgate.de
username=1234567e0
secret=Passwort
fromuser=1234567e0
fromdomain=sipgate.de
canreinvite=no
qualify=yes 
nat=force_rport ; oder comedia 
registertimeout=600
type=friend ; oder peer


; ausgehende antisip Leitung 1234567890
[antisip]
context=antisip-in
host=sip.antisip.com
username=1234567890
secret=Passwort
fromuser=1234567890
fromdomain=sip.antisip.com
canreinvite=no
qualify=yes
nat=force_rport
type=friend

; Nebenstellen, die auch über das Internet erreichbar sind

; Nebenstelle 1
[1001] ; Haustelefon mit der Nummer 1001
type=friend
secret=Passwort
host=dynamic
username=1001
canreinvite=no
port=5064
dtmfmode=rfc2833
callerid = "Anton Mustermann" <1001>

; Nebenstelle 2
[1002] ; Haustelefon mit der Nummer 1002
type=friend
secret=Passwort
host=dynamic
username=1002
canreinvite=no
port=5064
dtmfmode=rfc2833
callerid = "Berta Musterfrau" <1002>

; Nebenstelle 3
[1003] ; Haustelefon mit der Nummer 1003
type=friend
secret=Passwort
host=dynamic
username=1003
canreinvite=no
port=5064
dtmfmode=rfc2833
callerid = "Heribert Feuerstein" <1003>

; Beispiel für die Anmeldedaten der Nebenstelle 1003
; für die FritzBox oder in Softphones:
;
; Nummer, User, Telefonnummer, SIP-ID: 1003
; Registrar: blabla.hopto.org:5064
; Passwort: Passwort

; Falls sich die Nebenstellen innerhalb des eigenen LANs befindet:

; Nummer, User, Telefonnummer, SIP-ID: 1003
; Registrar: 192.168.1.111:5064
; Passwort: Passwort


In der Sip.conf sind die Nummern der einzelnen Nebenstellen definiert. Für die 1003 lautet sie:

; Nebenstelle 3
[1003] ; Haustelefon mit der Nummer 1003
type=friend
secret=Passwort
host=dynamic
username=1003
canreinvite=no
port=5064
dtmfmode=rfc2833
callerid = "Heribert Feuerstein" <1003>

Was muss ich in die FritzBox oder in einem anderen SIP-Endgerät eintragen? Damit Heribert Feuerstein auch unter seiner 1003 erreichbar ist, muss er in seiner FritzBox unter “neuer Telefonanbieter” oder in seinem Softphone folgende Daten eingeben:

Nummer, User, Telefonnummer, SIP-ID: 1003
Registrar: blabla.hopto.org:5064
Passwort: Passwort

Befindet sich die Nebenstelle im eigenen LAN, wäre folgende Alternative möglich:

Nummer, User, Telefonnummer, SIP-ID: 1003
Registrar: 192.168.1.111:5064
Passwort: Passwort

Nachfolgend ein Beispiel für die Konfiguration im Windows-Softphone Ninja Lite. Was rot durchgestrichen wurde, muss laut unserem Beispiel durch blabla.hopto.org ersetzt werden. Den SIP-Port 5064 muss man hier getrennt unter SIP Port eintragen.

Das kostenlose Softphone Ninja Lite für Windows ist auf https://www.globaliptel.com/Contents/Products/Software/Ninja-Lite.html erhältlich. Falls der Download nicht klappt, einen anderen Browser verwenden. Die Konfiguration ist im rechten Fenster ersichtlich. Dieses Fenster öffnet sich, wenn man auf das kleine Zahnrad in der oberen Leiste des Telefons klickt. Auch dieses Softphone sollte mit einem Headset betrieben werden, obwohl es ein gute Echounterdrückung zu besitzen scheint.

Ein sehr gutes und kostenloses Softphone für Windows ist PhonerLite, in welchem auch meherere Accounts verschiedener SIP-Anbieter konfiguriert werden können.

Für Android-Smartphones habe ich mit dem Softphone Sipnetic beste Erfahrungen gemacht. Selbst die kostenlose Version ist sehr umfangreich und erlaubt ebenfalls die Einbindung mehrerer SIP-Accounts ( mehr unter https://elektronikbasteln.pl7.de/sipnetic-softphone-android ).

Die extensions.conf: Sie enthält die Wahlregeln (Dialplan) und legt fest, was passiert, wenn jemand eine Nummer wählt.

Der Abschnitt [Callthrough] hat folgende Funktion, die für das Verständnis der Telefonanlage entscheidend ist. Ruft jemand über Sipgate oder AntiSip herein, hört der Anrufer eine weibliche Stimme, die auffordert die gewünschte Zielnummern einzutippen und mit # abzuschließen. Möchte man die 1001 erreichen, ist die 1001# einzutippen und man wird verbunden. Weiß der Anrufer nicht, welche Nummer er eintippen muss, wird er nach einer Weile automatisch mit der 1001 verbunden.

Möchte man über Sipgate heraustelefonieren kann je nach Auskomentierung der Programmzeilen zwischen zwei Möglichkeiten gewählt werden. Bei der einen gehen alle gewählten Nummern, die mit 0 biginnen über Sipgate. Bei der anderern Möglichkeit muss man die Vorwahl 8967 wählen. Wer über AntiSip herauswählen möchte, muss als Vorwahl die 8888 wählen. Angenommen man möchte die AntiSip-Nummer 1234 erreichen. Dann ist 88881234 zu wählen Das Programm schneidet die ersten 4 Ziffern ab, es bleibt die 1234 übrig, die zum Herauswählen an einen AntiSip-Account übergeben wird. Früher hätte das die Handvermittlung mit folgender Bitte  erledigt: “Ich möchte gerne die 1234 im AntiSip-Netz erreichen.”

;
; Musterversion der extensions.conf
; vom 14.10.2020
;
;
[general]
autofallthrough=no ; diese Einträge sind notwendig, damit CallThrough funtkioniert
static=yes         ; diese Einträge sind notwendig, damit CallThrough funtkioniert
writeprotect=no    ; diese Einträge sind notwendig, damit CallThrough funtkioniert


[telefone]  ; Siehe entsprechenden Eintrag in der sip.conf


; Die Nebenstellen, die in sip.conf definiert sind
; http://das-asterisk-buch.de/1.6/transfer.html
; tT ermoeglicht Rufweiterreichung mit Raute
; r lässt klingeln, nicht unbedingt notwendig
; wie in der features.conf definiert ist unter blindxfer

; So muesste man es Zeile fuer Zeile schreiben
; und Nummer fuer Nummer schreiben. Beispiel für 1001:
; exten => 1001,1,Dial(SIP/1001,60,tT)

; eleganter mit
; http://das-asterisk-buch.de/1.6/einleitung-regex.html
exten => _1XXX,1,Dial(SIP/${EXTEN},60,rtT)

; 1000 wählen und es klingeln alle 3 Nebenstellen
exten => 1000,1,Dial(SIP/1001&SIP/1002&SIP/1003,45,tT)

; ECHOTEST (HALL, ZEITVERZOEGERUNG)
exten => 1111,1,Answer()                ; Abheben
exten => 1111,n,Playback(demo-echotest) ; Ansage
exten => 1111,n,Echo                    ; Echotest
exten => 1111,n,Playback(demo-echodone) ; Bestaetigung
exten => 1111,n,Hangup()                ; Auflegen

; Test für Nummernschalter
exten => 1234567890,1,Goto(1111,1)

; 3333 zur Vertreibung von lästigen Werbeanrufen
exten => 3333,1,Ringing()
exten => 3333,n,Wait(1)
exten => 3333,n,Playback(tt-somethingwrong)
exten => 3333,n,Playback(tt-weasels)
exten => 3333,n,Playback(tt-monkeysintro)
exten => 3333,n,Playback(tt-monkeys)
exten => 3333,n,Playback(vm-goodbye)
exten => 3333,n,Hangup()

;ZEIT- UND DATUMSANZEIGE (zeitversetzt um eine Stunde) GMT
;beim Wählen der Nummer 2424
exten => 2424,1,Ringing()
exten => 2424,n,Wait(1)
exten => 2424,n,SayUnixTime(,Europe/Berlin,AdBY)
exten => 2424,n,Wait(1)
exten => 2424,n,SayUnixTime(,Europe/Berlin,H)
exten => 2424,n,Playback(hours)
exten => 2424,n,SayUnixTime(,Europe/Berlin,M)
exten => 2424,n,Playback(minutes)
exten => 2424,n,SayUnixTime(,Europe/Berlin,S)
exten => 2424,n,Playback(seconds)
exten => 2424,n,Wait(1)
exten => 2424,n,Playback(vm-goodbye)
exten => 2424,n,Wait(1)
exten => 2424,n,Hangup()



; TELEFONIEREN UEBER PROVIDER NACH AUSSEN 
; mit Hilfe von Vorwahlen
; https://wiki.asterisk.org/wiki/display/AST/Selecting+Characters+from+Variables

; WEITERLEITUNG AUF SIPGATE-NUMMERN UEBER SIPGATE 

; "@sipgate1", weil der entprechende Abschnitt [sipgate1] in der sip.conf vorkommt
; exten => _0X.,1,Dial(SIP/${EXTEN}@sipgate1,60,r)   ; fuer alle gewählt Nummern, die mit 0 beginnen 
exten => _8976X.,1,Dial(SIP/${EXTEN:4}@sipgate1,60,tT)     ; schneidet 8976 vorne ab
; mit der internen Vorwahl 8976 gehen die Telefonate über Sipgate heraus.

exten => 10000,1,Dial(SIP/${EXTEN}@sipgate1,60,r)     ; Willkommen bei Sipgate
exten => 10005,1,Dial(SIP/${EXTEN}@sipgate1,60,r)     ; Sprachtest Sipgate


; Weiterleiung auf Antisip-Nummern
exten => _8888X.,1,Dial(SIP/${EXTEN:4}@antisip,60,r)     ; schneidet vorne die 8888
; mit der Vorwahl 8888 können AntiSip-Nummern angewählt werden.

; Ansage gibt eigene Nummer zurück
exten => 55555,1,Ringing()
exten => 55555,n,Answer()
exten => 55555,n,Wait(1)
exten => 55555,n,SayDigits(${CALLERID(num)})
exten => 55555,n,Wait(1)
exten => 55555,n,SayNumber(${CALLERID(num)})
exten => 55555,n,Wait(1)
exten => 55555,n,HangUp()

; Zum Testen der Callthrough-Funktionen
exten => 880088,1,Goto(callthroughBlind,s,1)
exten => 880073,1,Goto(callthrough,s,1)

[callthroughBlind] ; Es werden die gewählten Ziffern angesagt
; 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)=10)
exten => s,7,WaitExten
exten => s,8,Playback(vm-dialout)
exten => s,9,Dial(SIP/1001,45,tT)
exten => _X,1,Set(NR=${NR}${EXTEN})
exten => _X,2,Goto(s,6)
exten => *,1,Goto(s,3)
exten => #,1,NoOp(${NR})
exten => #,n,Wait(1)
exten => #,n,SayNumber(${NR})
exten => #,n,Wait(1)
exten => #,n,SayDigits(${NR})
exten => #,n,Wait(1)
exten => #,n,SayDigits(${NR})
exten => #,n,Wait(1)
exten => #,n,Playback(vm-dialout)
exten => #,n,NoOP(Dialing Now)
exten => #,n,NoOp(Dialing ${NR})
exten => #,n,Dial(SIP/${NR},45,tT)    ; nur zu Sip-Telefonen, mit Rufweiterleitung
exten => #,n,Playback(beep)           ; macht Beep, wenn keine Nebenstellen gewaehlt
exten => #,n,Goto(telefone,${NR},1)   ; springt zum Context telefone
exten => #,n,HangUp()


[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)=30)
exten => s,7,WaitExten
exten => s,8,Playback(vm-dialout)
exten => s,9,Dial(SIP/1001,45,tT) ; wenn keine Nummer eingetippt, gehts zur 1001
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()


; Einwahl-Nummern von Aussen ueber CallThrough
; um zu einer beliebigen Nummer weiterzuleiten
[sipgate-in]
; von aussen Sipgate-Nummer  wählen,
exten => 1234567e0,1,Goto(callthrough,s,1)

; Alternativen:

; exten => 1234567e0,1,Dial(SIP/1001&SIP/1002&SIP/1003,45,tT)
; es klingeln alle drei Nebenstellen bei einem Anruf von Sipgate
; 
; exten => 1234567e0,1,Dial(SIP/1001,45,tT)
; es klingelt nur die 1001, wenn jemand von Sipgate anruft

[antisip-in] 
; von aussen Antisip-Nummer 1234567890 wählen,
exten => 1234567890,1,Goto(callthrough,s,1)

Ansonsten sind in dieser extensions.conf noch zahlreiche Testnummern zum Spielen enthalten, die Sound-Dateien aufrufen. Die Funktionen sind den Kommentarzeilen zu entnehmen. Sämtliche Soundfiles sind nach der Installation von Asterisk vorhanden.  Sie sind auf Englisch. Sollten sie dennoch fehlen, sind sie vielleicht auf http://www.spblinux.de/fbox/sounds16/ vorhanden. Es können auch Sound-Dateien anderer Sprachen nachinstalliert werden.

In der Extensions.conf müssen die Wahlregeln (extensions) für die 3 Nebenstellen 1001, 1002 und 1003 definiert sein:

exten => 1001,1,Dial(SIP/1001,60,tT)
exten => 1002,1,Dial(SIP/1002,60,tT)
exten => 1003,1,Dial(SIP/1003,60,tT)

Wenn jemand die Nummer 1001 wählt, dann klingelt auch 1001.

Etwas bequemer zum Eintippen ist folgende Variante, die dasselbe erledigt:

exten => 1001,1,Dial(SIP/${EXTEN},60,tT) 
exten => 1002,1,Dial(SIP/${EXTEN},60,tT) 
exten => 1003,1,Dial(SIP/${EXTEN},60,tT)

Was der Anrufer wählt, wird an ${EXTEN} weitergegeben. Bei drei Nummern kein Problem. Bei 1000 Nummern ist es lästig für jeden Anschluss eine Zeile zu schreiben. Es geht bequemer mit einer Zeile, die einen ganzen Nummernbereich abdeckt.

; eleganter mit
; http://das-asterisk-buch.de/1.6/einleitung-regex.html
exten => _1XXX,1,Dial(SIP/${EXTEN},60,rtT)

Unter http://das-asterisk-buch.de/1.6/einleitung-regex.html ist die Methode erklärt

Wir können uns auch einen Scherz erlauben:

exten => 1001,1,Dial(SIP/1002,60,tT)

Wenn  jemand also die 1001 wählt, dann klingelt es auf der 1002.

Folgende Variante ist möglich. Wenn 1000 gewählt wird, klingeln alle drei Telefone:

exten => 1000,1,Dial(SIP/1001&SIP/1002&SIP/1003,45,tT)

Derjenige, der zuerst abhebt, erhält das Gespräch.

Weiterleitung: Die nachfolgende Wahlregel leitet die Verbindung nach 20 Sekunden Klingeln auf ein anderes Telefon weiter:

; Weiterleitung nach 20 Sekunden
; auf eine andere Nummer:
; exten => 1059,1,Dial(SIP/1059,20,tT)
; exten => 1059,2,Dial(SIP/1022,60,tT)
; Jemand wählt die 1059. Hebt nach 20 Sekunden
; niemand die 1059 ab, klingelt die 1022.

Beispiel Echo-Test: Beispiel einer Test-Nummer in der extensions.conf, die einen Echo-Test ermöglicht.  Dabei hört man seine eigene Stimme etwas zeitverzögert:

; ECHOTEST (HALL, ZEITVERZOEGERUNG) beim Wählen der Nummer 1111
exten => 1111,1,Answer()                ; Abheben 
exten => 1111,n,Playback(demo-echotest) ; Ansage 
exten => 1111,n,Echo                    ; Echotest 
exten => 1111,n,Playback(demo-echodone) ; Bestaetigung 
exten => 1111,n,Hangup()                ; Auflegen

Vertreibung von lästigen Anrufern:

; 330 zur Vertreibung von lästigen Werbeanrufen
exten => 330,1,Ringing()
exten => 330,n,Wait(1)
exten => 330,n,Playback(tt-somethingwrong)
exten => 330,n,Playback(tt-weasels)
exten => 330,n,Playback(tt-monkeysintro)
exten => 330,n,Playback(tt-monkeys)
exten => 330,n,Playback(vm-goodbye)
exten => 330,n,Wait(1)
exten => 330,n,Hangup()

Dieser Code-Schnipsel in der extensions.conf spielt lustige Sounddateien ab, um unangenehme Anrufer zu vertreiben. Mit #330 erfolgt die Rufweiterleitung auf diese Darbietung. Aus dem Gedächtnis übersetzt lautet der Text: “Etwas Schreckliches ist passiert. Wiesel haben unser Sonnensystem aufgefressen. Sie wurden von Affen weggetragen. – Affengeschrei – Auf Wiedersehen.” Anrufer, die angeblich aus dem Microsoft Help Desk Center anrufen, rufen bei mir nie wieder an.

Beispiel Herauswählen aus dem SIP-Server in das Netz von AntiSip: Dazu ist in der Sip.conf folgendes festgelegt:

; ausgehende antisip Leitung 1234567890
[antisip] ; siehe exten => _8888X.,1,Dial(SIP/${EXTEN:4}@antisip,60,r) in der extensions.conf
context=antisip-in
host=sip.antisip.com
username=1234567890
secret=Passwort
fromuser=1234567890
fromdomain=sip.antisip.com
canreinvite=no
qualify=yes
nat=force_rport
type=friend

In der extensions.conf muss dann entsprechend folgendes stehen:

exten => _8888X.,1,Dial(SIP/${EXTEN:4}@antisip,60,r)

Die Zeile sorgt dafür, dass alle Nummern, die mit 8888 beginnen, über [antisip] -Nummer 123456789 geleitet werden. Möchte der Nutzer die AntiSip-Nummer 9876 erreichen, muss er 88889876 wählen. Die ersten 4 Ziffern werden vorne abgeschnitten und es wird über die AntiSip-Nummer 123456789 herausgewählt.

Beispiel Hereinwählen aus dem Netz von AntiSip: Dazu muss folgendes in der sip.conf stehen, damit die Registrierung des AntiSip-Accounts klappt.

; wir sind in der sip.conf
register => 1234567890:Passwort@antisip.com/1234567890 ; Antisip

und wie bereits gezeigt ist auch dieser Code-Schnipsel notwendig

; das hier ist auch in der sip.conf
; ausgehende antisip Leitung 1234567890
[antisip]
context=antisip-in ; entsprechenden context in der extensions.conf beachten
host=sip.antisip.com
username=1234567890
secret=Passwort
fromuser=1234567890
fromdomain=sip.antisip.com
canreinvite=no
qualify=yes
nat=force_rport
type=friend

Entsprechend sind dann folgende Einträge in der extensions.conf vorhanden: Es handelt sich um den Context [antisip-in]:

; und das steht in der extensions.conf

[antisip-in] ; siehe dazu in der sip.conf context=antisip-in
; von aussen Antisip-Nummer 1234567890 wählen und es geht zu callthrough,s,1
exten => 1234567890,1,Goto(callthrough,s,1)

Wer also im Netz von AntiSip die 1234567890 wählt, landet im Asterisk-Server, der den eingehenden Anruf auf den den context [callthrough] Zeile s,1 weiterleitet:

[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)=30)
exten => s,7,WaitExten
exten => s,8,Playback(vm-dialout)
exten => s,9,Dial(SIP/1001,45,tT) ; wenn keine Nummer eingetippt, gehts zur 1001
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()

Die ist etwas kompliziert und macht folgendes. Der Nutzer landet nach der Wahl der Telefonnummer 1234567890 auf den Context Callthrough Zeile s,1. Er hört das Klingelzeichen. Dann fordert ihn eine Stimme auf die gewünschte Zielnummer einzutippen und mit der  Raute # abzuschließen. Tippt er zum Beispiel die 1002# ein, klingelt die Nebenstelle 1002#, die sich vielleicht in Kalifornien befindet, während der SIP-Server sich in Schweden befindet und der Anrufer auf Bali im Urlaub ist und dort auf seinem Smartphone ein Softphone verwendet mit einem Account von AntiSip. Weiß der Anrufer nicht, was er eintippen soll, klingelt nach einer Weile die 1001, die das Gespräch nach 1002 von Hand weiterleiten könnte.

Gespräche an eine andere Telefonnummer übergeben: Angenommen 1001 und 1002 unterhalten sich. Einer der beiden weiß nicht mehr weiter und verweist auf den Spezialisten mit der 1003. Er oder sie tippt dann während des Gesprächs die #1003 und es klingelt die 1003. Dafür ist in features.conf folgender Eintrag notwendig:

Die gesamte features.conf:

[general]

[featuremap]
blindxfer => #    ; Blind transfer  (default is #)
                  ; Make sure to set the T and/or t option in the Dial() or Queue() app call!

Das ist schon alles. Allerdings darf in den Wahlregeln der extensions.conf nicht das t und T fehlen:

exten => _1XXX,1,Dial(SIP/${EXTEN},60,rtT)

Am Ende steht deshalb tT. Die Argumente 60,rtT bedeuten folgendes: Es klingelt 60 Sekunden, r veranlasst das Klingeln, ist aber nicht notwendig. tT bedeutet sowohl der Anrufer als der Angerufene dürfen Gespräche abgeben.

Portforwarding in der rtp.conf:  Im Router muss eine Portweiterleitung für UDP von 10205 bis 10500 erfolgen, damit man nach draußen über das Internet telefonieren kann. Dies muss zusätzlich auch Asterisk in der rtp.conf mitgeteilt werden. Die gesamte rtp.conf sieht so aus:

; Eintrag in der rtp.conf fuer 
; UDP-Portweiterleitung des Routers
; von 10205 bis 10230

[general]
rtpstart=10205
rtpend=10500

Dieser Bereich reicht für den kleinen SIP-Server, um mehrere Audio-Streams, also Telefonate, gleichzeitig zu bewältigen ( https://de.wikipedia.org/wiki/Real-Time_Transport_Protocol ).

Im Router sind also folgende Portweiterleitungen für die interne statische IP des Asterisk-Servers einzutragen:

UDP 5063 – 5066 (wahrscheinlich würde 5064 reichen)

UDP 10205 – 10500 (Diese Ports sind laut https://de.wikipedia.org/wiki/Liste_der_standardisierten_Port nicht belegt).

Im Router sollte nach Möglichkeit SIP ALG abgeschaltet sein ( https://www.voip-info.org/routers-sip-alg/ ).

Die logger.conf: Für das Logging sollte man sich die logger.conf sichern oder entsprechend anlegen. Sie wird zum Beispiel für den Betrieb von Fail2Ban benötigt:

[general]
dateformat=%F %T       ; ISO 8601 date format

[logfiles]

console => notice,warning,error,debug
messages => security,notice,warning,error

Mehr muss man für den Einstieg eigentlich nicht wissen, um für private Zwecke einen kleinen Asterisk-Server einzurichten, damit die Familie oder Freunde über das eigene Netz telefonieren können. Leider findet meine Frau die Bedienung meiner Telefonanlage zu kompliziert und sie verwendet nur noch ihr Handy.

Anrufbeanworter (AB) hinzufügen: Früher erledigte das für relativ viel Geld ein kleines Tonbandgerät. In Asterisk ist das eine Kleinigkeit und mit ein paar Programmzeilen erledigt, wenn man auf die E-Mail-Benachrichtigung verzichtet, denn dazu müsste man Postfix installieren. Ausprobiert habe ich den AB unter Asterisk 16.2.1. Geholfen hat mir dabei das Beispiel unter

http://das-asterisk-buch.de/1.6/minimale-telefonanlage.html.

Bei meinem Beispiel soll zum Ausprobieren nur die Nummer 1001 einen Anrufbeantworter erhalten. Dazu müssen wir eine voicemail.conf anlegen, in der nur wenig steht:

; vollständige voicemail.conf
; für einen Anrufbeantworter des Anschlusses 1001

[general]
format = wav

[default]
1001 => 12345,Anton Mustermann,anton.mustermann@xxxx.de
;
; da bei dieser einfachen Installation weder ein Passwort noch eine E-Mail-Benachrichtigung
; mit Postfix eingerichtet ist, dürfen das Passwort 12345 und der weitere Rest
; eine reine Erfindung sein.

Es fehlen noch ergänzende Einträge in der extensions.conf:

exten => 1001,1,Dial(SIP/1001,30) ; 30 bedeutet nach 30 Sekunden meldet sich der AB
exten => 1001,2,VoiceMail(1001,u) ; Der Anrufbeantworter meldet sich zur Spracheingabe

exten => 2000,1,VoiceMailMain(${CALLERID(num)},s)
; sorgt dafür, dass durch das Wählen der Nummer 2000 vom Anschluss 1001 der
; Anrufbeantworter für den Anschluss 1001 abgehört werden kann.

Das ist alles. Zeile 2 fügt einen Anrufbeantworter hinzu. Zeile 4 sorgt dafür, dass durch das Wählen der Nummer 2000 vom Anschluss 1001 der Anrufbeantworter  für den Anschluss 1001 abgehört werden kann. Eine us-amerikanische Stimme erklärt dabei welche Tasten zu drücken sind.

Eleganter funktioniert der nachfolgende Eintrag in die extensions.conf für die Nummern 1000 bis 1999. Der Nutzer setzt vor die Zielnummer (von 1000 bis 1999) eine 22 und kommt dann direkt auf den Anrufbeantworter der Zielnummer. Abhören kann man den AB mit der Nummer 2222 von seiner eigenen Telefonnummer.

; Voicemail durch die Vorwahl 22 für die Nummern 1000 bis 1999
exten => _221XXX,1,Voicemail(u${EXTEN:2}) ; die ersten beiden Ziffern werden mit {EXTEN:2} entfernt
exten => _221XXX,2,Hangup
exten => 2222,1,VoicemailMain(s${CALLERID(num)})
exten => 2222,2,Hangup

Dies funktioniert nur, wenn wie bereits beschrieben der entsprechende Eintrag für jede Nummer in der voicemail.conf vorhanden ist. Schließlich will nicht jeder Teilnehmer einen AB haben. Ich verwende den AB nur, um die Sprachqualität der Telefone zu testen.

Luxus-Sprachhinweise: Es folgen Sprachmeldungen bei Besetzt, Abwesend, kein Anschluss unter dieser Nummer und so weiter. Dies gibt der Telefonanlage eine besondere Note. Oder es ist als nette Spielerei anzusehen:

; in der extensions.conf, angepasst für Asterisk 16.2.1
; _1XXX gilt fuer alle Zahlen von 1000 bis 1999
exten => _1XXX,1,Dial(SIP/${EXTEN},60,rtT)
exten => _1XXX,2,GotoIf($[${DIALSTATUS} = NOANSWER]?22)    ; geht nicht ans Telefon
exten => _1XXX,3,GotoIf($[${DIALSTATUS} = CHANUNAVAIL]?17) ; Channel nicht erreichbar
exten => _1XXX,4,GotoIf($[${DIALSTATUS} = CONGESTION]?13)  ; Leitung überlastet, Fehler
exten => _1XXX,5,GotoIf($[${DIALSTATUS} = BUSY]?7)         ; Besetzt
exten => _1XXX,6,Hangup
exten => _1XXX,7,Playback(im-sorry)
exten => _1XXX,8,Playback(telephone-number)
exten => _1XXX,9,SayNumber(${EXTEN})     
exten => _1XXX,10,Playback(is-in-use)     
exten => _1XXX,11,Playback(please-try-call-later)                  
exten => _1XXX,12,Hangup             
exten => _1XXX,13,Playback(beep) ; Ueberlastung des Systems
exten => _1XXX,14,Playback(beep)
exten => _1XXX,15,Playback(tt-somethingwrong)
exten => _1XXX,16,Hangup
exten => _1XXX,17,Playback(beep)
exten => _1XXX,18,Playback(ss-noservice) ; Nummer nicht erreichbar
exten => _1XXX,19,Playback(please-try-call-later)
exten => _1XXX,20,Playback(beep)
exten => _1XXX,21,Hangup
exten => _1XXX,22,Playback(im-sorry)
exten => _1XXX,23,Playback(telephone-number) ; niemand geht ran
exten => _1XXX,24,SayNumber(${EXTEN}) ; niemand geht ran
exten => _1XXX,25,Playback(number-not-answering) ; niemand geht ran
exten => _1XXX,26,Playback(number-not-answering) ; niemand geht ran
exten => _1XXX,27,Wait(1)
exten => _1XXX,28,Playback(you-entered) ; niemand geht ran
exten => _1XXX,29,Playback(telephone-number) ; niemand geht ran
exten => _1XXX,30,SayDigits(${EXTEN}) ; niemand geht ran
exten => _1XXX,31,Playback(im-sorry)
exten => _1XXX,32,Playback(goodbye)
exten => _1XXX,33,Hangup

Anpassung für die schwedische Wählscheibe:  Die schwedische Wählscheibe hat die Ziffernfolge 0123456789 aufgedruckt, während die deutschen und die meisten anderen Wählscheiben die Ziffernfolge 1234567890 als Aufdruck verwenden. Die Mechanik des Nummernschalters ist prinzipiell gleich.

Links eine deutsche Wählscheibe, rechts eine schwedische Wählscheibe. Die Mechanik ist im Prinzip gleich, nur die Bedruckung der Ziffernabfolge unterscheidet sich. Wer auf einer schwedischen Wählscheibe eine “0” wählt, wählt in Wirklichkeit die Impulsfolge einer “1”.

Damit man nicht umrechnen muss, kann man folgenden Trick in der extensions.conf für bestimmte Nummern verwenden, die man häufig verwendet.

exten => 2110,1,Dial(SIP/1009,60,tT)
exten => 1234567890,1,Dial(SIP/0123456789,60,tT)

Orientiert sich jemand am Aufdruck einer schwedischen Wählscheibe und wählt die 2110, dann wählt er in Wirklichkeit die 1009. Mir ist selbstverständlich klar, dass es kaum jemanden auf der Welt geben wird, der unbedingt schwedische Wählscheibentelefone an einer Asterisk-Telefonanlage betreiben will.

Obiges Beispiel gilt nur für eine SIP-Nummer. Für einen Nummernblock von 1000 bis 1899 reichen wenige Zeilen aus. Für 900 Nummern reichen vier Zeilen aus:

; Nummernabfolge schwedische Wählscheibe:    0123456789 (der übliche schwedische Sonderweg)
; Nummernabfolge in den meisten Ländern:     1234567890
;
; Lösung für den Nummernblock von ca. 1000 bis 1899.
; die schwedischen Telefone kommen nur für interne Telefonate zum Einsatz.
exten => _2XXX,1,Dial(SIP/$[${EXTEN} - 1111],60,rtT) ; zieht 1111 ab
exten => _2XX0,1,Dial(SIP/$[${EXTEN} - 1101],60,rtT) ; wenn die 4. Ziffer eine 9
exten => _2X0X,1,Dial(SIP/$[${EXTEN} - 1011],60,rtT) ; wenn die 3. Ziffer eine 9
exten => _2X00,1,Dial(SIP/$[${EXTEN} - 1001],60,rtT) ; wenn die 3. u. 4. Ziffer eine 9
;
; Wählt man auf der schwedischen Wählscheibe eine Ziffer,
; muss man eine 1 abziehen. Nur bei der 0 klappt das nicht,
; weil die 0 zur 9 wird. 
; Die Nummern 1900 bis 1999 lasse ich aus Bequemlichkeit deshalb weg.
; Ganz Faule vergeben keine Nummern, welche die Ziffer 9 enthalten.
;
; Für die Nummern 1900 bis 1999 ist der Aufwand groß:
;
exten => _20XX,1,Dial(SIP/$[${EXTEN} - 111],60,rtT) ; wenn die 2. Ziffer eine 9
exten => _200X,1,Dial(SIP/$[${EXTEN} - 11],60,rtT) ; wenn die 2. u. 3. Ziffer eine 9
exten => _20X0,1,Dial(SIP/$[${EXTEN} - 101],60,rtT) ; wenn die 2. u. 4. Ziffer eine 9
exten => 2000,1,Dial(SIP/$[${EXTEN} - 1],60,rtT) ; wenn die 2. 3. u. 4. Ziffer eine 9
;
; Um das Zusammenspiel der Zeilen zu verstehen, 
; muss man wissen, dass Asterisk immer der Anweisung den Vorzug gibt,
; welche genauer ist, falls sie zutrifft. 
;
; Von Nachteil ist, dass jeder Teilnehmer über zwei Nummern zu erreichen ist.
; Der Nummernblock von 2000 bis 2999 ist also zusätzlich zu reservieren.
; Jedem Telefon werden also zwei Nummern zugeteilt, damit schwedische und deutsche
; Wählscheiben ohne Umschaltung zu verwenden sind.
;
; Mathematische Operatoren in Asterisk: 
; http://www.asteriskdocs.org/en/2nd_Edition/asterisk-book-html-chunk/asterisk-CHP-6-SECT-1.html 
; "Expressions and Variable Manipulation Chapter 6. More Dialplan Concepts"

Wenn es sich nicht um SIP-Nummern handelt, sondern um Testnummern (expressions) und dergleichen, dann ändert sich die Syntax etwas:

; für einen Nummernblock von ca. 400 bis 488, wenn die zweite Ziffer keine 9 ist.

exten => _5XX,1,Goto(telefone,$[${EXTEN} - 111],1)
exten => _5X0,1,Goto(telefone,$[${EXTEN} - 101],1)

; siehe auch http://www.asteriskdocs.org/en/2nd_Edition/asterisk-book-html-chunk/asterisk-CHP-6-SECT-1.html
; "Expressions and Variable Manipulation Chapter 6. More Dialplan Concepts"

Rufumleitung als Sonderbehandlung für wichtige Anrufer: Wenn der wichtige Anrufer 1005 die 1002 wählt, springt das Programm mit dem Befehl GotoIf direkt zu 100, was die 1088, die 1007 und die 1008 klingeln lässt.

Alle anderen Anrufer, die die 1002 wählen, lässt das Programm auf die 200 springen und sie werden normal auf 1002 weitergeleitet.

; Wir sind in der extensions.conf

exten => 1002,1,GotoIf($[${CALLERID(num)} = 1005]?100:200)
exten => 1002,100,Dial(SIP/1088&SIP/1007&SIP/1008,45,tT)
exten => 1002,200,Dial(SIP/${EXTEN},45,tT)

; Wenn der wichtige Anrufer 1005 die 1002 wählt, 
; springt das Programm mit dem Befehl GotoIf direkt zu 100,
; was die 1088, die 1007 und die 1008 klingeln lässt.
; Alle anderen Anrufer, die die 1002 wählen, 
; lässt das Programm auf die 200 springen 
; und sie werden normal auf 1002 weitergeleitet.

Zeit- und Datumsansage: Beim Wählen der Nummer 2424 wird die Uhrzeit und das Datum aufgesagt. Als es noch kein Internet gab, waren solche Telefonauskünfte gefragt. Heute ist es eine nette Spielerei.

; in der extensions.conf unterzubringen
;ZEIT- UND DATUMSANSAGE
;beim Wählen der Nummer 2424
exten => 2424,1,Ringing()
exten => 2424,n,Wait(1)
exten => 2424,n,SayUnixTime(,Europe/Berlin,AdBY)
exten => 2424,n,Wait(1)
exten => 2424,n,SayUnixTime(,Europe/Berlin,H)
exten => 2424,n,Playback(hours)
exten => 2424,n,SayUnixTime(,Europe/Berlin,M)
exten => 2424,n,Playback(minutes)
exten => 2424,n,SayUnixTime(,Europe/Berlin,S)
exten => 2424,n,Playback(seconds)
exten => 2424,n,Wait(1)
exten => 2424,n,Playback(vm-goodbye)
exten => 2424,n,Wait(1)
exten => 2424,n,Hangup()

Was ist meine eigene Nummer? Dieser Code-Schnipsel sagt die eigene Telefonnummer an, wenn man die 55555 wählt:

; Ansage gibt eigene Nummer zurück
exten => 55555,1,Ringing()
exten => 55555,n,Answer()
exten => 55555,n,Wait(1)
exten => 55555,n,SayDigits(${CALLERID(num)}) ; Ansage Ziffer für Ziffer
exten => 55555,n,Wait(1)
exten => 55555,n,SayNumber(${CALLERID(num)}) ; Ansage als Zahl
exten => 55555,n,Wait(1)
exten => 55555,n,HangUp()

Telefon-Konferenzschaltungen mit Asterisk und Confbridge: Mit Confbridge lassen sich in Asterisk mehrere Konferenzräume schaffen, in den sich beliebig viele Teilnehmer treffen und unterhalten können.  Pin-Nummern lassen sich per Telefon setzen, die Zugang für einen ausgewählten Teilnehmerkreis ermöglichen. Unter

https://elektronikbasteln.pl7.de/telefon-konferenzschaltungen-mit-asterisk-und-confbridge 

ist die Programmierung beschrieben.

Abspielen von MP3-Streaming-Adressen: Damit Asterisk das MP3-Protokoll verstehen kann, muss unter Linux bzw. unter Raspbian der entsprechende Dekoder mpg123 installiert sein. Dies geschieht wie üblich in der Konsole auf der Kommandozeilenebene von Linux (auf einem Raspberry Pi also unter Raspbian) mit dem Befehl

sudo apt-get install mpg123

Unter Raspbian des Raspberry Pi ist das schon alles. Getestet mit der Asterisk-Version 16.xx und Raspbian vom Februar 2020.

Um zum Beispiel den Deutschlandfunk zu hören, tragen wir in der extensions.conf das Folgende ein:

; Wer die 337 wählt, hört den Deutschlandfunk.
; mpg123 ist mit "sudo apt-get install mpg123" vorher unter Raspbian zu installieren.
exten => 337,1,Answer()
exten => 337,n,MP3Player(http://st01.dlf.de/dlf/01/64/mp3/stream.mp3)

Wählt jemand die 337, dann hört er den Deutschlandfunk. Die Klangqualität ist nicht berauschend, aber für das Abhören der Nachrichten oder als Hintergrundgedudel über die Freisprecheinrichtung reicht es. Testweise habe ich den Raspberry Pi 3 B+ mit 10 Streams gleichzeitig belastet. Die CPU-Auslastung lag etwas über 10%.

Telefone mit Freisprecheinrichtung lassen sich als Webradio nutzen. IP-Telefone sind besonders gut geeignet. Wegen der kleinen Lautsprecher ist die Klangqualität allerdings bescheiden. Für die Hintergrundmusik oder die Nachrichten reicht sie aber. Rechts oben im Display zeigt das Symbol “HD” an, dass der Audio-Codec G.722 zum Einsatz kommt, der einen Frequenzumfang von 50 – 8000 Hz bietet. Dies ist für den Frequenzumfang älterer Menschen meistens völlig ausreichend. Immerhin klingt das besser als Hörfunk auf  Lang- bis Kurzwelle.
Ein IP-Telefon bietet eine bequeme Auswahl der gewünschten Web-Radio-Stationen.

Wer den vollen Musikgenuss erlangen möchte, greift lieber zum VLC-Player und erstellt M3U-Dateien. Anleitungen dazu gibt in Hülle und Fülle.

Da dieser zusätzliche Service wider Erwarten bei meinen Teilnehmern gut ankommt, habe ich diesen Service mit verschiedenen Musik- und Geschmacksrichtungen erweitert:

; RADIOSENDER MP3-STREAMING

; Stand 12 September 2021
; mpg123 ist mit "sudo apt-get install mpg123" vorher unter Raspbian zu installieren.

; Deutschlandfunk
exten => 401,1,Set(SIP_CODEC=g722) ; erzwingt den Audio-Codec G722, falls unterstützt. Klingt dann besser.
exten => 401,n,Answer()
exten => 401,n,MP3Player(http://st01.dlf.de/dlf/01/64/mp3/stream.mp3)
exten => 401,n,Hangup() ; Auflegen reagiert damit schneller.
exten => 512,1,Goto(telefone,401,1) ; wegen der abweichenden Beschriftung schwedischer Wählscheiben.
;
; Deutschlandfunk Kultur
exten => 402,1,Set(SIP_CODEC=g722)
exten => 402,n,Answer()
exten => 402,n,MP3Player(http://st02.dlf.de/dlf/02/64/mp3/stream.mp3)
exten => 402,n,Hangup()
exten => 513,1,Goto(telefone,402,1)
;
; SWR1 BW
exten => 403,1,Set(SIP_CODEC=g722)
exten => 403,n,Answer()
exten => 403,n,MP3Player(http://liveradio.swr.de/sw282p3/swr1bw/play.mp3)
exten => 403,n,Hangup()
exten => 514,1,Goto(telefone,403,1)
;
; SR P1 
exten => 404,1,Set(SIP_CODEC=g722)
exten => 404,n,Answer()
exten => 404,n,MP3Player(http://http-live.sr.se/p1-mp3-64)
exten => 404,n,Hangup()
exten => 515,1,Goto(telefone,404,1)
;
; BBC World Service 
exten => 405,1,Set(SIP_CODEC=g722)
exten => 405,n,Answer()
exten => 405,n,MP3Player(http://stream.live.vc.bbcmedia.co.uk/bbc_world_service)
exten => 405,n,Hangup()
exten => 516,1,Goto(telefone,405,1)
;
; Smooth Jazz CD101.9 New York 
exten => 406,1,Set(SIP_CODEC=g722)
exten => 406,n,Answer()
exten => 406,n,MP3Player(http://hestia2.cdnstream.com/1277_192)
exten => 406,n,Hangup()
exten => 517,1,Goto(telefone,407,1)
;
; Cinemix 
exten => 407,1,Set(SIP_CODEC=g722)
exten => 407,n,Answer()
exten => 407,n,MP3Player(http://listenwmp.cinemix.fr)
exten => 407,n,Hangup()
exten => 518,1,Goto(telefone,408,1)
;
; KCEA 
exten => 408,1,Set(SIP_CODEC=g722)
exten => 408,n,Answer()
exten => 408,n,MP3Player(http://streaming.rubinbroadcasting.com/kcea)
exten => 408,n,Hangup()
exten => 519,1,Goto(telefone,409,1)
;
; Euro Smooth Jazz
exten => 409,1,Set(SIP_CODEC=g722)
exten => 409,n,Answer()
exten => 409,n,MP3Player(http://stream.laut.fm/eurosmoothjazz)
exten => 409,n,Hangup()
exten => 510,1,Goto(telefone,409,1)
;
; Big Band
exten => 410,1,Set(SIP_CODEC=g722)
exten => 410,n,Answer()
exten => 410,n,MP3Player(http://streams.calmradio.com/api/177/128/stream)
exten => 410,n,Hangup()
exten => 521,1,Goto(telefone,410,1)

; Wie finde ich die Streaming-Adressen?
; Zum Beispiel auf 
; https://vtuner.com/setupapp/guide/asp/BrowseStations/startpage.asp
; Dort Station aussuchen und reinhören.
; Im Browser Mozilla auf den Startbutton des Vtuner-Players
; mit der rechten Maustaste klicken.
; "Seitenquelltext anzeigen" im Popup-Fenster auswählen.
; Mit Strg+F nach mp3 im Quelltext suchen.
; Die entsprechende Streaming-Adresse herauskopieren.

Macros verwenden: Mit Macros lassen sich unter Asterisk solche Programmabschnitte, die nach dem gleichen Muster aufgebaut sind, vereinfachter und kompakter darstellen. Bleiben wir bei dem obigen Web-Streaming-Beispiel. Zur Wiederholung sind als Beispiel nachfolgend drei Webradiosender aufgeführt:

exten => 401,1,NoOp("Deutschlandfunk")
exten => 401,n,Set(SIP_CODEC=g722)
exten => 401,n,Answer()
exten => 401,n,MP3Player(http://st01.dlf.de/dlf/01/64/mp3/stream.mp3)
exten => 401,n,Hangup()
;
exten => 402,1,NoOp("Deutschlandfunk Kultur")
exten => 402,1,Set(SIP_CODEC=g722)
exten => 402,n,Answer()
exten => 402,n,MP3Player(http://st02.dlf.de/dlf/02/64/mp3/stream.mp3)
exten => 402,n,Hangup()
;
exten => 403,1,NoOp("SWR1 BW")
exten => 403,n,Set(SIP_CODEC=g722)
exten => 403,n,Answer()
exten => 403,n,MP3Player(http://liveradio.swr.de/sw282p3/swr1bw/play.mp3)
exten => 403,n,Hangup()



Wie oben zu sehen ist, läuft der Aufruf der drei Webradiostationen immer nach dem gleichen Muster ab. Für jeden Stationsaufruf sind 4 Zeilen vorgesehen. Bei wenigen Stationen ist das noch kein Problem. Bei 20 Stationen wäre die Tipperei schon lästig. Wir schreiben deshalb ein kleines Macro:

; Wir sind in der extensions.conf
; MACRO ZUM ABSPIELEN VON MP3-STREAMS (mpg123 mit "sudo apt-get install mpg123" vorher installieren)
[macro-webradio]               ; ARG1 = Stationsname - ARG2 = Audio-Streaming-Adresse
exten => s,1,NoOP(${ARG1})     ; NoOP hat keine Funktion, erscheint nur in der Assterisk-Konsole
 same => n,Set(SIP_CODEC=g722) ; schaltet auf G.722-Audio-Codec um, falls Endgerät unterstützt.
 same => n,Answer()            ; Baut die Verbindung auf, hebt den Hörer ab
 same => n,MP3Player(${ARG2})  ; Abspielen der Streaming-Adresse
 same => n,Hangup()            ; nicht notwendig, Auflegen klappt besser.

Dieses kleine Macro trägt den Namen webradio und besitzt 2 Platzhalter: ARG1 und ARG2. In ARG1 steht der Stationsname und in ARG2 die Streaming-Adresse. Mit Hilfe dieses Macros lassen sich die drei Stationen viel eleganter aufrufen:

[telefone] ; Bei mir stehen die Extensions historisch bedingt im Abschnitt telefone

; Macro-Aufruf getestet mit Asterisk 16.2.1, 
; ältere Versionen verlangen eventuell eine andere Syntax

exten => 401,1,Macro(webradio,"Deutschlandfunk",http://st01.dlf.de/dlf/01/64/mp3/stream.mp3)
exten => 402,1,Macro(webradio,"Deutschlandfunk Kultur",http://st02.dlf.de/dlf/02/64/mp3/stream.mp3)
exten => 403,1,Macro(webradio,"SWR1 BW",http://liveradio.swr.de/sw282p3/swr1bw/play.mp3)

Für jede Station wird nur noch eine Programmzeile benötigt. Der Deutschlandfunk wird mit der Nummer 401 angewählt, Deutschlandradio Kultur mit 402 und so weiter.

Man beachte, dass die die Kommatas zwischen den Argumenten ohne Leerzeichen zu setzen sind. Diese Schreibweise habe ich mit  Asterisk Version 16 getestet. Ältere Asterisk-Versionen verlangen eine andere Schreibweise. Die Platzhalter müssen ARG1, ARG2, ARG3 und so weiter lauten Sie müssen im Macro mit in geschweiften Klammern stehen und mit einem Dollarzeichen eingeleitet werden, z.B. ${ARG1}.

Eigene Sprachdateien erzeugen: Früher musste man  für Textansagen einen professionellen Sprecher engagieren. Man traf sich in einem Tonstudio. Der Auftraggeber musste das Studio mieten, die Reisekosten begleichen und das Honorar bezahlen. Das kostete viel Zeit und viel Geld.

Heute geht das einfacher. Wir tippen unseren Text auf https://www.texttomp3.online/ oder https://ttsmp3.com/ ein, wählen die Sprache und Sprecher oder die Sprecherin aus und lassen den Text als MP3-File ausgeben. Die beiden Dienste funktionieren online ohne Anmeldung.

Das nachfolgende MP3-File ist mit Hilfe von ttsmp3.com entstanden. Als Sprecherin kam die deutschsprachige “Vicki” zum Einsatz. Ihre Stimme klingt beinahe natürlich. Einige Wörter leiden unter einer falschen Betonung. Dieses MP3-File erzählt die Geschichte meines Asterisk-Servers in knapp 2 Minuten:

Die Sprachdateien  von https://ttsmp3.com/ klingen erstaunlich natürlich und bewältigen viele Sprachen. Leider ist die maximale Zahl der Wörter pro Tag begrenzt, wenn man nicht zu den zahlenden Kunden gehören möchte.

Die MP3-Dateien haben für Asterisk den Nachteil, dass wir mpg123 auf Linux nachinstallieren müssen (unter Raspbian “sudo apt-get install mpg123”). Mansche MP3-Dateien sind auch etwas zu leise. Sie starten auch mit einer manchmal merklichen Zeitverzögerung.

; Abspielen von MP3-Sounddateien

exten => 777,1,Answer() ; unbedingt notwendig
exten => 777,n,MP3Player(/usr/share/asterisk/sounds/mp3/kurzegeschichte.mp3)
exten => 777,n,Hangup() ; Auflegen geht schneller

; Die Endung .mp3 ist zwingend notwendig.
; Wählt der Nutzer 777, wird die Audio-Datei kurzegeschichte.mp3 abgespielt.
; mpg123 muss unter Linux / Raspian installiert sein ("sudo apt-get install mpg123").

Wir können diese MP3-Dateien online sehr leicht in Formate umwandeln, die Asterisk besser verarbeiten kann. Dazu gehen wir auf https://g711.org/. Ausprobiert habe ich die Konvertierung in die Standard Definition WAV und in die Asterisk G.722 für eine bessere Tonqualität. Nicht funktioniert hat a-law. Die gewünschte Lautstärke lässt sich einstellen. Medium reicht meistens aus. Von Nachteil ist auch, dass sich MP3-Dateien nicht mit Background() abspielen lassen.

exten => s,4,Background(/usr/share/asterisk/sounds/eigene/zielnummer)

; Aufruf der Datei zielnummer.wav oder zielnummer.g722 mit Pfadangabe.
; Die Dateiendung muss weggelassen werden.
; Zum Einsatz kommt Background(), damit der Nutzer während der
; Sprachausgabe Ziffern eintippen kann.


; ECHOTEST (HALL, ZEITVERZOEGERUNG)
exten => 222,1,Answer()                ; Abheben
exten => 222,n,Playback(demo-echotest) ; Ansage
exten => 222,n,Echo                    ; Echotest
exten => 222,n,Playback(demo-echodone) ; Bestaetigung
exten => 222,n,Hangup()                ; Auflegen

; Abspielen von Sound-Dateien mit Playback.
; Pfadangabe entfällt, wenn sich die Sounddateien
; im vordefinierten Pfad befinden.
; Nutzer muss 222 wählen.

Verschicken von Textnachrichten über Asterisk:  Ab Asterisk 11 lassen sich  Texte über das SIP-Protokoll verschicken. Dies geht laut den Anregungen von Conrad de Wet unter https://github.com/InnovateAsterisk/Browser-Phone und nach einer Anleitung von Gerd (einen ganz großen Dank an dieser Stelle) ganz einfach. Getestet auf Raspberry Pi 3 B+, Raspbian vom Februar 2020, und Asterisk 16.2.1. Die Textübermittlungen wurden mit den Softphones PhonerLite,  Sipnetic, Linphone für Android und MicroSip getestet.

Damit man Textnachrichten über dafür geeignete Softphones verschicken und empfangen kann, müssen die sip.conf und extensions.conf um ein paar Einträge ergänzt werden. Das ist alles.

Egänzungen in der sip.conf:

[general] ; Wir sind in der sip.conf

; Am Ende von [general] sind folgende drei Zeilen
; für die Textübermittlung einzutragen.

accept_outofcall_message=yes ; muss unbedingt auf yes stehen
auth_message_requests=no
outofcall_message_context=textmessages

Ergänzungen in der extensions.conf:

; Wir sind in der extensions.conf

[textmessages] 
; Nachfolgend werden alle Telefonanschlüsse aufgeführt,
; die schreiben und lesen dürfen. Diese extensions (Nummern) sind
; bereits in den entsprechenden Contexten und in der sip.conf
; definiert.

exten => 1001,1,Gosub(send-text,s,1,(1001))
exten => 1002,1,Gosub(send-text,s,1,(1002))
exten => 1003,1,Gosub(send-text,s,1,(1003))

; die Nummern 1001, 1002 und 1003 dürfen also
; in diesem Beispiel
; Texte verschicken und empfangen. Man kann das
; natürlich eleganter schreiben. Kommt später.

; Und das muss auch noch reinkopiert werden:
[send-text]
exten => s,1,NoOp(Sending Text To: ${ARG1})
exten => s,n,Set(PEER=${CUT(CUT(CUT(MESSAGE(from),@,1),<,2),:,2)})
exten => s,n,Set(FROM=${SHELL(asterisk -rx 'sip show endpoint ${PEER}' | grep 'callerid ' | cut -d':' -f2- | sed 's/^\ *//' | tr -d '\n')})
exten => s,n,Set(CALLERID_NUM=${CUT(CUT(FROM,>,1),<,2)})
exten => s,n,Set(FROM_SIP=${STRREPLACE(MESSAGE(from),<sip:${PEER}@,<sip:${CALLERID_NUM}@)})
exten => s,n,MessageSend(sip:${ARG1},${FROM_SIP})
exten => s,n,Hangup()

Mir was es zu anstrengend für die Nummern 1000 bis 1999 Nummer für Nummer 1000 Zeilen zu schreiben, weshalb ich [textmessages] umgeschrieben habe:

[textmessages]
exten => _1XXX,1,Gosub(send-text,s,1(${EXTEN}))
; mit einer Zeile sind die Nummern 1000 bis 1999 abgedeckt.

Nach den Änderungen an der sip.conf und an der extensions.conf habe ich in der Asterisk-Konsole den Befehl “core reload” ausgeführt. Danach wurden Änderungen an der extensions.conf mit “dialplan reload” akzeptiert.

Versenden von Texten mit dem Windows-Softphone PhonerLite.
Beim Softphone PhonerLite lässt sich die Textnachrichten-Funktion über Menüleiste – Optionen – Nachrichten aktivieren.

Vom Softphone Sipnetic ging das Verschicken von Textnachrichten an PhonerLite manchmal nur, wenn ich die Zielnummer neu eingegeben hatte. Ich konnte nicht direkt antworten. Es gelang mir eine Nachricht an mein IP-Telefon Thomson TB-30 zu verschicken. Der empfangene Text blinkte dann auf dem  Display. Er verschwand erst nach dem Unterbrechen der Stromversorgung.

Leider speichert Asterisk die Texte nicht zwischen. Texte kommen nur an, wenn das Softphone der Zielnummer eingeschaltet ist. Ein Telefongespräch muss nicht laufen. Ob die Textnachricht tatsächlich angekommen ist, erfährt man nicht. Man erfährt nur, ob die Textnachricht erfolgreich abgeschickt worden ist.

Selbst das IP-Telefon Thomson TB-30 kann Textnachrichten empfangen. Nachteil: Die Meldung verschwindet erst, wenn man die Stromversorgung unterbricht oder die Gegenstelle ein Leerzeichen sendet. Ist das TB-30 an einer FritzBox angemeldet, funktioniert die Textübermittlung nicht.

Nachtrag vom 21.9.2021: Leider hatte mit dem obigen Skript das Chatten auf dem Android-Smartphone Sipnetic nicht funktioniert. Wollte man auf einen Text direkt antworten, kam eine Fehlermeldung, weil die SIP-URI (die Sip-Adresse) der eingehenden Textnachricht falsch übermittelt wurde.

Das Skript in der extensions.conf habe ich deshalb angepasst und es läuft bei mir einwandfrei auf Asterisk 16.2.1:

; Auszug aus der extensions.conf 
; Skript für das Versenden von Texten über das SIP-Protokoll
; getestet auf Asterisk 16.2.1

[textmessages]
exten => _1XXX,1,Gosub(send-text,s,1,(${EXTEN}))
;
[send-text]
exten => s,1,NoOp(Sending Text To: ${ARG1})
exten => s,n,NoOp(Message from: ${MESSAGE(from)})
exten => s,n,NoOp(Message to: ${MESSAGE(to)})
exten => s,n,NoOp(Message body: ${MESSAGE(body)})
exten => s,n,Set(PEER=${CUT(CUT(CUT(MESSAGE(from),@,1),<,2),:,2)})
exten => s,n,NoOp(peer: ${PEER})
exten => s,n,MessageSend(sip:${ARG1},${PEER})
exten => s,n,Hangup()

; ohne die NoOp-Anweisung mitgezählt besteht [send-text] aus drei Zeilen.

Ich habe noch nicht ganz verstanden, warum es funktioniert. In der sip.conf habe ich die einzelnen Telefonnummern der Nebenstellen recht schlicht gehalten und immer CallerIDs versehen. Hier ein Muster-Beispiel:

; Wir sind in der sip.conf
; Jede Ähnlichkeit mit der Wirklichkeit ist rein zufällig.
; Musteraufbau eines Accounts mit der Nummer 1444

[1444] ; Magdalena Andersson
type=friend
context=statsminister
secret=skatteparadisetsverige
host=dynamic
username=1444
canreinvite=no
port=5064
dtmfmode=rfc2833
callerid = "Magdalena Andersson" <1444>

In Sipnetic funktioniert jetzt das Chatten einwandfrei:

Chatten in Sipnetic geht jetzt. Zum Einsatz kann auch die Spracherkennung kommen, was das Tippen erspart.

Im Asterisk-CLI mit Verbose 3 ist folgendes zu sehen:

Die sieht man beim Chatten im CLI von Asterisk. Zum Vergrößern auf das Bild klicken.

Aus Sicherheitsgründen sind die IP-Adressen rot übermalt. Zu sehen ist eine Text-Konversation zwischen den Nummern 1003 und 1009. Die 1003 ist ein Sipnetic-Sofphone auf Android und die 1009 ist PhonerLite unter Windows.

Verbesserte Version mit Fehlermeldung bei Empfangsstörungen: Störend ist, dass keine Fehlermeldung erfolgt, wenn der Empfänger der Textnachricht offline ist, weil er zum Beispiel seinen PC ausgeschaltet hat oder das Softphone abgeschaltet ist. Das nachfolgende verbesserte Script schickt eine Fehlermeldung zurück, falls die Nachricht nicht angekommen ist.

[textmessages]
exten => _1XXX,1,Gosub(send-text,s,1,(${EXTEN}))  ; in GOSUB ist die erste Variable EXTEN und entspricht
                                                  ; in [send-text] ARG1
                                                  ; EXTEN enthält Empfänger-Nummer, z.B 1003

; Zum Versenden brauchen wir die Ziel-Telefonummer, im Beispiel die 1003. Die haben wir schon.
; Dann brauchen wir noch die Absender-Nummer, z.B. die 1009. Diese Nummer zu erhalten ist das eigentliche Problem.
; Nach dem Versenden der Nachricht, stellen wir fest, ob sie erfolgreich war. Wenn nicht lassen wir
; eine Fehlermeldung in umgekehrter Richtung verschicken.

[send-text]
                                                  ; Das sollte man wissen:
                                                  ; NoOP hat keine Funktion, dient nur zur Info für Fehlersuche
exten => s,1,NoOp(Sending Text To: ${ARG1})       ; von [send-text] ARG1 enthält Empfänger-Telefon-Nummer, z.B 1003
exten => s,n,NoOp(Message from: ${MESSAGE(from)}) ; vollständige SIP-Adresse des Absenders. Da steht zu viel drin.
exten => s,n,NoOp(Message to: ${MESSAGE(to)})     ; vollständige SIP-Adresse des Empfängers, hier nur zur Info
exten => s,n,NoOp(Message body: ${MESSAGE(body)}) ; Inhalt der Textnachricht

                                                  ; Nachfolgend geht es jetzt richtig los mit dem Skript
exten => s,n,Set(PEER=${CUT(CUT(CUT(MESSAGE(from),@,1),<,2),:,2)}) ; schneidet die Absender-Telefon-Nummer heraus.
exten => s,n,NoOp(peer: ${PEER})                  ; in PEER steht jetzt nur die Absender-Telefonnummer, z.B. 1009
exten => s,n,MessageSend(sip:${ARG1},${PEER})     ; versendet Nachricht nach 1003 (ARG1) mit Absenderadresse 1009 (PEER)

                                                  ; Nachricht wurde abgeschickt. Nachfolgend die Fehlerbehandlung
exten => s,n,NoOp(Message send status: ${MESSAGE_SEND_STATUS})             ; zeigt den Status des Versendes an
exten => s,n,GotoIf($["${MESSAGE_SEND_STATUS}" = "SUCCESS"]?erfolg:failed) ; erfolgreich versendet, gehe zu Zeile erfolg, 
                                                                           ; andernfalls zur Zeile failed                       

exten => s,n(erfolg),Hangup()                    ; bei erfolgreicher Versendung die Verbindung trennen
exten => s,n(failed),Set(MESSAGE(body)=Übertragungsfehler zum Teilnehmer ${ARG1}: ${MESSAGE_SEND_STATUS}) 
                                                 ; obige Zeile: Verfasst den Nachrichtinhalt im Falle eines Fehlers 
      
exten => s,n,MessageSend(sip:${PEER},${ARG1})    ; schickt den neuen Nachrichteninhalt mit der Fehlermeldung
                                                 ; von 1009 nach 1003. ARG1 und PEER wurden vertauscht

exten => s,n,Hangup()                            ; Verbindung trennen. Das wars schon.

; Falls die Nachricht nicht ankommt, erscheint beim Absender eine Fehlermeldung.
; Richtet sich die Textnachricht an ein normales Telefon, das erreichbar ist,
; erscheint keine Fehlermeldung, obwohl es keine Texte empfangen kann.
Asterisk-Konsele: Erfolgreiches Versenden einer Textnachricht “Bitte rufe mich an, wenn du da bist.” von der Telefonnummer 1009 zur Telefonnummer 1003. Getestet mit Asterisk 16.2.1. Für eine Großdarstellung auf das Bild klicken.

Abgefragt wird der Status von MESSAGE_SEND_STATUS. Liefert diese Funktion nicht SUCCESS zurück, wird eine Fehlermeldung an den Absender geschickt.

Es erscheint eine Fehlermeldung, weil die Gegenstelle nicht angemeldet ist.

Wenn man jedoch versucht an ein ganz normales Telefon, das keine Texte empfangen kann, eine Nachricht zu schicken, erfolgt leider kein Fehlermeldung, falls dieses Telefon erreichbar  – d.h. angeschlossen – ist.

Schickt man versehentlich eine Textnachricht an ein altes Telefon, erfolgt leider keine Fehlermeldung, wenn es am SIP-Server über eine FritzBox angemeldet ist.

Video-Telefonate mit Asterisk: Der kleine SIP-Server auf der Basis eines Raspberry Pi und Asterisk ist sogar in der Lage Video-Telefonate zu bewältigen. Ein Video-Telefonat belastet die CPU des Raspberry Pi 3 B+ mit etwa 5 bis 6%. Getestet habe ich die Konfiguration wieder auf Asterisk 16.2.1. Um auf  Asterisk die Videotelefonie einzurichten, müssen wir nur in der sip.conf ein paar weitere Zeilen eintragen und mehr nicht. Voraussetzung ist, dass die normale Audio-Telefonie bereits einwandfrei klappt:

; Ausschnitt aus der sip.conf für Video-Support
; getestet auf Asterisk 16.2.1 am 24.9.21
; um SIP auf auf Video "scharfzustellen" müssen wir die
; sip.conf um ein paar Einträge [general] ergänzen.
; Alles, was für Video-Telefonie hinzugefügt wurde,
; ist mit NEU kommentiert.
;
[general]
videosupport=yes     ; NEU muss auf yes stehen
                     ; NEU alle Telefon-Accounts können
                     ; NEU Video-Telefonate durchführen,
                     ; NEU falls die Endgeräte dies unterstützen.
port=5064
bindport=5064
context=telefone
bindaddr=0.0.0.0
allowguest=no
;
; Codecs
disallow=all
;
; Audio-Codecs
allow=alaw         
allow=ulaw
allow=gsm
allow=g722
;
; Video-Codecs    NEU Asterisk nimmt keine Transkodierung der Videoformate vor.
                ; NEU ähnlich wie bei den Audio-Codecs, müssen wir die Video-Codecs
                ; NEU eintragen, die verwendet werden dürfen.
allow=h264      ; NEU zwingend erforderlich, da die meisten Softphones h264 unterstützen.
allow=h261      ; NEU
allow=h263      ; NEU
allow=h263p     ; NEU
; allow=vp8     ; NEU wenn man will ... https://en.wikipedia.org/wiki/VP8
;
; ****** Type Of Service (TOS) Settings ******
; empfehlenswert, aber nicht zwingend notwendig
; https://www.voip-info.org/asterisk-sip-tos/
; http://qosasterisk.blogspot.com/2015/08/setting-tos-in-asterisk.html
; https://www.dialogic.com/webhelp/bordernet2020/2.0.0/webhelp/tossetting.htm
tos_sip=cs3    ; Sets TOS for SIP packets.
tos_audio=ef   ; Sets TOS for RTP audio packets.
tos_video=af41 ; Sets TOS for RTP video packets.  ; NEU
tos_text=af41  ; Sets TOS for RTP text packets.   ; NEU, eventuell NEU
;
; und nachfolgend geht es weiter wie gehabt.
;

Die Konfiguration der sip.conf ist wirklich ein Klacks. Der Knackpunkt sind die meist kostenlosen Softphones, welche auch Video unterstützen. Sie müssen richtig konfiguriert werden, damit die Videotelefonie einwandfrei funktioniert.

Unter https://elektronikbasteln.pl7.de/video-telefonie-mit-asterisk geht es weiter zum Hauptartikel über Asterisk und Video-Telefonie.

Zusammenfassung der Konfiguration in der sip.conf für die wichtigsten SIP-Provider: Nachfolgend eine unvollständige Auflistung für die sip.conf, die um die eigenen Zugangsdaten zu ergänzen ist.

Sipgate: Kostenlose öffentliche Telefonnummern, kostenlose Telefonate innerhalb des Sipgate-Netzes. Guthaben kann aufgeladen werden.

Ippi: Kostenlose Telefonate innerhalb des eigenen Netzes. Öffentliche Telefonnummern gegen Aufpreis, Gateway nach Skype noch nicht getestet.

Iptel, Sip2Sip, AntiSip, OpenSips: Geschlossene (nichtöffentliche) Netze für die Telefonie über SIP.

C*NET: ( https://www.ckts.info/ ): Nichtöffentliches Netz für Betreiber alter Telefone und alter Vermittlungstechnik, die ihre historische Technik mittels VoIP über das Internet zusammenschalten. Normalerweise wird das IAX-Protokoll verwendet. SIP-Accounts gibt es auf Anfrage per E-Mail auf Englisch. Die meisten Teilnehmer kommen aus Nordamerika und Großbritannien. Das C*NET enthält neben persönlichen Nummern sehr viele Testnummern, historische Zeitansagen und vieles mehr.

EinfachVoip: Bietet kostengünstige Telefonate in die in- und ausländischen öffentlichen Festnetz- und Mobilfunknetze. Guthaben aufladbar. Paypal möglich. Der Kunde erhält ein Nummer, die nicht angerufen werden kann. Er kann nur über eine verfizierte Nummer zurückgerufen werden. Persönliche Angaben müssen verfiziert werden.

; 21.10.2020
; Auszug aus der sip.conf
; Die nachfolgenden Konfigurationen funktionieren bei mir auf Asterisk 16.2.1
; Andere Hardware und andere Asterisk-Versionen können Anpassungen erfordern.

; Sipgate 
; https://www.sipgatebasic.de/
; kostenlose öffentliche Telefonnummer, Verifizierung der persönlichen
; Angaben notwendig. Wohnsitz muss in Deutschland sein.
;
; Testnummern:
; Willkommen bei Sipgate: 10000
; Echotest:             : 10005
;
register => 1234567e0:passwort@sipgate.de/1234567e0
;
[sipgate1]
context=sipgate-in
host=sipgate.de
username=1234567e0
secret=passwort
fromuser=1234567e0
fromdomain=sipgate.de
canreinvite=no
qualify=yes 
nat=force_rport
registertimeout=600
type=friend

; Iptel 
; https://www.iptel.org/ 
; für den Alias nur Ziffern verwenden.
;
; Testnummern: 
; Musik: music
; Echo : echo
;
81234567:passwort@iptel.org/81234567
;
[iptel]
context=iptel-in
host=iptel.org
username=81234567
secret=passwort
fromuser=81234567
fromdomain=iptel.org
canreinvite=no
qualify=yes
nat=force_rport
type=friend

; Antisip
; https://www.antisip.com/service/register.html
; Username darf nur aus Ziffern bestehen
;
812345:passwort@antisip.com/812345
;
[antisip] 
context=antisip-in
host=sip.antisip.com
username=812345
secret=passwort
fromuser=812345
fromdomain=sip.antisip.com
canreinvite=no
qualify=yes
nat=force_rport
type=friend

; Sip2sip
; https://mdns.sipthor.net/register_sip_account.phtml
; http://wiki.sip2sip.info/projects/sip2sip/wiki/SipDeviceConfiguration
; Als username nur Ziffern eingeben
;
; Testnummern:
; Musik: 3333
; Echo : 4444
;
register => 812345:passwort@sip2sip.info/812345
;
[sip2sip]
context=sip2sip-in
host=sip2sip.info
username=812345
secret=passwort
fromuser=812345
fromdomain=sip2sip.info
domain=sip2sip.info
outboundproxy=proxy.sipthor.net:5060
canreinvite=no
qualify=yes
nat=force_rport
type=peer

; Opensips
; http://voip.opensips.org/account/reg/
; Anweisungen durchlesen! Als Alias nur eine Zahl verwenden, die mit 9 beginnt.
;
a912345:passwort@opensips.org:5060/a912345
;
[opensips]
context=opensips-in
host=opensips.org
username=a912345
secret=passwort
fromuser=a912345
fromdomain=opensips.org
canreinvite=no
qualify=yes
nat=force_rport
dtmfmode=rfc2833
type=friend
port=5060

; Ippi
; https://www.ippi.com/
; Kostenlos innerhalb des eigenen Ippi-Netzes
;
register => abcde:passwort@sip.ippi.com:5060/abcde
;
[ippi]
context=ippi-in
host=sip.ippi.com
username=abcde
secret=passwort
fromuser=abcde
fromdomain=sip.ippi.com
canreinvite=no
qualify=yes
nat=force_rport
dtmfmode=rfc2833
type=friend
port=5060

; Nexxtmobile, EinfachVoip
; https://www.einfachvoip.de/
;
49xxx:passwort@voip.nexxtmobile.de:5060/49xxx
;
; Testnummern:
; Begrüßungstext: 1000
; Echo          : 1001
;
[voipnexxtmobile]
context=voipnexxtmobile-in
host=voip.nexxtmobile.de
username=49xxx
secret=passwort
fromuser=49xxx
fromdomain=voip.nexxtmobile.de
canreinvite=no
qualify=yes
nat=force_rport
dtmfmode=rfc2833
type=peer
port=5060

; C*NET Older Phones & Phone Systems on VoIP
; SIP-Account gibt es nur auf Anfrage per E-Mail auf Englisch
; sehr netter und hilfreicher Kontakt
; empfehlenswert für alle, die alte Telephone und elktromechanische
; Vermittlungstechnik betreiben oder sich mit Asterisk beschäftigen
; https://www.ckts.info/
;
register => username:passwort@IP-auf-Anfrage:5062/username
;
[cnet]
context=cnet-in
host=IP-auf-Anfrage
username=username
secret=passwort
fromuser=username
fromdomain=IP-auf-Anfrage
canreinvite=no
qualify=yes
nat=force_rport
dtmfmode=rfc2833
type=friend
port=5062

Anmerkungen zu Asterisk:  Asterisk ist ein Gemeinschaftsprojekt von vielen Entwicklern und bietet viele Funktionen. Nicht alles ist durchgängig dokumentiert und manchmal treten Effekte auf, für die es keine Erklärung gibt. Dann bleibt nichts anderes übrig als zu experimentieren. Manche Router verhalten sich auch störrisch beim Zugang ins Internet. Wichtig ist eine stabile Netzwerkanbindung, weshalb der Raspberry Pi über ein LAN-Kabel mit dem Netzwerk verbunden sein sollte.

Legt Euch bitte Sicherheitskopien an, bevor größere Änderungen vorgenommen werden, damit ihr schnell das gesamte System auf dem Raspberry wiederherstellen könnt.

Ich selbst kenne nur einen kleinen Ausschnitt der Möglichkeiten von Asterisk, den ich hier anfängerfreundlich und unmissverständlich für mich und andere dokumentieren möchte. Man muss aber nicht alles wissen, um erfolgreiche Asterisk-Projekte bewältigen zu können, die zuverlässig ihre Aufgabe erfüllen. Zudem habe ich festgestellt, dass jeder Programmierer andere Vorlieben entwickelt und einen anderen Stil besitzt. Dies liegt in der Natur der Dinge. Asterisk ist ein sehr mächtiges Werkzeug. Bekanntlich führen verschiedene Wege nach Rom.

Anmerkungen zu meinem Asterisk-Server: Wer gerne mit Asterisk arbeitet, möge mich unter sm5zbs ätt janson bindestrich soft punkt de gerne kontaktieren. Nur noch wenige haben Interesse an diesem außergewöhlichen Hobby.  Weiterhin suche ich technisch interessierte Teilnehmer für meinen Telefon-Server, die sich gerne über alter und neuer Telefontechnik unterhalten möchten. Oft sind darunter Funkamateure, die eine weitere Alternative zur drahtlosen Kommunikation suchen und gegenüber technischen Experimenten aufgeschlossen sind.

Sinn und Zweck meines Telefonservers ist es Menschen mit gemeinsamen Interessen respektvoll zusammenzubringen, die sonst nie in Kontakt treten würden. Während Foren nur auf der reinen Sachebene funktionieren, können sich erst durch das persönliche Gespräch freundschaftliche Beziehungen entwickeln.

Wer bereits zu den wenigen gehört, welche einen kostenlosen Account bei Sipgatge, Linphone, Sip2Sip, ippi, Opensips, Iptel oder AntiSip besitzen, hat dadurch einen kostenlosen Zugang zu meinem  Telefonserver. Also nur zu!

Seite für die Teilnehmer  meines Asterisk-Servers (Passwort erforderlich): Zugang nur für Mitglieder meines Telefon-Servers:

https://elektronikbasteln.pl7.de/neuigkeiten-und-status-berichte-des-asterisk-sip-servers

Wer Interesse an Asterisk oder alter und neuer Telefontechnik hat, erhält von mir gerne einen Telefon-Account für eine Telefonnummer. Besonders interessiert bin ich an der Zusammenschaltung verschiedener kleiner Asterisk-Server zu einem Netzwerk.

Viel  Freude und angenehme Gespräche wünscht Euch

Volker SM5ZBS  (sm5zbs ätt janson-soft punkt de)