Grundsatzfrage contexte und prioritaeten

adoII

Neuer User
Mitglied seit
7 Feb 2006
Beiträge
58
Punkte für Reaktionen
0
Punkte
0
Hi,
ich hab noch immer ein grundsaetzliches Verstaendnisproblem bei Contexten und Prioritaeten. So richtig hab ich noch keine Stelle gefunden an der das sauber dokumentiert wird.

Was ich z.B. ier gerade nicht verstehe ist, warum asterisk vonn meinem context abspielenab ploetzlich in den context aufnahmeab springt.

Ich waehle mit meinem sipphone die 902 und bekomme aus dem context abspielenab brav die AB-Message: /var/lib/asterisk/sounds/de/GAT_ab_main angesagt. Dann druecke ich die 2 und dann wird mir nicht wie erwartet die Message /var/lib/asterisk/sounds/de/GAT_ab_english aus dem context abspielenab angesagt sondern die Zeile Record(/var/lib/asterisk/sounds/de/GAT_ab_deutsch aus einem ganz anderen Kontext naemlich dem Kontext aufnahmeab wird ausgefuehrt.

Was passiert da ? Wieso springt Asterisk zwischen den Kontexten hin- und her und wie kann ich meinen Dialplan sauber strukturieren, damit er uebersichtlich bleibt und solche Seiteneffekte nicht auftreten ?

Mein Beispiel:
Sip Telefon geht in den context sipphone, der sieht so aus:

Code:
[sipphone]
include=>sipmenus
include=>siprest

[sipmenus]
include=>aufnahmeab
include=>abspielenab

[aufnahmeab]
exten=>901,1,Answer
exten=>901,2,set(TIMEOUT(response(=10)))
exten=>901,n,Wait(1)
exten=>901,n,Background(/var/lib/asterisk/sounds/de/GAT_ab_record_menu)
exten=>1,1,Record(/var/lib/asterisk/sounds/de/GAT_ab_main:ulaw,2,25)
exten=>1,n,Goto(901,2)
exten=>2,1,Record(/var/lib/asterisk/sounds/de/GAT_ab_deutsch:ulaw,2,25)
exten=>2,n,Goto(901,2)
exten=>3,1,Record(/var/lib/asterisk/sounds/de/GAT_ab_english:ulaw,2,25)
exten=>3,n,Goto(901,2)
exten=>0,1,Hangup
exten=>i,1,Playback(invalid)
exten=>i,n,Goto(901,2)
exten=>t,1,Hangup

[abspielenab]
exten=>902,1,Answer
exten=>902,n,set(TIMEOUT(response(=10)))
exten=>902,n,Wait(1)
exten=>902,n,Background(/var/lib/asterisk/sounds/de/GAT_ab_main)
exten=>1,1,Playback(/var/lib/asterisk/sounds/de/GAT_ab_deutsch)
exten=>1,n,Hangup
exten=>2,1,Playback(/var/lib/asterisk/sounds/de/GAT_ab_english)
exten=>2,n,Hangup
exten=>i,1,Playback(invalid)
exten=>i,n,Hangup
exten=>t,1,Hangup
 
Dein Phone ist wohl im Context sipphone.

exten=>2,.........
gibt es zweimal.

[aufnahmeab] kommt eben zuerst, in diesem Fall bei gleicher Länge der Extension ist die Reihenfolge wichtig.

siehe show diaplan in der Console

902 gibt es nicht in [aufnahmeab], deswegen wird die 902 auch im letzten Context gefunden.
 
betateilchen schrieb:
Ganz einfach: Gib in Deinen Goto Anweisungen einfach den Kontext mit an.
Danke, das ist hilfeich und ein guter Tipp. Mein Problem tritt aber im Kontext abspielenab auf und der enthaelt gar keine gotos. In abspielenab druecke ich z.B. die 1 und befinde mich ploetzlich im Kontext aufnahmeab bei der extension 1.

Thomas007 schrieb:
Dein Phone ist wohl im Context sipphone.

exten=>2,.........
gibt es zweimal.

Ja, aber ist es denn so ungewoehnlich dass die Menueoption 2 bei einem Haufen von Voice.Menues mehrfach vorkommt ? Das ist doch eigentlich normal, dass man in verschiedenen Menues mit Ziffern von 0-9 bestimmte Aktionen ausloesen kann. Das muss sich doch trennen lassen ?
 
adoII schrieb:
Das ist doch eigentlich normal, dass man in verschiedenen Menues mit Ziffern von 0-9 bestimmte Aktionen ausloesen kann. Das muss sich doch trennen lassen ?

Klar, aber man bildet aus Untermenüs keine "riesigen" Vereinigungsmengen. Das ist sehr unübersichtlich und fehleranfällig.

Nimm Macros. Mache einen Eingang für eine Gruppe von Phones wo Du nach Exten oder anderen Kriterien absortierst und die Anrufe in Macros zur weiteren Bearbeitung schickst.
Macros kannst Du immer wieder verwenden und von überall aufrufen. Da eh alle Variablen in einem Channel global sind musst Du nicht mal viel Aufwand in die Übergabe der Parameter investieren.
Es muss nur strukturiert sein.
 
Thomas007 schrieb:
Klar, aber man bildet aus Untermenüs keine "riesigen" Vereinigungsmengen. Das ist sehr unübersichtlich und fehleranfällig.
Also kann man das so zusammenfassen, dass es unterhalb eines root-contextes (bei mir sipphone) jede Extension wirklich nur genau einmal geben darf ? Die ganze Unterteilung in Unter-Contexte dient dann maximal der Steuerung der Reihenfolge der Ausfuehrung aber nicht der Trennung der extensions ?

Ich denke halt wie ein Programmierer und da war fuer mich immer selbstverstaendlich, dass eine Variable x in jedem Modul durchaus eine getrennte Bedeutung haben kann.

Das fuehrt mich jetzt noch zu einer anderen Frage, gibt es so eine Art Lint fuer dialplaene ? Ich war naemlich schon 1 oder 2 mal ueber doppelte Extensions gestolpert und eigentlich muesste doch ein Stueck Software in der Lage sein solche doppelten Extensions zu erkennen ?
 
adoII schrieb:
eigentlich muesste doch ein Stueck Software in der Lage sein solche doppelten Extensions zu erkennen ?

Eigentlich reicht für eine solche Erkennung auch ein kleines Stück Hirn aus - da muß man nicht unbedingt externe Software verwenden :mrgreen:
 
betateilchen schrieb:
Eigentlich reicht für eine solche Erkennung auch ein kleines Stück Hirn aus - da muß man nicht unbedingt externe Software verwenden :mrgreen:
:mrgreen: Dennoch ist sowas als zusaetzliche Massnahme zur Qualitaetssicherung sehr hilfreich, ungefaehr so als ob man seine Bewerbung vor dem Ausdruck sicherheitshalber nochmal durch ne Rechtschreibprüfung jagt. Vermeidbare Fehler sollte man auch vermeiden und Software ist zumindest wenn sie nicht aus Redmond kommt haeufig weniger von der Tagesform abhaengig als der Mensch...
 
mach doch einfach auf der Linux Konsole mal ein

Code:
# asterisk -rx show dialplan |sort

Das kann Dir zumindest mal als Ansatz dienen.
 
adoII schrieb:
Also kann man das so zusammenfassen, dass es unterhalb eines root-contextes (bei mir sipphone) jede Extension wirklich nur genau einmal geben darf ? Die ganze Unterteilung in Unter-Contexte dient dann maximal der Steuerung der Reihenfolge der Ausfuehrung aber nicht der Trennung der extensions ?

Die Extension ist wie ein case in einem switch. Das machst Du "eigentlich" nur einmal. In den Macros nimmst Du eh nur noch s. Das ist dann viel übersichtlicher-.
Sprünge mit GoToIF macht man zu Labels.
GoTo nimmst Du für kleine Schleifen oder DANN wenn Du eine Variable erzeugt hast, die Du als "neue" EXTEN" benutzen möchtest und darüber absortieren willst.
Ansonsten ist GoTo zu vermeiden.

adoII schrieb:
Ich denke halt wie ein Programmierer und da war fuer mich immer selbstverstaendlich, dass eine Variable x in jedem Modul durchaus eine getrennte Bedeutung haben kann.

Hat es ja auch, solange Du nicht mit include alles zusammenfasst.

adoII schrieb:
Das fuehrt mich jetzt noch zu einer anderen Frage, gibt es so eine Art Lint fuer dialplaene ?

Schau mal in die Console oder Logfile bei entsprechenden log level.

Cannot register extension, allready in use...
 
Also ich nochmal. Ich hab jetzt meine Anwendung auf Macros umgebaut:
Jetzt geht aber gar nix mehr. Ich waehle 901, er jumpt nach macro-aufnahmeab, sagt den Text an, ich druecke erwartungsvoll die 1 und bekomme:
Jun 7 16:36:13 WARNING[2220]: pbx.c:2400 __ast_pbx_run: Invalid extension '1', but no rule 'i' in context 'sipphone'

???

Wie frag ich denn nun im Macro die DTMF-Toene ab ?

Code:
[macro-aufnahmeab]
exten=>s,1,Answer
exten=>s,n,set(TIMEOUT(response(=10)))
exten=>s,n(playagain),Wait(1)
exten=>s,n,Background(/var/lib/asterisk/sounds/de/GAT_ab_record_menu)
exten=>s,n,NoOp(Background is playing)

exten=>1,1,NoOp(1 was PRESSED)
exten=>1,n,Record(/var/lib/asterisk/sounds/de/GAT_ab_main:ulaw,2,25)
exten=>1,n,Goto(playagain)

exten=>2,1,Record(/var/lib/asterisk/sounds/de/GAT_ab_deutsch:ulaw,2,25)
exten=>2,n,Goto(playagain)

exten=>3,1,Record(/var/lib/asterisk/sounds/de/GAT_ab_english:ulaw,2,25)
exten=>3,n,Goto(playagain)

exten=>0,1,Hangup

exten=>i,1,Playback(invalid)
exten=>i,n,Goto(playagain)

exten=>t,1,Hangup

[sipmenus]
exten=>_901,1,Macro(aufnahmeab)
exten=>_902,1,Macro(abspielenab)

[siprest]
..uninteressant

[sipphone]
include=>sipmenus
include=>siprest
 
argh, die Erklärung war wohl etwas zu allgemein.

Background im macro ruft eine Extension ausserhalb des Macros auf.
Deswegen kein Backgound oder WaitExten im Macro.
Das ist eine kleine Asterisk Besonderheit.

Nimm einen GoTo Befehl zu einen anderen Context und nutze da Background, WaitExten und GoTo um die gewünschte Schleife zu erzeugen.

Binde diesen aber NICHT mit include irgendwo ein. Einziger Zutritt erfolgt mit einem expliziten GoTo-Befehl.
 
Jo, sehe ich auch gerade:
http://www.voip-info.org/wiki/view/Asterisk+cmd+Macro

Note that key presses within a macro will cause a jump to the calling context and WILL NOT jump to the appropriate extension within the macro context. This is a shame and means code becomes a lot more complex.

Das mit dem Shame kann man nur bestaetigen, das ist wirklich alles nicht gerade uebersichtlich.
 
adoII schrieb:
Das mit dem Shame kann man nur bestaetigen, das ist wirklich alles nicht gerade uebersichtlich.

Noch vor einigen Monaten gab es kein n als prioirity sondern man musste jede Zeile durchnummerieren. Sprünge waren nur zu den Nummern möglich (keine Labels)

Das Ergebnis eines Dial Befehl wurde mit einem priority jump +100 ausgewertet.

usw.

Es hat sich daher schon einiges getan.
 
Thomas007 schrieb:
Das Ergebnis eines Dial Befehl wurde mit einem priority jump +100 ausgewertet.

Falsch - es wurde nach +101 gesprungen.
 
betateilchen schrieb:
Falsch - es wurde nach +101 gesprungen.
Aprropos, wie wertet man die Dial-Returncodes denn heute am saubersten aus ?
Ich kenne nur die Variante mit Goto(s-${DIALSTATUS} aber jetzt haben wir gerade gesagt das gotos nicht so tolle sind und ausserdem braucht man jetzt ne case-artige Anweisung mit allen Dialstati, Labels usw.

Ist das jetzt der grosse Fortschritt gegenueber der frueher einen Zeile ??
 
betateilchen schrieb:
Falsch - es wurde nach +101 gesprungen.

Manchmal auch nicht.

Note: The bristuff patches change the dial behaviour slightly and jump to n+201
 
ja - und es gab auch +51 - aber +100 gab es nirgends.
 
Kostenlos!

Neueste Beiträge

Statistik des Forums

Themen
248,872
Beiträge
2,303,452
Mitglieder
378,532
Neuestes Mitglied
Nik320