|
|
Mobile Number Portability e Least Cost Routing
Come sappiamo, nell'ambito della telefonia mobile (ma anche di quella fissa), vi è da tempo la possibilità di mantenere il proprio numero anche quando si cambia operatore
In questo ultimo caso viene applicata la cosidetta Mobile Number Portability (MNP).
Cosa succede in pratica se un cliente Vodafone con un numero 347XXXXXXX vuole passare ad un altro operatore, ad esempio TIM?
Succede innanzitutto che il suo numero non viene preso in consegna da TIM, ma resta di competenza di Vodafone, che mantiene tale competenza sull'arco di numerazione assegnatole (340, 341 343, 346, 347, 348 e 349).
Succede poi che, senza che lo venga a sapere, gli viene assegnato un numero TIM verso il quale tutte le chiamate, destinate al suo originale 347XXXXXXX e instradato verso le centrali Vodafone, vengono da Vodafone, che ha attiva la MNP, trasferite a TIM.
Detto questo, viene subito da osservare che la cosa ha importanti conseguenze quando si voglia applicare il Least Cost Routing verso destinazioni cellulari attraverso gateways GSM provvist di SIM aderenti a quei tipi di offerta commerciale che prevedono tariffe agevolate nelle chiamate tra clienti dello stesso operatore. Spesso tale tipo di offerte sono solo leggermente più economiche ma molto più sconvenienti quando le chiamate siano dirette a clienti di altri operatori.
Venendo a mancare di validità lo screening sul prefisso del numero chiamato, il Least Cost Routing perde di senso.
La scelta più saggia e ragionevole rimane quella di optare per l'adozione di un piano tariffario che, a prescindere da caratteristiche come scatto / non scatto alla risposta, tariffazione a secondi / a minuti, non faccia distinzione sui numeri chiamati (a parte se nazionali o internazionali). Il risparmio rispetto al rischio è garantito.
Per gli irriducibili, è innanzitutto necessario risolvere il problema di conoscere l'operatore attuale dell'utente chiamato.
La cosa è facilmente ottenibile, Basta anteporre al numero da chiamare il codice 345 (valido per qualsiasi operatore), per venire a conoscenza tramite un annuncio vocale, dell'effettivo operatore. Contemporaneamente la chiamata viene inoltrata.
E' in pratica una conoscenza che ci può tornare utile solo in un altro momento, una volta acquisita. Ha senso poi se si prevede di chiamare ripetutamente le stesse destinazioni (si pensi ad esempio al caso di una azienda con un gran numero di utenti fidelizzati, o di fornitori)
Una soluzione di questo tipo si trova nella porzione di dialplan seguente.
[gsm-out]
exten => _3XXXXXXXXX,1,AGI(check_mobile.agi)
exten => _3XXXXXXXXX,n(vodafone),Dial(SIP/gw_vodafone|20|tD(${EXTEN}))
exten => _3XXXXXXXXX,n,Hangup
exten => _3XXXXXXXXX,n(tim),Dial(SIP/gw_tim|20|tD(${EXTEN}))
exten => _3XXXXXXXXX,n,Hangup
exten => _3XXXXXXXXX,n(wind),Dial(SIP/gw_wind|20|tD(${EXTEN}))
exten => _3XXXXXXXXX,n,Hangup
exten => _3XXXXXXXXX,n(tre),Dial(SIP/gw_tre|20|tD(${EXTEN}))
exten => _3XXXXXXXXX,n,Hangup
exten => _3XXXXXXXXX,n(generic),Dial(SIP/gw_generic|20|tD(${EXTEN}))
exten => _3XXXXXXXXX,n,Hangup
exten => _3XXXXXXXXX,n(search),Dial(SIP/gw_generic|20|tgD(345${EXTEN}))
exten => _3XXXXXXXXX,n,Read(TEST|file1|1|||4|)
exten => _3XXXXXXXXX,n,GotoIf($[ 1${TEST} = 1 ]?call_exit)
exten => _3XXXXXXXXX,n,AGI(store_mobile.agi|${TEST})
exten => _3XXXXXXXXX,n(call_exit),Hangup
Quando viene intrapresa una chiamata verso destinazione mobile, viene effettuato (tramite l'agi-script check_mobile.php) un preventivo controllo all'interno di una tabella MySQL (mobile_numbers) sull'esistenza di un numero identico a quello chiamato.
In caso affermativo il valore del relativo campo oper_code viene utilizzato per originare la chiamata attraverso il gateway più opportuno, quello cioè dotato di SIM appartenenti allo stesso operatore.
check_mobile.php
#!/usr/bin/php -q
ob_implicit_flush(true);
set_time_limit(6);
$in = fopen("php://stdin","r");
function read() {
global $in, $debug;
$input = str_replace("\n", "", fgets($in, 4096));
return $input;
}
function write($line) {
global $debug;
echo $line."\n";
}
while ($env=read()) {
$env = str_replace("\"","",$env);
$s = split(": ",$env);
$agi[str_replace("agi_","",$s[0])] = trim($s[1]);
if (($env == "") || ($env == "\n")) {
break;
}
}
function connect_db() {
$db_connection = mysql_connect ('localhost', '', 'dbpass')
or die (mysql_error());
$db_select = mysql_select_db('') or die (mysql_error());
}
$exten= $agi[extension];
connect_db();
$query1 = "SELECT number, oper_code FROM mobile_numbers WHERE number LIKE '%$exten' ";
$query_result1 = @mysql_query($query1);
$row_count = mysql_num_rows($query_result1);
If ($row_count !=0 ) {
$a_row = mysql_fetch_array($query_result1);
switch ($a_row["oper_code"]) {
case 1:
write ("SET PRIORITY vodafone");
break;
case 2:
write ("SET PRIORITY tim");
break;
case 3:
write ("SET PRIORITY wind");
break;
case 4:
write ("SET PRIORITY tre");
break;
default:
write ("SET PRIORITY generic");
}
}
else {
write ("SET PRIORITY search");
}
fclose($in);
exit;
In caso di inesistenza del corrispondente record, la chiamata viene originata attraverso un gateway generico, dotato di SIM con piano tariffario identico a prescindere dalle destinazioni, anteponendo il codice numerico 345 al numero.
A causa di questo il chiamante viene informato sull'operatore di appartenenza del chiamato.
Se è quest'ultimo a terminare la conversazione, l'opzione g con cui è stato invocata l'applicazione Dial fa in modo che vengano eseguite ulteriori azioni nel contesto corrente. Nella fattispecie viene richiesto al chiamante, se ancora in linea, di introdurre uno specifico codice operatore in abbinamento al quale archiviare il numero appena chiamato.
store_mobile.php:
#!/usr/bin/php -q
ob_implicit_flush(true);
set_time_limit(6);
$in = fopen("php://stdin","r");
function read() {
global $in, $debug;
$input = str_replace("\n", "", fgets($in, 4096));
return $input;
}
while ($env=read()) {
$env = str_replace("\"","",$env);
$s = split(": ",$env);
$agi[str_replace("agi_","",$s[0])] = trim($s[1]);
if (($env == "") || ($env == "\n")) {
break;
}
}
function connect_db() {
$db_connection = mysql_connect ('localhost', 'asterisk', 'asterisk')
or die (mysql_error());
$db_select = mysql_select_db('ghost') or die (mysql_error());
}
$exten=$agi[extension];
$code=$argv[1];
connect_db();
$query = "INSERT INTO mobile_numbers (number,oper_code) VALUES ('$exten','$code')";
$query_result = @mysql_query($query);
fclose($in);
exit;
Si viene in tal modo nel tempo a consolidare una base dati relativamente affidabile tramite cui applicare una politica di instradamento ottimizzata.
Per quale motivo "relativamente"? Perché la base dati fotografa una situazione non immutabile, in cui può in qualsiasi momento capitare che taluni decidano di cambiare operatore. Sarebbe opportuno, in questo senso, effettuare o un controllo periodico di validità delle informazioni presenti nella base dati, o un ripopolamento periodico da zero della stessa, o un campo ttl, con scadenza di validità.
|