domingo, 25 de enero de 2015

IMPLEMENTACIÓN DE UN IVR (INTERACTIVE VOICE RESPONSE) UTILIZANDO MySQL Y PHPAGI

Call Center Video_6

IVR es una plataforma de desarrollo de aplicaciones telefónicas, que permite diseñar, integrar, implementar y administrar sistemas de respuesta interactiva de voz
Es implementado en empresas que reciben grandes cantidades de llamadas, a fin de reducir la necesidad de personal y los costos que el servicio ofrecido representa para la empresa
IVR tiene capacidad para atender miles de llamadas al día, permitiendo a sus clientes recibir información, consultar y modificar bases de datos, vía telefónica y transferirse con una persona, cuando así lo requieran por medio de varios menús con múltiples opciones de marcado para satisfacer las necesidades del cliente


AGI (Asterisk Gateway Interface) 
Es una manera de interactuar con Asterisk desde un script. Este programa puede ser escrito en PHP y es llamado por Asterisk desde el dial plan. El ejemplo será el desarrollo de aplicaciones de consulta telefónica a bases de datos que se explicara a continuación.
El Asterisk Gateway Interface (AGI) permite desarrollar aplicaciones externas que pueden interactuar con Asterisk. Estas aplicaciones pueden estar escritas en distintos lenguajes de programación como por ejemplo librerías en PHP que simplifican su escritura, haciendo modificaciones a bases de datos, consultas a estados de variables, controlar el dIalplan, etc, todo esto haciendo la llamada desde el archivo extensions.conf
¿Cómo Funciona?
La comunicación entre Asterisk y el AGI se apoya a los “files descriptors” del sistema operativo Linux que permiten una comunicación entre el Kernel y la aplicación que quiere acceder a un determinado archivo/programa. En Linux. Los tres estándares que se utilizan son:
•STDIN
•STDOUT
•STDERR
Esto permite escribir el AGI utilizando prácticamente cualquier lenguaje de programación. Para el IVR que se implementara en el call center, se utilizarán la librería PHPAGI y PHP.


INSTALACIÓN PHPAGI
Ya se tiene la librería php.agi, a continuación se descomprime:
tar -xf phpagi-2.20.tgz
se entra en la carpeta creada:
cd phpagi-2.20
y se copian las dos librerías AGI en la carpeta agi-bin de Asterisk:
cp phpagi.php /var/lib/asterisk/agi-bin
cp phpagi-asmanager.php /var/lib/asterisk/agi-bin
se vuelven los archivos ejecutables:
chmod 755 /var/lib/asterisk/agi-bin/phpagi.php
chmod 755 /var/lib/asterisk/agi-bin
/var/lib/asterisk/agi-bin

EJEMPLO:
nano ejemplo.php
#!/usr/bin/php –q
Esta línea le dice al Sistema que va a utilizar un intérprete para ejecutar un script en lenguaje PHP, la opción –q desactiva los mensajes de error que puede enviar HTML, es muy Importante que después del "?" y el ">" del 'fin del PHP' no debe haber ni siquiera un [ENTER]
<?php
require('phpagi.php');
Llamamos a las librerías de phpagi
error_reporting(E_ALL);
Activamos la bandera de enviar todo lo que se realice a consola como modo depuración
$agi = new AGI();
Creamos una instancia de la clase AGI
$agi-> answer();
Generamos el comando Answer de Asterisk, este comando siempre lo ejecutamos al inicio de un AGI
$callerid = $agi->request['agi_callerid'];
Obtenemos el caller id de quién realiza la llamada
$agi->text2wav("Hola extension $callerid");
Enviamos un mensaje de voz por medio de festival, en este caso en ingles
$agi-> hangup();
al finalizar el script del AGI siempre es recomendable ejecutar esta función para no dejar el canal abierto
?>
Se vuelve ejecutable el archivo:
chmod +x /var/lib/asterisk/agi-bin/ejemplo.php
Se modifica el dialplan para añadir el AGI:
exten => 250,1,Agi(ejemplo.php)

Como se vio en el ejemplo anterior, Festival en Elastix viene instalado pero sin ninguna voz en español, además, la calidad no es muy buena, es por esto que es necesario instalar las especificaciones de las voces. Existe un proyecto de la Junta de Andalucía, el cual consiste de dos paquetes (para Debian) que contienen una voz masculina y otra femenina para Festival.
Se verá como convertir los paquetes debian (.deb) a CentOS (.rpm) utilizando el programa Alien y también como cambiar la configuración de Festival para que se puedan utilizar en Asterisk.
cd /usr/src
tar –xf alien_8.78.tar.gz
cd alien
perl Makefile.PL
make
make install

Ahora con los dos paquetes Debian con las voces en español para festival, estos se trasformaran a paquetes en .rpm asi:
alien –rv festvox-palpc16k_1.0-1_all.deb
alien –rv festvox-sflpc16k_1.0-1_all.deb

Llegados a este punto podemos instalar los dos paquetes para CentOS:
rpm –ivh festvox-palpc16k-1.0-2.noarch.rpm
rpm –ivh festvox-sflpc16k-1.0-2.noarch.rpm

En la carpeta /usr/share/festival/voices/spanish encontraremos estas dos carpetas:
JuntaDeAndalucia_es_pa_diphone
JuntaDeAndalucia_es_sf_diphone
Luego es necesario hacer que "Festival" use la nueva voz de forma predeterminada, se edita el archivo /usr/share/festival/siteinit.scm y al final se ponen las siguiente línea, recordar que en el paquete de voces se incluyen 2 voces, una voz masculina y otra femenina, esta será la voz masculina

(set! voice_default 'voice_JuntaDeAndalucia_es_pa_diphone)
Por último se editara en las librerías phpagi, el archivo de configuración de phpagi que trae Elastix (/etc/asterisk/phpagi.conf) en el cual hay que configurarle el path hacia la aplicación "text2wave" que es la que se utilizara como se vio en el ejemplo.
[festival]
text2wave= /usr/bin/text2wave


BASES DE DATOS A UTILIZAR EN EL IVR


create database usuario
create database promo


create table datos(
ci int(8) null,
clave int(4) null,
saldo float null
);

insert into datos (ci,clave,saldo) values (76324167,1234,100)
insert into datos (ci,clave,saldo) values (25269245,4321,200)


create table cosas(
id int not null auto_increment primary key,
descripcion char (100) null,
valor float null,
dias int(3) null
)

insert into cosas (id,descripcion,valor,dias) values (null,'monitores 25 por ciento de descuento', 50,15)
insert into cosas (id,descripcion,valor,dias) values (null,'Discos duros 10 por ciento de descuento', 35,8)
insert into cosas (id,descripcion,valor,dias) values (null,'memorias RAM 15 por ciento de descuento', 8,7)


DISEÑO DEL IVR
archivo extensiosn.conf

exten => 01800123,1,Goto(entrante,s,1)

[entrante]

exten => s,1,Answer()
same => n,Background(/var/lib/asterisk/sounds/custom/grabacion15)
same => n,WaitExten(5)

exten => i,1,Playback(pbx-invalid)
same => n,Goto(entrante,s,1)

exten => t,1,Playback(thank-you-for-calling)
same => n,Dial(SIP/4003)
same => n,Voicemail(4003@agentes)


exten => 1,1,Macro(llamadas,SIP/4001)
exten => 2,1,Macro(colas,${COLA1})
exten => 3,1,Macro(colas,${COLA2})
exten => 4,1,Playback(conference-call)
exten => 4,2,Goto(conferencia,s,1)
exten => 5,1,Goto(ivr,s,1)

#include ivr.conf


archivo ivr.conf

[ivr]

exten => s,1,Answer()
same => n,Background(/var/lib/asterisk/sounds/custom/grabacion11)
same => n,WaitExten(5)

exten => 1,1,AGI(cuenta.php)
same => n,Goto(ivr1,s,1)

exten => 2,1,Set(tabla=datos)
same => n,Background(/var/lib/asterisk/sounds/custom/grabacion05)
same => n,Read(ci,number&astcc-followed-by-the-pound-key)

same => n,Background(/var/lib/asterisk/sounds/custom/grabacion06)
same => n,Read(clave,number&astcc-followed-by-the-pound-key)

same => n,AGI(datos.php,${tabla},${ci},${clave})
same => n,Dial(SIP/4002,5)

exten => i,1,Playback(pbx-invalid)
same => n,Goto(ivr,s,1)

exten => t,1,Playback(thank-you-for-calling)
same => n,Dial(SIP/4002)
same => n,Voicemail(4002@agentes)

archivo cuenta.php

#!/usr/bin/php -q
<?php

require('/var/lib/asterisk/agi-bin/phpagi.php');

error_reporting(E_ALL);

$agi = new AGI();

$agi->answer();

$conexion = mysql_connect('localhost','root','123456') or die(mysql_error());

mysql_select_db('usuario',$conexion);

$aux=0;

do
{
$aux=$aux+1;

$agi->text2wav("por favor, ingrese su numero de cedula");
$_result=$agi->get_data('beep',20000,8);
$keys=$_result['result'];

if($keys!=""){
$query="select clave from datos where ci=\"$keys\"";
$_result=mysql_query($query,$conexion);}

if($_re=mysql_fetch_array($_result)){
$agi->text2wav("ha sido encontrado en nuestra base de datos, su clave actual es:");
$agi->say_digits($_re[clave]);
$aux=5;}

else{
$agi->text2wav("No ha sido encontrado en nuestra base de datos");
mysql_close();
}


archivo datos.php

#!/usr/bin/php -q
<?php

//llamamos a las librerias de phpagi
 require('/var/lib/asterisk/agi-bin/phpagi.php');

//activamos la bandera de enviar todo lo que se realice a consola como modo depu$
 error_reporting(E_ALL);

//creamos una instancia de la clase AGI
$agi = new AGI();

$agi->answer();

$conexion = mysql_connect('localhost','root','123456') or die (mysql_error());
mysql_select_db('usuario',$conexion);

//argumentos recibidos de asterisk
$id = $_SERVER['argv'][1];   //valor 1: tabla
$id2 = $_SERVER['argv'][2];   //valor 2: ci
$id3 = $_SERVER['argv'][3];   //valor 3: clave

$sql = "INSERT INTO $id (ci,clave) VALUES ( '$id2', '$id3')";
$result = mysql_query( $sql, $conexion );
mysql_close();

$agi->text2wav("a continuacion sera transferido a una operadora para completar e$

?>



archivo actualizar.php

#!/usr/bin/php -q
<?php

//llamamos a las librerias de phpagi
 require('/var/lib/asterisk/agi-bin/phpagi.php');

//activamos la bandera de enviar todo lo que se realice a consola como modo depuracion
 error_reporting(E_ALL);

//creamos una instancia de la clase AGI
$agi = new AGI();

$agi->answer();

$conexion = mysql_connect('localhost','root','123456') or die (mysql_error());
mysql_select_db('usuario',$conexion);

//argumentos recibidos de asterisk
$id = $_SERVER['argv'][1];   //valor 1: tabla
$id2 = $_SERVER['argv'][2];   //valor 2: ci
$id3 = $_SERVER['argv'][3];   //valor 3: clave

$agi->text2wav("su nueva clave es:");
$agi->say_digits($id3);

$sql = "update datos set clave = $id3 where ci = $id2";
$result = mysql_query( $sql, $conexion );
?>

archivo actualizar.php

#!/usr/bin/php -q
<?php

//llamamos a las librerias de phpagi
 require('/var/lib/asterisk/agi-bin/phpagi.php');

//activamos la bandera de enviar todo lo que se realice a consola como modo depuracion
 error_reporting(E_ALL);

//creamos una instancia de la clase AGI
$agi = new AGI();

$agi->answer();

$conexion = mysql_connect('localhost','root','123456') or die (mysql_error());
mysql_select_db('usuario',$conexion);

//argumentos recibidos de asterisk
$id = $_SERVER['argv'][1];   //valor 1: tabla
$id2 = $_SERVER['argv'][2];   //valor 2: ci
$id3 = $_SERVER['argv'][3];   //valor 3: clave

$agi->text2wav("su nueva clave es:");
$agi->say_digits($id3);

$sql = "update datos set clave = $id3 where ci = $id2";
$result = mysql_query( $sql, $conexion );
?>

archivo saldo.php

$aux=1;
do
{
if($aux==1)
$agi->text2wav("por favor ingrese su clave");

else $agi->text2wav("clave no encontrada");

$_result=$agi->get_data('beep',10000,4);
$keys=$_result['result'];
$query="select clave from datos where clave=\"$keys\"";
$_result=mysql_query($query,$conexion);
$_re=mysql_fetch_array($_result);

$aux=0;
}while($keys!=$_re[clave]);

$agi->text2wav("usuario registrado");
$query="select saldo from datos where clave=\"$keys\"";
$_result=mysql_query($query,$conexion);

if($_re=mysql_fetch_array($_result)){
$agi->text2wav("su saldo es $_re[saldo] dolares");
}

archivo promocion.php

mysql_select_db('promo',$conexion);

$aux=1;
$query="select descripcion,valor,dias from cosas where id=$aux";
$_result=mysql_query($query,$conexion);
$_re=mysql_fetch_array($_result);

while($_re !=0){

if($aux==1)
$agi->text2wav("las promociones de la empresa son");
$agi->say_digits($aux);
$query="select descripcion,valor,dias from cosas where id=$aux";
$_result=mysql_query($query,$conexion);
$_re=mysql_fetch_array($_result);

$agi->text2wav("$_re[descripcion].... el valor por unidad es $_re[valor] dolares... la promocion dura por los proximos $_re[dias] dias ");
$aux=$aux+1;
$query="select descripcion from cosas where id=$aux";
$_result=mysql_query($query,$conexion);
$_re=mysql_fetch_array($_result);}

if($aux!=1) $agi->text2wav("no hay mas promociones");
if($aux==1) $agi->text2wav("no hay promociones actualmente");



viernes, 22 de agosto de 2014

TRONCAL E1 PRI ENTRE ASTERISK Y CISCO CME


El adaptador E1 de voz consiste en una Línea Digital que permite tener acceso telefónico de 30 canales de voz con un ancho de banda de 64 Kbps cada uno, también cuenta con dos canales para señalización, esto es, indica en qué estado está la llamada, si está colgada, descolgada, como se marcan los números, el tono de ocupado etc. Los 30 canales de acceso del E1 son compartidos por todos los números telefónicos asignados al mismo, por lo que todas las llamadas entrantes o salientes de cualquiera de las extensiones asignadas podrán ser atendidas directamente mientras exista un canal disponible.


La configuración se hará con una tarjeta TE220 Digium, recordar que Digium es una empresa especializada en la creación de equipos de telefonía enfocados en Asterisk.

Los aspectos técnicos mas importantes a considerar para la selección de una tarjeta E1 son (http://elastixtech.com/configurar-adaptador-e1-en-elastix/)

1.- El tipo de interfaz PCI o PCI Express, dependerá del modelo de la computadora a utilizar como servidor

2.- Que incorpore hardware para cancelación de eco, se recomienda que lo incluya.

3.- La cantidad de puertos E1 incluidos, comprar lo que se va a utilizar ya que esto complica la configuración.

4.- Soporte para los 3 estándares digitales T1/E1/J1 aunque solo se use uno, lo determina el proveedor

5.- Que soporte los estándares de decodificación de línea: HDB3, AMI, B8ZS, aunque solo se use uno.

6.- Tipos de Tramas (Framing): CRC-4, Non CRC4, ESF, SF, D4. lo determina el proveedor telefónico.

Los 3 primeros aspectos son los más importantes, se debe estar seguro que tipo de bus PCI tiene el servidor ya que al momento de instalar la tarjeta esta debe ser compatible con este tipo de interface.

Con relación al cancelador de eco por hardware, (recordar que el eco se produce por un fenómeno técnico que se da por un retorno de la señal que se escucha por el teléfono y se cuela de nuevo por el micrófono, es decir, que el eco es una reflexión retardada de la señal acústica original. El eco es especialmente molesto cuanto mayor es el retardo y su intensidad) es muy recomendable que la tarjeta E1 lo tenga de lo contrario se tendrá que hacer por software complicando la configuración además de sobrecargar en procesamiento del servidor, esto se vuelve critico cuando la densidad de puertos es superior a 60 canales (2 E1), degradando el rendimiento del sistema. Las tarjetas que no incorporan cancelador de eco por hardware son más baratas.

En cuanto a la cantidad de puertos E1, no es que sea mala idea comprar una con más puertos de los que se van a utilizar porque es probable que un futuro se utilice, el problema se presenta al momento de configurarla ya que en algunas ocasiones en especial con la marca Sangoma esta se complica ya que se tienen que configurar los puertos aunque no se utilice.

En el Sistema T1 se multiplexan 24 señales de Voz/Datos, estas señales analógicas de entrada se muestrean a 8000 muestras por segundo formando una trama de 192 dígitos a los cuales se les agrega un dígito adicional para sincronización de trama. La trama contiene entonces 193 dígitos y la velocidad de señalización es de 1544 kbps.

El sistema E1 está formado por 32 canales, con 8 dígitos por canal para un total de 256 dígitos por trama. Como la frecuencia de muestreo es de 8000 muestras por segundo, la velocidad de la trama E1 es de 2048 kbps.

En el proceso de digitalización de una señal analógica, primero se muestrea, luego se cuantiza y por último se codifica la señal analógica, para así poder transportar los valores digitales a través de la red, para esto se pueden utilizar diferentes formas de codificación, bipolar, bipolar con inversión de marca alternada (AMI), Bipolar con sustitución de ocho ceros (B8ZS), bipolar de alta densidad de 3 ceros (HDB3), es por esto que el esquema de codificación basado en Norteamérica se llama B8ZS y el utilizado en Europa, Colombia y Japón es el HDB3, ambos se basan en la codificación AMI.

Los protocolos de señalización se utilizan para transmitir información de estado del canal de comunicaciones (como “desconectado”, “timbrando”, “ocupado”), información de control y otra información como DTMF, caller ID, entre otros. Los protocolos de señalización se pueden agrupar en dos tipos llamados CAS (Channel Associated Sgnaling) y CCS (Common Channel Signaling). La diferencia es que mientras CAS transmite la señalización en el mismo canal en que viaja la información, CCS la transmite en un canal separado. Por este hecho es que con CAS se reduce ligeramente el ancho de banda disponible o útil para la comunicación ya que una parte de él se está usando para señalización. Esa es una de las razones por las cuales las compañías telefónicas han adoptado en su mayoría CCS.


Tomar en cuenta el color de los puertos:

Si la tarjeta E1 es detectada pero aún no tiene el enlace del proveedor telefónico conectado, los puertos aparecen en color rojo.

Si la tarjeta E1 es detectada y ya tiene el enlace del proveedor telefónico conectado, los puertos aparecen en color verde.

Si la tarjeta E1 es detectada y ya tiene el enlace del proveedor telefónico conectado, pero los puertos aun aparecen en color rojo, esto significa que los puertos aun no están  sincronizados con el enlace del proveedor.

Ahora viene la parte más importante que determinara como van a funcionar los puertos, para esto es necesario que el proveedor del enlace telefónico E1, nos provea la siguiente información básica:

MASTER: Lo genera el cliente (La tarjeta E1 de nuestro servidor Asterisk), valor 0
SLAVE: Lo genera el proveedor, valor 1

[numero de espan]: Numero del Puerto E1 si es el primero 1 si es el segundo 2, se debe configurar todo esto para cada puerto.

BCHAN: Determinan los canales disponibles de voz o datos del E1, no se deben usar los canales 0 y 16. 

Un ejemplo de esta línea es la siguiente: bchan=1-15,17-31

DCHAN: Indica los canales utilizados para la señalización o sincronismo

ECHOCANCELLER: Se utiliza solamente si la tarjeta E1 no tiene cancelador de eco por hardware, aunque no afecta en nada si se coloca este parámetro aun teniéndolo. Se recomienda que se utilice OSLEC, se deben especificar sobre los canales en que va a funcionar.

Esta configuración se debe realizar por cada puerto de la tarjeta E1, si la tarjeta tiene 2 puertos E1 se deben crear 2 SPAN uno por cada puerto, el SPAN es una agrupación de 30+1 canales (30 para la voz y 1 para control). Como E1 está compuesto por 32 canales, sin embargo el proveedor de telefonía Telco hace uso de solo un canal para señalización o control, el otro no se utiliza para este propósito.

El número de los canales utilizados van numerados secuencialmente en orden ascendente, por ejemplo en una tarjeta con 2 puertos E1 los canales están distribuidos de la siguiente manera:

PUERTO 1 (SPAN 1):
Canales de voz 1-15 y 17-31
Canal de sincronismo o control 16
PUERTO 2 (SPAN 2): Canales de voz 32-46 y 48-62
Canal de sincronismo o control 47

El canal de sincronismo o control, también llamado de señalización es utilizado exclusivamente para sincronizar la separación de las señales digitales durante la transmisión de la voz, de esta manera se logra enviar 30 canales de voz equivalentes a 30 líneas telefónicas en solo 4 hilos (TX – RX).

De esta manera se ha configurado el adaptador E1 para la comunicación con el proveedor de Telefonía, pero aún falta configurar los canales para que sean reconocidos como troncales por el servidor Asterisk
El otro archivo a editar es /etc/asterisk/dahdi-channels.conf,  aquí se crearan agrupaciones de canales que servirán de troncales digitales para la entrada y salidas de llamadas.

Se pueden configurar tantos grupos como canales se tengan, para el caso un puerto E1 tiene 30 canales efectivos para la voz, en teoría se pueden crear 30 grupos o troncales, uno por canal, sin embargo esto no es nada practico debido a que el proveedor de telefonía envía las llamadas por cualquier canal, por esta razón lo que se hace es crear un solo grupo de canales por cada puerto E1, de esta manera se podrán utilizar cualquiera de los 30 canales disponibles para las llamadas entrantes y salientes hacia un mismo proveedor.

Para el caso de tarjetas con 2 o más puertos se recomienda crear un grupo o troncal de canales por cada uno de los puertos, en especial si hay más de un proveedor de telefonía, de esta manera se crean 2 o más grupos de troncales uno por cada proveedor.

switchtype = euroisdn : Tipo de protocolo, también puede ser national o qsig existen varias opciones
signalling = pri_cpe : Origen de la señal de reloj, pri_net para master y pri_cpe para esclavo
channel => 1-15,17-31 : Canales que formaran parte de este grupo

Una manera de comprobar que se están reconociendo los canales de los puertos E1 es:
CLI > dahdi show channels

Y para controlar que efectivamente la cancelación de echo configurada sea OSLEC
dahdi_cfg -vvv


CONFIGURACIÓN DEL ROUTER CISCO 2801 COMO PSTN



Ya se configuro el proveedor SIP, ahora se implementara la troncal digital por medio de los enlaces E1 con la PSTN, para simular la red PSTN se utilizara un router Cisco arquitectura 2801, con dos módulos de voz, uno con dos puertos FXS y otro con un puerto digital E1.

Los PVDM son los encargados de digitalizar las señales analógicas y hacer que los módulos de voz instalados en el router sirvan para este fin, por ejemplo, en el router se tienen instalados dos módulos que permiten trabajar con 16 canales de voz, como se tiene un módulo con dos puertos FXS, entonces, quedan 14 canales para utilizar en el enlace digital E1, si se quieren aumentar los canales digitales, es necesario adquirir módulos PVDM con más DSP.

El IOS es el software utilizado en la gran mayoría de routers y switches de Cisco y es necesario que el router tenga instalado el que servirá para la configuración de los módulos de voz, en resumen, no todos los routers cisco sirven como gateways de voz 


Antes de configurar los módulos FXS y el E1, será necesario tener un softphone para hacer y recibir las llamadas, como vimos en Asterisk que se utilizaban diferentes softphones, Cisco tiene uno llamado CIPC, la configuración básica de este softphone y los teléfonos IP físicos de cisco se hace siguiendo esta serie de pasos.

Conocer número máximo de teléfonos y directorios, dependiendo del router

Source IP Address Information, esta opción le dice a los teléfonos IP de cisco que van a utilizar esta dirección IP para registrarse y así el router darles todas las opciones de configuración que se verá más adelante, como hacían los sofphones con Asterisk.

Básicamente es la actualización de los archivos necesarios para que los teléfonos IP físicos funciones adecuadamente por medio del comando Source IP Address del router Cisco 


Para poder configurar los módulos de voz del router, es decir, configurar el plan de marcación,  es necesario entender el comportamiento de una llamada a través de la red, sea por medio de la red telefónica PSTN o por VoIP.

En este caso se configura el POTS Dial Peer, ya que es aquí donde se define todo lo relacionado con la red telefónica tradicional, aquí es donde se encontraran módulos de voz FXS, FXO y E1 según sea el caso, el truco es ver que en esta clase de módulos no se configura ninguna dirección IP como se verá más adelante


El cable que se va a utilizar para conectar la interfaz E1 de la red PSTN, (en este caso el router Cisco) con la interfaz E1 de Asterisk es un cable RJ48, similar a un RJ45 en cuanto al número de hilos (8 hilos) y al conector (8 pines), por lo que un cable de red UTP servirá para fabricar uno, tanto el RJ45 como el RJ48 se pueden encontrar cruzados y directos. La diferencia consiste básicamente en la configuración de los pines que lo forman. Mientras que el RJ45 (cable de red) utiliza los pines 1,2,3 y 6, el RJ48 utiliza los pines 1,2,4 y 5 (a veces incluso el 3 y el 6). Otra diferencia, aunque obvia puede dar lugar a grandes complicaciones como por ejemplo:

- ¿Qué ocurre si se conecta un cable RJ48 que viene de un proveedor en una tarjeta de red?
- La tarjeta de red se quema.
- ¿Qué ocurre si se conecta un cable RJ45 a una tarjeta con un puerto E1?
- No habrá red 

CONFIGURACIÓN TRONCAL SIP CISCO ASTERISK 

- Dial Peer envía llamadas a Asterisk

dial-peer voice 4000 voip
 destination-pattern 4...
 session protocol sipv2
 session target ipv4:172.16.1.5
 dtmf-relay rtp-nte
 codec g711ulaw

- Configuración router CME directorios y teléfonos con el protocolo SCCP

telephony-service
 max-ephones 30
 max-dn 100
 ip source-address 192.168.1.100 port 2000

- configurar directorios (dn1 y dn2)

ephone-dn 1  dual-line
 number 3305
 label Telecomunicaciones

 ephone-dn 2  dual-line
 number 3303
 label Redes

- configurar teléfonos 1 y 2 y asociarlos a los directorios 1 y 2 creados

ephone 1
 mac-address 0200.4C4F.4F50
 button  1:1

ephone 2
 mac-address 000C.2947.A416
 button  1:2

- habilitar el servicio VoIP y las llamadas entre teléfonos SIP

voice service voip
 allow-connections sip to sip
 sip
  registrar server expires max 1200 min 300

- Router CME como cliente SIP de Asterisk

sip-ua
 mwi-server ipv4:172.16.1.5 expires 86400 port 5060 transport tcp unsolicited
 registrar ipv4:172.16.1.5 expires 3600 secondary 

- Configuración router CME directorios y teléfonos con el protocolo SIP

voice register global
 mode cme
 source-address 192.168.1.100 port 5060
 max-dn 10 
 max-pool 5
 create profile

- configurar directorios (dn1 y dn2)

voice register dn 1
 number 3304
 
voice register dn 2
 number 3307

- configurar teléfonos 1 y 2 y asociarlos a los directorios 1 y 2 creados

voice register pool 1
 id mac DEAD.BEEF.0001 
 number 1 dn 1 
 dtmf-relay sip-notify 
 username sena password 1234 
 codec g711ulaw

voice register pool 2
 id mac DEAD.BEEF.0001 
 number 2 dn 2 
 dtmf-relay sip-notify 
 username cisco password 1234 
 codec g711ulaw

CONFIGURACIÓN TRONCAL PRI E1 CISCO ASTERISK

card type e1 0 2

network-clock-participate wic 2
isdn switch-type primary-qsig

controller E1 0/2/0
framing crc4
linecode hdb3
pri-group timeslots 1-14

clock source internal

interface Serial 0/2/0:15
isdn switch-type primary-qsig
isdn incoming-voice voice

dial-peer voice 4001 pots
destination-pattern 4...
no digit-strip
direct-inward-dial
port 0/2/0:15


ARCHIVOS DE CONFIGURACIÓN ASTERISK

sip.conf

[agentes](!)

type=friend
context=agentes
language=es
host=dynamic
secret=a1b2c3
dtmfmode=auto
disallow=all
allow=ulaw
allow=alaw

[4002](agentes)

[4003](agentes)

[4004](agentes)

[3301](agentes)

[3302](agentes)

[3303](agentes)

[3304](agentes)

[3305](agentes)

[3306](agentes)


extensions.conf

[agentes]

;llamadas SIP Cisco_Asterisk
exten => _400X,1,Dial(SIP/${EXTEN},15)
same => n,Hangup

exten => _330X,1,Dial(DAHDI/R0/${EXTEN})
same => n,Hangup

exten => _400X,1,Dial(DAHDI/R0/${EXTEN})
same => n,Hangup

;llamadas SIP Asterisk_Cisco
exten => _330X,1,Dial(SIP/${EXTEN},192.168.1.100)
same => n,Hangup

[from-pstn]

exten => _330X,1,Dial(DAHDI/R0/${EXTEN})
same => n,Hangup

exten => _400X,1,Dial(DAHDI/R0/${EXTEN})
same => n,Hangup

dahdi-channels.conf

[trunkgroups]

[channels]

language=en
usecallerid=no
hidecallerid=no
callwaiting=yes
usecallingpres=yes
callwaitingcallerid=yes
threewaycalling=yes
transfer=yes
cancallforward=yes
callreturn=yes
echocancel=yes
echocancelwhenbridged=no
echotraining=800
rxgain=0.0
txgain=0.0
group=0
callgroup=1
pickupgroup=1
prilocaldialplan=unknown

; Span 1: TE2/0/1 "T2XXP (PCI) Card 0 Span 1" (MASTER) HDB3/ RED

group = 0
context = from-pstn
switchtype = qsig
signalling = pri_net
channel => 1-14
overlapdial=yes

system.conf

span = 1,1,0,ccs,hdb3,crc4
bchan=1-14
dchan=16
echocanceller=oslec,1-14
loadzone = us
defaultzone = us

chan_dahdi.conf

#include /etc/asterisk/dahdi-channels.conf





miércoles, 4 de junio de 2014

IMPLEMENTACION DE UNA TRONCAL SIP UTILIZANDO UN PROVEEDOR VoIP

Las troncales son el medio que permite comunicar a Asterisk con el mundo exterior o PSTN, son los canales de comunicación de entrada y salida de llamadas, también permiten la comunicación hacia otras PBX, tradicionales o IP.

El tipo de troncal a utilizar, dependerá de la manera que el proveedor brinda el servicio de telefonía. Tradicionalmente el servicio es entregado por medio de líneas de cobre, fibra óptica, redes IP, por medio de Internet o enlaces dedicados de datos; con la opción de redes IP, no es necesario instalar ningún hardware de comunicación en Asterisk.

Troncales SIP (SIP Trunk): se transporta la voz por medio de las redes IP, se puede utilizar Internet para establecer los enlaces, de esta manera se podrán tener números telefónicos de cualquier parte del mundo sin importar la ubicación geográfica. La cantidad de canales dependerá del ancho de banda del enlace IP.

Troncales Digitales (Puertos E1): Es el método más utilizado por los proveedores para la entrega de los servicios telefónicos, utiliza medios físicos para el transporte de la voz como cable de cobre o fibra óptica, se debe instalar una tarjeta en el servidor para configurar el troncal.

Troncales Análogas (Puertos FXO): Es la manera tradicional de recibir las líneas telefónicas.  Por cada línea es necesario un puerto, por ejemplo si hay 4 líneas telefónicas es necesario utilizar un adaptador con 4 puertos FXO. 

El tipo de troncal determina el número de llamadas simultaneas, por ejemplo, en una troncal digital E1 permite hasta un máximo de 30 llamadas por enlace.

En una troncal análoga FXO solo permite una llamada por enlace.


En troncales SIP, en teoría no hay límite de llamadas simultaneas, el limite lo impone el ancho de banda de la red IP, y es recomendable realizar menos de 150 llamadas simultaneas.

Las rutas son reglas que indican por cual troncal se deberán enviar las llamadas en base a ciertos patrones de marcado del dialplan. También se utilizan rutas para recibir llamadas, cuando una llamada entrante es recibida en una troncal se requiere que estas sean direccionadas a un numero de extensión, como también puede ser a un IVR, para esto se requiere que se cree un plan de marcado para llamadas entrantes.

Por ejemplo, el proveedor VozToVoice, el cual se va a utilizar como ejemplo,  requiere que la sintaxis para marcar cualquier numero sea: 00 + código país + numero.

Para configurar el troncal SIP, se utilizara, en este caso, el proveedor SIP VozToVoice. Para utilizar este proveedor se puede abrir una cuenta desde esta página. Una vez que la cuenta ha sido activada, habrá 1 dólar de crédito para realizar las llamadas por medio de este proveedor.

en el archivo sip.conf se configura lo siguiente:

;register => username:password@your.sip.provider

[voztovoice]
username=
type=friend
secret=
host=sip.voztovoice.eu 
fromuser=
context=voztovoice 
qualify=yes
disallow=all
allow=ulaw
allow=alaw 
trustrpid = yes
sendrpid = yes
directmedia = no

en el archivo extensions.conf se configura lo siguiente:

#include llamadas_externas.conf


archivo llamadas_externas.conf

[supervisor]
exten => _00.,1,Dial(SIP/voztovoice/${EXTEN},30)

exten => _3XXXXXXXXX,1,Dial(SIP/voztovoice/0057${EXTEN},30)

exten => _[12,4-9]XXXXXX,1,Dial(SIP/0057${EXTEN}@voztovoice,30)


Contexto [desvio_llamadas]

Las llamadas con destino a una extensión, se podrán desviar a una serie de números que se hayan definido previamente.

Include=> desvio_llamadas


AstDB: Asterisk Database

Se permitirá a los agentes o el supervisor activar y desactivar la funcionalidad en cualquier momento, el valor 0 significa desactivado, el valor 1 significa activado.
Se organiza en familias, y dentro de una familia se pueden tener diversas claves, y para cada clave un solo valor.

*CLI> database put familia clave valor
*CLI> database show
*CLI> database show familia 

Set(var=${DB(familia/clave)})
Set(DB(familia/clave)=${var})

[desvio_llamadas]

;Activar FollowMe
exten => *00,1,NoOp (activando followme)
same => n,Set(DB(FM/${CALLERID(num)})=1)
same => n,Playback(beep)
same => n,hangup

;Desactivar FollowMe
exten => *01,1,NoOp (desactivando followme)
same => n,Set(DB(FM/${CALLERID(num)})=0)
same => n,Playback(beep)

same => n,hangup


La aplicación Gotoif: literalmente es: ve al destino indicado, (destino 1) si la expresión es verdadera, sino ve al destino 2 si la expresión es (falsa). Si la segunda prioridad no se especifica, el dialplan continúa con la prioridad que sigue. (Mostrar los dos ejemplos en el dial plan)

[desvio_llamadas]
exten => 345,1,Set(TEST=1)
same => n,GotoIf($[${TEST} = 1]?comadrejas:iguanas)
same => n(comadrejas),Playback(weasels-eaten-phonesys)
same => n,Hangup()
same => n(iguanas),Playback(office-iguanas)
same => n,Hangup()


Configuración del archivo followme.conf

[4001]
musicclass=> default
context=> desvio_llamadas
number=> 4010,15
number=> 00573155768698,15

se llamará el numero 4010 primero y después al número celular por 15 segundos

[desvio_llamadas]

exten => _40XX,1,Answer()
same => n,GotoIf($[${DB(FM/${EXTEN})} = 1]?FM)
same => n,Dial(SIP/${EXTEN},15,hHkKtTwWxXhHkKtTwWxX)
same => n,Hangup
same => n(FM),FollowMe(${EXTEN})
same => n,Hangup

Contexto [limitar_llamadas]

Limita el número de canales utilizados en las llamadas entrantes y salientes. A través de estas dos funciones, es posible limitar el número de canales utilizados en las llamadas entrantes y salientes. Por ejemplo, para limitar a 2 el número de llamadas simultaneas por extensión y también limitar a 2 las llamadas simultáneas por la troncal.  Se configura el dialplan donde si una extensión intenta sacar la tercera llamada simultánea, se le avise que no es posible, y si los 2 canales de la troncal se están utilizando, informar que no hay más canales disponibles

GROUP([category])
Set(GROUP(voip)=voztovoice)
Set(GROUP(salida)=${CALLERID(num)})

GROUP_COUNT([groupname][@category])
Set(trunksal=${GROUP_COUNT(voztovoice@voip)})
Set(extsal=${GROUP_COUNT(${CALLERID(num)}@salida)})

Gotoif($[${extsal} > 2 | ${trunksal} > 2]?busy)
Dial(SIP/voztovoice/${EXTEN})
Hangup
(busy),Playback(all-outgoing-lines-unavailable)
Hangup