SER Rufweiterleitung

[email protected]

Neuer User
Mitglied seit
20 Jan 2006
Beiträge
118
Punkte für Reaktionen
0
Punkte
0
Hallo!

Ich hab einen SER am laufen und möchte nun eine Rufumleitung (ev. mit verschiedenen Zuständen, permanent, bei besetzt, bei nicht melden...)hinzufügen.
Hat jemand eine Idee dazu wie man das verwirklichen könnte.
Im Internet hab ich nichts brauchbares gefunden.

Danke!

System: Debain 3.1, SER 0.8.14, Mysql 4
 
*hm du könntest z.b sagen , das wenn du jemanden anrufst und der nicht errreichbar ist, das der SER in der Datenbank eine weitere Nummer abruft und mit dieser einen weiteren Verbindungsaufbau versucht.
Ich glaube du könntest den Befehl append_branch verwenden.
Du müsstest über ein Skript eine Datenbankverbindug aufbauen in der du die weitere Nummer des jeweiligen Gesprächspartners abfragst.

Um dem SER dann zu sagen das er das machen soll, könntest du dich am Fehler Wert 408 orientieren. Wenn der SER einen anruf durchlässt, der jenige nicht anbnimmt dann kommt der Fehler 408 . Würde sage mit ner If Schleife im File und dann dort das externe Skript starten den User namen mit ner Variablen rausziehen und die andere Nummer abfragen und zurückgeben.
Denke aber noch mal drüber nach.
Muss jetzt weg !

Grüsse,
 
Hallo Devender!

Danke für deine Antwort!
Ich hätte mit vorgestellt es gibt vor der Abfrage

if (lookup("location")

noch eine weiter Abfrage mit

if (lookup("prul") --> prul=permanente Rufumleitung

aber wie soll in dieser Tabelle die Rufnummer drinsteht?
In der Tabelle "location" seht die Nummer so drin:
sip:12345@IPvonClient -- auf dem die Nummer registriert ist.
Wenn ich nun die neue Tabelle auch so aufbaue und die UmleiteNummer auch auf diese Art reinschreibe
sip:67890@IPvonneuemClient
funktionierts, jedoch möchte ich, dass SER den Client auf dem die Umleitenummer registriert ist wieder selbst findet, weil es könnte ja sein, dass auch diese Nummer wieder umgeleitet ist.....
Und ich hab monentan keine Idee wie ich das machen kann so eine Art Sprungmarke damit er weiter oben wieder ins Script reinspringt.

Kann das append_branch? Ich hab gelesen, dass er einen neuen Zweig aufmacht, aber nicht wieder die Routingvorschriften durchläuft?

Danke,
Hannes
 
Hi!

ich dachte mir das so. Wenn du zwei SIP Nummern hast und in der ser Tabelle unter dem Tabreiter subscriber die zweiter Nummer, sagen wir mal als SECOND_SIP einträgst könntest du folgenden Skript Teil verwenden.


failure_route[x]
{
if (t_check_status("(408)")) //das soll ein 408 sein nicht 40SMILIE*hmpf
{
Heißt: Wenn du bei der ersten Nummer nicht abnimmst, gibt es ein Timeout, wenn das so ist könnte man dem SER mit dem t_check sagen, springe in einen neuen Routeblock.
In diesem Block könntest du dann einen Datenbankabfrage machen, die die zweite Nummer raussucht.
Es gibt da die globalen variablen wie SIP_OURI oder auch SIP_OUSER.
Diese könntest du dir im folgenden Teil zu Nutze machen:

exec_dset(' QUERY="SECOND_SIP from subscriber where username=\"$SIP_OUSER\"";
SECOND_SIP=`mysql -Bsuser -pheslo -e "$QUERY" ser`;
if [ -z "$PHONE" ] ; then exit 1; fi ;

//Damit würdest du einen externen Befehl ausführen und die Rückgabe direkt //wieder in SER leiten.

echo sip:[email protected]:5060;echo>/dev/null');
//Mit dem echo Befehl wird dann die alte SIP mit der neuen Überschrieben und //damit als rewrite URi verwendet

append_branch();
};
}
Diese Variante kannst du auch immer weiterführen. Also wenn du unter der zweiten Nummer nicht erreichbar bist gibts ne dritte usw.

Hoffe ich konnte deine Frage beantworten.

Grüsse
 
Hi ,

ich habe dazu auch mal eine Frage. Besteht die Möglichkeit nur SIP-Messages weiterzuleiten? Also ich meine Textnachrichten. Alle anderen normalen Anrufe sollen ganz normal behandelt werden. Aber SIP Messages möchte ich gerne weiterleiten zu einem sms Server.

Hat das schon mal jemand probiert?

Danke schon mal!
 
HI!

Also du könntest ganz normal nach Messages Filtern bedeutet:

if(method =="MESSAGE" && search ("z.b SMS")
{
rewriteuri("sip: SMS Gateway z.B Asterisk IP Adresse");
};

Oder du schreibst an Stelle von rewriteuri ein kleines Shell das die Internetseite vom SMS Server abruft und deine SMS Nachircht dort einträgt und verschickt.

Grüsse,
 
Hallo Devender!

Hm, hab jetzt das Problem, dass ich zwar eine neue URI bekomme, aber ich hier die komplette Adresse in die Datenbank reinschreiben muss (sip:[email protected])
Ich möchte aber gerne, dass SER sich die "location" auf welcher IP die neue Nummer registriert ist wieder selbst sucht.
Gibt es dazu eine Möglichkeit?

Hannes
 
Zuletzt bearbeitet:
Hallo Devender!

Hab jetzt mal 2 Rufumleitungen aktiviert
1: permanente -- Hierzu frage ich mit "lookup" eine Tabelle "cfu" ab (ähnlich wie aliases)
2: on Busy -- Hierzu frage, wie du vorgeschlagen hast, in einer failure_route mit "lookup" die Tabelle "cfb" ab.

Was stört ist, dass ich bei jeder Datenbankänderung den Dienst durchstarten muss. Hast du dazu ev. eine andere Idee?

Danke,
Hannes
 
Was verstehst du unter - den Dienst durchstarten? SER neu Starten?
Und was änderst du dann immer an der Datenbank? Neue Einträge?

Grüsse,

Dirk
 
Guten Morgen!

Ja, SER neu starten. In der Datenbank sollte die Nummer der Rufumleitung immerwieder selbst durch den User geändert werden können (ev. Webinterface). Bei einer ständigen Umleitung sollte diese auch durch den User aktiviert bzw. deaktiviert werden können.

Hannes
 
Hatte eben schön eine Antwort geschrieben und dann mit dem Handballen aufs PAD und futsch war alles.............*grummel
ICH HASSE TOUCH PADS !!!!!!

Auf ein neues.
Das erstellen des Eintrages mit der Rufumleitung in der DB sollte ja kein Problem sein.
Was den Neustart angeht, kann ich nur aus meiner eigenen Erfahrung sprechen. Die Dienste die ich implementiert hatte verlangten beim ersten "Mal" einen Neustart. Auch wenn ich einen DB eintrag geändert hatte. Liegt wohl daran das SER beim start alle aktuellen Module und Einstellungen läd und das nicht zwischenzeitlich erneuert. (du könntest natürlich mit einer art Zeit conuter so ein neustart erzwingen, denke ich)

Du willst ja das ein Nutzer seine Rufumleitungsnummer ändern kann und diese dann auch aktiviert wird. Das würde ja heißen, dass ,da es anscheinend nicht anders geht den SER bei jedem Eintrag neu zu starteten, was wiederrum bedeutet alle gerade geführten Gespräche werden unterbrochen.
Du könntest allerdings wenn du es so willst, den SER automatisch neu starten lassen. Das stelle ich mir so vor:
Der Nutzer gibt seine neue Nummer in das Webinterface ein und beim speichern seiner neuen Nummer, wird auf dem SER Rechner der Befehl /etc/init.d/ser restart ausgeführt.

Ich würde es eleganter machen. Der Teilnehmer kann seine Nummer ändern, übers Web oder per Mail an den Admin. Und im laufe eines Tages oder Nachts werden alle Einstellungen übernommen und der SER neu gestartet. Ich weiß ja nicht wie du den SER einsetzt, ständig oder nur sporadisch.

Mehr fällt mir zum Theme Neustart jetzt auch nicht mehr ein.*sorry

Zum Webinterface kann ich dir noch was sagen. in der config.php gibt es die Möglichkeit diese TABS wie myaccount etc. zu erweitern. Ich hatte es damals so gemacht, das ich für meinen E-Mail Dienst einfach ein weiteres TAB ans ende gehängt hatte, musste dann natürlich die PHP Seite an das Interface optisch angleichen.
Eventuell lassen sich die dann auch ein oder abschalten, also die dienste. In der selben datei kann man Gruppenrichtlinien einstellen, so ab Zeile 314. Vielleicht liese sich damit die neuen Dienste ein und abschalten.

Hoffe ich konnte dir etwas weiterhelfen.

Grüsse,

Dirk
 
Hallo Dirk!

Danke für deine schnelle Antwort! Bei mir läuft der SER immer, das mit dem "automatischen Neustart" gefällt mir nicht so gut, ev. könnte man es mit serctl .... machen, dass man einmal vom Webinterface aus in die DB schriebt und zugleich den Befehl serctl... absetzen lässt?? Muss ich noch einwenig suchen. Das mit der config.php muss ich mir genauer ansehen, hört sich interressant an!

Kennst du ev. einen Möglichkeit wie man die Rufumleitung vom Telefon programmieren könnte?? So mit *31*Umleiteziel# oder so? Dann könnte ich mir ev. das ganze Webinterface sparen.

Danke,
Hannes
 
Hi !

Also das mit der Umleitung ist ja Telefon spezifisch. Ich hatte bis jetzt nur mit dem Snom 100 das Vergnügen, aber da ist mir so eine Funktion nicht bekannt.
Schaue mich auch mal in der conifg.php um, vielleicht finde ich auch noch was.
Grüsse,

Dirk
 
Hallo!

Rufumleitung funktioniert! Die Eingabe der Umleitungsarten erfolgt mit einem Webinterface, das dann einfach den Befehl "serctl fifo ul_add cfu ......" absetzt.

Jetzt hab ich noch ein kleines Problem:
Damit ich die Rufumleitung richtig verrechnen kann benötige ich in der Accounting Datenbank die Einträge dafür. Leider funktioniert in der Fehler Route die Funktion acc_db_request nicht. Gibt es dafür einen anderen Ansatz!

Hannes
 
Da ich mit der Accounting Funktion noch nicht so wirklich gearbeite habe, aber vielleicht kann ich dir ja weiterhelfen.
Wie sieht den deine Schleife aus , in der der SER in den acc Request springen soll?

hab grad mal im Adminsguide geguckt, dort wird das so dargestellt.

modparam("acc", "log_missed_flag", 3 );
if (!lookup("location")) {
# call invitations to off-line users are reported using the
# acc_request action; to avoid duplicate reports on request
# retransmissions, request is processed statefuly (t_newtran,
# t_reply)
if ((method=="INVITE" || method=="ACK") && t_newtran() ) {
t_reply("404", "Not Found");
acc_request("404 Not Found"); Hier müsste er ja dann in die Datenbank springen um die Call zu speichern.
break;
};
# all other requests to off-line users are simply replied
# statelessly and no reports are issued
sl_send_reply("404", "Not Found");
break;
} else {
# user on-line; report on failed transactions; mark the
# transaction for reporting using the same number as
# configured above; if the call is really missed, a report
# will be issued
setflag(3);
# forward to user’s current destination
t_relay();
break;
};

Arbeitest du mit SERWEB um dann die Anrufe darzustellen?? Da gibt es mittlerweile auch eine neue Version von.

Grüsse,

Dirk
 
Hallo Dirk!

Bei CFU (dauerhafte Rufumleitung) und bei CFNRc (Rufumleitung bei Störung des Endgeräts) ist der Eintrag in die DB kein Problem, hier kann ich den Befehl "acc_db_request" absetzen. Jedoch muss ich bei CFB (Rufumleitung bei besetzt) in eine Fehler Route springen und in Dieser funktioniert der "acc_db_request" nicht. Ich habs momentan so gelöst, dass ich in der Fehler Route eine neue Route aufrufe und in dieser wieder "acc_db_request" aufrufe. Jedoch gefällt mir diese Lösung nicht, denn ich hab jetzt 10 Routen im Script zu den jeweiligen Destinationen. Ich hätte auch versucht die einzelnen Routen in eine zusammenzufassen, jedoch hatte ich dann das Problem, dass ich nach dem Aufruf von "append_branch" (in der Fehler Route) die URI (in der danach aufgerufnen Route) nicht mehr verändern konnte.

Ich möchte aber die "Unterrouten" wieder wegbringen und alles wieder in der failure_route unterbringen.

Serweb verwende ich nicht.

Hannes
 
Hallo Hannes und Dirk,

da passt mein Problem ja genau rein in euren Thread!
Ich habe auch mal versucht eine Rufumleitung (forking) einzurichten - mit deiner Idee Dirk, aber leider ohne Erfolg. Hab den failure_routing-Block extra genau 'nachgebaut', allerdings bekomme ich bei dem Versuch immer einen Fehler im INVITE-Header (habs rot markiert). Ist zwar sehr lang, aber ich setzte hier mal den Routing-Block und die Fehlermeldung aus der Konsole komplett rein. Vielleicht könnt ihr mir ja den entscheidenden Tip geben.

Code:
[U][B]Relevante Teile aus der ser.cfg:[/B][/U]

route {
	...
	if(method=="INVITE" || method=="CANCEL"){
		# go to failure_route[3]
		t_on_failure("3");
    	};
	...
}   ### Ende route

######################################################################
# ---------------- failure routing logic 3 ------------------------- #
# -- serielles Forking - Anrufweiterschaltung zu 2tem SIP-Telefon -- #

failure_route[3] {

    log(1, "----------------------------------------\n");
    log(1, "             Failure Route 3	    \n");
    if(t_check_status("(408)")){
	log(1, "408 -- Route 3 \n");
    };
    log(1, "SIPPHONE \n");
    exec_msg('printenv SRCIP > /tmp/ERROR;
	      cat >> /tmp/ERROR');
    exec_dset('QUERY="select sip_phone from subscriber where 					   	username=\"$SIP_OUSER\"";
               	SIP_PHONE=`mysql -Buser -pheslo -e "$QUERY" ser`;
	       	if [ -z "$SIP_PHONE" ] ; then exit 1; fi ;
               	echo sip:[email protected]; echo>/dev/null');
    append_branch();
    log(1, "redirection to another SIP-Phone \n");
    t_relay();

}   ### Ende failure_route[3] 


[B][U]Fehleranzeige in der Konsole:[/U][/B]

32(6935) ----------------------------------------
32(6935)              Failure Route 3
32(6935) 408 -- Route 3
32(6935) SIPPHONE
32(6935) redirection to another SIP-Phone
30(6929) ERROR:parse_first_line: bad request first line
30(6929) ERROR: at line 0 char 44:
30(6929) ERROR: parsed so far: INVITE sip:[COLOR="Red"]sip_phone[/COLOR] [email protected]
30(6929) ERROR:parse_first_line: bad message
30(6929) ERROR: parse_msg: message=<INVITE sip:[COLOR="Red"]sip_phone[/COLOR] [email protected] SIP/2.0
Record-Route: <sip:192.168.175.10;ftag=qxztbiyqv6;lr=on>
Via: SIP/2.0/UDP 192.168.175.10;branch=z9hG4bKe1a2.195f2117.2
Via: SIP/2.0/UDP 192.168.175.6:2051;branch=z9hG4bK-owtmzwsa6pmg;rport=2051
From: "snom300" <sip:[email protected]>;tag=qxztbiyqv6
To: <sip:[email protected]>
Call-ID: 3c4de43dbbfd-9dz46362yemt@snom300-000413258CF0
CSeq: 1 INVITE
Max-Forwards: 16
Contact: <sip:[email protected]:2051;line=s0xl9c0t>;flow-id=1
P-Key-Flags: keys="3"
User-Agent: snom300/6.2.3
Accept: application/sdp
Allow: INVITE, ACK, CANCEL, BYE, REFER, OPTIONS, NOTIFY, SUBSCRIBE, PRACK, MESSAGE, INFO
Allow-Events: talk, hold, refer
Supported: timer, replaces, callerid
Session-Expires: 3600;refresher=uas
Min-SE: 90
Content-Type: application/sdp
Content-Length: 477

v=0
o=root 1242982447 1242982447 IN IP4 192.168.175.6
s=call
c=IN IP4 192.168.175.6
t=0 0
m=audio 60224 RTP/AVP 0 8 9 2 3 18 4 101
a=crypto:1 AES_CM_128_HMAC_SHA1_32 inline:eXhJMdyFor+q7SEfn0gpH5d1+sTUh8vWxKVCXC9a
a=rtpmap:0 pcmu/8000
a=rtpmap:8 pcma/8000
a=rtpmap:9 g722/8000
a=rtpmap:2 g726-32/8000
a=rtpmap:3 gsm/8000
a=rtpmap:18 g729/8000
a=rtpmap:4 g723/8000
a=rtpmap:101 telephone-event/8000
a=fmtp:101 0-16
a=ptime:20
a=encryption:optional
a=sendrecv
>
23(6907) ERROR: receive_msg: parse_msg failed

Wie bekomme ich da bloss 'sip_phone' raus bzw. wo kommt das her?

Beste Grüße,
Nils
 
Hi,

ist jetzt nur so ne Idee, aber für doch mal bei der SQl Abfrage ine "-N" ein. Also genau hier:

Code:
QUERY="select sip_phone from subscriber where                            username=\"$SIP_OUSER\"";
                   SIP_PHONE=`mysql -Buser -pheslo [COLOR=Red][B]-N[/B][/COLOR] -e "$QUERY" ser`;


Grüsse,

Dirk
 
Morgen,

das mit dem eingebauten "-N" im Query hat funktioniert!
Super Sache, da bei nem CANCEL-Request auf Seiten des zuerst Angerufenen oder nach Ablauf von "fr_inv_timer" des tm-Moduls weitergeleitet wird.
Allerdings habe ich noch ein Problem: Wenn keine zweite Rufnummer eingetragen ist und einer der beiden Kommunikationspartner (Anrufer oder Angerufener) zwischenzeitlich den Call abbricht, wird der Angrufene automatisch erneut per INVITE angesprochen - sprich erneut angerufen.
Ne, Idee?

Gruß und schönes Wochenende,
Nils

P.S. Das Problem mit den beiden // der Plug-ins 'ttsannounce' und 'semstalk' besteht immer noch. Hab das mit den "dateien in mehrer Verzeichnisse kopieren" nicht verstanden... wäre schön, wenn du nochmal gucken könntest. Danke!
 
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.