.titleBar { margin-bottom: 5px!important; }

[Kurs] Wir konfigurieren uns einen Asterisk

Dieses Thema im Forum "Asterisk Allgemein" wurde erstellt von betateilchen, 4 Jan. 2006.

Status des Themas:
Es sind keine weiteren Antworten möglich.
  1. betateilchen

    betateilchen Grandstream-Guru

    Registriert seit:
    30 Juni 2004
    Beiträge:
    12,882
    Zustimmungen:
    0
    Punkte für Erfolge:
    0
    Ort:
    am Letzenberg
    #1 betateilchen, 4 Jan. 2006
    Zuletzt bearbeitet: 23 Mai 2007
    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 <markster@digium.com>
    =========================================================================
    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 !
     
  2. betateilchen

    betateilchen Grandstream-Guru

    Registriert seit:
    30 Juni 2004
    Beiträge:
    12,882
    Zustimmungen:
    0
    Punkte für Erfolge:
    0
    Ort:
    am Letzenberg
    #2 betateilchen, 5 Jan. 2006
    Zuletzt bearbeitet: 19 Feb. 2007
    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,root@localhost
    31 => 1234,Example Mailbox,root@localhost
    32 => 1234,Example Mailbox,root@localhost
    33 => 1234,Example Mailbox,root@localhost
    34 => 1234,Example Mailbox,root@localhost
    35 => 1234,Example Mailbox,root@localhost
    36 => 1234,Example Mailbox,root@localhost
    37 => 1234,Example Mailbox,root@localhost
    38 => 1234,Example Mailbox,root@localhost
    39 => 1234,Example Mailbox,root@localhost
    
    Den Aufbau eines Mailbox-Eintrags möchte ich hier noch kurz erklären:

    Code:
    30 => 1234,Example Mailbox,root@localhost
    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

    root@localhost = 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
     
  3. betateilchen

    betateilchen Grandstream-Guru

    Registriert seit:
    30 Juni 2004
    Beiträge:
    12,882
    Zustimmungen:
    0
    Punkte für Erfolge:
    0
    Ort:
    am Letzenberg
    #3 betateilchen, 5 Jan. 2006
    Zuletzt bearbeitet: 8 Jan. 2006
    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.
     
  4. betateilchen

    betateilchen Grandstream-Guru

    Registriert seit:
    30 Juni 2004
    Beiträge:
    12,882
    Zustimmungen:
    0
    Punkte für Erfolge:
    0
    Ort:
    am Letzenberg
    #4 betateilchen, 5 Jan. 2006
    Zuletzt bearbeitet: 12 Jan. 2006
    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,root@localhost
     
  5. betateilchen

    betateilchen Grandstream-Guru

    Registriert seit:
    30 Juni 2004
    Beiträge:
    12,882
    Zustimmungen:
    0
    Punkte für Erfolge:
    0
    Ort:
    am Letzenberg
    #5 betateilchen, 5 Jan. 2006
    Zuletzt bearbeitet: 12 Jan. 2006
    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:ABCXYZ@sipgate.de/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:ABCXYZ@sipgate.de/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
     
  6. betateilchen

    betateilchen Grandstream-Guru

    Registriert seit:
    30 Juni 2004
    Beiträge:
    12,882
    Zustimmungen:
    0
    Punkte für Erfolge:
    0
    Ort:
    am Letzenberg
    #6 betateilchen, 6 Jan. 2006
    Zuletzt bearbeitet: 12 Jan. 2006
    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: :?:​
     
  7. betateilchen

    betateilchen Grandstream-Guru

    Registriert seit:
    30 Juni 2004
    Beiträge:
    12,882
    Zustimmungen:
    0
    Punkte für Erfolge:
    0
    Ort:
    am Letzenberg
    #7 betateilchen, 7 Jan. 2006
    Zuletzt bearbeitet: 12 Jan. 2006
    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:
     
  8. betateilchen

    betateilchen Grandstream-Guru

    Registriert seit:
    30 Juni 2004
    Beiträge:
    12,882
    Zustimmungen:
    0
    Punkte für Erfolge:
    0
    Ort:
    am Letzenberg
    #8 betateilchen, 8 Jan. 2006
    Zuletzt bearbeitet: 12 Jan. 2006
    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
    
     
  9. betateilchen

    betateilchen Grandstream-Guru

    Registriert seit:
    30 Juni 2004
    Beiträge:
    12,882
    Zustimmungen:
    0
    Punkte für Erfolge:
    0
    Ort:
    am Letzenberg
    #9 betateilchen, 9 Jan. 2006
    Zuletzt bearbeitet: 12 Jan. 2006
    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:30@192.168.1.102: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.
     
  10. betateilchen

    betateilchen Grandstream-Guru

    Registriert seit:
    30 Juni 2004
    Beiträge:
    12,882
    Zustimmungen:
    0
    Punkte für Erfolge:
    0
    Ort:
    am Letzenberg
    #10 betateilchen, 10 Jan. 2006
    Zuletzt bearbeitet: 12 Jan. 2006
    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
     
  11. betateilchen

    betateilchen Grandstream-Guru

    Registriert seit:
    30 Juni 2004
    Beiträge:
    12,882
    Zustimmungen:
    0
    Punkte für Erfolge:
    0
    Ort:
    am Letzenberg
    #11 betateilchen, 11 Jan. 2006
    Zuletzt bearbeitet: 17 Jan. 2006
    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
     
  12. betateilchen

    betateilchen Grandstream-Guru

    Registriert seit:
    30 Juni 2004
    Beiträge:
    12,882
    Zustimmungen:
    0
    Punkte für Erfolge:
    0
    Ort:
    am Letzenberg
    #12 betateilchen, 12 Jan. 2006
    Zuletzt bearbeitet: 12 Jan. 2006
    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:passwort@bluesip.net/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
     
  13. betateilchen

    betateilchen Grandstream-Guru

    Registriert seit:
    30 Juni 2004
    Beiträge:
    12,882
    Zustimmungen:
    0
    Punkte für Erfolge:
    0
    Ort:
    am Letzenberg
    #13 betateilchen, 12 Jan. 2006
    Zuletzt bearbeitet: 18 Jan. 2006
    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
     
  14. betateilchen

    betateilchen Grandstream-Guru

    Registriert seit:
    30 Juni 2004
    Beiträge:
    12,882
    Zustimmungen:
    0
    Punkte für Erfolge:
    0
    Ort:
    am Letzenberg
    #14 betateilchen, 12 Jan. 2006
    Zuletzt bearbeitet: 13 Jan. 2006
    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 !
     
  15. betateilchen

    betateilchen Grandstream-Guru

    Registriert seit:
    30 Juni 2004
    Beiträge:
    12,882
    Zustimmungen:
    0
    Punkte für Erfolge:
    0
    Ort:
    am Letzenberg
    #15 betateilchen, 13 Jan. 2006
    Zuletzt bearbeitet: 13 Jan. 2006
    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
     
  16. betateilchen

    betateilchen Grandstream-Guru

    Registriert seit:
    30 Juni 2004
    Beiträge:
    12,882
    Zustimmungen:
    0
    Punkte für Erfolge:
    0
    Ort:
    am Letzenberg
    #16 betateilchen, 13 Jan. 2006
    Zuletzt bearbeitet: 13 Jan. 2006
    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
     
  17. betateilchen

    betateilchen Grandstream-Guru

    Registriert seit:
    30 Juni 2004
    Beiträge:
    12,882
    Zustimmungen:
    0
    Punkte für Erfolge:
    0
    Ort:
    am Letzenberg
    #17 betateilchen, 13 Jan. 2006
    Zuletzt bearbeitet: 17 Jan. 2006
    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.
     
  18. betateilchen

    betateilchen Grandstream-Guru

    Registriert seit:
    30 Juni 2004
    Beiträge:
    12,882
    Zustimmungen:
    0
    Punkte für Erfolge:
    0
    Ort:
    am Letzenberg
    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
     
  19. betateilchen

    betateilchen Grandstream-Guru

    Registriert seit:
    30 Juni 2004
    Beiträge:
    12,882
    Zustimmungen:
    0
    Punkte für Erfolge:
    0
    Ort:
    am Letzenberg
    #19 betateilchen, 19 Jan. 2006
    Zuletzt bearbeitet: 19 Jan. 2006
    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 <markster@digium.com>
    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
     
Status des Themas:
Es sind keine weiteren Antworten möglich.