Enumlookup

wrrdlbrrmpft

Mitglied
Mitglied seit
17 Jul 2004
Beiträge
263
Punkte für Reaktionen
0
Punkte
0
Da das EnumLookup von Asterisk nur den ersten Eintrag liefert, hab ich dieses Skript geschrieben.

enumlookup.agi:
EDIT: Die Datei gibt es jetzt als Anhang, siehe etwas weiter unten.

Funktion: Das Skript sucht nach iax- und sip-Einträgen und speichert diese dann in IAXDIAL und SIPDIAL. Diese beiden Variabeln können dann im Dialplan genutzt werden, z. B.:

Dial(${IAXDIAL}&${SIPDIAL},,T)

[highlight=orange:822d431931]
EDIT: Jetzt sollte es auch mit mehreren sip- und iax-Einträgen zurecht kommen.
[/highlight:822d431931]

EDIT: Die neueste Version gibt es hier:
http://www.voip-info.org/tiki-index.php?page=Asterisk+and+multiple+ENUM+entries
 
Erstmal vielen Dank für das script.

Fragen:

Wie werden Prioritäten bei mehreren SIP bzw. IAX Einträgen berücksichtigt?

Ist das auf Abfragen nach 9.4.e164.arpa beschränkt (Bin kein RegExep freak)?

Vorschlag:

Erweiterung um tel und mail Einträge.

jo
 
Wie werden Prioritäten bei mehreren SIP bzw. IAX Einträgen berücksichtigt?
Da bin ich dran, noch etwas Geduld.
Ist das auf Abfragen nach 9.4.e164.arpa beschränkt (Bin kein RegExep freak)?
Ja, aber das kann man sich so anpassen, wie man es braucht.
Erweiterung um tel und mail Einträge
tel und mail ist auch kein Problem. Ich hab tel zunächst bewusst rausgelassen, weil das evtl. teuer werden kann, wenn man nicht aufpasst. Bei Interesse werd ich das Skript weiterpflegen und ggf. erweitern, je nach Zeit und Lust.
 
wrrdlbrrmpft schrieb:
Bei Interesse werd ich das Skript weiterpflegen und ggf. erweitern, je nach Zeit und Lust.

Ich freu' mich drauf!

jo
 
So, damit sollten die Einträge nach Priorität geordnet werden. Der ENUM-Wert mit Priorität 1 sollte dann in ENUMENTRY1, der mit Priorität n in ENUMENTRYn stehen. Das ist zur Zeit auf 999 ENUM-Einträge begrenzt :( . Das kann ich aber vermutlich schneller auf z. B. 999999 erweitern, als irgendjemand so viele ENUM-Einträge eingeben kann :) .
Die Anzahl der verwertbaren ENUM-Einträge wird in ENUMENTRIES abgelegt.

Noch ein paar Hinweise:

1. Die Nummer muss in der Form LON an das Skript übergeben werden, wobei L für die Ländervorwahl, O für die Ortsvorwahl und N für die Nummer steht, also z. B. 4930123456 für die Berliner Nummer 123456.

2. Wer außer iax und sip nochwas rausfiltern will, der kann im Skript nach egrep suchen und den Filter anpassen, z. B. so:
| egrep 'iax|tel|mail' \

Das würde die iax-, tel- und mail-Einträge heraussuchen, habs nicht getestet.

enumlookup.agi:
EDIT: Code entfernt, siehe Anhang etwas weiter unten.

Fragen, Fehlerberichte und Verbesserungsvorschläge nehm ich gern entgegen.

wrrdlbrrmpft
 
Ich hab noch einen Fehler eliminiert. Ich werd das jetzt als Anhang hier veröffentlichen. Sonst beschwert sich noch einer der Mods, dass ich hier bei jeder kleinen Änderung neue Skripte poste.

Noch eine Änderung: Für die Übermittlung der Rufnummer ist ab sofort die Variable ENUMEXTEN zuständig. Das könnte also ungefähr so aussehen:

in extensions.conf:
Code:
exten => _5.,1,Setvar(ENUMEXTEN=49${EXTEN:2})
exten => _5.,2,agi,enumlookup.agi
exten => _5.,3,Dial(${ENUMENTRY1},,T)
exten => _5.,4,Dial(${ENUMENTRY2},,T)
exten => _5.,5,Hangup

wrrdlbrrmpft
 
Du kannst doch mittels "EDIT" Deine CODE-Blöcke in den vorhergegangen Postings einfach löschen :wink: dann steht hier immer nur die letzte Version des Skriptes im Thread.
 
Tolle Sache - ich werde das in einer der nächsten Nächte mal ausgiebig testen. Wäre super, wenn wir für die Sache wirklich mal eine komplette Lösung hätten.

:groesste:
 
Es wird nochmal kniffelig. Man kann im Dialplan eine Schleife programmieren, die nach und nach alle zurückgelieferten ENUM-Einträge untersucht und entsprechend abarbeitet. Die Schleife könnte z. B. zuerst alle Einträge nach IAX durchsuchen und bei Erfolg wählen. Ansonsten springt sie in diesem Fall in die Priorität 100 und legt auf. Sie könnte aber genausogut in eine weitere Schleife springen und nach SIP durchsuchen.

in extensions.conf:
Code:
exten => _5.,1,Setvar(ENUMEXTEN=49${EXTEN:2})
exten => _5.,2,Setvar(COUNTER=#)
exten => _5.,3,agi,enumlookup.agi
exten => _5.,4,GotoIf($[${ENUMENTRY${LEN(${COUNTER})}} = IAX]?5:6)
exten => _5.,5,Dial(${ENUMENTRY${LEN(${COUNTER})}})
exten => _5.,6,Setvar(COUNTER=#${COUNTER})
exten => _5.,7,GotoIf($[${LEN(${COUNTER})} = ${ENUMENTRIES}]?100:4)
exten => _5.,100,Hangup

Ich habs noch nicht getestet. Bei diesen Verschachtelungen ist daher mit ziemlicher Sicherheit noch der eine oder andere Fehler drin. Aber bei genauem Hinsehen, wird das Prinzip klar sein. Ansonsten fragen!

wrrdlbrrmpft
 
Verfasst am: Gestern um 17:49
ich halte ein "Abtelefonieren" nach der in ENUM registrierten Priority-Reihenfolge für völlig ausreichend, weil damit jeder Nutzer die Möglichkeit hat, die Reihenfolge selbst vorzubestimmen.
[hr:abb8edd5d0]
Nach 3 Stunden erfolglosem Experimentieren ( bis ich endlich draufgekommen bin, daß auf meinem Server /dev/stdin und /dev/stdout nicht existierten :shock: ) kann ich nur sagen:


:nemma: :bier: :groesste:

:rosen: :rosen: :rosen: DAS IST EINFACH NUR GENIAL ! :rosen: :rosen: :rosen:
Ein paar Feinheiten noch - aber das kriegen wir auch noch gelöst :wink: Jetzt gehe ich erstmal schlafen.
 
Guten Morgen !

Ich habe mal meine EXTENSION.CONF ein bißchen umgebaut.
Es ist nun möglich, mit Hilfe einer Vordefinierten Variablen ALLOWENUMTEL festzulegen, ob bei einer negativen ENUM-Abfrage, oder wenn auf den "kostenlosen" Einträgen niemand erreicht wurde, ein kostenpflichtiger Telefonanruf durchgeführt werden darf

Was ich mir jetzt im Skript noch wünsche:

- alle gefundenen tel: Einträge in Variablen ENUMTELENTRY1 - ENUMTELENTRYn
- diese Einträge ebenfalls sortiert nach den im ENUM-Listung vorgegebenen Prioritäten
- eine entsprechende Zählvariable ENUMTELENTRIES

Dann ließe sich - falls erlaubt, auch noch eine Abarbeitung von gefundenen tel: Einträgen durchführen, falls diese erlaubt sind. Sie würden dann in einer ähnlichen Schleife wie für die SIP und IAX Anrufe ab extension => 11 abgearbeitet. Eine entsprechende Anpassung des Dialplans werde ich hier posten, sobald diese Variablen verfügbar sind.

Ich gebe es gerne zu: ich bin ein Skript-Dummie :oops: deshalb will ich mich an dem tollen Skript nicht "vergreifen" um das selbst reinzubasteln.

--- EDIT ---

Die an die jeweils aktuelle Version des AGI angepaßten Dial-Plan-Vorschläge für die extensions.conf sind ab sofort hier zu finden.
 
Hallo betateilchen,

wie ich sehe, hast du die Möglichkeit gefunden, wie man Variablen als Integer deklariert. Danach hab ich Ewigkeiten gesucht und dann in letzter Not dieses elendige Konstrukt über ${LEN} gewählt. :lol:

Habe eine neue Version mit tel und mail. Ich werde das oben in den sechsten Forumsbeitrag reinhängen. Hatte noch keine Zeit zum Testen.
[highlight=orange:d7bb60434b]Bitte sendet Fehlerberichte![/highlight:d7bb60434b]

In wie weit macht es Sinn, für tel eigene Variablen zu benutzen? Ich werde es wohl so machen, dass ich im ersten Anlauf alle Einträge in eine Schleife lege und dort nach IAX und SIP durchsuche. Sobald ein IAX- oder SIP-Eintrag gefunden wird, wird dieser angewählt. Dieser hat von allen IAX- und SIP-Einträgen die höchste Priorität. Schlägt das fehl, wird der mit der zweit höchsten Priorität genommen, usw. Schlagen alle IAX- und SIP-Einträge fehl, bzw. es gibt gar keine, wird in die nächste Schleife gesprungen und nach tel durchsucht. Wird tel gefunden, dann wird zunächst die Nummer angesagt und, wenn man nicht auflegt, angerufen. Als (vorerst) letzte Möglichkeit kann man schließlich noch eine Voicemail aufzeichnen und an die E-Mail-Adresse versenden.

Alternativ:
Die Schleife geht stur nach Prioritäten geordnet vor. Stößt sie auf einen tel-Eintrag, dann wird vorher die Nummer angesagt. Bei IAX und SIP kann direkt gewählt werden. Voicemail ist auch klar.

Eine Notwendigkeit, tel-Einträge in gesonderten Variablen abzulegen, sehe ich zur Zeit nicht. Ich lasse mich aber gern eines Besseren belehren.

wrrdlbrrmpft

[highlight=orange:d7bb60434b]EDIT: Ich hab das Skript nun nach ganz oben geschoben, damit man nicht lange danach suchen muss.[/highlight:d7bb60434b]
 
@w.... (das kann man nicht aussprechen, ohne zu spucken :wink:

wie ich sehe, hast du die Möglichkeit gefunden, wie man Variablen als Integer deklariert. Danach hab ich Ewigkeiten gesucht und dann in letzter Not dieses elendige Konstrukt über ${LEN} gewählt.

Das ist eigentlich ganz einfach:

Setvar(VARIABLE=1); ordnet der Variablen den Integer-Wert 1 zu
Setvar(VARIABLE=${VARIABLE} + 1); ordnet der Variablen den Integer-Wert VARIABLE+1 (=2) zu
Setvar(VARIABLE=${VARIABLE}+1) ordnet der Variablen den verketteten String VARIABLE+ "+1" zu (= "1+1")

Das entscheidende sind die Leerzeichen vor und nach dem Operator "+" !
 
Ok - es geht auch ohne separate Variablen für tel: Einträge :wink:
Man muß ja ein Skript nicht unnötig aufblähen.
Meine extensions.conf sieht jetzt so aus:

--- EDIT ---

Die an die jeweils aktuelle Version des AGI angepaßten Dial-Plan-Vorschläge für die extensions.conf sind ab sofort hier zu finden.
 
Genial, das kann ich ja fast direkt übernehmen. Statt Playback(beep) kann man wohl auch SayDigits(${ENUMENTRY${EINTRAG}:5}) nehmen, bzw. erst beep und dann SayDigits oder wie auch immer.
 
ja - nur hat mir SayDigits zu lange gedauert, weil da i.d.R. 12 Stellen anzusagen sind - und die Dame ist nicht die schnellste.

Und bevor jetzt wieder jemand schreibt "Du kannst auch SayNumber() nehmen" sei angemerkt, daß SayNumber nur bis 99.999.999 funktioniert, also erstens nur 8 Stellen und zweitens kommen da "merkwürdige" Ansagen raus, weil versucht wird, die Zahl in "Sprache" umzusetzen:
Beispiel: 24 -> englische Soundfiles: "twenty four" (das paßt ja noch) -> deutsche Soundfiles: "zwanzig vier" :mrgreen:

Den Dialplan habe ich gerade nochmal ergänzt (exten 33 + 34) - in der Abarbeitung der "mail"-Einträge hatte ich das Inkrementieren und Überprüfen auf weitere Einträge vergesssen. Naja, es war auch spät in der Nacht.
 
ja - nur hat mir SayDigits zu lange gedauert, weil da i.d.R. 12 Stellen anzusagen sind - und die Dame ist nicht die schnellste.
Mir würde es evtl. schon reichen, wenn ich mir nur die Vorwahl ansagen lasse.
Man könnte das natürlich auch so realisieren, dass man erst einen beep hört. Dann legt man auf, das Telefon klingelt, und man sieht im Display die Nummer. Hebt man dann ab, wird die Verbindung gewählt. Noch besser wäre es natürlich, wenn man vom Asterisk via CLIP nach Lust und Laune Nummern an Telefone senden könnte. Aber das ist technisch wahrscheinlich nicht möglich, da die Endgeräte vermutlich nur während eines einkommenden Rufs auf CLIP-Nummern reagieren.
Mit SendText könnte das vielleicht funktionieren, wenn die Endgeräte das unterstützen; meine leider nicht.
 
Mir würde es evtl. schon reichen, wenn ich mir nur die Vorwahl ansagen lasse

SayDigits(${ENUMENTRY${EINTRAG}:0:4}) ; sagt die die ersten 4 Stellen an

Mit SendText könnte das vielleicht funktionieren, wenn die Endgeräte das unterstützen; meine leider nicht.

Vorsicht !

voip-info.org schrieb:
This command was added to the development (CVS) edition of Asterisk on 2004-04-07. It does not exist in Asterisk stable-1.0 cvs or 0.9.


Man könnte das natürlich auch so realisieren, dass man erst einen beep hört. Dann legt man auf, das Telefon klingelt, und man sieht im Display die Nummer. Hebt man dann ab, wird die Verbindung gewählt. Noch besser wäre es natürlich, wenn man vom Asterisk via CLIP nach Lust und Laune Nummern an Telefone senden könnte.

Das geht grundsätzlich - daran arbeite ich gerade.
 
Du meinst, man kann sich auch, während man den Hörer in der Hand hält, via CLIP Nummern aufs Display schicken lassen? Wenn ja, gibts dafür einen Befehl?
 
Holen Sie sich 3CX - völlig kostenlos!
Verbinden Sie Ihr Team und Ihre Kunden Telefonie Livechat Videokonferenzen

Gehostet oder selbst-verwaltet. Für bis zu 10 Nutzer dauerhaft kostenlos. Keine Kreditkartendetails erforderlich. Ohne Risiko testen.

3CX
Für diese E-Mail-Adresse besteht bereits ein 3CX-Konto. Sie werden zum Kundenportal weitergeleitet, wo Sie sich anmelden oder Ihr Passwort zurücksetzen können, falls Sie dieses vergessen haben.