Ultimamente he implementado algunos conmutadores de Voz sobre IP para casetas telefonicas, para ello he usado AsterBilling el cuál me ha parecido un software bastante bueno para el manejo de distribuidores de telefonía, casetas y cabinas telefonicas, funciona mediante AMI y a traves de una aplicacion web para poder llevar el control de casetas telefonicas, tarifas por tipos de prefijos, reportes, creditos prepagos y postpagos, entre otras cosas.
Lo unico que le faltaba era una versión en español, por lo que me meti a editar los archivos de lenguajes y adaptarlos a Mexico. Por ello pongo aquí en este post el archivo en español para AsterBilling esperando pueda ser util para alguien más en la implementación de Asterisk como solución de Casetas Telefónicas, entre otras cosas.
El archivo puede ser descargado de http://files.mexrom.net
entrar como:
login:invitado
Password:invitado:
Y entrar al directorio es_MX-AsterBilling, descargar el archivo es_MX.tar
Este archivo descompactarlo en
/var/www/astercc/asterbilling/includes/language
Despues solo editar los archivos de
/var/www/astercc/asterbilling/login.php
/var/www/astercc/asterbilling/manager_login.php
Y agregar una opcion en el campo select para español
Con esto ya se tendria en español AsterBilling y listo para empezar a funcionar en casetas telefonicas usando Asterisk y aprovechando los servicios de Telefonia IP.
Hace unos días requerí enviar archivos a un servidor web para su procesamiento, anteriormente había usado el método clásico que mediante una forma capturaba los datos y seleccionaba el archivo y lo mandaba a procesar en la página especificada como action en el formulario, el detalle al hacer esto es que se recarga toda la página, por lo que ahora en este caso necesitaba que se enviara el archivo pero sin recargar la página por diversas razones.
Para esto investigué un poco sobre como hacerlo y encontré en un foro dónde indicaban que se creara un frame invisible dentro de la página html que recibiera la petición de envío, de tal forma que se haría el mismo proceso de enviar el procesamiento solo que en vez de recargar una página sería solo el frame invisible, por lo que se conseguiría enviar el archivo sin necesidad de recargar la página.
A continuación pongo el código correspondiente
index.php
<script language="javascript" type="text/javascript"> function upload(){
document.getElementById('upload_message').innerHTML ="";
document.getElementById('loader').innerHTML ="Loading...<br/><img src=\"loader.gif\" />"; returntrue; } function finish(success){ var result =''; if(success ==1){
document.getElementById('upload_message').innerHTML ='<span class="msg">El archivo fue enviado exitosamente!<\/span><br/><br/>'; } else{
document.getElementById('upload_message').innerHTML ='<span class="emsg">Hubo un error al enviar el archivo al servidor!<\/span><br/><br/>'; }
document.getElementById('loader').innerHTML =""; returntrue; } </script> <form action="upload.php" method="post" enctype="multipart/form-data" target="upload_window" onsubmit="upload();"> <table> <tr><td colspan=2><div id="upload_message" align="center"><div></td></tr> <tr id=fileUpload><td>FILE:<input name="myfile" type="file" size="30"/></td><td><input type="submit" name="submitBtn"class="sbtn" value="Upload"/></td></tr> <tr><td colspan=2><div id=loader></div></td></tr> </table> <iframe id="upload_window" name="upload_window" src="#" style="width:0;height:0;border:0px solid #fff;"></iframe> </form>
DynDNS es un servicio que permite ligar IP Homologadas a un nombre de dominio, de tal forma que es posible ligar una IP Dinámica aun dominio, el detalle es que cuándo la IP Dinámica cambia hay que modificar el registro de DynDNS con la nueva IP.
Los router Linksys y DD-WRT ya traen un cliente DynDNS integrado, pero muchas veces cuándo se tiene como router un 2Wire, estos no tienen esta funcionalidad, por lo que hay que hacer uso de algún script, en este caso haremos uso de inadyn.
¿ Porqué inadyn ?
Existen clientes como ddclient ó ipcheck, pero estos deben estar instalados sobre el equipo que tiene la IP Homologada, en este caso el script se ejecutará en una máquina que está dentro de una red local y solo tienen configurada una IP Privada. Inadyn permite actualizar DynDNS desde cualquier equipo aunque esté en la red privada, ya que inadyn obtiene la ip pública del router consultando checkip.dyndns.org y de ahí realiza la actualización.
En debian ó Ubuntu dolo basta obtener inadyn de la siguiente manera:
sudoapt-getinstall inadyn
Despues editar un archivo en /etc/default.conf
Ahí poner los parámetros siguientes:
update_period_sec 600# Verifica la IP cada 600 segundos
username usuariodyndns #Usuario de dyndns
password passworddyndns #password de dyndns
dyndns_system dyndns@dyndns.org alias miservidor.dyndns.org #dominio configurado en dyndns alias otroservidor.dyndns.org #dominio configurado en dyndns
Y luego solo ejecutar
inadyn
Solo bastaría configurar para que inadyn se ejecute al iniciar el servidor para que quede en background trabajando.
¿ Para que sirve todo esto ?
Para poder poner en internet diversos servicios como puede ser un servidor de faxes, un servidor de mensajería instantanea, un servidor web, un sistema de impresión, un servidor de base de datos, alguna herramienta de sincronización, un servidor VPN, un sistema de telefonía IP ó envío de mensajes sms, entre otras cosas.
Solo replicando la nota del Grupo de Usuarios de Oaxaca sobre una reunión que realizarán allá en la siempre linda, hermosa y mística Verde Antequera de la Ciudad de Oaxaca..
< gusloInvita >
FLISOL
Con motivo de la organización del FLISOL, les hacemos una cordial invitación para asistir este Sabado 28 de Febrero al Café Don Emiliano...
El Café esta ubicado en Av. Juárez 505 a un lado de la Meso...
Hablaremos de las sedes propuestas:
* Instituto Tecnológico de Oaxaca
* Zimatlan
* UniTierra/Escuela de Ciencias UABJO
Y tambien de los pormenores y avances que se tienen...
No falten...
< /gusloInvita >
Hace unos días me contactó una persona preguntándome sobre una solución de toma de inventarios para dispositivos móviles que liberé de forma gratuita hace un par de años en internet de la cuál ya ni me acordaba, esta aplicación de lo que recuerdo es que permitía capturar 5 campos aparte de código y cantidad en una toma de inventarios muy básica para dispositivos con Windows Móbile, avanzando en la plática le sugerí mejor una solución más profesional que ofrece una empresa que distribuye terminales portátiles.
Esta persona después me volvió a contactar ya que a dónde lo mandé le preguntaron si su sistema soportaba importación de datos en formato csv, txt, xls, entonces él le pregunto al proveedor de su sistema administrativo y le dijo que si, pero que era un sistema de importación de datos que no era compatible con la solución de los móviles, su proveedor le dijo que podrían hacerle un desarrollo para que el sistema que tiene pudiera importar datos csv(algo muy simple), pero se vino de espaldas cuándo le dieron el costo del desarrollo por ese módulo personalizado de importación de datos.
Preguntándole más sobre su sistema pude saber que la base de datos que está detras de ese sistema propietario es MySQL, una base de datos libre, por lo que se me ocurrió algo para saber como el pudiera importar su información sin tantos dolores de cabeza.
La idea era que hiciera un registro de inventarios para saber que tablas y que consultas se realizaban al hacer la operación, la forma de saber las consultas es mediante una forma muy llana y simple, habilitando el log de mysql.
Generalmente el registro de transacciones de mysql debe estar desactivado, por cuestiones de performance en la base de datos, pero para este caso solo bastó editar el archivo de configuración my.cnf en la línea
log=PATH_DEL_LOG
Y reiniciar MySQL..
Con esto el realizó el registro de inventarios y solo revisando el archivo log de mysql se observa el usuario, la fecha, hora y consultas realizadas, de tal forma que fué una manera rápida de saber como esa aplicación propietaria afectaba los inventarios y con lo cuál ya podría desarrollarse una simple interfaz de importación de datos csv para que sea compatible con el sistema de toma de inventarios para dispositivos móviles.
Obviamente despues de verificar las transacciones de mysql, se volvió a desactivar el log para no afectar el rendimiento de MySQL.
Hace unos días me pidieron un conmutador de voz sobre IP con más de 150 extensiones VoIP, por lo que me puse a ver como insertar 200 extensiones configuradas en el conmutador mediante un script de forma automática siguiendo un patrón recursivo ya que no había prácticamente cambios en las extensiones más que el número de la extensión, password y correo de voz, de tal forma que si hacía esto a mano me iba a llevar algunos minutos con posibles errores de captura humanos.
Lo primero que se me ocurrió es generar un script que agregara las cuentas SIP a /etc/asterisk/sip_custom.conf y las extensiones en /etc/asterisk/extensions_custom.conf, el detalle que habría es que FreePBX no podría manejarlas desde el módulo de extensions, ni tampoco flash panel podría operarlas, por lo que se me ocurrió insertar la información de las cuentas en la base de datos de freepbx y luego dejar que freepbx leyera la información de la base de datos para que generara los archivos correspondientes.
Básicamente hay 3 tablas de la base de datos de FreePBX que se relacionan con las cuentas SIP, extensiones y correos de voz.
users
sip
devices
La tabla users se refiere a la configuración de la extensión del usuario tal como grabación de llamadas, tiempo de espera para mandar a correo de voz cuándo le marquen, nombre SIP, correo de voz, etc..
La tabla SIP tiene la información detallada de la cuenta SIP configurada, tal como cuenta, contraseña, codec permitidos y no permitidos, contexto, dtmfmode, etc..
La tabla devices se refiere al tipo de dispotivo si es SIP, IAX, etc.
Entonces por ejemplo si quisiera agregar manualmente la extensión 109 tendría que ejecutar las siguientes consultas sql.
Obviamente la tabla sip se le puede insertar toda la información en una sola consulta en vez de ir haciéndola una por una como la muestra, pero para fines de mostrar el proceso lo vale.
Entonces en el script solo se requirió generar consultas similares a las anteriores al vuelo, indicándole solo de que rango a que rango se configurarían las extensiones.
Obviamente para algo simple como agregar n extensiones no es complicado, pero cuándo se requiere una configuración específica por extensión también podría usarse un script pero sería algo más complejo.
Lo interesante en la tabla sip son los keywords, estos no deben tener espacios en blanco que si no al momento de decirle a freepbx que genere los archivos de configuración de asterisk, tomaría solo los keywords correctos, pero al momento de hacer pruebas no funcionarían las extensiones, por eso es importante que los keywords de la tabla sip no tengan espacios en blanco al igual que los valores dónde no lo requieran.
Probando el uso de AMI (Asterisk Manager Interface) para controlar de forma externa acciones, eventos y comandos de Asterisk desde algún script, me he metido a estudiar esta tecnología interesante que potencializa el uso de Asterisk y permite crear diversas aplicaciones externas e integrarlas a aplicaciones terceras, tales como CRM, ERPs, Encuestas, etc.
Como demo he intentado hacer un script en php que buscará información de una extensión dada, si está estuviera llamando, entonces que buscara información del canal, para luego mandar a colgar esa extensión.
El código que hice para poder hacer este ejemplo es el siguiente:
/*
Script creado por Filein Rommel Leon(aka Phylevn)
Licencia GPL
Script de demostración del uso de AMI con PHP, este script cuelga una extensión si estuviera en uso, ocupada ó no disponible, como demo agrego la opción de que si una extensión está en una llamada(uso) para que se pueda hacer la prueba
0=> Disponible
1=>Use: Si una extension esta llamando
2=>Busy: Si una extensión esta ocupada
4=>Unavailable: Si una extensión está ocupada
En este caso comparo si las extensiones tienen el status 1,2 ó 4, entonces obtengo el canal correspondiente a la extensión y luego la cuelgo.
Para probar este script hacer una llamada de la extensión a colgar a otra extensión y correr el script paraver su funcionamiento. */ $amiHost="localhost"; //servidor de AMI $amiUser="asterisk"; //login AMI $amiSecret="4st3r1sk";//password AMI $amiExten="102"; $amiChannel="SIP/$amiExten"; //extension a buscar para colgar $amiContext="from-internal";//contexto $getTextSearched=0;
$amiStatusExt=0;
//Estados de una extension $_extStatus=array(-1=>"Extension not found",0=>"Idle",1=>"Use",2=>"Busy",4=>"Unavailable",8=>"Ringing",16=>"On Hold");
//Nos validamos dentro de AMI fputs($oSocket,"Action: login\r\n"); fputs($oSocket,"Events: off\r\n"); fputs($oSocket,"Username: $amiUser\r\n"); fputs($oSocket,"Secret: $amiSecret\r\n\r\n");
//Obtenemos el status de la extension deseada fputs($oSocket,"Action: ExtensionState\r\n"); fputs($oSocket,"exten: $exten\r\n"); fputs($oSocket,"context: default\r\n"); fputs($oSocket,"actionid: 1\r\n\r\n"); $echo="ok"; while($echo!=""){ if(strstr($echo,"Status:")!=""){ $amiStatusExt=ereg_replace("[^0-9]","",$echo); echo"Exten : ".$_extStatus[$amiStatusExt]."\n"; $echo=""; }else{ //echo ":::".$echo; $echo=fgets($oSocket); } }
//Obtiene la información de canales y buscamos informacion sobre nuestro canal if($amiStatusExt==2 or $amiStatusExt==4 or $amiStatusExt==1){ fputs($oSocket,"Action: command\r\n"); fputs($oSocket,"command: show channels\r\n\r\n"); echo$echo="getting SIP Channels\n"; while($echo!="" or $echo=="--END COMMAND--"){ if(strstr($echo,$amiChannel)!=""){ $_values=split("[\s]+|[\t]",$echo); $_values[0]=ereg_replace("[^(SIP/)0-9a-zA-Z-]","",$_values[0]); echo$_values[0]."\n"; $echo=""; }else{ //echo ":::".$echo; $echo=fgets($oSocket); } } }
//Si se encontró nuestro canal entonces lo colgamos if($_values[0]!=""){ fputs($oSocket,"Action: Hangup\r\n"); fputs($oSocket,"channel: $_values[0]\r\n\r\n"); echo"hanging channel: $_values[0]\r\n"; }
//Salismo de AMI fputs($oSocket,"Action: Logoff\r\n\r\n"); sleep(2);
solo basta correr el script de alguna forma como esta:
php hangup.php
Antes solo hay que checar la configuración de AMI en /etc/asterisk/manager.conf ó /etc/asterisk/manager_custom.conf si están usando freepbx.
Entender el protocolo de AMI no es tan complicado, pero lo interesante es la potencia que le brinda a Asterisk para desarrollos más avanzados, este código está hecho a pelo precisamente para entender como se interactua con AMI, aunque ya hay librerías que disminuyen la chamba tal como asterisk-perl ó por ahí el nuevo killer app de Ruby creo que se llama AdHearsion o algo asi que luce muy interesante para hacer este tipo de cosas..
Para conocer un poco más sobre la tecnología de Asterisk Manager Interface entrar a la siguiente URL: http://www.voipinfo.org/wiki/view/Asterisk+manager+API
< pensando en voz alta >
Hace un rato mientras estaba lavando los trastos acumulados durante la semana -sugerencia si cocinan espagueti, pónganle agua por lo menos a la cacerola si es que la van a dejar varios días ahí amontonada en el fregadero :$ -, entonces andaba oyendo algo de música, y mientras lavaba para poder cambiar de canción en canción tenía que buscar el celular y apretar un botón para que vía bluetooth indicarle al reproductor multimedia Amarok en Ubuntu Linux que pasara a la siguiente canción, entonces entre que las manos con jabón y que se te puede romper un plato, pensaba en como poder usar un dispositivo manos libres bluetooth que permitiría mediante comandos de voz cambiar las canciones, entre otras cosas en tú computadora.
Y siguiendo pensando en voz alta, recordé a PerlBox-Voice una herramienta basada en sphinx que es un software de reconocimiento de voz, el cuál había probado ya hace varios años y el cuál te permite ejecutar aplicaciones en Linux mediante comando de voz, la configuración de PerlBox-Voice es fácil, solo introduces las palabras y la aplicación a ejecutar cuándo perlbox "oiga" la palabra, entonces se me estuvo ocurriendo que pudiera hacerse una modificación en el código de PerlBox-voice para poder mandar diversos comandos a diversas aplicaciones mendiante la voz usando un manos libres bluetooth ó un micrófono conectado directamente al puerto de audio de la PC.
La diferencia pensada de la versión actual de PerlBox es que en vez de solo iniciar programas, también en base a comandos de Voz tome perfiles, algo que hacen los controles remotos bluetooth, de tal forma que si activas un perfil para Amarok, puedas usar las funciones de amarok para adelantar, atrasar, pausar, continuar una canción, si cambias a VLC puedas usar las funciones de voz para reproducción de DVDs, si cambias de perfil a modo TV puedas mandar comandos de voz para cambiar de canal, subir volúmen, etc.. y asi sucesivamente para diversos perfiles (fotografía, navegación web, gestión de archivos).
Lo que teóricamente pasa por mi cabeza es que haya un demonio que esté a la escucha de los comandos recibidos desde los clientes, esos clientes se encargarían de evaluar la información leída por Perlbox-voice y permitirían el cambio de perfil y las acciones si es que asi fueron ordenados, los demonios se encargarían enviar los comandos a las respectivas aplicaciones habilitadas del perfil aprovechando el uso de comandos remotos que tienen diversas aplicaciones.
Por ahora parece que puede ser factible hacerlo aprovechando la tecnología de PerlBox-voice.
pensando en voz alta >
Has de cuenta que es como la red inalámbrica que tienes en tú casa u oficina, con aquellos routers de infinitum tienes WiFI, con los CPE tendrías WiMax, solo que WiMax es una red inalámbrica que puede tener hasta decenas de kilómetros de alcance al igual que varias decenas de Megabits de ancho de banda, y si al igual que el WiFi también podría no tener costo usar la red.
¿ Porqué no tendría costo ?
Porqué al igual que el WiFi, en WiMax hay frecuencias libres que no son licenciadas, lo que significa que no requieres de permisos de la COFETEL aquí en México para poder instalarlas en tú casa, oficina, pueblo, ciudad ó región.
¿Es caro WiMax?
Implementar WiMax en una ciudad no lo es, requieres de un CPE Base Multipunto que permite radiar la señal de WiMax en toda la ciudad, dependiendo de la potencia del radio será la cobertura de la señal en algunos casos puede sobrepasar los 50 Km, requieres también PC Cards(para notebooks) WiMax para poder recibir la señal desde cualquier punto dónde andes, como si fuera un WiFi solo que en grande, obviamente los CPE Base y CPE Clientes aún no están a precios de risa como los router Linksys o 2Wire, pero para proyectos empresariales el precio ya es asequible y la inversión vale mucho la pena en comparación de rentar una red 3G.
¿ Que aplicaciones se le podrían dar a WiMax ?
Imagínate que desde tú notebook ó PDA pudieras ver las cámaras que tuvieras en tú casa en tiempo real y con alta definición sin pagar ninguna renta o uso de ancho de banda, imagina tener conversaciones de voz con tús amigos, tener una videoconferencia ó transmitir a todos tús contactos un videostream de lo que estás viendo, imagina que desde tú PDA pudieras controlas las luces de tu casa, apagar ó prender dispositivos eléctricos mediante una tecnología de domótica como X10, si eres dueño de una empresa, imagina que en cualquier parte de la calle estes haciendo ventas, tomando pedidos, consultando información de tu base de datos, realizando un inventario, estes llevando tú extensión telefónica vía voz sobre IP con el nuevo dispositivo de VoIP-WiMax y tener lo que es realmente una oficina virtual móvil..
¿ Porqué ayudaría WiMax a México ?
Porqué podría ser una forma económica y rápida de poder llevar las telecomunicaciones a los pueblos marginados de nuestro país y acercar la tecnología a los niños de los pueblos de México. Porqué a las empresas les permitiría llevar sus negocio hasta la puerta del cliente y así generar más movimientos y tener lo que realmente sería "movilidad empresarial", porqué aumentaría la innovación de los jóvenes al tener el conocimiento más cerca.
Definitivamente las aplicaciones de WiMax pueden ser muchas.
¿ Porqué WiMax aun no sé usa en México ?
Por desconocimiento de la tecnología.. también porqué la COFETEL aún no termina de revisar el protocolo, de definir que dispositivos pudieran ser permitidos para usarse en la frecuencia libre, entre otras cosas.. pero definitivamente por el costo No, pues un CPE Base está alrededor de los 1,500 dlls, y una PC Card alrededor de los 200 dlls.. en un inicio quizá sea algo caro pero se abaratarían sin duda estos costos cuándo el uso sea masivo, recuerdo hace unos 10 años cuándo el costo de un Access Point era de $ 1,000.00 dlls el más barato ahora los puedes conseguir hasta en $ 20.00 dólares.
¿ Ya hay productos WiMax disponibles en México ?
Si ya hay varios distribuidores de dispositivos WiMax como Canopy Wireless, MotoWi4, RedLine, solo basta que hagas una búsqueda en google sobre distribuidores de esta tecnología.
Festival es un software Text to Speech (texto a voz) que es un desarrollo basado en la filosofia del Software Libre impulsado por la Universidad de Edimburgo, este desarrollo permite tener parlantes en diversos para poder pronunciar textos en otros idiomas.. Asterisk el proyecto open source de conmutador de telefonía de voz sobre IP(VoIP) permite hacer aplicaciones de Voz sobre IP con una tecnología que incorpora llamada AGI(Asterisk Gateway Interface) con lo cuál es posible hacer aplicaciones de texto a voz, lo que permite a alguien que llama al conmutador de telefonía de voz sobre ip darles respuestas automatizadas mediante un parlante implementado con Festival y Asterisk.
Por default Festival viene con un parlante en Ingles, pero para los que hablamos idioma en español es muy incómodo escuchar a un parlante con acento ingles hablar palabras en español, por ello pongo un corto y rápido tutorial de como modificar esta parte para cambiar el parlante en español.
Si aun no tienes instalado Festival puedes echarle un ojo a este post para configurar e instalar Festival.. http://phylevn.binniza.com/index.php/blog/show/_Como_configurar_Festival_en_Asterisk_.html
Ya que se tenga instalado Festival y configurado..
Ir a este sitio http://forja.guadalinex.org/repositorio/frs/?group_id=21&release_id=110
Y bajar las siguientes voces :
http://forja.guadalinex.org/repositorio/frs/download.php/153/festvox-palpc16k_1.0-1_all.deb
Estas voces son de Silvia Y Pedro.. voces implementadas en Festival por la Junta de Andalucía para personalizar aun más las voces que vienen preinstaladas en Festival ya que se escuchan más robotizadas y con estas implementaciones se trató de que fueran menos robotizadas y aceptables.
Ya que descarguemos los archivos los instalamos con:
Voz de Silvia:
sudo dpkg -i festvox-sflpc16k_1.0-1_all.deb
Voz de Pedro:
sudo dpkg -i festvox-palpc16k_1.0-1_all.deb
Ahora editaremos el archivo /etc/festival.scm
Buscaremos una línea como esta:
(set! voice_default 'voice_el_diphone)
Y la cambiaremos por la siguiente para voz de Silvia:
(set! voice_default 'voice_JuntaDeAndalucia_es_sf_diphone)
Para la voz de Pedro sería:
(set! voice_default 'voice_JuntaDeAndalucia_es_pa_diphone)
Despues de editar el archivo, guardarlo.. y solo bastaría reiniciar festival para oirlo funcionar con Asterisk
sudo /etc/init.d/festival restart
Ahora solo echarle un ojo a la liga del tutorial que puse arriba para probar la nueva voz configurada con Festival..
Comentarios Recientes