Click to dial usando PHP y Asterisk

asteriskEn muchas ocasiones puede ser bastante útil implementar una función de llamar con un simple click, en mi caso me fue requerida tal acción para un CAC. Dado que ya poseemos la infraestructura VoIP (Trixbox) y que la aplicación de servicio al cliente funciona web, me decidí por implementar la funcionalidad con PHP.

En este pequeño manual voy a saltar la parte de instalar el LAMP y el Asterisk, entendiendo que saben hacerlo o que ya lo tienen listo. Lo primero que tienen que hacer es modificar el archivo /etc/asterisk/manager.conf, localizar el usuario con el que desean conectarse y si el servidor LAMP no es el mismo del Asterisk entonces deberán agregar una línea con la IP y la red de dicho servidor como se muestra a continuación. Si es el mismo servidor este paso lo pueden obviar.

permit=192.x.x.1/255.255.255.0

Después de modificar el archivo deberán ir al Asterisk y recargar el fichero para aplicar los cambios. Ya restaría preparar en el LAMP un archivo PHP como el que listo a continuación.

<?php
    // credenciales para la conexión
	// ip del servidor
	$host = "192.x.x.1";
    // puerto de conexión
    $puerto = "5038";
	// usuario y contraseña que se encuentran en /etc/asterisk/manager.conf
	$usuario = "usuario";
	$contrasena = "contrasena";
	// canal o extensión que hará la llamada inicial, en mi caso SIP/201
	$canal = "SIP/201";
    // contexto del dialplan donde se encuentran la extensión o canal
	$contexto = "from-internal";
	// tiempo de espera antes de finalizar la llamada si no se contesta
	$espera = "30";
	// prioridad con que se va a realizar la llamada
	$prioridad = "1";
	// cantidad de intentos antes de finalizar
	$intentos = "2";
	// prefijo en caso de que sea necesario para llamadas al exterior
	$prefijo = "9";
	// número que va a marcarse, sin específicas protocolo
	$numero = "125";
	$pos = strpos($numero, "local");
	if ($numero == null){
		exit() ;
	}
	if ($pos === false){
		$errno = 0 ;
		$errstr	= 0 ;
		$caller_id = "Llamada AMI desde $canal";
		// aperturar una conexión mediante un socket
		$socket = fsockopen($host, $puerto, $errno, $errstr, 20);
		// si la conexión falla se imprime el error
		if (!$socket) {
			echo "$errstr ($errno)
		}
		// si la conexión es satisfactoria se establece la llamada
		else {
			fputs($socket, "Action: login\r\n");
			fputs($socket, "Events: off\r\n");
			fputs($socket, "Username: $usuario\r\n");
			fputs($socket, "Secret: $contrasena\r\n\r\n");
			fputs($socket, "Action: originate\r\n");
			fputs($socket, "Channel: $canal\r\n");
			fputs($socket, "WaitTime: $espera\r\n");
			fputs($socket, "CallerId: $caller_id\r\n");
			fputs($socket, "Exten: $prefijo$numero\r\n");
			fputs($socket, "Context: $contexto\r\n");
			fputs($socket, "Priority: $prioridad\r\n\r\n");
			fputs($socket, "Action: Logoff\r\n\r\n");
			sleep(2);
			fclose($socket);
		}
		// imprimir mensaje sobre los números que están interactuando
		echo "$canal llamando $numero..." ;
	}
	else {
		exit() ;
	}
?>

Entenderán que este es un ejemplo básico, con valores estáticos y sin comprobaciones de seguridad, además de que dicho código tendría que ir en una función que pueda ser llamada de acuerdo a sus necesidades. No está de más explicar que esto hará sonar la extensión SIP/201 y al obtener la señalización de listo entonces se marcará el segundo número (que no necesita el protocolo para ser marcado).

Espero les sirva este pequeño y corto ejemplo de cómo hacer un click to dial en PHP usando el AMI de Asterisk.