15.10.2020 (aktualisiert am 29.10.2020, 25.09.2021, 1.05.2022)
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. Außerdem sind mit der Zeit hier zahlreiche Programmierbeispiele vorgestellt worden, die in der Linkliste zu finden sind.
Sämtliche Asterisk-Artikel sind auch hier zu finden:
Hurra! Mein Asterisk-Telefon-Server-Tutorial ist fertiggestellt – 9. März 2023: Das Tutorial besteht aus genau 40 Abschnitten und es ermöglicht Anfängern, auf einem Raspberry Pi einen eigenen Telefon-Server zu betreiben und diesen mit anderen Asterisk-Servern zu vernetzen. Zusätzlich sind zahlreiche wirkungsvolle Schutzmaßnahmen wie APIBAN und Fail2Ban beschrieben, um einen sicheren Betrieb zu gewährleisten. Asterisk läuft bei mir dank APIBAN jetzt wartungsfrei rund um die Uhr. Das Tutorial beinhaltet auch die Programmierung von AGI-Skripten auf Python und anderen Programmiersprachen, wodurch es fast keine Grenzen bei der Umsetzung gibt. – weiter – |
Hier geht es direkt zu meinen Asterisk-Artikeln für den Raspberry Pi, die in einer für den Einstieg sinnvollen Reihenfolge geordnet sind:
Asterisk-Telefonserver auf einem Raspberry Pi – Installation, Konfiguration, Programmierung, SIP, IAX2, AGI-Skripte, Fail2Ban, APIBAN, 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 – |
Die nachfolgende Liste ist etwas älter und entstand zu einer Zeit, als ich noch nicht ahnte wie tief ich mich in Asterisk vergraben würde:
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, muss in seinem Router außerdem einen kostenlosen DynDNS-Anbieter einrichten.
Themenliste zu Asterisk, Unterabschnitte, Links zu anderen Seiten auf diesem Server, die Asterisk behandeln. Die nachfolgende Linkliste behandelt hauptsächlich die Asterisk-Programmierung:
– 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
– Eine universelle Testnummer mit einem automatischen Rückruf
– Altes Smartphone als Überwachungskamera
– Von Windows auf den Raspberry Pi zugreifen
– Testnummer zum Prüfen der Sprach- und Verbindungsqualität
– Faxweiche für Asterisk als Software-Lösung
– Installation von Raspbian (Raspberry Pi OS) auf einem Raspberry Pi
– Zwei Asterisk-SIP-Server über IAX2 verbinden
– Mehrere Asterisk-Server über das IAX2-Protokoll verbinden
– SIP-Scanner blockieren, die selbst Fail2Ban nicht entdecken kann
– Faxe mit Asterisk empfangen und versenden
– Sinnvolle Verwendung für ein 30 Jahre altes Telefax-Gerät
–
–
–
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.
Teure Mobilfunkgebühren sind Vergangenheit: Seit einigen Jahren telefoniere ich dank meines Asterisk-Servers von unterwegs nur noch über kostenlose WLAN-Hotspots oder über den mobilen Datenfunk. Dadurch spare ich mir die teuren Mobilfunkgebühren. Mein Asterisk-Server ermöglicht den Zugang zu öffentlichen Telefonnetzen, die ich über eine Nebenstelle auf meinem Smartphone mit Hilfe von SIP-Softphones fast kostenlos erreichen kann. In den meisten Fällen telefoniere ich auch von unterwegs für umsonst.
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.
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 ; yes = Aktivierung des DNS-Suchdienstes von Asterisk 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=force_rport,comedia ; hieß früher nat=yes, hier stand vorher nur nat=comedia ; https://stackoverflow.com/questions/4743298/nat-configuration-for-sipasterisk insecure=invite canreinvite=no 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.
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.
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%.
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.
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.
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:
Im Asterisk-CLI mit Verbose 3 ist folgendes zu sehen:
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.
Abgefragt wird der Status von MESSAGE_SEND_STATUS. Liefert diese Funktion nicht SUCCESS zurück, wird eine Fehlermeldung an den Absender geschickt.
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.
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)
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 – |