[Kurs] Wir konfigurieren uns einen Asterisk

Status
Für weitere Antworten geschlossen.

betateilchen

Grandstream-Guru
Mitglied seit
30 Jun 2004
Beiträge
12,882
Punkte für Reaktionen
0
Punkte
0
Anmerkung der Moderation: Der Kurs ist eine gute Grundlage, wenn man sich mit dem Thema Asterisk befassen möchte, auch wenn inzwischen neuere Versionen von Asterisk erschienen sind. Wir weisen ausdrücklich daraufhin, dass ein frei zugänglicher Server auch ein Einfallstor für Hacker ist, die z.B. hohe Telefonkosten verursachen können. Dies gilt insbesondere bei Nutzung des default Contextes. Eine Diskussion zur Sicherheit der Konfiguration ist u.a. hier zu finden.
********************************************************************************

Diskussion zu diesem Kurs bitte in diesem Thread führen. Danke !


[hr]x[/hr]

-- EDIT vom 23.05.2007 ---

Zu diesem Kurs ist inzwischen auch ein Buch erschienen, in dem der komplette Kursinhalt zu finden ist und das man auch als kleines Nachschlagewerk für die Grundinstallation verwenden kann.

Nähere Infos zum Buch finden sich in diesem Thread

[hr]x[/hr]

Ergänzungsanleitungen von anderen Usern zur Asterisk-Konfiguration sind hier zu finden.
[hr]x[/hr]
Lektion 1: Installation der Asterisk-Software auf dem vServer
Lektion 2: Wir erstellen uns CONF Dateien
Exkurs 1: Wie bindet man ein IAX Endgerät ein ?
Lektion 3: Wir binden unseren ersten SIP-Provider ein
Lektion 4: Einbindung Echotest und Mailboxabfrage
Lektion 5: Verwendung von Variablen im Dialplan
Lektion 6: Die wichtigsten Befehle auf der Asterisk CLI
Lektion 7: Wir binden die Mailbox ein
Lektion 8: Wir bringen unserem Asterisk deutsch bei
Lektion 9: Wir binden einen 2. SIP Provider ein
Lektion 10: Wir bauen unseren ersten Macro
Exkurs 2: Einbindung eines nikotel-Accounts
Lektion 11: Wir binden einen IAX Provider ein
Exkurs 3: Befehls-Syntax in der extensions.conf
Exkurs 4: Der Einzelverbindungsnachweis in Asterisk
Lektion 12: Wir weisen Endgeräten bestimmte Provider zu
[hr]x[/hr]
Da hier im Forum immer wieder die gleichen Anfangsschwierigkeiten auftreten, einen Asterisk Server aufzusetzen, habe ich mich entschlossen, mal eine Schritt-für Schritt-Anleitung zur Inbetriebnahme eines Asterisk-Servers zusammenzustellen, die ich an dieser Stelle, in einzelne Lektionen aufgeteilt, veröffentlichen möchte.

Am Ende dieser Lektionen werden wir komplette CONF Dateien für einen funktionierenden Asterisk-Server mit 10 SIP-Endgeräten und der Anbindung an jeweils einen IAX und einen SIP Provider haben. Diese Endgeräte werden alle über einen Mailbox-Account verfügen und sowohl intern wie extern erreichbar sein. Und sie können natürlich auch intern untereinander telefonieren.

Auf die Einrichtung von ISDN Anbindungen (sowohl extern wie intern) werde ich in diesem Kurs nicht eingehen.

Bei genügend Interesse und Resonanz in diesem Kurs, wird in weiteren Lektionen auch noch die Implementierung von Erweiterungen anhand von Beispielen realisiert.

Beispiel für diese Erweiterungen:

- "Ruhe vor dem Telefon" mit mehreren Optionen über Tastencodes aktivierbar
- Anrufer-Identifizierung anhand der Rufnummer mit Übertragung des Anrufernamens an das Endgerät

[hr]x[/hr]

Grundvoraussetzungen:

Ich habe zu diesem Zweck einen vServer mit einer festen IP aufgesetzt, auf dem ich die Installation des Asterisk und die Entwicklung der CONF Dateien vornehmen werde. Da im Moment vServer mit entsprechender Leistung bereits für ca. 2,90 Euro / Monat verfügbar sind, habe ich mich für diesem Weg entschlossen, da man damit von vorneherein viele Probleme bzgl. NAT und wechselnden IPs umgehen kann.

Außerdem ist so ein Server in der Wohnung auch nicht zu hören, da er ja ca. 300km von hier wegsteht. Das erhöht den WAF erheblich :wink: Und für 2,90 habe ich immerhin einen 24/7 Betrieb des Servers, man sollte die heimischen Stromkosten bei Vergleichen nicht außer acht lassen :!:

Das Ganze sollte natürlich auch mit einem PC im lokalen Netzwerk funktionieren. Bei anderen Linux-Distributionen muß das Installieren der benötigten Pakete analog erfolgen, hierzu sind die entsprechenden Werkzeuge der Distribution zu verwenden - bitte fragt mich aber nicht für jede Distribution nach den Namen der Pakete oder der genauen Vorgehensweise - ich kenne nicht alle Distributionen :!:

[hr]x[/hr]
Lektion 1: Installation der Asterisk-Software auf dem vServer

Auf dem neu eingerichteten vServer befindet sich ein funktionierendes, ziemlich nacktes Debian Linux System.

Zuerst machen wir mit

Code:
apt-get update
und

Code:
apt-get upgrade
eine Aktualisierung auf den aktuellen Programmstand. Die dabei autretenden Rückfragen des Update-Prozesses bestätigen wir jeweils einfach mit <ENTER>

Danach installieren wir die für das Kompilieren des Asterisk notwendigen Bibliotheken:

Code:
apt-get install libssl-dev
apt-get install libz-dev
apt-get install libncurses-dev
Und wir installieren uns den Midnight-Commander (im weiteren Verlauf MC), der uns bei der weiteren Arbeit gute Dienste leisten wird

Code:
apt-get install mc
Nun brauchen wir noch die Entwicklungsumgebung für das Kompilieren des Asterisk Servers:

Code:
apt-get install make
apt-get install gcc
Natürlich fehlen uns nun noch die Sourcen des Asterisk selbst. Die holen wir uns von der Webseite http://www.asterisk.org

Zwischenzeitlich ist eine neue Asterisk Version rausgekommen. Die jeweils aktuelle Version findet man auf der Webseite http://www.asterisk.org in der Liste oben rechts auf der Webseite. Ich werde den Kurs nicht bei jeder neuen Version anpassen - die Vorgehensweise zur Installation ist nämlich versionsunabhängig.
Anleitung zum Updaten einer bestehenden Installation befinden sich als Nachtrag am Ende dieses Kurses.


Momentan aktuell ist die Version 1.2.1 - die laden wir uns nun auf den vServer und installieren diese in /usr/src

Code:
cd /usr/src
wget http://ftp.digium.com/pub/asterisk/asterisk-1.2.1.tar.gz
wget http://ftp.digium.com/pub/asterisk/asterisk-sounds-1.2.1.tar.gz
Danach entpacken wir diese Archive in das Verzeichnis /usr/src. Ich verwende dazu einfach den vorher installierten MC, öffne dort die .tar.gz Dateien und kopiere das angezeigt Unterverzeichnis asterisk-xxx einfach mit F5 ins Unterverzeichnis /usr/src (ja ich weiß, daß das auch einfacher geht, aber ich wollte hier nicht auch noch auf die Bedienung von tar eingehen)

Wir beenden den MC wieder und legen uns im Verzeichnis /usr/src noch einen symbolischen Link an:

Code:
ln -s asterisk-1.2.1 asterisk
Jetzt kompilieren und installieren wir das ganze System.

Code:
cd asterisk
make
make install
make samples

cd ..
cd asterisk-sounds-1.2.1
make install
Wenn bis hierher alles ohne Fehlermeldung funktioniert hat, sollten wir nun einen funktionsfähigen Asterisk-Server auf unserem vServer installiert haben. Um das zu testen, versuchen wir jetzt einfach, den Server zu starten:

Code:
asterisk (hier passiert scheinbar erstmal gar nix, es kommt einfach wieder der System-Prompt)

asterisk -r
Und nun sollte sich der Asterisk so melden:

Code:
vs8216:~# asterisk -r
Asterisk 1.2.1, Copyright (C) 1999 - 2005 Digium.
Written by Mark Spencer <m[email protected]>
=========================================================================
Connected to Asterisk 1.2.1 currently running on vs8216 (pid = 5941)
vs8216*CLI>
Wenn wir das geschafft haben - dann ist die Installation erfolgreich abgeschlossen.

Wir verlassen den Asterisk durch Eingabe von exit an der CLI

[hr]x[/hr]

Das war die Lektion 1.
In Lektion 2 widmen wir uns der Einrichtung der 4 grundlegenden Konfigurationsdateien:

Code:
sip.conf 
iax.conf
extensions.conf
voicemail.con
[hr]x[/hr]

Viel Erfolg beim nachvollziehen der oben beschriebenen Schritte !
 
Zuletzt bearbeitet:

betateilchen

Grandstream-Guru
Mitglied seit
30 Jun 2004
Beiträge
12,882
Punkte für Reaktionen
0
Punkte
0
Lektion 2: Wir erstellen uns CONF Dateien

Nachdem in Lektion 1 dieses Kurses die grundlegende Installation des Asterisk vorgenommen wurde, widmen wir uns nun der Einrichtung der Konfigurationsdateien.

Im Einzelnen werden wir in dieser Lektion folgende Dateien bearbeiten:

Code:
logger.conf
iax.conf
sip.conf
extensions.conf
voicemail.conf
Die Konfigurationsdateien für den Asterisk-Server befinden sich alle in /etc/asterisk. Damit wir da nicht jedesmal erst hinwechseln müssen, legen wir uns in unser Home-Verzeichnis /root symbolische Links zu den Dateien an, damit wir diese direkt in unserem Verzeichnis bearbeiten können.

Code:
cd
ln -s /etc/asterisk/extensions.conf
ln -s /etc/asterisk/iax.conf
ln -s /etc/asterisk/sip.conf
ln -s /etc/asterisk/voicemail.conf
Wer mitzählt, dem wird aufgefallen sein, daß das nur 4 Dateien waren - das ist beabsichtigt. Da wir die logger.conf im Rahmen dieses Kurses nur einmal bearbeiten werden, brauchen wir dafür keinen Link.
[hr]x[/hr]
Diese Datei /etc/asterisk/logger.conf nehmen wir uns als erstes vor, um unnötige und verwirrende NOTICES auf der Asterisk-CLI zu unterdrücken. Wir wechseln in das Verzeichnis /etc/asterisk

Code:
cd /etc/asterisk
und öffnen die Datei mit dem Editor unserer Wahl. Ich nehme dazu wieder MC, öffne die Datei mit F4 zum Bearbeiten und werfe den gesamten Inhalt raus. Die Datei logger.conf braucht nur folgenden Inhalt:

Code:
; Logging Configuration
[general]

[logfiles]
console => warning,error
messages => notice,warning,error
[hr]x[/hr]
Als nächstes widmen wir uns der Datei iax.conf Diese Datei können wir aufgrund des generierten Links ja in unserem /root Verzeichnis bearbeiten. Also begeben wir uns dorthin

Code:
cd
und öffnen die Datei mit dem Editor unserer Wahl.

Da wir im Moment mit IAX gar nix tun wollen, schmeißen wir dort alles raus und tragen nur eine einzige Zeile in die Datei ein:

Code:
[general]
Mehr brauchen wir hier im Moment nicht zu tun.
[hr]x[/hr]
Nun kommen wir zur Datei sip.conf

Wie der Name der Datei schon vermuten läßt, wird in dieser Datei alles konfiguriert, was zum Betrieb von VoIP über das Protokoll SIP notwendig ist. Das beinhaltet sowohl den "Anschluß" der benutzen Hard-oder Softphones als auch die Verbindung zu VoIP-Providern, die mit diesem Protokoll arbeiten (also die überwiegende Zahl der Provider).

Da wir uns immer noch in Lektion 2 befinden, werden wir uns an dieser Stelle erstmal nur der Konfiguration für die Anmeldung von SIP-Endgeräten widmen.

Wir beginnen mit einer leeren Datei ! (Also öffnen der Datei und löschen des gesamten Inhalts) In diese Datei tragen wir einen [general] Teil ein, der grundlegende Informationen über den Server selbst beinhaltet.

Code:
[general]
context=default
bindport=5060
bindaddr=84.16.xxx.xxx
srvlookup=yes
Wer den Asterisk auf einem vServer betreibt, muß unter bindaddr= die IP des vServers eintragen. Wer den Asterisk auf einem PC im lokalen Netzwerk betreibt kann hier einfach bindaddr=0.0.0.0 eintragen, damit weiß Asterisk, daß er auf der lokalen Netzwerk-Adresse reagieren soll.

Nun kommen wir zur Einrichtung der Endgeräte. Ein einzelner Abschnitt (=Context) für ein SIP Gerät sieht folgendermaßen aus:

Code:
[30]
callerid=Phone 1 <30>
host=dynamic
domain=84.16.xxx.xxx
user=30
secret=geheim
type=friend
mailbox=30
nat=yes
canreinvite=no
schauen wir uns die wichtigsten Parameter mal genauer an:

[30]​
Das ist die ID des SIP Teilnehmers, unter der dieser Teilnehmer dem Asterisk Server bekannt ist. Man kann hier auch mit Namen oder mit alphanumerischen Kombinationen arbeiten. Um die Übersichtlichkeit im weiteren Verlauf zu gewährleisten, sollten wir uns hier darauf einigen, daß die ID und die Rufnummer gleich lauten.

callerid=Phone 1 <30>​
Die CallerID besteht generell aus 2 Teilen, CallerIDName (= Phone 1) und CallerIDNum (= 30). Die spitzen Klammern <> um die 30 dienen der Abgrenzung der Nummer vom Namen, wenn wie in diesem Fall die komplette CallerID auf einmal gesetzt wird. Man kann diese Parameter auch einzeln setzen, dazu kommen wir in einem späteren Teil in der extensions.conf.

host=dynamic​
Das gibt an, daß sich der SIP Client unter wechselnden IPs am Server anmelden wird. Das ist eigentlich immer der Fall, wenn man den Client über einen Internet-Zugang anmeldet, der nicht über statische IP verfügt. Wenn man das Glück hat, über eine statische IP ins Internet gehen zu können, funktioniert dieser Eintrag trotzdem, man sollte ihn also einfach so stehen lassen.

domain=84.16.xxx.xxx​
Hier ist wieder die IP-Adresse (oder der Domain-Name) des Asterisk-Servers einzutragen. Wer im lokalen Netz arbeitet, verwendet hier die IP des Asterisk-Servers.

nat=yes​
Hier kann angegeben werden, daß das SIP Gerät hinter einem NAT Router hängt, was in den meisten Fällen der Fall sein dürfte. Dieser Eintrag hat den Zweck, dem Asterisk mitzuteilen, wie er das Gerät "finden" kann, um ankommende Anrufe an das Gerät durchzustellen.

type=friend​
Der Typ friend legt fest, daß dieser Teilnehmer sowohl abgehende als auch ankommende Gespräche führen darf.

user=30 & secret=geheim​
Das sind die Userdaten, mit denen sich das Endgerät am Asterisk bei der Anmeldung identifiziert.

mailbox=30​
Hiermit wird festgelegt, daß dem SIP Gerät die Mailbox mit der Nummer 30 zugeordnet ist. Der Eintrag ist wichtig, falls das Endgerät über eine MWI Funktion (Anzeige von neuen Voicemails) direkt am Gerät, z.B. per LED oder Displaymeldung verfügt.

canreinvite=no​
Da wir hier in einem Anfängerkurs sind, möchte ich auf die Erklärung dieses Parameters verzichten, um unnötige Verwirrung zu vermeiden.
[hr]x[/hr]
Da in der Einführung zu diesem Kurs aufgezählt wurde, daß wir den Asterisk für den Anschluß von 10 SIP Endgeräten konfigurieren wollen, brauchen wir als 10 solche Contexte.

Unsere sip.conf sollte also in dieser Phase folgenden Inhalt haben:

Code:
[general]
context=default
bindport=5060
bindaddr=84.16.xxx.xxx
srvlookup=yes

; --------------------------------------------------------------------
;
; hier koennten die Anmeldedaten für VoIP Provider stehen
; dazu kommen wir in einer spaeteren Lektion
;


; --------------------------------------------------------------------
;
; hier kommen die Anmeldekontexte für die SIP Endgeraete 30-39
;

[30]
callerid=Phone 1 <30>
host=dynamic
domain=84.16.xxx.xxx
user=30
secret=geheim
type=friend
mailbox=30
nat=yes
canreinvite=no

[31]
callerid=Phone 2 <31>
host=dynamic
domain=84.16.xxx.xxx
user=31
secret=geheim
type=friend
mailbox=31
nat=yes
canreinvite=no

[32]
callerid=Phone 3 <32>
host=dynamic
domain=84.16.xxx.xxx
user=32
secret=geheim
type=friend
mailbox=32
nat=yes
canreinvite=no

[33]
callerid=Phone 4 <33>
host=dynamic
domain=84.16.xxx.xxx
user=33
secret=geheim
type=friend
mailbox=33
nat=yes
canreinvite=no

[34]
callerid=Phone 5 <34>
host=dynamic
domain=84.16.xxx.xxx
user=34
secret=geheim
type=friend
mailbox=34
nat=yes
canreinvite=no

[35]
callerid=Phone 6 <35>
host=dynamic
domain=84.16.xxx.xxx
user=35
secret=geheim
type=friend
mailbox=35
nat=yes
canreinvite=no

[36]
callerid=Phone 7 <36>
host=dynamic
domain=84.16.xxx.xxx
user=36
secret=geheim
type=friend
mailbox=36
nat=yes
canreinvite=no

[37]
callerid=Phone 8 <37>
host=dynamic
domain=84.16.xxx.xxx
user=37
secret=geheim
type=friend
mailbox=37
nat=yes
canreinvite=no

[38]
callerid=Phone 9 <38>
host=dynamic
domain=84.16.xxx.xxx
user=38
secret=geheim
type=friend
mailbox=38
nat=yes
canreinvite=no

[39]
callerid=Phone 10 <39>
host=dynamic
domain=84.16.xxx.xxx
user=39
secret=geheim
type=friend
mailbox=39
nat=yes
canreinvite=no
[hr]x[/hr]
Nachdem wir in der sip.conf schon die Zuordnung zu dem Voicemail-Boxen vorgenommen haben, werden wir die 10 VM-Boxen jetzt auch entsprechend einrichten.

Die Konfiguration erfolgt in der Konfigurationsdatei voicemail.conf

Wir öffnen die Datei also im Editor und tragen die Daten für die Mailboxen ein. Die fertige Datei sollte folgenden Inhalt haben. Über die einzelnen Einträge und die Optimierung / Anpassung dieser Datei wird es eine eigene Lektion zu einem späteren Zeitpunkt geben.

Code:
;
; Voicemail Configuration
;

[general]
format=wav
serveremail=asterisk
attach=yes
maxsilence=10
silencethreshold=128
maxlogins=3
emaildateformat=%A, %d %B %Y at %H:%M:%S

[zonemessages]
eastern=America/New_York|'vm-received' Q 'digits/at' IMp
central=America/Chicago|'vm-received' Q 'digits/at' IMp
central24=America/Chicago|'vm-received' q 'digits/at' H N 'hours'
military=Zulu|'vm-received' q 'digits/at' H N 'hours' 'phonetic/z_p'

[default]

30 => 1234,Example Mailbox,[email protected]
31 => 1234,Example Mailbox,[email protected]
32 => 1234,Example Mailbox,[email protected]
33 => 1234,Example Mailbox,[email protected]
34 => 1234,Example Mailbox,[email protected]
35 => 1234,Example Mailbox,[email protected]
36 => 1234,Example Mailbox,[email protected]
37 => 1234,Example Mailbox,[email protected]
38 => 1234,Example Mailbox,[email protected]
39 => 1234,Example Mailbox,[email protected]
Den Aufbau eines Mailbox-Eintrags möchte ich hier noch kurz erklären:

Code:
30 => 1234,Example Mailbox,[email protected]
30 = Nummer der Mailbox

1234 = Passwort, mit der die Mailbox abgefragt werden kann

"Example Mailbox" = hier kann der Name jedes Users eingetragen werden. Dieser Eintrag wird beim Verschicken der Nachricht per email in den Mail-Text übernommen

[email protected] = hier kommt die email-Adresse jedes einzelnen Users hin, an welche die VM-Nachrichten verschickt werden sollen

(Anmerkung: Auf einem vServer sollte ein Mailserver standardmäßig vom Anbieter installiert und konfiguriert sein, sodaß der Versand auf Anhieb funktionieren sollte)
[hr]x[/hr]
Wir haben nun die SIP Geräte konfiguriert, die Voicemail eingerichtet, und nun müssen wir noch dafür sorgen, daß wir auch überhaupt telefonieren können.

Die gesamte Logik der Wählvorgänge (in vielen Beschreibungen auch DIALPLAN genannt) befindet sich in der Datei extensions.conf

In diesem ersten einfachen Beispiel wird einfach mal dafür gesorgt, daß die SIP Geräte sich gegenseitig anrufen können. Voicemail wird hierbei noch nicht genutzt.

Code:
[general]
static=yes
writeprotect=no

; --------------------------------------------------------------------
; Es hat sich als gute Praxis erwiesen, die Inhalte der Datei
; extensions.conf modular aufzubauen. Diese Praxis wollen
; wir auch hier anwenden
;

[lokal]
; Erreichbarkeit der Nebenstellen 30-39
; untereinander herstellen

exten => _3X,1,NoCDR()
exten => _3X,n,Dial,SIP/${EXTEN}|55|Ttr

; --------------------------------------------------------------------
;
; hier kommt der default-Context, in dem alle Geraete in der
; Grundkonfiguration erstmal laufen.
; Alle Geraete koennen sich gegenseitig anrufen

[default]
include => lokal
Damit haben wir alle Konfigurationsdateien zusammen, die wir für einen ersten Funktionstest brauchen.
[hr]x[/hr]

Kommen wir nun zur Aktivierung der Dateien.

a) Asterisk wurde bereits gestartet

Wir verbinden uns zum Asterisk mit

Code:
asterisk -r
und geben an der CLI (da ist die Kommandozeile, die uns angezeigt wird) ein:

Code:
reload <enter>
Damit werden alle CONF-Dateien neu geladen.

b) Asterisk wurde noch nicht gestartet

Wir starten den Asterisk mit

Code:
asterisk
In diesem Fall werden die Konfigurationsdateien sowieso neu geladen, und wir brauchen keinen reload machen.
[hr]x[/hr]

Nun sollten sich die SIP Geräte am Server anmelden können und auch untereinander Telefongespräche führen können.

Viel Spaß beim Quasseln !
[hr]x[/hr]
Wir sind am Ende der Lektion 2. Viel zu lesen, viel zu Tippen. Aber damit haben wir ein Grundgerüst, das wir nun Schritt für Schritt weiter ausbauen werden.

In Lektion 3 werden wir einen Echotest und die Abfrage der Mailbox in den Dialplan einbauen.

Bis dahin - viel Erfolg beim Nachbauen :D
 
Zuletzt bearbeitet:

betateilchen

Grandstream-Guru
Mitglied seit
30 Jun 2004
Beiträge
12,882
Punkte für Reaktionen
0
Punkte
0
An dieser Stelle sei - aus gegebenem Anlaß - ein wichtiger Hinweis angebracht:

Dieser Kurs ist ausschließlich diesem Forum gewidmet.


Jede - auch auszugsweise - Veröffentlichung in irgendwelchen anderen Formen (elektronisch, Fachliteratur, Studien-/Diplomarbeiten, andere Foren usw) ohne meine ausdrückliche Zustimmung ist hiermit ausdrücklich untersagt. Sollte ich Hinweise darauf finden, daß Teile dieses Kurses irgendwo kopiert oder nachgeahmt werden, werde ich entsprechende rechtliche Schritte einleiten.
 
Zuletzt bearbeitet:

betateilchen

Grandstream-Guru
Mitglied seit
30 Jun 2004
Beiträge
12,882
Punkte für Reaktionen
0
Punkte
0
Exkurs 1: Wie bindet man ein IAX Endgerät ein ?

Nun, die Einbindung eines IAX Endgerätes ist genau so einfach wie die eines SIP Gerätes.

Wir müssen dazu die Datei iax.conf entsprechend ergänzen:

Code:
[general]
bindaddr=84.16.xxx.xxx
context=default

[40]
type=friend
username=40
secret=40
host=dynamic
callerid="IAX Phone <40>"
mailbox=40
notransfer=yes
Hiermit ermöglichen wir einem IAX Gerät mit der ID 40, sich mit den angebenen Userdaten am Server zu registrieren. Da es dem Context [default] zugeordnet ist, kann es zwar die internen Nebenstellen 30-39 bereits anrufen, aber noch nicht selbst angerufen werden.

Um die Erreichbarkeit dieser IAX-Nebenstelle zu gewährleisten, müssen wir den [lokal] Context in der extensions.conf ergänzen, sodaß dieser Context nun wie folgt aussieht:

Code:
[lokal]
; Erreichbarkeit der Nebenstellen 30-39
; untereinander sicherstellen
;
exten => _3X,1,NoCDR()
exten => _3X,n,Dial,SIP/${EXTEN}|55|Ttr

; für das IAX Geraet aus Exkurs 1 stellen wir hier die Erreichbarkeit her
;
exten => 40,1,NoCDR()
exten => 40,n,Dial,IAX2/40|55|Ttr
Da wir in unserem Beispiel nur ein IAX Gerät einbinden, brauchen wir in diesem Fall nicht mit den extension-Patterns zu arbeiten (_4X) sondern können die 40 direkt verwenden.

Falls die 40 auch eine Voicemailbox bekommen soll, muß noch ein Eintrag in der voicemail.conf ergänzt werden.

Code:
40 => 1234,Example Mailbox,[email protected]
 
Zuletzt bearbeitet:

betateilchen

Grandstream-Guru
Mitglied seit
30 Jun 2004
Beiträge
12,882
Punkte für Reaktionen
0
Punkte
0
Lektion 3: Wir binden unseren ersten SIP-Provider ein

Ich habe die Reihenfolge der Lektionen geändert und die Einbindung eines ersten SIP-Providers als nächstes beschrieben. Warum ? Einige haben ein langes Wochenende (Heilige 3 Könige) und die Einbindung eines Providers ist bestimmt ein bißchen schwieriger nachzuvollziehen, als ein Echotest oder die Mailboxabfrage. Außerdem wird die Mailboxabfrage sowieso noch nicht benutzt :wink: Die Einbindung von Echotest und Mailbox kommt natürlich auch noch. Bitte um Verständnis für diese Änderung.
[hr]x[/hr]

Nun wird es also ernst. Wir binden unseren 1. Provider ein, damit wir auch in die weite Welt telefonieren können und auch von außen erreichbar sind.

Es hat sich aus meiner Erfahrung heraus als vorteilhaft erwiesen, die Anruf-Richtungen und damit die Konfigurationsabschnitte in der sip.conf zu trennen. Dies ist insbesondere wichtig, wenn man mehrere Accounts beim selben Provider auf dem Asterisk konfigurieren möchte. Es gibt Provider, bei denen diese Trennung nicht notwendig ist, bei anderen funktioniert es nicht, wenn man diese Trennung nicht vornimmt.

Deshalb werden wir diese Trennung auch hier im Kurs praktizieren - denn sie funktioniert immer :!:

Als Beispielprovider nehmen wir einen Account bei sipgate.de (nein - sie zahlen mir keine Provision für diese Werbung - leider). Der Account hat die fiktive ID 6112233 und das Paßwort ABCXYZ (das ist das kryptische Paßwort, das man nach dem Einloggen auf der Webseite von Sipgate unter "Meine Daten" findet.

Wir bearbeiten nun die sip.conf und fügen folgendes ein:

Code:
register => 6112233:[email protected]/6112233
; hiermit registrieren wir den Asterisk bei Sipgate, um ankommene Anrufe
; entgegennehmen zu koennen

[6112233]
; dies ist der Context, den wir zum Raustelefonieren verwenden
; da dieser Context nur zum Raustelefonieren verwendet wird,
; ist die Angabe von "context =" hier ueberfluessig, da wir ja ohnehin
; aus der extensions.conf hierher kommen
;
type=peer
username=6112233
fromuser=6112233
secret=ABCXYZ
host=sipgate.de
fromdomain=sipgate.de
insecure=very
canreinvite=no
nat=no
disallow=all
allow=ulaw

[sipgate_de_in] 
; das ist der Context für ankommende Anrufe
; von sipgate.de
; Diesen Context brauchen wir nur einmal - 
; egal wieviele Sipgate-Accounts wir registrieren
; wichtig ist, dass dies der LETZTE Context von
; oben nach unten in der sip.conf  betrachtet, ist
; der einen Verweis auf sipgate.de beinhaltet !
; Durch die Angabe von "context = ankommend"
; werden alle Anrufe in den gleichnamigen Context 
; [ankommend] in der extensions.conf geleitet.
;
type=peer
fromdomain=sipgate.de
host=sipgate.de
disallow=all
allow=ulaw
context=ankommend
Die Kommentare in dem Beispiel sollten eigentlich alles verständlich beschreiben. Wenn nicht, bitte im Diskussionstread nachfragen. Unsere komplette sip.conf sieht nun also so aus:

Code:
[general]
context=default
bindport=5060
bindaddr=84.16.xxx.xxx
srvlookup=yes

; --------------------------------------------------------------------
;
register => 6112233:[email protected]/6112233

[6112233]
type=peer
username=6112233
fromuser=6112233
secret=ABCXYZ
host=sipgate.de
fromdomain=sipgate.de
insecure=very
canreinvite=no
nat=no
disallow=all
allow=ulaw

[sipgate_de_in] 
type=peer
fromdomain=sipgate.de
host=sipgate.de
disallow=all
allow=ulaw
context=ankommend

; --------------------------------------------------------------------
;
; hier kommen die Anmeldekontexte für die SIP Endgeraete 30-39
;

[30]
callerid=Phone 1 <30>
host=dynamic
domain=84.16.xxx.xxx
user=30
secret=geheim
type=friend
mailbox=30
nat=yes
canreinvite=no

[31]
callerid=Phone 2 <31>
host=dynamic
domain=84.16.xxx.xxx
user=31
secret=geheim
type=friend
mailbox=31
nat=yes
canreinvite=no

[32]
callerid=Phone 3 <32>
host=dynamic
domain=84.16.xxx.xxx
user=32
secret=geheim
type=friend
mailbox=32
nat=yes
canreinvite=no

[33]
callerid=Phone 4 <33>
host=dynamic
domain=84.16.xxx.xxx
user=33
secret=geheim
type=friend
mailbox=33
nat=yes
canreinvite=no

[34]
callerid=Phone 5 <34>
host=dynamic
domain=84.16.xxx.xxx
user=34
secret=geheim
type=friend
mailbox=34
nat=yes
canreinvite=no

[35]
callerid=Phone 6 <35>
host=dynamic
domain=84.16.xxx.xxx
user=35
secret=geheim
type=friend
mailbox=35
nat=yes
canreinvite=no

[36]
callerid=Phone 7 <36>
host=dynamic
domain=84.16.xxx.xxx
user=36
secret=geheim
type=friend
mailbox=36
nat=yes
canreinvite=no

[37]
callerid=Phone 8 <37>
host=dynamic
domain=84.16.xxx.xxx
user=37
secret=geheim
type=friend
mailbox=37
nat=yes
canreinvite=no

[38]
callerid=Phone 9 <38>
host=dynamic
domain=84.16.xxx.xxx
user=38
secret=geheim
type=friend
mailbox=38
nat=yes
canreinvite=no

[39]
callerid=Phone 10 <39>
host=dynamic
domain=84.16.xxx.xxx
user=39
secret=geheim
type=friend
mailbox=39
nat=yes
canreinvite=no
Damit ist die Anpassung der Datei sip.conf für die Provideranbindung abgeschlossen.
[hr]x[/hr]
Kommen wir nun zu den notwendigen Änderungen in der Datei extensions.conf.

Teil 1: Wir verwenden Sipgate für alle abgehenden Anrufe

In unserem Kurs gehen wir (derzeit) davon aus, daß der Teilnehmer an unserem Asterisk an seinem SIP Telefon eine abgehende Rufnummer in der Form 0123/456789 wählt, also mit kompletter Ortsvorwahl.

Wir brauchen also eine Möglichkeit, diese Nummer anhand der 0 als erster Ziffer zu erkennen. Zu diesem Zweck stellt uns der Dialplan des Asterisk die sogenannten "Pattern" (=Muster) zur Verfügung. In unserem Fall brauchen wir folgendes Pattern: _0.

Dabei bedeuten die einzelnen Teile folgendes:

_ = Achtung, es kommt ein Pattern !
_0 = Das Pattern ist nur dann gültig, wenn die erste Ziffer eine 0 ist
_0. = Nach der 0 können keine bis beliebig viele weitere Zeichen kommen

Anmerkung: Der Ausdruck Zeichen an dieser Stelle beinhaltet auch z.B. den Stern * aber wir gehen der Einfachheit halber davon aus, daß wir nur Nummern wählen, die aus Ziffern bestehen.

Nun basteln wir uns die komplette Logik zusammen, was passieren soll, wenn so ein Pattern erkannt wird:

Code:
exten => _0.,1,Dial,SIP/${EXTEN}@6112233|45|r
Schlüsseln wir das Ganze mal auf:

exten =>
so beginnt jede Zeile im Dialplan, in der eine gewählte Nummer (=extension) ausgewertet wird

_0.
das Pattern kennen wir schon - siehe oben

1
Dies ist der erste Befehl der für das angegebene Pattern ausgeführt wird

Dial
Das ist die Anweisung, die der Asterisk ausführen soll, in diesem Fall wollen wir etwas wählen

SIP/${EXTEN}
Wir wollen über das Protokoll SIP eine Nummer wählen. Diese Nummer befindet sich in der Variablen EXTEN und entspricht genau der Nummer mit 0 am Anfang, die der Nutzer gewählt hat. Zum Thema "Variablen" mache ich demnächst einen separaten Exkurs. Erstmal nur soviel ${EXTEN} liefert den Inhalt der Variablen zurück.

@6112233
das ist der Name des Context aus der sip.conf den wir zum Rauswählen verwenden wollen, in unserem Fall also der Sipgate-Account

|45|r
45 = Zeit in Sekunden, die wir den Anruf klingeln lassen wollen;
r sorgt dafür, daß wir ein Rufzeichen im Hörer haben :wink:


Um den modularen Aufbau der extensions.conf beizubehalten, legen wir uns in dieser Konfigurationsdatei einen neuen Context namens [sipgate_out] an und tragen diese Wähllogik dort ein. Diesen Kontext binden wir dann mit einem include in den [default] Kontext ein, den alle Geräte für das Wählen verwenden.

Vorgehensweise:

Schritt 1 - neuen Kontext anlegen (am besten nach dem [lokal]:

[sipgate_out]
exten => _0.,1,Dial,SIP/${EXTEN}@6112233|45|r


Schritt 2 - Einbinden dieses Kontextes mittels include in [default]

[default]
include => lokal
include => sipgate_out

########
ACHTUNG! Das Einbinden von abgehenden Wahlregeln im default Context stellt ein hohes Sicherheitsrisiko dar. Mehr dazu im Thread "
Hacker in meinem Asterisk Server"
########

Unsere gesamte extensions.conf sieht nunmehr so aus:

Code:
[general]
static=yes
writeprotect=no

; --------------------------------------------------------------------
; Es hat sich als gute Praxis erwiesen, die Inhalte der Datei
; extensions.conf modular aufzubauen. Diese Praxis wollen
; wir auch hier anwenden
;

[lokal]
; Erreichbarkeit der Nebenstellen 30-39
; untereinander herstellen

exten => _3X,1,NoCDR()
exten => _3X,n,Dial,SIP/${EXTEN}|55|Ttr

[sipgate_out]
; Diesen Context verwenden wir zum waehlen von abgehenden
; Rufnummern über den Sipgate Account 6112233

exten => _0.,1,Dial,SIP/${EXTEN}@6112233|45|r

; --------------------------------------------------------------------
;
; hier kommt der default-Context, in dem alle Geraete in der
; Grundkonfiguration erstmal laufen.
; Alle Geraete können sich gegenseitig anrufen

[default]
include => lokal
include => sipgate_out

Teil 2 - wir wollen ankommende Anrufe am Endgerät 30 signalisieren

In der sip.conf hatten wir im Context [sipgate_de_in] den Eintrag context=ankommen eingetragen. Nun müssen wir dafür sorgen, daß dieser Context auch in der extensions.conf existiert und wir dort festgelegt haben, was mit den ankommenden Anrufen passieren soll.

Wir legen also in der Datei extensions.conf diesen neuen Context an - am besten nach dem [sipgate_out]:

Code:
[ankommend]
exten => 6112233,1,Dial,SIP/30|30|r
Diesen Context müssen wir nirgends einbinden !

"Nanu - wieso das denn nicht ?" werden sich jetzt einige fragen. Ganz einfach: Dieser Context wird ja nicht von unseren Endgeräten verwendet, sondern vom Sipgate-Server, der durch unseren Asterisk hindurch einen Anruf auf das Endgerät schickt.

Der Weg ist also folgender (stark vereinfacht)

Sipgate-Server ->
(Unser Asterisk [sip.conf]) ->
(register => xxx) ->
([sipgate_de_in]) ->
(extensions.conf[ankommend])

Und wenn der Anruf dann im [ankommend] gelandet ist, wird dieser anhand seiner ID 6112233 identifiziert und an das SIP Endgerät 30 signalisiert -d.h. das Telefon 30 klingelt

Der Aufbau der extension sollte inzwischen klar sein. Falls nicht, bitte im Diskussionsthread nachfragen.

Wir vervollständigen also unsere extensions.conf die danach so aussieht:

Code:
[general]
static=yes
writeprotect=no

; --------------------------------------------------------------------
; Es hat sich als gute Praxis erwiesen, die Inhalte der Datei
; extensions.conf modular aufzubauen. Diese Praxis wollen
; wir auch hier anwenden
;

[lokal]
; Erreichbarkeit der Nebenstellen 30-39
; untereinander herstellen

exten => _3X,1,NoCDR()
exten => _3X,n,Dial,SIP/${EXTEN}|55|Ttr

[sipgate_out]
; Diesen Context verwenden wir zum waehlen von abgehenden
; Rufnummern über den Sipgate Account 6112233

exten => _0.,1,Dial,SIP/${EXTEN}@6112233|45|r

[ankommend]
; alle Anrufe mit einer ID 6112233 sollen an das SIP Endgeraet 30
; signalisiert werden

exten => 6112233,1,Dial,SIP/30|30|r


; --------------------------------------------------------------------
;
; hier kommt der default-Context, in dem alle Geraete in der
; Grundkonfiguration erstmal laufen.
; Alle Geraete können sich gegenseitig anrufen

[default]
include => lokal
include => sipgate_out
Anmerkung: Wer einen ankommenden Anruf auf mehreren Geräten signalisieren möchte, kann dies einfach durch Ergänzung des Dial-Kommandos in [ankommen] einbauen:
exten => 6112233,1,Dial,SIP/30&SIP/31&SIP/32|30|r​
würde die 3 Telefone 30, 31 und 32 gleichzeitig klingeln lassen. Wer zuerst abnimmt, hat gewonnen :mrgreen:


[hr]x[/hr]

Damit haben wir unseren ersten Provider eingebunden.

Wir können nun

- interne Gespräche führen
- ankommende Gespräche annehmen
- abgehende Gespräche führen

Viel Spaß beim Nachbauen :D
 
Zuletzt bearbeitet:

betateilchen

Grandstream-Guru
Mitglied seit
30 Jun 2004
Beiträge
12,882
Punkte für Reaktionen
0
Punkte
0
Lektion 4: Einbindung Echotest und Mailboxabfrage

Diese Lektion ist während einer Bahnfahrt auf der Linux-Systemconsole eines uralten Laptop entstanden, auf dem es keine deutschen Umlaute gibt. Ich bitte daher schon jetzt um Entschuldigung, wenn ich bei der Kontrolle vor dem Posten ins Forum irgendwo noch die Umsetzung von ae, ss etc. übersehen habe.
[hr]x[/hr]
Nachdem wir nun alle (hoffentlich erfolgreich) die internen Verbindungen und die Anbindung an einen SIP Provider eingerichtet haben, kommen wir nun zu einer Ergänzung unseres Dialplans.

Wir werden in dieser Lektion folgende Features in die extensions.conf einbauen:

a) einen Echotest
Mit diesem Echotest kann jeder User seine eigene Verbindungsqualität zum Server testen kann. Hierzu wählt er die extension (=Telefonnummer) 81 von seinem Telefon aus.
Nach einer Begrüßung wird ihm dann alles, was zum Server spricht, als Echo zurückgeschickt.
Das Beenden des Echotests erfolgt durch Auflegen oder durch Drücken der Raute-Taste (#) am Telefon, wobei beim Beenden mit der Raute noch ein Abschlußtext angesagt wird.​

b) die Abfrage der eignen Mailbox
Mit Wahl der extension 88 wird ohne weitere Authentifizierung die Mailbox abgefragt, die dem Telefon zugeordnet ist, von dem aus die Abfrage gestartet wird. Wem dies ein Risiko erscheint - prinzipiell richtig :wink: aber es gibt dazu noch die Alternative​

c) die Abfrage einer beliebigen Mailbox mit vorheriger PIN Authentifizierung
Durch Wahl der extension 80 wird das Mailbox-System gestartet, das dann zuerst nach der abzufragenden Mailbox und dann nach dem zugehörigen Paßwort fragt. Mit dieser Variante ist es dann auch möglich, vom Apparat 30 aus die Mailbox 34 abzufragen - vorausgesetzt man weiß das richtige Paßwort.​

d) für die Kursteilnehmer, die testen wollen, ob sie b) & c) verstanden haben:
Ihr dürft Euch die Kombination aus b+c mal selber basteln, also die Abfrage der eigenen Mailbox mit vorheriger PIN-Authentifizierung ohne Eingabe der Mailboxnummer.

[hr]x[/hr]
Vorab mal noch eine Anmerkung zur Asterisk-Terminologie

Die Nummerierung 1 2 3 4 innerhalb einer extension wird auch "priority" genannt.
Wenn man mit fortlaufender Nummerierung arbeitet, was bei uns in den einfachen Beispielen bis jetzt der Fall ist, kann man die nächsthöhere priority auch einfach durch "n" erzeugen.
Also ist

Code:
exten => 1234,1,bla
exten => 1234,2,bla
exten => 1234,3,bla
absolut gleichbedeutend mit

Code:
exten => 1234,1,bla
exten => 1234,n,bla
exten => 1234,n,bla
Es muß natürlich immer eine Basis vorhanden sein, ab der mit n aufaddiert werden kann, deshalb darf die priority 1 nicht weggelassen werden.

[hr]x[/hr]

Die gesamten Erweiterungen des Dialplans in dieser Lektion finden in der Datei extensions.conf statt.

Fangen wir also an mit

a) der Echotest

Zur Durchführung eines solchen Echotests beinhaltet die Asterisk Software von Haus aus eine eigene Applikation namens ECHO worüber wir uns natürlich sehr freuen, denn die paßt genau in unseren Plan :D

Code:
[echotest]
exten => 81,1,answer
exten => 81,2,wait,1
exten => 81,3,playback,demo-echotest
exten => 81,4,echo
exten => 81,5,playback,demo-echodone
exten => 81,6,hangup
Zerpflücken wir mal diesen Context und schauen, was da genau passiert:

exten => 81,1,answer
exten => 81,2,wait,1
Hier beantworten wir zuerst den Anruf (der Asterisk nimmt sozusagen ab) und warten erstmal eine Sekunde. Diese 2 Zeilen müssen nicht unbedingt vorhanden sein, aber bei manchen VoIP Endgeräten würde ein Teil der darauffolgenden Ansage verlorgengehen, wenn diese 2 Zeilen (vor allem die Wartezeit) nicht vorhanden sind.​

exten => 81,3,playback,demo-echotest
exten => 81,5,playback,demo-echodone
Hiermit spielen wir dem Anrufer die Ansagen demo-echotest (zur Begrüßung) und demo-echodone (zur Verabschiedung) in seinen Telefonhörer. Die gleichnamigen Soundfiles mit diesen Ansagen gehören zum Standard der Asterisk-Installation und sind somit automatisch vorhanden.​

exten => 81,4,echo
Hier starten wir die eigentliche Applikation, die für das Zurückspielen des Echos zuständig ist.​

exten => 81,6,hangup
Der Asterisk legt auf und beendet den Anruf.​
[hr]x[/hr]

Kommen wir zum nächsten Teil

b) Abfrage der eigenen Mailbox
(genauer: Abfrage der Mailbox, die zu dem verwendeten Telefon gehört)​

Code:
[mailbox_own]
exten => 88,1,answer
exten => 88,n,wait,1
exten => 88,n,voicemailmain,s${CALLERIDNUM}
exten => 88,n,hangup

Nehmen wir das einfach mal auseinander und schauen uns an, was da passiert. 3 der 4 Zeilen sind uns bereits bekannt und werden hier nicht nochmal erklärt.
Der neue Befehl den wir verwenden, ist voicemailmain Mit diesem Befehl wird das Voicemail-System gestartet. Da wir diesem System gleich noch einen Parameter s${CALLERIDNUM} mitgeben, weiß das System, daß wir die zu dem Telefon gehörende Mailbox hören wollen und da wir direkt von diesem Telefon aus anrufen, fragt es uns nicht nach einer PIN. Das ist das gleiche Prinzip wie man es auch von Mobilfunknetzen kennt: Wenn man dort die eigene Mailbox vom eigenen Telefon aus abhören will, muß man sich auch nicht extra identifizieren (die Spitzfindigkeiten wie "aber ich kann auch bei Provider XY meine Handynummer mitschicken um das System auszutricksen" lassen wir jetzt bitte weg !)

Der Parameter s teilt dem Mailboxsystem mit,daß wir direkt - ohne Authentifizierung - abfragen wollen.
Die Variable ${CALLERIDNUM} enthält die Rufnummer des Anrufers - im Gegensatz dazu enthält ${EXTEN} die Nummer, die der Anrufer gewählt hat. Ich sehe schon - als nächste Lektion muß ich mal die Sache mit den Variablen genauer erklären :mrgreen:

[hr]x[/hr]

Nun zum letzten Teil unser Dialplan-Erweiterung

c) Abfrage einer beliebigen Mailbox mit PIN Authentifizierung

Code:
[mailbox]
exten => 80,1,answer
exten => 80,n,wait,1
exten => 80,n,voicemailmain
exten => 80,n,hangup
Das sieht eigentlich fast genauso aus wie unsere obige Mailboxabfrage.
Nur haben wir hier beim Starten des Voicemailsystem keinen Parameter mitgegeben.
Dadurch wird das System mit der "Einstiegsansage" gestartet und will von uns zuerstmal die gewünschte Mailbox wissen, bevor es uns nach der PIN fragt.
Die PIN wird übrigens aus der voicemail.conf gelesen. Dort haben wir für alle Teilnehmer als Standard die 1234 eingetragen. Diese PIN kann übrigens von jedem Benutzer selbst über das Sprachmenue des Voicemail-Systems geändert werden.​

[hr]x[/hr]
Wir bauen diese 3 Contexte in der extensions.conf am besten vor den Context [lokal] ein. Da diese 3 Contexte von allen Endgeräten genutzt werden sollen, müssen wir sie in den [default] Context einbinden.
Unsere extensions.conf sieht nun also so aus:

Code:
[general]
static=yes
writeprotect=no

; --------------------------------------------------------------------
; Es hat sich als gute Praxis erwiesen, die Inhalte der Datei
; extensions.conf modular aufzubauen. Diese Praxis wollen
; wir auch hier anwenden
;

[echotest]
exten => 81,1,answer
exten => 81,2,wait,1
exten => 81,3,playback,demo-echotest
exten => 81,4,echo
exten => 81,5,playback,demo-echodone
exten => 81,6,hangup

[mailbox]
exten => 80,1,answer
exten => 80,n,wait,1
exten => 80,n,voicemailmain
exten => 80,n,hangup

[mailbox_own]
exten => 88,1,answer
exten => 88,n,wait,1
exten => 88,n,voicemailmain,s${CALLERIDNUM}
exten => 88,n,hangup

[lokal]
; Erreichbarkeit der Nebenstellen 30-39
; untereinander herstellen

exten => _3X,1,NoCDR()
exten => _3X,n,Dial,SIP/${EXTEN}|55|Ttr

[sipgate_out]
; Diesen Context verwenden wir zum waehlen von abgehenden
; Rufnummern über den Sipgate Account 6112233

exten => _0.,1,Dial,SIP/${EXTEN}@6112233|45|r

[ankommend]
; alle Anrufe mit einer ID 6112233 sollen an das SIP Endgeraet 30
; signalisiert werden

exten => 6112233,1,Dial,SIP/30|30|r


; --------------------------------------------------------------------
;
; hier kommt der default-Context, in dem alle Geraete in der
; Grundkonfiguration erstmal laufen.
; Alle Geräte koennen sich gegenseitig anrufen
; alle Geraete koennen den Echotest durchfuehren
; alle Geraete haben Zugriff auf das Voicemailsystem

[default]
include => lokal
include => echotest
include => mailbox
include => mailbox_own
include => sipgate_out
[hr]x[/hr]

Wir sind damit am Ende der Lektion 4.

Unser Asterisk kann nun schon eine ganze Menge.

- wir können intern telefonieren
- wir können abgehend uber einen SIP Provider telefonieren
- wir können eingehende Anrufe am Endgerät signalisieren
- wir können einen Echotest machen
- wie können die Mailbox in 2 verschiedenen Varianten abfragen

Unser Asterisk "kennt" inzwischen folgende Telefonnummern:

- alles was mit 0 anfängt : das sind Nummern, die nach draußen gehen
- 30 - 39 : das sind die Nummern unserer internen SIP Endgeräte
- 80 : Starten des Mailboxsystems zur Abfrage beliebiger Mailboxen
- 81 : Starten eines Echotests
- 88 : Abfragen der eigenen Mailbox vom eigenen Telefon aus

Wer den Exkurs 1 mit eingebaut hat, hat noch eine weitere Nummer zur Verfügung:
- 40 : Nummer unseres internen IAX Endgerätes

An der Tatsache, daß das gesamte Mailboxsystem im Moment in englischer Sprache erfolgt, stören wir uns derzeit überhaupt nicht. Die Installation der deutschen Sprachfiles werden wir in einer eigenen Lektion behandeln.

In der nächsten Lektion werde ich ein bißchen was über Variablen und deren Verwendung erzählen.

Bis dahin: Viel Spaß beim Nachbauen :D

PS: Wäre es nicht an der Zeit, jetzt mal die 4 CONF Dateien zu sichern :wink: :?:​
 
Zuletzt bearbeitet:

betateilchen

Grandstream-Guru
Mitglied seit
30 Jun 2004
Beiträge
12,882
Punkte für Reaktionen
0
Punkte
0
Lektion 5: Verwendung von Variablen im Dialplan

Diese Lektion ist wichtig - und sie ist dynamisch ! Ich werde in diesem Beitrag hier immer die neuen Variablen aufführen, die wir im Laufe des weiteren Kurses im Dialplan verwenden. Also wird diese Lektion eine Art Nachschlagewerk, in das man immer mal wieder zurückkommen kann um nachzulesen. Deshalb steht die Auflistung auch an oberster Stelle in dieser Lektion.

Eine vollständige Auflistung (in englischer Sprache) aller Variablen befindet sich hier. Ich werde im Rahmen dieses Kurses nur die Variablen erläutern, mit denen wir auch selbst arbeiten.

[hr]x[/hr]

Aufstellung der bisher verwendete Variablen und ihre Bedeutung:
(aufgelistet in der Reihenfolge ihres Auftauchens im Kursablauf)


${EXTEN} Typ = vordefinierte Channel-Variable
enthält die gewählte Rufnummer, die gerade ausgewertet wird​

${CALLERIDNUM} Typ = vordefinierte Channel-Variable
enthält die Rufnummer des Anrufers

${DIALSTATUS} Typ = vordefinierte Channel-Variable
enthält das Ergebnis des letzten Dial-Befehls​
[hr]x[/hr]

Kommen wir nun zu den Grundlagen der Variablen im Dialplan

Ich werde mich bei den Erklärungen ziemlich eng an die Beschreibung auf http://www.voip-info.org halten und um eigene Kommentare ergänzen.

Die Verwendung von Variablen im Dialplan erlaubt die übergabe von dynamischen Werten an die Befehle in der extensions.conf.

Dabei wird folgende Syntax verwendet:
Code:
${gustav}

gustav ist dabei der Name der Variablen. Ein Variablenname kann eine beliebige alphanumerische Zeichenkette sein, solange diese mit einem Buchstaben beginnt.

An der Stelle im Dialplan, an der ${gustav} auftaucht, wird der gesamte Ausdruck zur Laufzeit durch den Inhalt der Variablen ersetzt.

Beispiel:

Annahme: ${gustav} enthält den Wert 30

Dann würde der Befehl

Code:
exten => 1234,1,dial,SIP/${gustav}
bei seiner Ausführung aufgelöst nach

Code:
exten => 1234,1,dial,SIP/30

Es gibt 4 Arten von Variablen:

- Globale Variablen
Diese können im [globals] Context der extensions.conf definiert oder durch den Befehl setglobalvar erzeugt werden. Sobald diese Variable definiert ist, steht sie im gesamten Dialplan zur Verfügung.
Mit diesem Variablentyp haben wir noch nicht gearbeitet - wir kommen dazu später aber noch.​

- Channel-Variablen
Diese werden mit dem Befehl set generiert. Sie stehen nur während der aktuellen Verbindung (= channel) zur Verfügung und werden bei Anrufende automatisch wieder gelöscht. Da jeder channel eindeutig identifiziert ist, sind es natürlich auch seine Variablen. Es können sich dadurch gleichnamige Variablen unterschiedlicher Verbindungen nicht gegenseitig beeinflussen oder stören.
Diesen Variablentyp haben wir bisher auch noch nicht verwendet, werden diese aber zu gegebener Zeit auch noch verwenden.​

- Umgebungsvariablen
Das sind Variablen, die aus dem Dialplan heraus aus dem Betriebssystem ausgelesen werden.
Solche Variablen werden wir im Rahmen dieses Kurses überhaupt nicht verwenden.​

- Vordefinierte Variablen
Das sind Variablen, die uns Asterisk selbst zur Verfügung stellt.
Hierbei kann man noch weiter unterscheiden nach
- vordefinierte Channel-Variablen
- vordefinierte befehlsspezifische Variablen
- vordefinierte macro-spezifische Variablen

Bisher hatten wir es nur mit dem Typ "vordefinierte Channel-Variablen" zu tun. ${EXTEN} und ${CALLERIDNUM} können logischerweise nur innerhalb einer aktiven Verbindung vorhanden sein :wink:​
[hr]x[/hr]

Es gibt bei der Verwendung von Variablen ein paar grundlegende Regeln zu beachten:

1.) bei benutzerdefinierten Variablen wird die Groß-/Kleinschreibung ignoriert.
${gustav} ${GUSTAV} ${GuStAv} würden also alle den gleichen Wert zurückliefern.​

2.) vordefinierte Variablen sind immer komplett in GROSSBUCHSTABEN zu schreiben !

${EXTEN} = richtig :)
${exten} = falsch :-(

3.) keine benutzerdefinierten Variablen setzen, die es als vordefinierte Variablen schon gibt !

[hr]x[/hr]

Was kann man mit Variablen noch machen ?

- die Länge ermitteln:

${LEN(${gustav})}
ermittelt die Länge des Inhalts der Variablen namens "gustav"
Wenn wir wieder davon ausgehen, daß in der Variablen der Wert 30 gespeichert ist, bekommen wir also 2 (Stellen) als Ergebnis zurück.

Wohingegen

${LEN(gustav)} den Wert 6 zurückliefern würde, da das Wort "gustav" eben aus 6 Buchstaben besteht.


- Teilstücke der Variablen verwenden:

allgemeine Syntax: ${gustav:ab_stelle:länge}
dies liefert uns einen Teil des Inhalts der Variablen ${gustav} zurück.
Dieser Teil beginnt an der Stelle <ab_stelle> und hat die Länge <länge>.
Die Zählung der Stellen beginnt immer mit 0 :!:

Falls <ab_stelle> einen negativen Wert enthält, erfolgt die Zählung von rechts nach links :!:
Falls <länge> einen negativen Wert enthält oder fehlt, wird der gesamte Rest ab der Stelle <ab_stelle> zurückgeliefert

Beispiele:
Code:
${123456789:1}    : ergibt den Teilstring 2345678
${123456789:-4}   : ergibt den Teilstring 6789
${123456789:0:3}  : ergibt den Teilstring 123
${123456789:2:3}  : ergibt den Teilstring 345
${123456789:-4:3} : ergibt den Teilstring 678

- Variablen verbinden:

Das ist ganz einfach - wir schreiben sie einfach hintereinander :mrgreen:

Angenommen, ${carl} enthält "1234" und ${gustav} enthält "5678",
dann erhalten wir durch Verwendung von

Code:
${carl}${gustav}
das Ergebnis 12345678 zurück.

Wir können die Verwendung der Teilstring-Funktion zusammen mit dem Verbinden von Strings dazu verwenden, eine Rufnummer umzuformatieren.

Beispiel:
nikotel verlangt als Format einer gültigen deutschen Rufnummer 49<ortsnetz_ohne_0><teilnehmernummer>
Nun könnten wir das in unserer Kundenkonfiguration auf der nikotel-Webseite so einstellen, oder wir lassen einfach unseren Dialplan diese Konvertierung vornehmen.

Der User wählt also wie gewohnt die "normale" deutsche Rufnummer des gewünschten Teilnehmers, und unser Dialplan macht daraus folgendes:

Code:
exten => _0Z.,1,dial,SIP/49${EXTEN:1}@nikotel|30|r
Wir schneiden also mit :1 die erste Stelle (die 0 der Ortsvorwahl) ab und stellen dafür die 49 (für Deutschland) davor.

bevor jetzt Fragen zu _0Z. kommen: das Z steht für EINE beliebige Ziffer von 1-9. Damit kann man verhindern, daß das Pattern auch für Auslandsgespräche - beginnend mit 00 - verwendet wird. Wenn man am Beispiel von Nikotel auch dies automatisch ins korrekte Format umsetzen möchte, dann würde das als zusätzliche extension so aussehen:

Code:
exten => _00.,1,dial,SIP/${EXTEN:2}@nikotel|30|r
Wir schneiden also einfach die führenden Nullen ab und haben sofort das richtige Ergebnis :wink:



- mit Variablen rechnen
Im Moment glaube ich nicht, daß wir das in diesem Kurs brauchen werden. Deshalb verweise ich auf die bereits oben erwähnte Doku auf voip-info.org
Sollte sich ergeben, daß wir das Rechnen doch brauchen, werde ich das zu gegebener Zeit hier ergänzen.​
[hr]x[/hr]

Wir sind am Ende von Lektion 5 angekommen. Ich hoffe, daß das mit den Variablen einigermaßen verständlich wurde. Wir werden im Laufe des Kurses noch einige praktische Anwendungen sehen, dann wird das bestimmt noch ein bißchen klarer.

Dies war mal eine Lektion, bei der IHR keine Arbeit habt, sondern nur ich mir die Finger wundschreibe. Auch diese Lektion ist während der Bahnfahrt entstanden. Entsprechend gilt also der Hinweis bezüglich Umlaute aus Lektion 4 auch hier :wink:
 
Zuletzt bearbeitet:

betateilchen

Grandstream-Guru
Mitglied seit
30 Jun 2004
Beiträge
12,882
Punkte für Reaktionen
0
Punkte
0
Wichtige Korrektur !

In Lektion 4 ist mir ein Fehler unterlaufen.
Die Priority 3 im Context [mailbox_own] bekommt als Parameter s${CALLERIDNUM}
und nicht wie irrtümlich zuerst angegeben u${CALLERIDNUM} :!:

Bitte korrigiert dies in Eurer extensions.conf !

Hier der korrekte Inhalt des Context [mailbox_own]

Code:
[mailbox_own]
exten => 88,1,answer
exten => 88,n,wait,1
exten => 88,n,voicemailmain,s${CALLERIDNUM}
exten => 88,n,hangup
 
Zuletzt bearbeitet:

betateilchen

Grandstream-Guru
Mitglied seit
30 Jun 2004
Beiträge
12,882
Punkte für Reaktionen
0
Punkte
0
Lektion 6: Die wichtigsten Befehle auf der Asterisk CLI

Vorab: CLI ist der Konsolenbildschirm, den man erhält, wenn man sich durch "asterisk -r" mit dem Asterisk-Server verbunden hat.

Auf dieser Konsole können viele viele Befehle eingegeben werden - für uns ist aber die Konsole eher zum Debuggen wichtig, um zu sehen, was eigentlich passiert, wenn wir einen Anruf tätigen.

In dieser Lektion werde ich ein paar der wichtigsten Befehle vorstellen, die wir in nächster Zeit dann auch verwenden werden.

[hr]x[/hr]

Starten und Beenden des Asterisk-Servers, Verbinden mit der Konsole und Verlassen der Konsole


Starten des Asterisk:

das erfolgt auf Betriebssystemebene durch

Code:
# asterisk
Der Asterisk wird bei diesem Aufruf ohne jegliche Rückmeldung gestartet - oder auch nicht => wenn es beim Start zu einem Abbruch kommt, bemerken wir das an dieser Stelle erstmal nicht.


Verbinden mit der Asterisk-Konsole CLI

Code:
# asterisk -r
Wenn das Starten erfolgreich war, meldet sich der Asterisk mit seiner Konsole, die bereits in Lektion 1 abgebildet war.

Falls das Starten nicht erfolgreich war, bekommen wir an dieser Stelle eine Fehlermeldung, daß keine Verbindung hergestellt werden konnte. Man kann dann den Asterisk mal mit

Code:
# asterisk -vvvg
versuchen zu starten, dann sollte man zumindest erkennen, an welcher Stelle der Abbruch erfolgt. Das ist zur Fehlereingrenzung sehr nützlich.​


Beenden des Asterisk Servers

Von der Systemkonsole aus kann man den Asterisk-Server mit

Code:
CLI> stop now
beenden. Die Verbindung zur Asterisk-Konsole wird dabei (logischerweise) beendet.


Verlassen der Asterisk Konsole

Die Systemkonsole kann mit

Code:
CLI> exit
verlassen werden. Achtung - der Server selbst wird dadurch nicht beendet !

[hr]x[/hr]

Sichtbarmachen, was eigentlich passiert

Wir geben mal an der CLI den Befehl

Code:
CLI> set verbose 3
ein und erhalten eine entsprechende Rückmeldung.

Ab jetzt können wir auf der CLI den Rufaufbau verfolgen, wenn wir ein Gespräch führen, die Mailbox abfragen usw.

Achtung: Nach einem Neustart des Servers steht dieser Wert wieder auf 0 und muß neu gesetzt werden.

So sieht zum Beispiel der Rufaufbau eines über Sipgate ankommenden Anrufes, der an die Nebenstelle 31 geleitet wird, aus:

Code:
    -- Executing Dial("SIP/217.10.67.4-081938f0", "SIP/31|30|r") in new stack
    -- Called 31
    -- SIP/31-8b35 is ringing
    -- SIP/31-8b35 answered SIP/217.10.67.4-081938f0
    -- Attempting native bridge of SIP/217.10.67.4-081938f0 and SIP/31-8b35
  == Spawn extension (ankommend, 6112233, 1) exited non-zero on 'SIP/217.10.67.4-081938f0'
[hr]x[/hr]

Status der peers abfragen

Um zu sehen, welche der 10 möglichen SIP-Endpunkte (=peers) online sind, verwenden wir den Befehl

Code:
CLI> sip show peers
da erhalten wir eine Ausgabe, die in etwa so aussieht:

Code:
vs8221*CLI> sip show peers
Name/username              Host            Dyn Nat ACL Port     Status
39                         (Unspecified)    D   N      0        Unmonitored
38                         (Unspecified)    D   N      0        Unmonitored
37                         (Unspecified)    D   N      0        Unmonitored
36                         (Unspecified)    D   N      0        Unmonitored
35                         (Unspecified)    D   N      0        Unmonitored
34                         (Unspecified)    D   N      0        Unmonitored
33                         (Unspecified)    D   N      0        Unmonitored
32                         (Unspecified)    D   N      0        Unmonitored
31/31                      88.1xx.xx.xxx    D   N      5070     Unmonitored
30/30                      88.1xx.xx.xxx    D   N      5060     Unmonitored
sipgate_de_in              217.10.79.9                 5060     Unmonitored
6112233/6112233            217.10.79.9                 5060     Unmonitored
12 sip peers [12 online , 0 offline]
vs8221*CLI>
Die Einträge 39 - 30 sind die 10 in der sip.conf vorbereiteten SIP Endgeräte. Die Geräte, bei denen eine IP anstatt (Unspecified) steht, sind gerade am Asterisk angemeldet.

Die beiden untersten Einträge sind die beiden Einträge für Sipgate, die wir in der sip.conf haben.

Die Aussage

Code:
12 sip peers [12 online , 0 offline]
ignorieren wir für den Moment erstmal. Das einzige was daran stimmt, ist der Teil vor der Klammer: 12 sip peers aber das wußten wir ja auch so :mrgreen:

Bei Eingabe von

Code:
sip show peer 30
erhalten wir alle Informationen über ein bestimmtes Gerät.

Code:
vs8221*CLI> sip show peer 30
vs8221*CLI>

  * Name       : 30
  Secret       : <Set>
  MD5Secret    : <Not set>
  Context      : default
  Subscr.Cont. : <Not set>
  Language     : de
  AMA flags    : Unknown
  CallingPres  : Presentation Allowed, Not Screened
  Callgroup    :
  Pickupgroup  :
  Mailbox      : 30
  VM Extension : asterisk
  LastMsgsSent : 0
  Call limit   : 0
  Dynamic      : Yes
  Callerid     : "Thomson ST2030" <30>
  Expire       : 2720
  Insecure     : no
  Nat          : Always
  ACL          : No
  CanReinvite  : No
  PromiscRedir : No
  User=Phone   : No
  Trust RPID   : No
  Send RPID    : No
  DTMFmode     : rfc2833
  LastMsg      : 0
  ToHost       :
  Addr->IP     : 88.1xx.xx.xxx Port 5060
  Defaddr->IP  : 0.0.0.0 Port 5060
  Def. Username: 30
  SIP Options  : (none)
  Codecs       : 0x8000e (gsm|ulaw|alaw|h263)
  Codec Order  : (none)
  Status       : Unmonitored
  Useragent    : THOMSON ST2030 hw0 fw1.38 00-0E-50-00-00-00
  Reg. Contact : sip:[email protected]:5060;user=phone
Wir erkennen also, daß Rocky gerade ein Thomson Telefon als Nebenstelle 30 an seinem Server angemeldet hat :D
Ich werde die angegebenen Daten nicht alle erklären - wer das genau wissen möchte, kann das auf http://www.voip-info.org nachlesen.

Wer den Exkurs 1 (IAX Endgerät) mitgemacht hat, der sollte wissen, daß das gleiche auch für IAX Geräte funktioniert. Es ist dazu nur anstatt sip eben iax2 zu schreiben (nein - die 2 ist kein Tippfehler !)

[hr]x[/hr]
Nachtrag

Status der Provider-Registrierungen abfragen

Code:
vs2501*CLI> sip show registry
Host                            Username       Refresh State
sipgate.de:5060                 6112233            105 Registered
vs2501*CLI>
Man sieht also, daß der Server gerade bei sipgate.de registriert ist - alles prima :D

[hr]x[/hr]

So - heute war nochmal ein bißchen Theorie, aber in der nächsten Lektion werden wir wieder an unseren Konfigurationsdateien rumschrauben.
 
Zuletzt bearbeitet:

betateilchen

Grandstream-Guru
Mitglied seit
30 Jun 2004
Beiträge
12,882
Punkte für Reaktionen
0
Punkte
0
Lektion 7: Wir binden die Mailbox ein

Nachdem wir in der Lektion 2 schon die voicemail.conf so eingerichtet haben, daß wir jedem Endgerät eine gleichnamige Mailbox zugeordnet haben, und wir in Lektion 4 auch schon dafür gesorgt haben, daß wir diese Mailbox auch abfragen und steuern können, wird es nun höchste Zeit, daß wir auch dafür sorgen, daß uns irgendwer auch auf den Laberkasten sprechen kann.

Das Ziel dieser Lektion ist, den Anrufer mit unterschiedlichen Ansagen für "besetzt" und "nicht erreichbar" zu begrüßen und ihm die Möglichkeit zu geben, uns eine Nachricht zu hinterlassen.

[hr]x[/hr]

Da es sich hierbei um eine Erweiterung des Dialplans handelt, bewegen wir uns in der extensions.conf.

Im speziellen geht es ja darum, Anrufer die uns über unsere Sipgate-Nummer anrufen, auf die Mailbox zu schicken, wir müssen also den Kontext [ankommend] ändern.

Dieser Context sieht im Moment so aus:

Code:
[ankommend]
exten => 6112233,1,Dial,SIP/30&SIP/31|30|r
Nun führen wir eine neue Variable ein: ${DIALSTATUS}

Mit dieser von Asterisk vordefinierten Variablen ist es möglich, das Resultat des letzten Anrufes zu ermitteln. Diese Variable kann verschiedene Werte annehmen (CHANUNAVAIL | CONGESTION | BUSY | NOANSWER | ANSWER | CANCEL | HANGUP).

Für unsere Aufgabenstellung sind (vorläufig) nur BUSY und NOANSWER interessant. BUSY bedeutet, daß der Anrufer gerade besetzt war und NOANSWER bedeutet, daß er in der vorgegebenen Rufzeit (im Beispiel 30 Sekunden) nicht abgenommen hat.

Wir werten diese Variable also nach dem Dial-Befehl aus und unser Kontext [ankommend] sieht danach so aus:

Code:
[ankommend]
exten => 6112233,1,Dial,SIP/30&SIP/31|30|r
exten => 6112233,2,Goto,r-${DIALSTATUS}|1

exten => r-BUSY,1,voicemail,b30
exten => r-BUSY,2,Hangup

exten => r-NOANSWER,1,voicemail,u30
exten => r-NOANSWER,2,Hangup
Ob Ihr es glaubt oder nicht - das ist alles :D

Versuchen wir mal zu erklären, was da passiert.

Der Goto-Befehl in der 2. Zeile des Kontexts läßt uns an die 1. priority (= vorgegeben durch |1 ) in einer extension springen, deren Name sich aus "r-" und dem daran angehängten DIALSTATUS zusammensetzt (bitte an die Lektion 5 denken, wo wir Variablen mit Text oder anderen Variablen zusammengefügt haben !) Das "r-" ist übrigens rein willkürlich, für mich ist es aber ein Synonym für "result-". Reine Geschmackssache.

Im Fall von BUSY heißt die extension, die wir suchen, also r-BUSY und da springen wir hin. An der 1. priority dieser extension rufen wir die Applikation voicemail mit dem Parameter b30 auf. Das b steht dabei für die Auswahl der Ansage für den Besetzfall, die 30 ist die Mailbox auf die wir sprechen lassen wollen. Wir können zwar 2 SIP Geräte parallel klingeln lassen, aber wir müssen uns bei der Auswahl der Mailbox dann eben mal festlegen. Ich hab das hier zugunsten der 30 gemacht.

Genaus funktioniert das mit NOANSWER, nur daß dort u30 verwendet wird, das u steht für die Auswahl des Ansagetextes für "unreachable" - also nicht erreichbar.

[hr]x[/hr]

Das wars - so einfach geht das.

Viel Spaß beim Nachbauen :D
 
Zuletzt bearbeitet:

betateilchen

Grandstream-Guru
Mitglied seit
30 Jun 2004
Beiträge
12,882
Punkte für Reaktionen
0
Punkte
0
Lektion 8: Wir bringen unserem Asterisk deutsch bei

Heute kommt nochmal was einfaches. Wir bringen unserem Asterisk bei, daß er deutsch mit uns redet.

Hierzu sind nur wenige Schritte notwendig:

Wir besorgen uns deutsche Soundfiles

Dazu gehen wir mal auf die entsprechende Webseite der Stadt Pforzheim und finden darauf einen Link zum Downloadbereich. Von dort holen wir uns die Datei ast_prompts_de_v2_0.tar.gz

Am einfachsten & schnellsten geht das übrigens, wenn wir das direkt von der Systemconsole unseres Servers aus machen. Wir loggen uns also per SSH dort ein (z.B. mit putty - für die Windows-Anwender, ein paar soll es ja noch geben) und führen dann folgenden Befehl aus:

Code:
# wget http://www.stadt-pforzheim.de/asterisk/dateien/ast_prompts_de_v2_0.tar.gz
danach entpacken wir das Archiv mit

Code:
# tar -xvzf ast_prompts_de_v2_0.tar.gz
Danach haben wir einen Ordner namens ast_prompts_de_v2.0. In diesem befindet sich ein Verzeichnis "var" das wir komplett nach /var kopieren. Ob man das mit MC macht, oder mit direkt mit cp bleibt jedem Anwender selbst überlassen. Windows-User können das Kopieren dann natürlich auch mit WinSCP machen.​


Wir teilen Asterisk mit, daß er nun deutsch mit uns reden soll

Dafür editieren wir die Datei sip.conf. Wir müssen im [general] Kontext eine Zeile einfügen, in der wir festlegen, daß die Sprache nun deutsch sein soll.

Code:
[general]
context=default
bindport=5060
bindaddr=84.16.xxx.xxx
srvlookup=yes
[b]language=de[/b]

Wir aktivieren die Änderung

Dazu wechseln wir auf die Asterisk CLI und machen ein "sip reload"

Wer Exkurs 1 mitgemacht hat, muß die gleiche Zeile auch in die iax.conf einfügen und dann ein "iax2 reload" auf der CLI machen

Das wars :!: Wenn wir nun einen Echotext oder die Mailbox anrufen, sollte sich eine nette Frauenstimme in deutsch mit uns unterhalten.

Wer die Sprache pro Endgerät festlegen möchte, kann dies in der sip.conf im entsprechenden Context der Geräteanmeldung machen und so zwischen language=en und language=de gerätespezifisch konfigurieren.

[hr]x[/hr]

Viel Erfolg beim Nachbauen :D
 
Zuletzt bearbeitet:

betateilchen

Grandstream-Guru
Mitglied seit
30 Jun 2004
Beiträge
12,882
Punkte für Reaktionen
0
Punkte
0
Lektion 9: Wir binden einen 2. SIP Provider ein

Habe extra bis nach Mitternacht gewartet - hier also die heutige Lektion
[hr]x[/hr]
Heute binden wir unseren 2. SIP Provider ein. Ich habe dazu mal ein Konfigurationsbeispiel mit blueSIP gebastelt.

Im [general] Teil der sip.conf bauen wir das register => mit ein (um erreichbar zu sein)

Code:
register => bluesip/username:[email protected]/bluesip1
Dann brauchen wir in der sip.conf wieder 2 Contexte - einen für ausgehende Anrufe (das ist der lange) und einen für eingehende (der kurze)

Code:
[bluesip1]
type=peer
username=bluesip/username
fromuser=username
secret=passwort
host=bluesip.net
fromdomain=bluesip.net
insecure=very
caninvite=no
canreinvite=no
nat=no
disallow=all
allow=gsm

[bluesip_in]
type=peer
fromdomain=bluesip.net
host=bluesip.net
context=ankommend
We zu erkennen ist, gelangen die ankommenden Anrufe von blueSIP auch in den Context [ankommend] der extensions.conf Und da wir im register => die Erweiterung /bluesip1 angegeben haben, können wir die Anrufe in der extensions.conf leicht identifizieren.

Wir ergänzen also unseren Context [ankommend] wie folgt:

Code:
[ankommend]
exten => 6112233,1,Dial,SIP/30&SIP/31|30|r
exten => 6112233,2,Goto,r-${DIALSTATUS}|1

[B]exten => bluesip1,1,Dial,SIP/30&SIP/31|30|r
exten => bluesip1,2,Goto,r-${DIALSTATUS}|1[/B]

exten => r-BUSY,1,voicemail,b30
exten => r-BUSY,2,Hangup

exten => r-NOANSWER,1,voicemail,u30
exten => r-NOANSWER,2,Hangup
Damit werden ab sofort auch alle Anrufe, die über blueSIP reinkommen, auch auf den Geräten 30 & 31 signalisiert.

wir werden die Zuordnung von Providern zu Endgeräten später noch ändern - im Moment lassen wir das aber einfach mal so.

Damit haben wir den eingehenden Teil abgehakt.

Kommen wir nun zum zweiten Teil - wir wollen ja auch abgehend über diesen Provider telefonieren. Dazu werden wir uns eine "Vorwahl" einrichten, bei desser Verwendung der Asterisk erkennt, daß er diesen Anruf über den blueSIP-Account führen soll. Alle Anrufe ohne diese Vorwahl werden weiterhin über den Sipgate-Account ausgeführt.

Als Vorwahl verwenden wir die Kombination *1

Dazu legen wir uns in der extensions.conf einen neuen Context [bluesip_out] an, der folgenden Inhalt bekommt:

Code:
[bluesip_out]
exten => _*1.,1,Dial,SIP/${EXTEN:2}@bluesip1|45|r
Die Funktionsweise sollte eigentlich klar sein: Wir werten das Pattern aus, und schneiden dann von ${EXTEN} die ersten 2 Stellen (*1) mit :2 ab - das dürfen wir ja nicht mitwählen.

Und da dieser Context im Moment von allen Geräten genutzt werden soll, binden wir ihn in den [default] Context ein:

Code:
[default]
include => lokal
include => echotest
include => mailbox
include => mailbox_own
include => sipgate_out
[b]include => bluesip_out[/b]
Das wars. Nun noch den Asterisk mit

Code:
CLI> reload
neu initialisieren, und dann sollte man ab sofort z.B. *108003301000 wählen können und eine freundliche Ansage der T-Com hören.

[hr]x[/hr]

Viel Spaß beim Nachbauen :D
 
Zuletzt bearbeitet:

betateilchen

Grandstream-Guru
Mitglied seit
30 Jun 2004
Beiträge
12,882
Punkte für Reaktionen
0
Punkte
0
Lektion 10: Wir bauen unseren ersten Macro

Nun ist es an der Zeit, unseren ersten Macro in die extensions.conf zu bauen.

Warum brauchen wir einen Macro ?

Schauen wir uns mal unsere extensions.conf an:

Code:
[lokal]
exten => _3X,1,NoCDR()
exten => _3X,n,Dial,SIP/${EXTEN}|55|Ttr

[ankommend]
exten => 6112233,1,Dial,SIP/30&SIP/31|30|r
exten => 6112233,2,Goto,r-${DIALSTATUS}|1

exten => bluesip1,1,Dial,SIP/30&SIP/31|30|r
exten => bluesip1,2,Goto,r-${DIALSTATUS}|1

exten => r-BUSY,1,voicemail,b30
exten => r-BUSY,2,Hangup

exten => r-NOANSWER,1,voicemail,u30
exten => r-NOANSWER,2,Hangup
Was hierbei sofort auffällt, ist die Tatsache,daß wir an 3 Stellen einen Dial-Befehl stehen haben, 2 Mal sogar mit gleichem Inhalt - nämlich bei der Signalisierung von externen Anrufen.

Hätten wir im Context [lokal] z.B. auch noch die Mailbox eingebunden, sodaß auch interne Anrufer eine Nachricht hinterlassen können, dann hätten wir die Mailboxeinbindung auch nochmal in den Context [lokal] schreiben müssen.

Wenn wir uns nun noch zusätzlich überlegen, daß wir nicht nur mit 2 Providern arbeiten, sondern mit 20 - dann kann man sich gut vorstellen, daß die extensions.conf sehr schnell sehr übersichtlich werden kann, da wir für jeden weiteren Provider die 2 Zeilen (Dial & Goto) wiederholen müßten.

Das ist natürlich unbefriedigend. Und deshalb werden wir das nun vereinfachen - und das geht mit einem Macro.

Was ist ein Macro ?

Vereinfacht gesagt, ist ein Macro ein Stück Code, das an verschiedenen Stellen immer wieder verwendet werden kann.

Der Macro den wir brauchen, sieht so aus:

Code:
[macro-ruf]
; Die Zeile 1 dient lediglich dazu, dass wir in der CLI eine Bestaetigung erhalten,
; dass wir an der richtigen Stelle angekommen sind
exten => s,1,NoOp(Wir sind im Macro ruf gelandet)
exten => s,n,Dial,${ARG1}/${ARG2}|30|r
exten => s,n,Goto,s-${DIALSTATUS}|1

exten => s-BUSY,1,voicemail,b${ARG2}
exten => s-BUSY,n,Hangup

exten => s-NOANSWER,1,voicemail,u${ARG2}
exten => s-NOANSWER,n,Hangup
Macros sind Bestandteile der extensions.conf und werden wie "normale" Contexte dort eingetragen. Ich habe mir angewöhnt, sie an den Anfang der extensions.conf, direkt nach dem [globals] Context zu platzieren. Bei der Namensgebung ist darauf zu achten, daß sie nach dem Schema [macro-<name>] erstellt werden, denn mit <name> werden sie später aus dem Dialplan aufgerufen :!:

Nun versuchen wir mal rauszufinden, was da genau passiert.

In der 1. Zeile verwenden wir den Befehl NoOp() der einfach "No Operation" bedeutet und nix tut :mrgreen:
Dieser Befehl ist prima geeignet, um während des Abarbeiten des Dialplans ein paar Informationen auf der CLI zu erhalten.

Den Rest kennen wir eigentlich schon: ein Dial Befehl und danach die Verzweigung in die Mailboxansage - ja nach ${DIALSTATUS}

Es fallen uns aber 2 Besonderheiten auf:

1.) Wir verwenden im Macro die extension "s"

"s" ist die Standardextension und gilt prinzipiell für alles was als extension verwendet werden kann. In Macros stehen die channelgebundenen Variablen (z.B. ${EXTEN}) nicht zur Verfügung, deshalb können wir hier nur mit "s" arbeiten.​

2.) Wir verwenden im Dialplan ${ARG1} und ${ARG2}

Wie bereits in Lektion 5 beschrieben, gibt es neben den channelspezifischen Variablen auch macrospezifische. Dazu zählen die Variablen ${ARG0} ${ARG1} ${ARG2} ${ARG3} ...

Vereinfacht gesagt, handelt es sich hierbei um die Parameter, die wir dem Macro an beliebiger Stelle bei seinem Aufruf übergeben. Die laufende Nummer der Variablen ergibt sich dabei aus der Reihenfolge der übergebenen Parameter. Also ${ARG1} = 1. Parameter, ${ARG2} = 2. Parameter usw.

In unserem Macro arbeiten wir also mit 2 Parametern:

Code:
exten => s,n,Dial,${ARG1}/${ARG2}|30|r
Wenn wir das mal noch weiter aufdröseln und uns aufs Wesentliche konzentrieren, bleibt folgendes übrig:

Dial,${ARG1}/${ARG2}

Wenn man sich nun die Syntax des Dial-Befehls anschaut, dann sieht das prinzipiell so aus:

Dial, <technology>/<ziel> also z.B. Dial, SIP/30

Wir haben in unserem Macro also <technology> durch ${ARG1} und <ziel> durch ${ARG2} ersetzt. Nehmen wir mal an, daß ${ARG1}=SIP und ${ARG2}=30 dann würde unser Befehl im Macro aufgelöst werden zu:

Code:
Dial, SIP/30
und wir haben das gewünschte Ergebnis.​

Klingt alles furchtbar kompliziert - wenn wir das aber praktisch anwenden, wird das klarer. Also nicht aufgeben :wink:

Wozu betreiben wir den ganzen Aufwand ? werden sich jetzt sicherlich einige fragen ...

Naja - wir können nun folgendes machen: Wir modifizieren unseren Context [lokal], so daß er nun so aussieht:

Code:
[lokal]
exten => _3X,1,NoCDR()
exten => _3X,n,macro,ruf|SIP|${EXTEN}
Damit übergeben wir der Applikation macro den Namen des macros (= ruf - das ist übrigens im Makro die Variable ${ARG0}), und die beiden Parameter SIP und die Nummer der Extension mit ${EXTEN}
Sieht erstmal so aus, als hätten wir dadurch nix gespart - es sind immer noch 2 Zeilen. Ok - 2 Zeilen stimmt. Aber durch den Aufruf des Macros haben wir so ganz nebenbei die Mailbox auch für alle internen Anrufe eingebunden. Das heißt, wenn 31 die 30 anruft, und 30 ist nicht erreichbar oder besetzt, dann landet 31 auf der Mailbox und kann eine Nachricht hinterlassen.

Wer den Exkurs 1 (IAX Endgerät) mit eingebaut hat, kann nun auch noch das IAX-Gerät nach dem gleichen Schema einbinden:

Code:
[lokal]
exten => _3X,1,NoCDR()
exten => _3X,n,macro,ruf|SIP|${EXTEN}

exten => 40,1,NoCDR()
exten => 40,n,macro,ruf|IAX2|${EXTEN}

Noch besser wirkt sich das bei unserem Context [ankommend] aus. Dort müssen wir jetzt nur noch für jeden ankommenden Account eine einzige Zeile eintragen, anstatt bisher 2. Und die Behandlung der Mailbox können wir aus dem Context ganz rauswerfen.
Unser neuer Context [ankommend] sieht also nun so aus:

Code:
[ankommend]
exten => 6112233,1,macro,ruf|SIP|30
exten => bluesip1,1,macro,ruf|SIP|31
Hiermit erreichen wir, daß alle ankommenden Anrufe über Sipgate an Gerät 30 signalisiert werden, und all blueSIP Anrufe auf der 31 landen. Jeder weitere Provider wird nach dem gleichen Schema hier eingetragen - wir schaffen uns dadurch einen extrem übersichtlichen Context für die Zuordnung von ankommenden Anrufen zu bestimmten Endgeräten.​

Wenn alles richtig gemacht wurde, sollte auf der CLI nun beim Telefonieren folgendes erscheinen:

Beispiel 1: Ankommender Anruf über Sipgate (Mailbox antwortet nach 30 Sekunden, weil keiner abnimmt)

Code:
    -- Executing Macro("SIP/217.10.67.4-40855248", "ruf|SIP|30") in new stack
    -- Executing NoOp("SIP/217.10.67.4-40855248", "Wir sind im Macro ruf gelandet") in new stack
    -- Executing Dial("SIP/217.10.67.4-40855248", "SIP/30|30|r") in new stack
    -- Called 30
    -- SIP/30-f499 is ringing
    -- Nobody picked up in 30000 ms
    -- Executing Goto("SIP/217.10.67.4-40855248", "s-NOANSWER|1") in new stack
    -- Goto (macro-ruf,s-NOANSWER,1)
    -- Executing VoiceMail("SIP/217.10.67.4-40855248", "u30") in new stack
    -- Playing '/var/spool/asterisk/voicemail/default/30/unavail' (language 'de')
    -- Playing 'vm-intro' (language 'de')
    -- Playing 'beep' (language 'de')
    -- Recording the message
    -- x=0, open writing:  /var/spool/asterisk/voicemail/default/30/INBOX/msg0090 format: wav, 0x819bb38
    -- User hung up
  == Spawn extension (macro-ruf, s-NOANSWER, 1) exited non-zero on 'SIP/217.10.67.4-40855248' in macro 'ruf'

Beispiel 2: interner Anruf von 30 nach 31

Code:
    -- Executing NoCDR("SIP/30-57b7", "") in new stack
Jan 12 18:33:15 WARNING[5425]: cdr.c:443 ast_cdr_free: CDR on channel 'SIP/30-57b7' not posted
Jan 12 18:33:15 WARNING[5425]: cdr.c:445 ast_cdr_free: CDR on channel 'SIP/30-57b7' lacks end
    -- Executing Macro("SIP/30-57b7", "ruf|SIP|31") in new stack
    -- Executing NoOp("SIP/30-57b7", "Wir sind im Macro ruf gelandet") in new stack
    -- Executing Dial("SIP/30-57b7", "SIP/31|30|r") in new stack
    -- Called 31
    -- SIP/31-4dd4 is ringing
    -- Nobody picked up in 30000 ms
    -- Executing Goto("SIP/30-57b7", "s-NOANSWER|1") in new stack
    -- Goto (macro-ruf,s-NOANSWER,1)
    -- Executing VoiceMail("SIP/30-57b7", "u30") in new stack
    -- Playing '/var/spool/asterisk/voicemail/default/30/unavail' (language 'de')
    -- Playing 'vm-intro' (language 'de')
    -- Playing 'beep' (language 'de')
    -- Recording the message
    -- x=0, open writing:  /var/spool/asterisk/voicemail/default/30/INBOX/msg0091 format: wav, 0x819bb38
    -- User hung up
  == Spawn extension (macro-ruf, s-NOANSWER, 1) exited non-zero on 'SIP/30-57b7' in macro 'ruf'

[hr]x[/hr]
Wir haben durch diesen Umbau die Möglichkeit der gleichzeitigen Anrufsignalisierung auf mehreren Geräten verloren. Das ist ein erster Vorgriff auf die nächste Lektion, wo wir die Endgeräte sowohl eingehend wie ausgehend autark machen. Vielleicht zeige ich in einem späteren Schritt auch noch, wie man das mit der Mehrfachsignalisierung auch bei Verwendung eines Macros lösen kann.
[hr]x[/hr]

Viel Spaß beim Nachbauen :D
 
Zuletzt bearbeitet:

betateilchen

Grandstream-Guru
Mitglied seit
30 Jun 2004
Beiträge
12,882
Punkte für Reaktionen
0
Punkte
0
Exkurs 2: Einbindung eines nikotel-Accounts

Für User, die auch einen Nikotel-Account auf den Asterisk einbinden wollen, kommen hier die relevanten Teile. Bei Nikotel ist manches anders als bei unseren bisherigen SIP Providern hier im Kurs.

  • Bitte übernehmt die Beispiele unverändert :!:
  • Bitte probiert nicht, mehr als einen nikotel Account auf dem Server zu verwenden :!:
  • Bitte fragt mich nicht nach weiteren Erklärungen - wer nachlesen will -> hier

Danke an Blackvel für die seinerzeitige Geduld und den Einsatz bei der Entwicklung der nikotel/Asterisk Lösung !

Hier die relevanten Teile für die sip.conf:

Code:
register => <username>:<passwort>@calamar0.nikotel.com

[63.214.186.6]
type=peer
username=<username>
secret=<passwort>
host=calamar0.nikotel.com
fromuser=<username>
fromdomain=nikotel.de
context=from_nikotel
canreinvite=no
insecure=very
promiscredir=yes
qualify=no
disallow=all
allow=gsm
und hier für die extensions.conf:

Code:
[from_nikotel]
exten => s,1,NoOp(Ankommend über Nikotel)
exten => s,n,macro,ruf|SIP|32 ; hier anstatt 32 das Endgerät angeben, das bei ankommenden Calls klingeln soll !

[nikotel_out] ; wir verwenden *2 als Vorwahl für Anrufe über den nikotel-Account
exten => _*2.,1,dial,SIP/${EXTEN:2}@63.214.186.6|45|r
Der Context [nikotel_out] muß dann natürlich noch mit

include => nikotel_out

in den [default] Context der extensions.conf eingebunden werden.

In diesem Konfigurationsbeispiel wird davon ausgegangen, daß der User nach *2 die Rufnummer im "nikotel-Format" also 49<vorwahl><rufnummer> wählt. Wer das anpassen möchte, sodaß deutsche Rufnummer "normal" gewählt werden können, findet die Lösung (und auch die Lösung für internationale Anrufe) in Lektion 5 bei den Beispielen für die Variablen-Verwendung !

Für die copy & paste Fanatiker hier ein kompletter Context, der Inlands- Auslands- und nikotel-interne Gespräche korrekt abwickelt:

Code:
[nikotel_out] ; wir verwenden *2 als Vorwahl für Anrufe über den nikotel-Account
; für Auslandsgespraeche
exten => _*200.,1,dial,SIP/${EXTEN:4}@63.214.186.6|45|r

; für Inlandsgespraeche (Deutschland - ansonsten die 49 anpassen !)
exten => _*20Z.,1,dial,SIP/49${EXTEN:3}@63.214.186.6|45|r

; für nikotel-interne Anrufe mit 99xxxx
exten => _*299.,1,dial,SIP/${EXTEN:2}@63.214.186.6|45|r
[hr]x[/hr]
Viel Erfolg !
 
Zuletzt bearbeitet:

betateilchen

Grandstream-Guru
Mitglied seit
30 Jun 2004
Beiträge
12,882
Punkte für Reaktionen
0
Punkte
0
Lektion 11: Wir binden einen IAX Provider ein

Heute werden wir einen Provider einbinden, den wir nur abgehend benutzen werden. Ich habe mich hier für Voipjet entschieden, weil

  • kostenlose Registrierung
  • $ 0.25 Guthaben zum Testen direkt nach der Anmeldung verfügbar
  • Provider untertstützt ausschließlich IAX
  • Einfaches Guthaben-Aufladen, z.B. per PayPal
  • Bisher sehr gute Erfahrungen in punkto Sprachqualität und Zuverlässigkeit

Schritt 1: Wir besorgen uns einen Testaccount bei Voipjet (Link siehe oben)

Auf der Webseite finden wir nach der Anmeldung auch schon die gesamte Einrichtungsbeschreibung für VoipJet auf einem Asterisk. Aber ich will die hier einfach nochmal wiedergeben, damit man die Informationen auch hier im Kurs hat.

Schritt 2: Wir bearbeiten die iax.conf

Folgende Ergänzungen sind notwendig:

Code:
[general]
jitterbuffer=yes
dropcount=1

[voipjet]
type=peer
host= 64.34.45.100
secret= <das ellenlange MD5 Passwort>
auth=md5
notransfer=yes
disallow=all
allow=ulaw
Schritt 3: Wir bearbeiten die extensions.conf

Folgende Ergänzungen sind notwendig:

Code:
[voipjet_out] ; wir verwenden *3 zum Rauswählen nach Deutschland über VoipJet
exten =>  _*30Z.,1,Dial,IAX2/<userid>@voipjet/01149${EXTEN:3}

[default]
...
...
...
include => voipjet_out
Das Wählformat für internationale Anrufe ist bei VoipJet so festgelegt: 011<landesvorwahl><ortsvorwahl><rufnummer>
Unser o.g. Dial-Befehl setzt das entsprechen korrekt um - für Anrufe nach Deutschland. Deutsche Rufnummern können damit "normal" gewählt werden, also 0123/456789

Schritt 4: Wir aktivieren die Änderungen

Nach einem "reload" auf der Asterisk-CLI sollten nun alle Endgeräte mit *3 über VoipJet nach Deutschland anrufen können.
[hr]x[/hr]
Wie man sieht, ist die Einbindung von IAX Providern nicht komplizierter, als die Einbindung von SIP-Anbietern.

Viel Spaß beim Nachbauen :D
 
Zuletzt bearbeitet:

betateilchen

Grandstream-Guru
Mitglied seit
30 Jun 2004
Beiträge
12,882
Punkte für Reaktionen
0
Punkte
0
Exkurs 3: Befehls-Syntax in der extensions.conf

Da mich einige PNs erreicht haben, in denen danach gefragt wurde, warum ich schreibe

Code:
exten => xyz,1,Dial,SIP/30|30|r

und nicht

Code:
exten => xyz,1,Dial(SIP/30,30,r)
(wie es in den allermeisten Dokus und Beispielen steht)​

hier eine kurze Antwort:

Es bewirkt exakt das gleiche !

Ich arbeite grundsätzlich mit dieser Variante

Code:
exten => xyz,1,Dial,SIP/30|30|r

weil diese Trennung nach Applikation (= Dial) und Parameter (= SIP/30|30|r) beim Arbeiten mit Realtime und der Speicherung solcher Anweisungen in einer MySQL Datenbank unbedingte Voraussetzung ist.

Der senkrechte Strich | ersetzt dabei das Komma.

Es kam auch die Frage, woher unser Macro weiß, daß ${ARG1} den Inhalt SIP hat. Nun, das ergibt sich einfach aus dem übergebenen Parameterteil. Wir rufen ja unseren Macro z.B. auf mit

Code:
exten => xyz,1,macro,[b]ruf|SIP|30[/b]

wenn man den Paramterteil ruf|SIP|30 zerlegt, ergibt sich folgendes:

Code:
${ARG0} = ruf
${ARG1} = SIP
${ARG2} = 30
Die Anzahl der Parameter ist übrigens (beim Macro) nicht begrenzt.​

Ich hoffe, damit die gestellten Fragen geklärt zu haben :D
 
Zuletzt bearbeitet:

betateilchen

Grandstream-Guru
Mitglied seit
30 Jun 2004
Beiträge
12,882
Punkte für Reaktionen
0
Punkte
0
Exkurs 4: Der Einzelverbindungsnachweis in Asterisk

Standardmäßig schreibt Asterisk Daten zu Anrufen im CSV Format (getrennt durch Kommas) in das Verzeichnis /var/log/asterisk/cdr-csv Die Datei Master.csv in diesem Verzeichnis enthält alle Einträge.

Die einzelnen Felder bedeuten dabei folgendes: (kopiert von www.voip-info.org - ich hab keine Lust das zu übersetzen)
Code:
   1. accountcode: What account number to use: account, (string, 20 characters)
   2. src        : Caller*ID number (string, 80 characters)
   3. dst        : Destination extension (string, 80 characters)
   4. dcontext   : Destination context (string, 80 characters)
   5. clid       : Caller*ID with text (80 characters)
   6. channel    : Channel used (80 characters)
   7. dstchannel : Destination channel if appropriate (80 characters)
   8. lastapp    : Last application if appropriate (80 characters)
   9. lastdata   : Last application data (arguments) (80 characters)
  10. start      : Start of call (date/time)
  11. answer     : Anwer of call (date/time)
  12. end        : End of call (date/time)
  13. duration   : Total time in system, in seconds (integer)
  14. billsec    : Total time call is up, in seconds (integer)
  15. disposition: What happened to the call: ANSWERED, NO ANSWER, BUSY
  16. amaflags   : What flags to use: see amaflags::DOCUMENTATION, BILL, IGNORE etc, specified on a per channel basis like accountcode.
In Einzelfällen können auch die Felder "userfield" und "uniqueid" zusätzlich vorhanden sein - dazu muß aber der Source-Code der CDR Applikation angepaßt werden - das werden wir hier im Kurs nicht machen.​

Beispiel:

Code:
"","unbekannt","6112233","ankommend","""anonymous"" <unbekannt>","SIP/217.10.67.4-08183a20","SIP/30-0bda","Dial","SIP/30|30|r","2006-01-13 13:54:30","2006-01-13 13:54:39","2006-01-13 13:55:00",30,21,"ANSWERED","DOCUMENTATION"

Aufgedröselt:
Ein ankommender ankommend Anruf über den Sipgate-Account 6112233 mit der Callerid anonymous <unbekannt> der mit der Applikation Dial an SIP/30|30|r signalisiert wurde, der um 13:54:30 am 13.01.2006 ankam, um 13:54:39 beantwortet und um 13:55:00 beendet wurde. Der Anruf dauerte insgesamt 30 Sekunden und davon können 21 Sekunden abgerechnet werden. Der Anruf wurde beantwortet ANSWERED und dokumentiert DOCUMENTATION


Asterisk kann die Gesprächsdatenaufzeichnung auch in anderen Formaten zusätzlich ablegen - z.B. in einer MySQL-Datenbanktabelle. Auf diese Möglichkeiten werden wir hier in diesem Anfängerkurs nicht eingehen.
 
Zuletzt bearbeitet:

betateilchen

Grandstream-Guru
Mitglied seit
30 Jun 2004
Beiträge
12,882
Punkte für Reaktionen
0
Punkte
0
Lektion 12: Wir weisen Endgeräten bestimmte Provider zu

In dieser Lektion wollen wir dafür sorgen, daß jeder Teilnehmer (= SIP Endgerät) abgehend über einen bestimmten Provider telefoniert. Wie man die über die einzelnen Provider ankommenden Anrufe an die entsprechenden Endgeräte leitet, haben wir ja schon geklärt.

Zusätzlich wollen wir dafür sorgen, daß jeder Teilnehmer über eine bestimmte Vorwahl auch einen bestimmten Provider selbst auswählen kann (z.B. wenn der Standardprovider mal ausfällt, oder kein Guthaben auf dem Account ist).

Hierzu sind folgende Schritte notwendig:

1. Anlegen eines Contextes [vorwahlen] in der extensions.conf

Hierbei habe ich auch gleich noch die Möglichkeit integriert, sipgate-interne Anrufe mit abzuwickeln.

Code:
[vorwahlen]
; ********************
; blueSIP mit *1 als Vorwahl
exten => _*1X.,1,Dial,SIP/${EXTEN:2}@bluesip1|45|r

; ********************
; nikotel mit *2 als Vorwahl
; Auslandsgespraeche per nikotel
exten => _*200.,1,dial,SIP/${EXTEN:4}@63.214.186.6|45|r
; für Inlandsgespraeche (Deutschland - ansonsten die 49 anpassen !)
exten => _*20Z.,1,dial,SIP/49${EXTEN:3}@63.214.186.6|45|r
; für nikotel-interne Anrufe mit 99xxxx
exten => _*299.,1,dial,SIP/${EXTEN:2}@63.214.186.6|45|r

; ********************
; Gespraeche nach Deutschland per voipjet mit *3 als Vorwahl
exten => _*30Z.,1,Dial,IAX2/<userid>@voipjet/01149${EXTEN:3}

; ********************
; Sipgate mit *4 als Vorwahl
; Sipgate-interne Anrufe per 7-stelliger ID
exten => _*4ZXXXXXX,1,Dial,SIP/${EXTEN:2}
; alle anderen Telefonnummern
exten => _*40.,1,Dial,SIP/${EXTEN:2}@6112233|45|r

2. Ändern des Contextes [default] in der extensions.conf

Wir schmeißen alle providerbezogenen ausgehenden Contexte raus und binden dafür den neuen Context [vorwahlen] ein.

Code:
[default]
include => lokal
include => echotest
include => mailbox
include => mailbox_own
include => vorwahlen
In dieser Phase können jetzt alle Teilnehmer ausschließlich durch die zwingende Verwendung einer Vorwahl raustelefonieren - keine Sorge, das ändern wir gleich :D

3. Anpassen der outgoing-Contexte in der extensions.conf

Wir passen nun die bestehenden [xyz_out] Contexte so an, daß sie jeweils ohne Vorwahl funktionieren.

Code:
[bluesip_out]
exten => _X.,1,Dial,SIP/${EXTEN}@bluesip1|45|r

[nikotel_out]
; Auslandsgespraeche per nikotel
exten => _00.,1,dial,SIP/${EXTEN:2}@63.214.186.6|45|r
; für Inlandsgespraeche (Deutschland - ansonsten die 49 anpassen !)
exten => _0Z.,1,dial,SIP/49${EXTEN:1}@63.214.186.6|45|r
; für nikotel-interne Anrufe mit 99xxxx
exten => _99.,1,dial,SIP/${EXTEN}@63.214.186.6|45|r

[voipjet_out]
; Gespraeche nach Deutschland per voipjet
exten => _0Z.,1,Dial,IAX2/<userid>@voipjet/01149${EXTEN:1}

[sipgate_out]
; Sipgate-interne Anrufe per 7-stelliger ID
exten => _ZXXXXXX,1,Dial,SIP/${EXTEN}
; alle anderen Telefonnummern
exten => _0.,1,Dial,SIP/${EXTEN}@6112233|45|r

4. Ein bißchen Theorie:
Wo wird eigentlich die Verbindung zwischen SIP Client (in der sip.conf) und
dem Rauswählen (in der extensions.conf) eigentlich hergestellt ?​

Diese Verknüpfung erfolgt in der sip.conf. Dort haben wir ja für jeden Teilnehmer einen eigenen Context angelegt [30] [31] usw. Wenn man in diesem Context einen Eintrag

Code:
[30]
...
...
...
[b]context=app30[/b]
ergänzt, dann wird diesem Teilnehmer der Context [app30] in der extensions.conf zugewiesen. Das bedeutet, der Dialplan für diesen Teilnehmer muß in diesem Context der extensions.conf definiert werden.

Da wir bisher keine Context-Einträge in der sip.conf verwendet haben, wurden alle Geräte in den Standard-Context [default] gestellt.

Anmerkung: Dieser Standard-Context kann im [general] der sip.conf festgelegt werden. Dieser Eintrag gilt für alle SIP Peers, die keinen eigenen context-Eintrag besitzen. Fehlt dieser Eintrag unter [general], wird default verwendet.

In unserem Beispiel wollen wir nun eine Konfiguration schaffen, die festlegt, daß der Teilnehmer [30] immer über blueSIP und der Teilnehmer [31] immer über Sipgate raustelefoniert. Zusätzlich sollen diese Teilnehmer (wie schon oben erwähnt) die Möglichkeit haben, über Vorwahlen auch alle anderen Provider nutzen zu können.

5. Die praktische Umsetzung

Wir ergänzen die Contexte [30] und [31] in der sip.conf um die entsprechenden Context-Einträge


Code:
[30]
...
...
...
[b]context=app30[/b]

[31]
...
...
...
[b]context=app31[/b]

Wir legen die neuen Contexte [app30] und [app31] am Ende der extensions.conf an

Diesen Contexten weisen wir per include den [default] Context sowie den vorgesehen [xyz_out] Context zu:

Code:
[app30]
include => default
include => bluesip_out

[app31]
include => default
include => sipgate_out

[hr]x[/hr]
Nach einem reload auf der Asterisk-CLI ist das Ziel erreicht, und alles sollte so funktionieren, wie eingangs dieser Lektion geplant. Übrigens gilt die gleiche Verknüpfungs-Logik natürlich auch für IAX-peers.

Viel Spaß beim Nachbauen :D
[hr]x[/hr]
Damit sind wir am Ende des Einsteigerkurses zur Konfiguration eines Asterisk-Servers angekommen. Schön, daß doch einige Leute mitgebaut haben und sich im Diskussionsthread rege beteiligt haben.

Ich hoffe, ich habe keine grundlegenden Informationen vergessen. Die wichtigsten Features sollte besprochen sein, und jeder sollte nun in der Lage sein, eingehende und ausgehende Gespräche zu führen, und sich z.B. solche Dienst wie "stayconnect" und "proxy-service" oder wie die Dinge bei den unterschielichen Providern auch immer heißen, selbst auf dem Asterisk einrichten zu können.

Viel Spaß beim VoIPen - Euer BetaTeilchen
 

betateilchen

Grandstream-Guru
Mitglied seit
30 Jun 2004
Beiträge
12,882
Punkte für Reaktionen
0
Punkte
0
Nachtrag: Wie macht man ein Update bei einem Asterisk-Server ?

Aus gegebenem Anlaß - es ist gerade die Version 1.2.2 erschienen, möchte ich hier kurz beschreiben, wie man ein Update von 1.2.1 auf 1.2.2 machen kann.

1.) aktuelle Sourcen von www.asterisk.org holen und in /usr/src entpacken (siehe Lektion1)

2.) in /usr/src den symbolischen Link asterisk löschen und auf die neue Version anlegen


Code:
# cd /usr/src
# rm asterisk
# ln -s asterisk-1.2.2 asterisk


3.) neue Version kompilieren


Code:
cd /usr/src/asterisk
make

Das gleiche auch für die asterisk-addons machen. (im Moment gibt es auf www.asterisk.org noch keine neue Version der addons - also ist erstmal nix zu tun)


4.) laufenden Asterisk beenden.

Code:
CLI> stop now


5.) neue Versionen installieren


Code:
cd /usr/src/asterisk
make install
*** auf keinen Fall nochmal ein make samples machen - das würde sämtliche vorhandenen CONF Dateien überschreiben ! ***


6.) asterisk neu starten


Code:
# asterisk

7.) prüfen ob alle geklappt hat


Code:
vs4509:~# asterisk -r
Asterisk 1.2.2, Copyright (C) 1999 - 2006 Digium, Inc. and others.
Created by Mark Spencer <[email protected]>
Asterisk comes with ABSOLUTELY NO WARRANTY; type 'show warranty' for details.
This is free software, with components licensed under the GNU General Public
License version 2 and other licenses; you are welcome to redistribute it under
certain conditions. Type 'show license' for details.
=========================================================================
Connected to Asterisk 1.2.2 currently running on vs4509 (pid = 9682)
vs4509*CLI>

[hr]x[/hr]

Viel Erfolg ! :D
 
Zuletzt bearbeitet:
Status
Für weitere Antworten geschlossen.

3CX PBX - GRATIS
Linux / Win / Cloud

Statistik des Forums

Themen
234,036
Beiträge
2,041,917
Mitglieder
353,354
Neuestes Mitglied
equites