Hausgemachtes LCR für asterisk

noway0815

Neuer User
Mitglied seit
12 Mai 2006
Beiträge
117
Punkte für Reaktionen
0
Punkte
16
Hi,
ich habe 3 Betamax accounts, da ich in verschiedenen Ländern Telefoniere. Jedoch ändert Betamax die Preise ständig ohne Vorwahrnung. Deswehen dachte ich diese MINI LCR zu machen. Es ist sicherlich ausbaufähig und auch verbesserungsfähig. Aber schon jetzt tut was es tun soll.
Code:
extensions.ael
macro getGateway(Number, *gw){
   gw="";
   Data="";
   CCode="";
   Network="";
   Country="";
   System(rm /etc/asterisk/rates.txt /etc/asterisk/CCode.txt /etc/asterisk/Network.txt /etc/asterisk/Country.txt);

   len=0;
   Set(i=${LEN(${number})});
   i=${i}-6; // die eigentliche telefonnummer wird wohl mehr als 6 ziffern sein, oder?
   while(${len}=0){
      System(cat /etc/asterisk/countrycodes.txt | grep ${Number:0:${i}} > /etc/asterisk/Data.txt);
      Set(Data=${FILE(/etc/asterisk/Data.txt)});
      Set(len=${LEN(${Data})});
      i=${i}-1;
   };

   Set(CCode=${CUT(Data,":",1)});
   Set(Country=${CUT(Data,":",2)});
   Set(Network=${CUT(Data,":",3)});

   System(lynx -dump -nonumbers -width=1024 [url]http://www.powervoip.com/en/calling-rates.html|grep[/url] -i "${Country}"|grep -i ${Network}|awk '{if($NF=="FREE*") print "0.0000"; else print $NF}' > /etc/asterisk/rates.txt);
   Set(powervoip=${FILE(/etc/asterisk/rates.txt,0,6)});

   System(lynx -dump -nonumbers -width=1024 [url]http://www.12voip.com/en/calling-rates.html|grep[/url] -i "${Country}"|grep -i ${Network}|awk '{if($NF=="FREE*") print "0.0000"; else print $NF}' > /etc/asterisk/rates.txt);
   Set(12voip=${FILE(/etc/asterisk/rates.txt,0,6)});

   System(lynx -dump -nonumbers -width=1024 [url]http://www.intervoip.com/en/calling-rates.html|grep[/url] -i "${Country}"|grep -i ${Network}|awk '{if($NF=="FREE*") print "0.0000"; else print $NF}' > /etc/asterisk/rates.txt);
   Set(intervoip=${FILE(/etc/asterisk/rates.txt,0,6)});

   if( (${12voip} <= ${powervoip} ) && (${12voip} <= ${intervoip}) ) gw=12voip;
   else
     if( (${powervoip} <= ${12voip} ) && (${powervoip} <= ${intervoip}) ) gw=powervoip;
   else
     gw=intervoip;
   return;
};

Aufgerufen wird es so
&getGateway(Number, gw);
.... Dial(Device/nummer@${gw},......);

/etc/asterisk/countrycodes.txt hat folgendes Format:

00973:Bahrain:Landline:
009733:Bahrain:Mobile:

0032:Belgium:Landline:
003245:Belgium:Mobile:
003247:Belgium:Mobile:
003248:Belgium:Mobile:
003249:Belgium:Mobile:

001519:Canada:Landline: 
001514:Canada:Landline: 
001506:Canada:Landline: 
001450:Canada:Landline: 
001600:Canada:Landline: 
001807:Canada:Landline: 
001604:Canada:Landline: 
001613:Canada:Landline: 
001647:Canada:Landline: 
001705:Canada:Landline: 
001709:Canada:Landline: 
001778:Canada:Landline: 
001418:Canada:Landline: 
001438:Canada:Landline: 
001416:Canada:Landline: 
001819:Canada:Landline: 
001867:Canada:Landline: 
001902:Canada:Landline: 
001905:Canada:Landline: 
001204:Canada:Landline: 
001250:Canada:Landline: 
001403:Canada:Landline: 
001306:Canada:Landline: 
001289:Canada:Landline: 
001226:Canada:Landline: 
001780:Canada:Mobil: 

usw.
gw ist natürlich der peer-name im sip.conf.


Gruß
Noway0815
 
Zuletzt bearbeitet:
Das ist natürlich der Ansatz, der die "aktuellsten" Preise liefert, da Du ja bei jedem Call fetchst. Nun hat das ganze nur den Nachteil, das - in Deinem beispiel 3 - Webseiten aufgerufen werden müssen und eine Textdatei vorher "durchgeflöht" werden muss, bevor der Call aufgeebaut werden kann. Das verlängert natürlich die Rufaufbauzeit deutlich.
Ein etwas anderer Ansatz ist darauf zu setzen, mit einer gewissen Unschärfe zu leben und die Ratetables aller relevanten Betreiber n-mal täglich per Cronjob komplett zu fetchen (etwa in eine MySQL-DB) und den Fetch der günstigsten Rate aus Asterisk-Sicht dann komplett lokal zu machen. Bei reinen Betamax/Delmont-Fetches kommt der von Dir bereits genutzte Vorteil dazu, dass die Zonen - respektive Ländernamen - bei den einzelnen Clonen identisch sind. Du musst Nur, wie schon von Dir erhoben, ein Mapping zwischen Zonennamen und Zoneninhalt (respektive Rufnummernrümpfen) innerhalb der Zone machen.

BTW: Bitte codetags verwenden, das macht das Lesen für alle deutlich einfacher!
 
ich nutze das seit ca. eine Woche und merke überhaupt keine Verzögerung. Der ganze Vorgang (bis Verbindungsaufbau) dauert nicht länger als sonst (es sind ja nur 3 seiten) und ich habe den Vorteil immer "frische" Preis zu haben. Ich habe auch einen anderen Ansatz und das basiert darauf, die preise von http://backsla.sh/betamax zu lesen. Da ist wird es 2xtäglich geupdated. Und wie gesagt ist ja nur ein Ansatz.
 
Dann hast Du eine richtig gute Verbindung und die Dellmont-Server arbeiten auch immer zuverlässig, Glückwunsch!
Da hätte ich nur Bedenken, wiewohl der Ansatz an sich natürlich funktioniert.
 
Darüber hinaus hätte ich noch Bedenken wegen der Geschwindigkeit des Dateisystems.
Gleichzeitige (oder gering versetzte) Gesprächsaufbauten verwenden dieselben Dateien. Bei höherem Gesprächsaufkommen ist das evtl. wackelig.
 
Rechts habt ihr, aber wie schon gesagt, das ist "Hausgemacht" und auch für das Hausgebrauch. Wer können auch was richtiges machen. Das war nur ein Ansatz.
Wenn man an stelle von Dateinen System-Variablen. Aber kann man das Ergebnis von "lynx ...." in einer Variablen einlesen und diese auch in Asterisk nutzen?
 
Wie komplett ist denn deine countrycodes.txt? Magst du mir dese zur Verfügung stellen?
 
Sie ist nicht ganz komplett. Ich mache immer das was ich brauche und stück für stück wird sie komplett werden :)

Wie auch immer hier ist die datei countrycodes.txt.

achja, ich habe das code umgeschrieben. ich benutze die funktion SHELL, um nicht Dateien zu benutzen. Diese geht leider nur ab asterisk 1.6. aber auch noch mehr geändert. ich habe das link wegen der Währung geändert, da man bei dem 1. link keinen Einfluss auf die Währung hat. Und so kann es das falsche Ergebniss liefern, da mal USD und mal EUR nutzt. Bei dem neuen link kann man die Wührung bestimmen:

Code:
macro getGateway(Number, *gw){
   gw="";
   Data="";
   CCode="";
   Network="";
   Country="";

   System(rm /etc/asterisk/Data.txt);
   len=0;
   Set(i=${LEN(${number})});
   i=${i}-6;                 // die eigentliche telefonnummer wird wohl mehr als 6 ziffern sein, oder?
   while(${len}=0){
      System(cat /etc/asterisk/countrycodes.txt | grep ${Number:0:${i}} > /etc/asterisk/Data.txt);
      Set(Data=${FILE(/etc/asterisk/Data.txt)});
      Set(len=${LEN(${Data})});
      i=${i}-1;
   };

   Set(CCode=${CUT(Data,":",1)});
   Set(Country=${CUT(Data,":",2)});
   Set(Network=${CUT(Data,":",3)});

   Set(Country=${FILTER(A-z,${Country})});
   set(Country=${TOLOWER(${Country})});
   set(Network=${TOLOWER(${Network})});

   Set(12voipUAE=${SHELL(lynx -dump -nonumbers -width=1024 http://www.12voip.com/en/callingrates/${Network}/cheap-calls-${Country}-eur.html|awk '/${Network}s / {print $NF}'):0:5});
   if(${12voipUAE:0:1}==F) 12voipUAE=0;

   Set(PowervoipNoway=${SHELL(lynx -dump -nonumbers -width=1024 http://www.powervoip.com/en/callingrates/${Network}/cheap-calls-${Country}-eur.html|awk '/${Network}s / {print $NF}'):0:5});
   if(${PowervoipNoway:0:1}==F) PowervoipNoway=0;

   Set(InterVOIPNoway=${SHELL(lynx -dump -nonumbers -width=1024 http://www.intervoip.com/en/callingrates/${Network}/cheap-calls-${Country}-eur.html|awk '/${Network}s / {print $NF}'):0:5});
   if(${InterVOIPNoway:0:1}==F) InterVOIPNoway=0;

   if( (${12voipUAE} <= ${PowervoipNoway} ) && (${12voipUAE} <= ${InterVOIPNoway}) ) gw=12voipUAE;
   else
     if( (${PowervoipNoway} <= ${12voipUAE} ) && (${PowervoipNoway} <= ${InterVOIPNoway}) ) gw=PowervoipNoway;
   else
     gw=InterVOIPNoway;

   return;
};

wäre schön, wenn jeder, der etwas daran entwickelt, hier postet.

Gruß
Noway
 

Anhänge

  • countrycodes.txt
    26.1 KB · Aufrufe: 3
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.