CallerID mit AGI an VDR per Telnet übermitteln

Ber5erker

Mitglied
Mitglied seit
6 Apr 2004
Beiträge
305
Punkte für Reaktionen
0
Punkte
16
Hallo, jetzt kommt etwas kompliziertes:

Ich möchte bei eingehenden Anrufen, dass Asterisk die CallerID (Nummer und evtl. Name) an meinen VDR schickt, sodass dieser eine OSD-Meldung auf meinem Fernseher ausgeben kann.

In der extensions.conf wird mittels AGI ein Script aufgerufen:
[...]
exten => 100,1,agi(anruf.sh)
exten => 100,2,Dial(SIP/100,60,tr)
[...]

Im "/usr/share/asterisk/agi-bin" habe ich das Script "anruf.sh" hinterlegt mit folgendem Inhalt:
Code:
#!/bin/sh
#
echo -e "mesg Text\nquit\n" | telnet activy 2001
exit 0

Soweit funktioniert auch alles, auf dem Fernseher erscheint bei einem eingehenden Anruf der Text "Text", jedoch soll ja die RUFNUMMER angezeigt werden :?

FRAGE: Wie kann ich nun die Rufnummer abgreifen lassen und als Variable in meinem Script einsetzen?
 
AGI geht über stdin und stdout. Wenn dein Shellskript also so gemacht ist, dass es Variablen entgegennimmt, dann kannst Du mit

exten => 100,1,agi(anruf.sh|<parameter>)

wobei <parameter> dann die ${CALLERID} in Deinem Fall ist.


(und im shell-skript dann mit $1 abgreifen:
echo -e "mesg $1\nquit\n" | telnet activy 2001 )
 
gibts davon screenshots? :)
 
ist ja wahnsinn ... *habenwollen*
 
Hier die "Screenshots" 8)

Sorry, wegen Guthabenmangel meines Handys gibts leider nur Screenshots innerhallb meiner VoIP-Anlage.

"Seb intern" hab ich mein internes Softphone genannt, "102" ist die interne Nummer des Phones.

"Drei von Tausend" hieß die Doku, die grad im Fernsehen lief ;-)

PS: War gar nicht so einfach, die Bilder hochzuladen.
Der Konqueror (KDE 3.2.2) mag die Attachment-Funktion des Boards überhaupt nicht :-(
 

Anhänge

  • fernseher.jpg
    fernseher.jpg
    36.5 KB · Aufrufe: 688
  • activy.jpg
    activy.jpg
    19.9 KB · Aufrufe: 636
Das kann man auch für isdn machen ... in www.vdrportal.de (sorry für werbung) muss man nur nach isdn + onscreen schauen dann zeigt er mittels callerid.conf auch an wer grade anruft.
 
Hallo,

Was hat es mit der callerid.conf auf sich. Kann ich auf meinem system nicht finden. Wo muss das Teil liegen?
Ich möchte gern über einen AGI Script "Echte" Namen aus Callerid's ermitteln.


Peter
 
Inverssuche

Hallo,

könnte man die Inverssuche der Telekom einbinden um den Namen des Anrufers anzeigen zu lassen?

Habe hier folgendes gefunden:
lynx "http://www.dasoertliche.de/DB4Web/es/oetb2suche/home.htm?kw_invers=123456&main=Antwort&s=2" \
-dump -nolist | grep printselected.gif -A 2 -m 1 | awk '{ if (NR>1) {printf $0} } END { print }'

anstatt der 123456 im Link muss natürlich die Telefonnummer rein.

Gruss lxuser
 
Hi
der einzeiler ist schonmal genial.
Ich schau mal was ich machen kann - bin aber kein script-profi.
Wer schneller ist soll sein ergebniss schonmal veröffentlichen :-D

Gruß
Thorsten Gehrig
 
Hier meine (vorläufige) Lösung:
in den conext für ankommende gespräche:
exten xxxx,1,System(/etc/asterisk/reverse.sh ${CALLERIDNAME} &)

das passende script sieht dann so aus:
Code:
#!/bin/sh
#
echo -e -n "mesg Anruf von " >/etc/asterisk/anruf.txt
echo -e -n "$1" >>/etc/asterisk/anruf.txt

lynx "http://www.dasoertliche.de/DB4Web/es/oetb2suche/home.htm?kw_invers=$1&main=Antwort&s=2" \
-dump -nolist | grep printselected.gif -A 2 -m 1 | awk '{ if (NR>1) {printf $0} } ' >>/etc/asterisk/anruf.txt

echo -e -n "\nquit\n" >>/etc/asterisk/anruf.txt

cat /etc/asterisk/anruf.txt | telnet vdr.gehrig.lan 2001

exit 0

Ich baue mir hier - zugegebenermassen recht umständlich - meinen Anzeigestring zusammen. Jeder kann seinen Pfad nach belieben anpassen...

Da alle mir bekannten Handynummern noch nicht per Reverse-Lookup funktionieren werde ich mir wohl noch was überlegen müssen dass ich vorher per "LookupCIDName" schaue ob ich nicht schon selbst eine Caller-ID gespeichert habe.
Ausserdem währe es vielleicht nicht schlecht die Caller-ID auch an Asterisk mit zurück zu geben - für SIP telefone (die können sowas ja auch anzeigen).
Es ist nur die Frage wie man sowas macht - und ob die Abfrage schnell genug ist...

Für verbesserungsvorschläge bin ich JEDERZEIT OFFEN UND DANKBAR!!!

Gruß
Thorsten Gehrig
 
verbessertes script

Hi
in Anlehnung an VDRPortal habe ich das script (von dort) auf den Asterisk angepasst.

Vorteil: einen Cache - in den man auch selbst (nicht revers-suche-erlaubte) Rufnummern eintragen kann und durch den cache weniger Onlinezugriffe (wir wollen die ja schonen.... oder?)

Die Pfade können beliebig angepasst werden...
Code:
#!/bin/sh 
# 
#pfad zum cachefile
CACHE="/var/spool/asterisk/invsuche_cache"

#pfad um das tempfile anzulegen
TMPFILE="/tmp/tmpsuche"
LOG="/var/log/asterisk/inverssuche_log"

NUMMER=`echo $1 | sed -e "s/\ //g" -e "s/+49/0/"`

echo "Suche nach $NUMMER im cache"
NAME=`awk  -F '\t' '{ if ($1 == "'$NUMMER'") print $2 }' $CACHE`
DETAILS=`awk  -F '\t' '{ if ($1 == "'$NUMMER'") print $3 }' $CACHE`
echo "Name: $NAME"
echo "Details: $DETAILS"
if [ "$NAME" == "" ]; then
    echo "Suche nach $NUMMER in [URL]www.dasoertliche.de[/URL]"
    lynx "http://www.dasoertliche.de/DB4Web/es/oetb2suche/home.htm?kw_invers=$NUMMER&main=Antwort&s=2" \
    -dump -nolist -connect_timeout=3>  $TMPFILE
		
    NAME=`grep printselected.gif -A 2 $TMPFILE | awk '{ if (FNR == 2) print $0 }' |  sed  -e "s/\ \+//" -e "s/\ \+/\ /g" -e "s/\[_\]//g"`
    DETAILS=`grep printselected.gif -A 2 $TMPFILE | awk '{ if (FNR == 3) print $0 }' |  sed  -e "s/\ \+//" -e "s/\ \+/\ /g" -e "s/\[_\]//g"`
		
    if [ "$NAME" == "" ]; then
        if grep "Kein Teilnehmer gefunden" $TMPFILE > /dev/null; then
            NAME="Telefonnummer $NUMMER"
            DETAILS="Kein Eintrag $2"
        fi;
    fi;
									
    if [ "$NAME" == "" ]; then
        NAME="Telefonnummer $NUMMER"
        DETAILS="Fehler $2"
    else
        echo -e "$NUMMER\t$NAME\t$DETAILS" >> $CACHE
    fi;
    echo "Name: $NAME"
    echo "Details: $DETAILS"
												    
fi

echo -e -n "mesg " >/etc/asterisk/anruf.txt
echo -e -n "TEL:$NAME " >>/etc/asterisk/anruf.txt
echo -e -n "\nquit\n" >>/etc/asterisk/anruf.txt

cat /etc/asterisk/anruf.txt | telnet vdr.gehrig.lan 2001

echo -e -n "mesg " >/etc/asterisk/anruf.txt
echo -e -n "$DETAILS " >>/etc/asterisk/anruf.txt
echo -e -n "\nquit\n" >>/etc/asterisk/anruf.txt

cat /etc/asterisk/anruf.txt | telnet vdr.gehrig.lan 2001

exit 0

Für die commands.conf vom vdr noch diesen Eintrag:
Code:
Anrufliste :  grep "vdr\[.*\]: info: TEL:" /var/log/messages | tail -n 100 | tac

Jetzt müsste nur noch von den richtigen experten der Tip dazukommen wie man eine Variable (CALLERIDNAME oder so) aus einem Script heraus setzen kann.... -WER KANN HELFEN?-

Gruß
Thorsten
 
echo "SET VARIABLE variablenname variblenwert"

Keine Ursache
Dominic
 
Hi @DerDominic,

kannst du mir ein Beispiel nennen?
Ich habe zumindest in der Theorie alles verstanden - in der Praxis funktionier es bei mir aber nicht :-(

Annahme 1) ich muss per AGI und nicht per SYSTEM aufrufen -> kein Problem
Annahme 2) das File muss bei /var/lib/asterisk/agi-bin/ liegen -> kein Problem

ich habe folgendes Testscript
Code:
#!/bin/bash

echo 'SET VARIABLE CALLERIDNAME "TEST" '
echo 'SET CALLERID "0815"  '

exit 0

aber es funktioniert nicht - meine CALLERIDNAME und meine CALLERID sind wie vorher....

Wo liegt mein Fehler? Oder hat jemand ein Beispiel-AGI wo Bash und ein/ausgabe an Asterisk genutzt wird? (die meisten benutzen Perl - und das kann ich nicht ...)

Gruß
Thorsten Gehrig
 
Kuck mal, hier im Forum habe ich auch noch ein Bash-Script mit agi und teltarif, da kannst Du es Dir 'abkäsen'

Gruß
Dominic
 
Ich habs mittlerweile - (hab am ENUM-script ´abgekäst´).
Dan´ke
 
Neue Version vom Reverse-Callerid-Lookup-Script

Hallo
so langsamm wird das script sauber....

Änderungen / Fukntionsweisse des neuen Scipts:
es muss nach l:\var\lib\asterisk\agi-bin kopiert werden.

Es werden folgende Files angelegt:
/var/spool/asterisk/inverssuche_cache
Hier werden die suchergebnisse gecached - für Rufnummern die nicht gefunden werden kann man hier auch MANUELL den richtigen Namen eintragen - dann wird er beim nächsten mal aus dem cache gefunden!!

/var/log/asterisk/anrufliste_log
Hier stehen die eingegangenen Anrufe drinnen - in einem Format was man wunderbar am VDR lesen kann (commands.cmd => tac /pfad/zum/log/anrufliste_log | tail -n 100 )

Der gefundene Namen wird an Asterisk als variable LONGNAME zurückübergeben und kann ausgewertet werden (wird z.B. bei mir im SIP-Telefondisplay angezeigt!)

In der extensions.conf sieht das ganze bei mir so aus:

Code:
exten => 12345,1,SetLanguage(de)
exten => 12345,2,AGI,reverse.agi| ${CALLERIDNUM}
exten => 12345,3,SetCIDName(${LONGNAME})
exten => 12345,4,SetCIDNum(0${CALLERIDNUM})

Danke an alle die mir geholfen haben und an alle von denen ich abgekupfert habe! :-D

Gruß
Thorsten Gehrig
 
Hi Thorsten,

danke für das tolle Script. Jetzt fehlt nur noch der letzte Stand Deines Scripts mit der Variablen-Rückgabe - zumindest finde ichs in der letzten Nachricht nicht. Ich erlaube es mal selber auf Grundlage Deines ersten Scripte zu vervollständigen:
Code:
#!/bin/sh
#
#pfad zum cachefile
CACHE="/var/spool/asterisk/invsuche_cache"

echo -n "SET VARIABLE LONGNAME "\"


#pfad um das tempfile anzulegen
TMPFILE="/tmp/tmpsuche"
LOG="/var/log/asterisk/inverssuche_log"

NUMMER=`echo $1 | sed -e "s/\ //g" -e "s/+49/0/"`

#echo "Suche nach $NUMMER im cache"
NAME=`awk  -F '\t' '{ if ($1 == "'$NUMMER'") print $2 }' $CACHE`
DETAILS=`awk  -F '\t' '{ if ($1 == "'$NUMMER'") print $3 }' $CACHE`
echo -n "$NAME"
if [ "$NAME" == "" ]; then
    #echo "Suche nach $NUMMER in [URL]www.dasoertliche.de[/URL]"
    lynx "http://www.dasoertliche.de/DB4Web/es/oetb2suche/home.htm?kw_invers=$NUMMER&main=Antwort&s=2" \
    -dump -nolist -connect_timeout=3>  $TMPFILE

    NAME=`grep printselected.gif -A 2 $TMPFILE | awk '{ if (FNR == 2) print $0 }' |  sed  -e "s/\ \+//" -e "s/\ \+/\ /g" -e "s/\[_\]//g"`
    DETAILS=`grep printselected.gif -A 2 $TMPFILE | awk '{ if (FNR == 3) print $0 }' |  sed  -e "s/\ \+//" -e "s/\ \+/\ /g" -e "s/\[_\]//g"`

    if [ "$NAME" == "" ]; then
        if grep "Kein Teilnehmer gefunden" $TMPFILE > /dev/null; then
            NAME="Telefonnummer $NUMMER"
            DETAILS="Kein Eintrag $2"
        fi;
    fi;

    if [ "$NAME" == "" ]; then
        NAME="Telefonnummer $NUMMER"
        DETAILS="Fehler $2"
    else
        echo -e "$NUMMER\t$NAME\t$DETAILS" >> $CACHE
    fi;
    echo -n "$NAME"
fi

echo -n "\""
exit 0

Gruß,
Tom
 
Hi TomS,

freud mich das das Script freunde findet :-D

eigentlich sollte das script attached sein - ist wohl irgendwie schiefgelaufen....

Bevor ich mir jetzt deine änderungen anschaue - lege ich lieber nochmal mein Script bei :-D

Gruß
Thorsten
Code:
#!/bin/sh 
# 
read agi_request
read agi_language
read agi_channel
read agi_type
read agi_uniqueid
read agi_callerid
read agi_dnid
read agi_rdnis
read agi_context
read agi_extension
read agi_priority
read agi_enhanced
read agi_accountcode
read emptyline

#pfad zum cachefile
CACHE="/var/spool/asterisk/invsuche_cache"

#pfad um das tempfile anzulegen
TMPFILE="/tmp/tmpsuche"
LOG="/var/log/asterisk/anrufliste_log"

if [ "$1" == " " ]; then
    NAME="anonymer Anrufer"
    DETAILS="Keine details"
else
    NUMMER=`echo $1 | sed -e "s/\ //g" -e "s/+49/0/"`
    #echo "Suche nach $NUMMER im cache"
    NAME=`awk  -F '\t' '{ if ($1 == "'$NUMMER'") print $2 }' $CACHE`
    DETAILS=`awk  -F '\t' '{ if ($1 == "'$NUMMER'") print $3 }' $CACHE`
    #echo "Name: $NAME"
    #echo "Details: $DETAILS"
    if [ "$NAME" == "" ]; then
    #    echo "Suche nach $NUMMER in [URL]www.dasoertliche.de[/URL]"
        lynx "http://www.dasoertliche.de/DB4Web/es/oetb2suche/home.htm?kw_invers=$NUMMER&main=Antwort&s=2" \
        -dump -nolist -connect_timeout=3>  $TMPFILE
        NAME=`grep printselected.gif -A 2 $TMPFILE | awk '{ if (FNR == 2) print $0 }' |  sed  -e "s/\ \+//" -e "s/\ \+/\ /g" -e "s/\[_\]//g"`
        DETAILS=`grep printselected.gif -A 2 $TMPFILE | awk '{ if (FNR == 3) print $0 }' |  sed  -e "s/\ \+//" -e "s/\ \+/\ /g" -e "s/\[_\]//g"`
        if [ "$NAME" == "" ]; then
            if grep "Kein Teilnehmer gefunden" $TMPFILE > /dev/null; then
                NAME="Telefonnummer $NUMMER"
                DETAILS="Kein Eintrag $2"
            fi;
        fi;
        if [ "$NAME" == "" ]; then
            NAME="Telefonnummer $NUMMER"
            DETAILS="Fehler $2"
        else
            echo -e "$NUMMER\t$NAME\t$DETAILS" >> $CACHE
        fi;
    fi
fi

echo -e -n "mesg TEL:$NAME \nquit\n" | telnet vdr.gehrig.lan 2001
echo -e -n "mesg $DETAILS \nquit\n"  | telnet vdr.gehrig.lan 2001
echo -e "`date +%e.%m\ %H:%M ` $NAME " >>$LOG
echo 'SET VARIABLE LONGNAME '"\"$NAME\"" >/dev/stdout
read in

exit 0
 
Du benutzt lynx. Warum dieses ? Ginge es auch mit wget ?
 
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.