Festnetz oder Sip

Hupe

Aktives Mitglied
Mitglied seit
8 Apr 2004
Beiträge
2,586
Punkte für Reaktionen
0
Punkte
0
Hi Jungs,

hab mir mal darüber Gedanken gemacht, ob es nicht möglich ist zu erkennen , ob ein eingehender Anruf über Sip seine Quelle im Festnetz hat, oder es sich um einen reinen Anruf via Voip handelt (der ja in der Regel für den Anrufer kostenpflichtig ist).

Bisher hatte ich nur die Idee aus dem Sip-Header die "User-Agent"-Variable abzufragen. Die ist bei einem Anruf über ein Sipgate-Gateway "Asterisk PBX". Nun benutzt ja nicht nur Sipgate Astersik, sondern durchaus auch andere Leute :). Somit würden dann Anrufe über Sip von anderen Asterisk-Usern als Festnetzgespräch erkannt. Was mich in dem Fall nicht weiter bringen würde. Fällt Euch vielleicht noch ne Möglichkeit ein, die Anrufe sicher zu unterscheiden?

P.S.: Dies soll bitte keine Diskussion über den Sinn und Zewck werden!
 
Ein paar Ideen.
1. Viele Leute haben in ihren Endgeräten Namen stehen. Diser wird dann im $CIDName angezeigt. Sollte ein Benutzer anrufen der dieses gesetzt hat, muss man nur prüfen ob dieser Buchstaben enthält.
Problem: Unknow wird angezeigt wenn eine Nummer aus dem Festnetz unterdrückt wird. Dieser Anruf würde als SIP Anruf erkannt werden.

2. Die IP Adresse des Absenders Prüfen. Solle diese ungleich der von Sipgate oder eines anderen Providers sein so weis man dass es ein Sip Call ist. Nachteil: Manache Provider senden immer ihre eigene IP mit und vermitteltn übder den Server

3. Die CIDNum überprüfen. Ist die erste Zahl eine 0 so kommt es aus dem Festnetz. Nachteil: Auch hier senden einige VOIP Provider die eigene Festnetznummer mit.

Ich hoffe da war wenigstens was brauchbares bei. Kenne mich mit den übertragenden Daten nicht so aus.
 
Hmm, die einfachste Lösung für das Problem wäre, wenn man Sipagte bitten würde, dass sie in der sip.conf den Eintrag "useragent" auf "Sipgate Asterisk", oder so setzen. Dann könnte man das wohl unterscheiden.
Wie sieht das eigentlich bei den anderen Providern aus? Nutzen die auch alle Asterisk als Gateway?
 
@Hupe

Soweit ich weiß, benutzen die Voip-Provider kein Asterisk
sondern SER.

Die Idee ist aber garnicht schlecht. Als einfachste Möglichkeit sehe
ich was beckmann unter 2. beschrieben hat. Es gibt nicht nur sipgate,
man kann die verschiedenen Voip-Provider nicht zu einer gemeinsamen
Linie bewegen.

Gruß
britzelfix

PS: dazu habe ich auch noch eine Idee, ich werde mal schauen
ob es sich realisieren lässt und wenn ja es hier später vorstellen.
 
britzelfix schrieb:
Soweit ich weiß, benutzen die Voip-Provider kein Asterisk
sondern SER.

Es soll auch Provider geben, die nicht auf open Source setzen ;)

jo
 
@rollo

Die benutzen dann SER's mit der kommerziellen Lizenz
und gespooften Namen. :)

gruß
britzelfix
 
Die benutzen dann SER's mit dem kommerziellen Lizenz
und gespooften Namen.

Oder Hardwarelösungen, die sowas nicht benötigen, weil sie alleine vom HW-Design schon so ausgelegt sind, daß sie keine OpenSource-Lösungen clonen müssen :mrgreen:
 
Lösung: Festnetz oder SIP

So, hier mal eine kleine Lösung für dieses Problem.

Das mini-Perlscript läuft irgendwo als Daemon im
Hintergrund und loggt sich in das Manager-Interface
ein.

Wenn jemand anruft, dann bekommt es ein Ringing-Event.
Danach führt es das Kommando: "sip show channels"
und extrahiert die Sender-IP.

Je nach IP spielt es mit mpg123 eine ander Melodie/Ansage
durch die angeschlossene Soundkarte (nicht Telefon).

Das ganze ist nur ein Quick-Hack. Wer will kann gerne
sich dessen annehmen und es zu einer echten Anwendung
erweitern.



Code:
#!/usr/bin/perl


use strict;
use Net::Telnet;

$|++;

fork and exit;

my ($mgr,
    $mgr_username,
    $mgr_password,
    $prev, $cur, $ip
   );


$mgr_username = "blah";
$mgr_password =  "blah";



while (1) {

    # init manager interface

    $mgr = new Net::Telnet( Port => 5038,
                            Prompt => '/.*[\$%#>] $/',
                            Output_record_separator => '',
                            Errmode    => 'return' ) or die "$@:$!";

    $mgr->open('localhost');
    $mgr->waitfor('/0\n$/');
    $mgr->print("action: login\nusername: $mgr_username\nsecret: $mgr_password\n\n");
    $mgr->waitfor('/Authentication accepted*/')
        or do { print "Asterisk Manager Interface login failed, verify username and password: ", $mgr->lastline;
                exit; };

    while ($mgr->errmsg() eq '' ) {

        # wait for action
        ($prev, $cur) = $mgr->waitfor('/Ringing/');

        if ($cur =~ /Ringing/)
        {
            $mgr->print("Action: command\ncommand: sip show channels\n\n");

            ($prev, $cur) = $mgr->waitfor('/\d+ active SIP channel\(s\)\n/');
            ($ip) =  grep /^\d+\./, split /\n/, $prev;
            $ip  =~ s, .*$,,;

            if ($ip =~ /217\.10\.79/) { $peer = 'sipgate'; }
            elsif ($ip =~ /217\.175\.252/) { $peer = 'dusnet'; }
            else { $peer = 'unknown'; }

            # play file
            system '/usr/bin/mpg123', '/var/lib/asterisk/sounds/' . $peer . '.gsm';
        }
    }
}

# never reached ...

Gruß
britzelfix
 
Ja, Sipgate benutzt SER . Dan kann man auch wuderschön sehen, wenn man sich im Asterisk mal die Debug-Meldungen von Sip ansieht(User Agent: Sipgate SER). Wenn der Anrufer aber über ein Sipgate-Gateway anruft, so wird als User-Agent "Asterisk PBX" angezeigt. Also stelle ich mal die kühne behauptung auf, und sage, dass Sipgate Asterisk als Gateway nutzt.

Edit:
@britzelfix: schönes Skript!
 
@Hupe

danke!

Es geht aber noch viel einfacher, als man gedacht hätte.
Mit der Umgebungsvariable ${SIPDOMAIN} nämlich.

Im Dialplan kann dann folgendes stehen:

exten blah,1,SetCIDName( ${CALLERID}@${SIPDOMAIN} )


Eine Variable ${IAXDOMAIN} gibt es afaik nicht.

Gruß
britzelfix
 
So, habe es jetzt mal ausprobiert, und mich über meine Festnetznummer von Sipgate angerufen. Unglücklicherweise steht dann in der Variable "Sipdomain" nicht die Domain von Sipgate, oder dem Gateway-Server sondern meine IP. Ich konnte es jetzt leider nicht testen, welche IP da steht, wenn ein Anruf "nur Sip" reinkommt, Aber ich vermute mal, dass dann da auch meine Ip steht.
 
Unglücklicherweise steht dann in der Variable "Sipdomain" nicht die Domain von Sipgate, oder dem Gateway-Server sondern meine IP.

stimmt. Darauf habe ich nicht geachtet,
allerdings gibt es noch die ${SIPCALLID}
mit Cut kann man sich die IP herausschneiden.

Gruß
britzelfix
 
@Hupe

${IP} enthällt die Anrufer-IP

exten => _X.,1,Cut(IP=SIPCALLID,@,2)
exten => _X.,2,SetCIDName( ${CALLERID}@${IP} )

Gruß
britzelfix
 
Cool, ich hatte mal gestern bei Sipgate nachgefragt, ob sie den User-Agent-Eintrag ihres Gateway-Servers nicht ändern können. Wie ich jetzt sehe haben sie das schon gemacht. das Gateway heisst jetzt "sipgate asterisk".
Super! Danke Sipgate!

Damit ist für mich das Problem gelöst.
 
Kostenlos!

Statistik des Forums

Themen
248,439
Beiträge
2,291,512
Mitglieder
377,855
Neuestes Mitglied
Slasher625