[LUG.ro] Contestador telefonico

Pablito lugro@lugro.org.ar
Thu, 03 Jul 2003 14:02:00 -0300


Hola!
Estaba buscando un contestador..lo encontre.. tal vez a alguien le interese.
saludos

>
>  Proyecto del contestador telefónico customizado
>
> *Introducción:*
>
>        Una alternativa divertida para crear un contestador telefónico 
> con voice mail es utilizar un programa creado por Niccolo Rigacci 
> llamado voice ( 
> http://metalab.unc.edu//pub/Linux/apps/serialcomm/modem/ 
> <http://metalab.unc.edu/pub/Linux/apps/serialcomm/modem/> o 
> http://sunsite.unc.edu/).
>        A diferencia del mgetty y otros tantos programas este tiene la 
> ventaja de estar desarrollado casi íntegramente en el lenguaje del 
> shell bash. Lo que el autor hizo fue crear un programa en C llamado 
> vmcp (Voice Módem Control Program) que se utiliza para comunicarse con 
> el módem. Por medio de ese programa uno puede enviar comandos AT y 
> esperar resultados del módem. Más importante aun es que ese programa 
> se encarga de manejar todo el tema de los famosos códigos de escape 
> DLE que utilizan los modems voice.
>        Para quienes no sepan en que consisten estos códigos haremos 
> una pausa para explicarlos.
>        */Códigos de escape DLE:/*
>            Cuando uno pone al módem en modo voice y atiende una 
> llamada son varias las cosas que se pueden recibir del módem:
>                - los tonos DTMF de números discados en el otro lado 
> del teléfono,
>                - la agradable voz de alguna persona,
>                - tono de fax o
>                - un silencio indicativo de que podrían estar llamando 
> con una computadora y esperan recibir tono de módem.
>
>       En la tabla de caracteres ASCII el código 10 hexa corresponde a 
> un carácter de control llamado */DLE./* Los modems de voice mail 
> acostumbran enviar este código para informar de estos distintos 
> eventos. (también depende mucho de la configuración del módem en ese 
> momento). Cuando reciben códigos */DTMF /*envían un carácter */DLE/* y 
> luego el código */DTMF/* recibido. Cuando están programados para 
> grabar sonidos también reciben un código */DLE/* acompañado de todos 
> los datos del sampleado asegurándose de que el código 10 hexa 
> (*/DLE/*) sea "escapado" del sample para no provocar problemas. De 
> similar manera uno puede enviar al módem datos para que reproduzca un 
> mensaje y debe asegurarse de controlar correctamente los DLE.
>        Muchos de estos eventos pueden suceder en modo simultaneo, es 
> decir que uno podría estar reproduciendo un mensaje mientras graba 
> otro y a la vez analiza posibles tonos */DTMF/* de la persona que esta 
> hablando en el otro lado. Bien, para manejar un módem voice hay que 
> conocer unos cuantos comandos AT dado que hay que setear varias cosas.
>        Antes de grabar un mensaje uno debe configurar la fuente de 
> grabación (línea telefónica, teléfono conectado al módem o entrada de 
> line-in del módem por ejemplos). También algunos modems disponen de 
> varias configuraciones para compresión de datos o velocidades de 
> sampleo, también se configura el volumen de grabación para detectar 
> silencios. En caso de líneas un poco ruidosas esto ultimo podría ser 
> importante para que la maquina no confunda un ruido de la línea y lo 
> grabe cuando la persona en realidad no quiso dejar mensaje. Lo bueno 
> del sistema de Niccolo es que sus programas están muy comentarizados y 
> el código es muy fácil de entender lo cual nos permite hacerle 
> numerosas adaptaciones......
>
>    Adaptación 1:
>
>        Soporte de CALLER-ID :
>        Hacer tal cosa es bástente fácil. Para ello les diré que el
>        comando a enviar para habilitar la recepción del caller-id por
>        parte del módem es: */AT#CID=1/*
>        Habiendo habilitado esto en el módem luego de recibir el primer
>        ring se reportaran varios renglones de información que suenan
>        mas o menos así: */DATE=la fecha TIME=la hora NMBR=el número
>        telefónico./*
>        El programa de shell que hay que modificar se llama */ans/* y el
>        código que le agregue es el que sigue a continuación (antes les
>        diré que yo no soy tan prolijo como Niccolo y mi código es
>        bastante mejorable)
>
> # Aca sistema de obtencion de datos de lo del CALLER-ID
> $VMCP -c"AT#CID=1" -wOK $VMCP -l$LOCK -wRING -t0 > /tmp/caller-id.txt
> $VMCP -o /tmp/caller-id.txt -wRING -t10
> cat /tmp/caller-id.txt >> /usr/adm/caller-id.log
> CALLERID=`grep -e NMBR < /tmp/caller-id.txt | (read a a b ; echo $b)`
> rm /tmp/caller-id.txt
> echo '**************** Caller ID : $CALLERID'
> /usr/local/bin/reportar.sh $CALLERID &
> #-----------------------------------
>   
>
>        Todo este código lo puse en reemplazo de la línea que decía:
>        */$VMCP -l$LOCK -wRING -t0 /*y que estaba en la rutina
>        */wait_rings()/*casi al principio luego de donde dice reset_modem.
>        Como podrán observar uso el programa */vmcp/* para capturar los
>        datos del caller-id a un archivo temporal y luego extraigo el
>        número telefónico para ejecutar un programa mío llamado
>        reportar.sh.
>        Les diré que mi programa reportar.sh lo que hace es comparar el
>        número telefónico con algunos que tengo almacenados y luego por
>        una voz sintetizada reproduce algún mensaje especial o
>        sencillamente dicta el número en la placa de sonido.
>        En cualquier momento mejoro el sistema incorporando la guía
>        telefónica completa en mi servidor SQL o algo por el estilo. Se
>        imaginaran que el tema da para mas así que quedara para otro
>        momento. Bueno el número telefónico lo dejo en la variable
>        CALLERID porque nos será útil en otras posibles adaptaciones del
>        programa...
>
>    Adaptación 2.
>
>            Convertir los mensajes grabados en mails. Dado que mi esposa
>        contesta la mensajería de un sitio que mantenemos en Internet
>        (http://www.manes.com.ar/) ella chequea el mail todos los días y
>        el ideal para nuestro caso seria que los mensajes del
>        contestador telefónico estuvieran allí también como mails. Para
>        eso se necesitan algunos programas mas y pueden ser necesarias
>        adaptaciones de acuerdo al módem que uno tenga. Cuando uno usa
>        el programa de Niccolo no es demasiado importante el formato que
>        utilice el módem para samplear las grabaciones dado que los
>        mensajes se graban y reproducen con el mismo módem. En mi caso
>        tenia a mi disposición un módem de UsRobotics y me las tuve que
>        ingeniar un poco. Encontré que en los fuentes del mgetty
>        (disponible en Sunsite y en varios CDs de Linux) en el
>        subdirectorio pvftools del subdirectorio voice hay un programa
>        que transforma los samples de modems */Voice UsRobotics/* en un
>        formato de sonido compactado llamado */gsm/*. Observando los
>        fuentes vi que el formato de UsRobotics debería tener una
>        cabecera de varios bytes que el programa por suerte no emplea.
>        Como el programa */vmcp/* no genera esa cabecera dado que toma
>        los datos como vienen del módem hay que inventarla o tocar los
>        fuentes del programa conversor (*/usrgsm.c/*).
>            Aun debemos convertir de ese formato a algo mas conocido y
>        para eso hay que utilizar un utilitario llamado */tcat/* que
>        vienen en un paquete llamado gsm (también se consigue en Sunsite
>        o en los CD en un subdirectorio utils/compress ).
>            Como este ultimo programa solo lo descomprime falta darle el
>        toque final para que quede en algún formato conocido y esto
>        ultimo lo hago con el */sox /*( Sunsite o los CDs). Para generar
>        el mail atachandole el archivo de sonido utilizo un programa
>        llamado */mpack/* que hace lo propio y se consigue en Sunsite o
>        los CDs.
>        Como ya he terminado les mando el código que agregue:
>
> if [ -e $FNAME ]
> then
>     DAT=$($DATE +'mensaje del %d/%m/%y a las %H:%M:%S TEL '+$CALLERID)
>     WAV=/tmp/jnewmsg$$.au
>     (echo 1234567890123456789012345678903 ; cat $FNAME) | usrgsm | 
> tcat | sox -t ul -r 8000 - -t au - > $WAV
>     mpack -s "$DAT" $WAV $MAILTO
>     rm $WAV
> fi
>   
>
>                Esto lo puse en la rutina voice_call luego del CASE que
>        discrimina llamadas Voice, fax y data. No se dejen engañar
>        porque a una de mis variables la llame WAV pues el formato del
>        archivo que genero es .au que a mí me gusta mas. Prestar
>        atención a que los programas estén en el path. Si se deciden a
>        poner el programa 'ans' en el archivo /etc/inittab con una línea
>        como:
>        */a1:1235:respawn:/usr/local/bin/ans >/dev/null 2>/dev/null/*
>        puede suceder que algún programa que resida en /usr/local/bin no
>        se encuentre en el path de ese proceso . Por esa razón yo
>        agregue la línea: */PATH=$PATH:/usr/local/bin /*en el programa
>        */ans/* al comienzo . En un primer momento había intentado poner
>        los paths completos cuando referenció a los ejecutables pero eso
>        no funciono por la siguiente razón:
>             Algunos programas tienen la costumbre de realizar varias
>        funciones de acuerdo a cual sea el nombre de su propio
>        ejecutable. En los unixes con el comando link uno puede
>        fácilmente darle varios nombres al mismo archivo y en algunas
>        ocasiones los programas testean su propio nombre para saber que
>        es lo que deben hacer. Si el testeo no esta muy bien hecho al
>        dar el path completo del ejecutable el programa ya no quiere 
> andar.
>
>        Otras adaptaciones:
>                Ya pueden imaginarse que con el soporte de caller-id y
>        al tener el número de origen almacenado en una variable surgen
>        numerosas posibilidades...
>
>        Sin necesidad de armar un programa reportar.sh como el mío con 
> síntesis de voz no es mala idea grabar algunos mensajes customizados 
> para distintos posibles llamadores y mandarlos a reproducir con un 
> case que testee esos números telefónicos. También se puede programar 
> que si la llamada proviene de ciertos números telefónicos la maquina 
> de directamente tono de datos o de fax o ejecute programas especiales. 
> Yo a veces me siento tentado a desconectar la campanilla del teléfono 
> y dejar que la computadora me avise y me filtre los llamados.
>
>    
>    Autor: Jorge Luis Chamorro
>    Fecha: Diciembre de 1998
>
>